【问题标题】:Symfony2 Gedmo Tree with Translatable listner带有可翻译监听器的 Symfony Gedmo 树
【发布时间】:2012-12-14 12:12:00
【问题描述】:

我在 Symfony2 项目中使用 Gedmo 树。

$em = $this->getDoctrine()->getEntityManager();

$options = array(
    'decorate' => true,
    'rootOpen' => '<ul>',
    'rootClose' => '</ul>',
    'childOpen' => '<li>',
    'childClose' => '</li>',
    'nodeDecorator' => function($node) {
        return '<a class="menu" href="#">'.$node['name'].'</a>';
    }
);


$category = $em->getRepository('MyMainBundle:Category')->childrenHierarchy(
    null, /* starting from root nodes */
    false, /* load all children, not only direct */
    $options
);

print_R($category);

它有效,但问题是字段名称是可翻译的。在类别表中它是 NULL 并且值保存在 category_translations 表中,但我的代码仅返回类别表中的字段。

尝试添加监听器:

$evm = new \Doctrine\Common\EventManager();

$translatableListener = new \Gedmo\Translatable\TranslatableListener();
$translatableListener->setTranslatableLocale('en');
$evm->addEventSubscriber($translatableListener);

然后改变:

$em = $this->getDoctrine()->getEntityManager();

与:

$em = $this->getDoctrine()->getEntityManager(null,null,$evm);

但没有帮助。

阅读query hint,但没有查询使用它。

【问题讨论】:

    标签: php symfony tree translation


    【解决方案1】:

    这应该有效: 创建 Custom NestedTreeRepository 并覆盖 getNodesHierarchyQuery 方法以在返回的 query 上调用 setHint

    namespace My\Bundle\Entity;
    
    use Doctrine\ORM\EntityRepository;
    use Gedmo\Tree\Entity\Repository\NestedTreeRepository;
    
    /**
     * CategoryRepository
     */
    class CategoryRepository extends NestedTreeRepository
    {
        /**
         * {@inheritDoc}
         */
        public function getNodesHierarchyQuery($node = null, $direct = false, array $options = array(), $includeNode = false)
        {
            $query = $this->getNodesHierarchyQueryBuilder($node, $direct, $options, $includeNode)->getQuery();
            $query->setHint(
                \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
                'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
            );
            return $query;
        }
    }
    

    不要忘记将您的存储库分配给您的实体:

    namespace My\Bundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Gedmo\Mapping\Annotation as Gedmo;
    
    /**
     * Category
     *
     * @Gedmo\Tree(type="nested")
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="CategoryRepository")
     */
    class Category
    {
    }
    

    【讨论】:

    • 谢谢,没有考虑覆盖查询功能。
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多