2012-08-28 13 views
1

我想改變Gedmo \ Tree \ RepositoryUtils-> buildTree()方法的行爲,因爲我想改變返回數組的構造方式。在StofDoctrineExtensions中覆蓋DoctrineExtensions方法

我嘗試以下操作:

我有一個類:

<?php 

namespace MyCorp\CMSBundle\Util; 

use Doctrine\Common\Persistence\Mapping\ClassMetadata; 
use Doctrine\Common\Persistence\ObjectManager; 
use Gedmo\Exception\InvalidArgumentException; 

/** 
* Description of jsandjqTreeCompatibleRepositoryUtils 
* 
* @author peterrus 
*/ 
class jsandjqTreeCompatibleRepositoryUtils extends Gedmo\Tree\RepositoryUtils { 

    public function buildTree(array $nodes, array $options = array()) { 

     $meta = $this->getClassMetadata(); 
     $nestedTree = $this->repo->buildTreeArray($nodes); 

     $default = array(
      'decorate' => false, 
      'rootOpen' => '<ul>', 
      'rootClose' => '</ul>', 
      'childOpen' => '<li>', 
      'childClose' => '</li>', 
      'nodeDecorator' => function ($node) use ($meta) { 
       // override and change it, guessing which field to use 
       if ($meta->hasField('title')) { 
        $field = 'title'; 
       } elseif ($meta->hasField('name')) { 
        $field = 'name'; 
       } else { 
        throw new InvalidArgumentException("Cannot find any representation field"); 
       } 
       return $node[$field]; 
      } 
     ); 
     $options = array_merge($default, $options); 
     // If you don't want any html output it will return the nested array 
     if (!$options['decorate']) { 
      return $nestedTree; 
     } 

     if (!count($nestedTree)) { 
      return ''; 
     } 

     $build = function($tree) use (&$build, &$options) { 
        $output = is_string($options['rootOpen']) ? $options['rootOpen'] : $options['rootOpen']($tree); 
        foreach ($tree as $node) { 
         $output .= is_string($options['childOpen']) ? $options['childOpen'] : $options['childOpen']($node); 
         $output .= $options['nodeDecorator']($node); 
         if (count($node['children']) > 0) { 
          $output .= $build($node['children']); 
         } 
         $output .= $options['childClose']; 
        } 
        return $output . $options['rootClose']; 
       }; 

     return $build($nestedTree); 
    } 

} 

?> 

現在我嘗試使用,而不是所使用的默認情況下,一個這個類調用

$pagerepo = $this->getDoctrine()->getRepository('MyCorpCMSBundle:Page'); 

通過執行以下類型轉換:

$pagerepo = (jsandjqTreeCompatibleRepositoryUtils) $this->getDoctrine()->getRepository('MyCorpCMSBundle:Page'); 

但是,因爲這不是Java,所以這是不可能的。

我在做什麼錯?

+0

這也是在這裏討論https://github.com/l3pp4rd/DoctrineExtensions/issues/442 – peterrus

+0

我實例如下: 代碼: '$ em = $ this-> getDoctrine() - > getEntityManager(); $ pagerepo = $ em-> getRepository('MyCorpCMSBundle:Page'); $ pagerepo-> setRepoUtils(新jsandjqTreeCompatibleRepositoryUtils());' 這是越來越朝着正確的方向,但是RepositoryUtils對象需要一些參數 '公共職能__construct($的ObjectManager OM,ClassMetadata $元,$聽衆,$回購)' 我在哪裏檢索這些? – peterrus

回答

0

可能有點晚,但我需要做同一件事 - 這裏是萬一別人解決方案需要它:

您的倉儲類:

namespace Acme\Model\Repository; 

use Doctrine\ORM\EntityManager; 
use Gedmo\Tree\Entity\Repository\NestedTreeRepository; 
use Doctrine\ORM\Mapping\ClassMetadata; 
use MyNamespace\GenericBundle\Repository\RepositoryUtils as MyRepositoryUtils; 

/** 
* Group Repository 
*/ 
class CategoryRepository extends NestedTreeRepository 
{ 
    /** 
    * @param EntityManager $em 
    * @param ClassMetadata $class 
    */ 
    public function __construct(EntityManager $em, ClassMetadata $class) 
    { 
     parent::__construct($em, $class); 
     $this->repoUtils = new MyRepositoryUtils($this->_em, $this->getClassMetadata(), $this->listener, $this); 
    } 
} 
你可以MyRepositoryUtils

覆蓋buildTree方法:

namespace MyNamespace\GenericBundle\Repository; 

use Doctrine\Common\Persistence\Mapping\ClassMetadata; 
use Doctrine\Common\Persistence\ObjectManager; 
use Gedmo\Exception\InvalidArgumentException; 
use Gedmo\Tree\RepositoryUtils as GedmoRepositoryUtils; 

class RepositoryUtils extends GedmoRepositoryUtils 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function buildTree(array $nodes, array $options = array()) 
    { 
    } 
} 
+0

請參閱https://gist.github.com/rufinus/99f6808d0b4fe2b51530關於如何使用jquery Nestable插件實現此示例的示例 – Rufinus