Intereting Posts
Имя таблицы как параметр с использованием подготовленного оператора PDO / MySQL В CakePHP, как вы можете определить, было ли поле изменено в действии редактирования? Как создать динамическую ассоциацию сущностей с Doctrine2 в Symfony2 Как установить поле объекта, которое не существует в таблице, но существует в необработанном SQL как псевдоним? wordpress, получить имена категорий для настраиваемого типа сообщений Логическая ошибка для отображения данных таблицы MySQL создание маршрутизатора PHP Каков максимальный размер для $ _SESSION? mod_rewrite работает на localhost, но не на сервере Отправка данных в веб-службу с использованием сообщения Многоуровневое меню из записей базы данных Как получить доступ к n-му объекту в объекте коллекции Laravel? Передача данных на другую страницу после отправки формы с помощью PHP json синтаксический анализ php foreach Ошибка PHP и MYSQLI, вызов функции-функции члена () для не-объекта

Переопределение метода DoctrineExtensions в StofDoctrineExtensions

Я пытаюсь изменить поведение метода Gedmo \ Tree \ RepositoryUtils-> buildTree (), потому что я хотел бы изменить способ построения возвращаемого массива.

Я стараюсь:

У меня есть класс:

<?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'); 

Но поскольку это не джава, это невозможно.

Что я делаю не так?

Может быть, немного поздно, но мне нужно было сделать то же самое – вот решение на тот случай, если кому-то это понадобится:

Ваш класс хранилища:

 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()) { } }