Zol*_*aKt 7 php oop orm doctrine internationalization
我想扩展i18n行为,以便它在任何类型的查询(DQL,relations,getTable)上自动加入转换表.
此外,它需要定义默认语言参数,因此当我在没有语言设置的情况下进行查询时,它会回退到默认语言.
注意:我正在寻找一个通用行为,因此这适用于所有i18n模型对象,而不是为每个类编写和覆盖.
这是一个例子:
table product- > id,category_id,price ...
table product_translation- > id,lang,name,description ...
使用当前的解决方案,当我做这样的事情时:Doctrine_Core::getTable('Product')->findAll()它获得所有产品而不加入翻译.
所以在控制器中我必须循环遍历所有记录并重新应用翻译的值$product->name = $product->Translation['en']->name
我想要这样的东西:
Doctrine_Core::getTable('Product')->findAll() 它应该得到lang ='en'的连接值Doctrine_Core::getTable('Product)->findAll('en') 与上述相同$user->Products它应该返回包含翻译的集合.$user->Products('en')应该返回其他(非默认)语言的集合Doctrine_Core::getTable('Product')->getByCategoryAndLang(1,'en')有人可以帮忙吗?我正在研究模板和行为,我认为这是要走的路,但不知道如何实现这一点
编辑:我看到对此没什么兴趣,所以让我尝试一个更简单的问题.你通常如何通过关系获得i18n领域.例如,我如何调用$user->Products并获取带有加载翻译的产品?
我认为您不需要扩展标准的 Doctrine 行为,除非您想要全自动。但你仍然可以尝试像我们一样这样做 - 我们使用 DAO(数据访问对象)来返回具体的 Doctrine 实体(Doctrine 表表示):
\DAO::get('Some\Namespace\Classname')
Run Code Online (Sandbox Code Playgroud)
其中Classname代表 PHP 类模型描述的表。Classname我们的 DAO 类创建了封装的实例proxy(请参阅设计模式)。
除了表类模型之外,我们还为此表创建另一个类,该类位于表模型之上并使用该模型进行操作。在这个类中,我们编写诸如getProducts($args)、getProduct($id)等方法getProductsByCategory($catId)。
我认为这就是您正在寻找的......
在方法中,getProducts($args)您可以在 DQL 中实现,通过参数中的给定标识符->leftJoin()连接转换表。简单示例(未测试):$lang$args
class Products extends \DAO {
public function save($item) {
$item->save();
}
public function getProducts($args = array()) {
$order = array('p.id');
$result = \Doctrine_Query::create()
->from('Some\Namespace\Product p')
->where('1 = 1');
if(!empty($args['lang'])) {
$result = $result->leftJoin('Some\Namespace\ProductTranslation pt ON pt.product_id = p.id AND pt.language = ?', $args['lang']);
}
$result = $result->orderBy($order);
$result = $result->execute();
return $result;
}
}
Run Code Online (Sandbox Code Playgroud)
然后通过调用
$products = DAO::get('Some\Namespace\Product')->getProducts(array('lang' => 1));
Run Code Online (Sandbox Code Playgroud)
您将获得所有已加载英文翻译的产品...
它不是那么自动化,您必须为每个模型编写自己的 DAO 类,但这是一个很好的方法,因为您有 MVC/MVP 面向对象的应用程序架构所需的不同数据定义类(模型)和数据操作类(控制器) ...