我想改變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,所以這是不可能的。
我在做什麼錯?
這也是在這裏討論https://github.com/l3pp4rd/DoctrineExtensions/issues/442 – peterrus
我實例如下: 代碼: '$ em = $ this-> getDoctrine() - > getEntityManager(); $ pagerepo = $ em-> getRepository('MyCorpCMSBundle:Page'); $ pagerepo-> setRepoUtils(新jsandjqTreeCompatibleRepositoryUtils());' 這是越來越朝着正確的方向,但是RepositoryUtils對象需要一些參數 '公共職能__construct($的ObjectManager OM,ClassMetadata $元,$聽衆,$回購)' 我在哪裏檢索這些? – peterrus