2016-07-19 8 views
2

У меня есть поле выбора (или выбора), которое должно получить все параметры от функции, которая возвращает массив.Как я могу получить доступ к пулу конфигурации в Symfony Sonata в классе Admin?

Это строка, определяющая поле выбора;

->add('possibilities', 'choice', array('choices' => Crud::enumStatus())) 

И это функция enumStatus;

public static function enumStatus() 
{ 
    return array(
     '1' => 'Awaiting Approval', 
     '2' => 'Partly Approved', 
     '3' => 'Approved', 
     '4' => 'Disapproved', 
     '5' => 'Complete' 
    ); 
} 

То, что я объяснил выше, работает отлично. Но то, что я действительно хочу, не работает. Принципы остаются неизменными.

Это то, что я хочу;

->add('possibilities', 'choice', array('choices' => Crud::getUsers(array('Marketing', 'Human Resource Management')))) 

И функция в том же классе, что и упомянутая выше;

public function getUsers($roles) 
{ 
    $queryBuilder = $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager('admin') 
      ->createQueryBuilder();     

    $queryBuilder->select('u.id, u.name') 
         ->from('Qi\Bss\BaseBundle\Entity\Admin\User', 'u') 
         ->innerJoin('u.businessRoles', 'r') 
         ->where('r.name IN (:roles)') 
         ->setParameter('roles', $roles) 
         ->orderby('u.name');   
    $result = $queryBuilder->getQuery()->getResult();  

    $users = array(); 
    foreach ($result as $key => $value) { 
     $users[$value['id']] = $value['name']; 
    } 

    return $users;   
} 

Ошибка при попытке что я хочу;

Пытались вызвать метод "getConfigurationPool" на классе "Xx \ Yyy \ QqqBundle \ Controller \ OrderController".

Контроллер, упомянутый в сообщении об ошибке, является контроллером, где -> add() для моей формы, а не там, где эти две функции.

Почему первый работает, а второй нет? Может кто-нибудь, пожалуйста, объясните мне это? Это как-то связано с static в одной функции? И как я могу решить эту проблему? Что такое configurationPool и как его получить?

Я использую Соната Admin Bundle и Symfony.

+0

Извините, в конце я задаю слишком много вопросов. Давайте позаботимся о том, как исправить выбор и получить правильную информацию из метода getUsers и ошибки getConfigurationPool. –

+0

Не должен быть ваш вопрос под названием «Как получить доступ к пулу конфигурации?» – pbenard

+0

Хорошо, да, это звучит лучше. Изменит его. –

ответ

1

Пожалуйста, взгляните на это official doc.

ConfigurationPool => конфигурация бассейн, где все экземпляры класса администратора хранится

$this->getConfigurationPool() Я думаю, что это копия паста из класса Admin.

Чтобы получить доступ к пулу конфигурации внутри одного расширяющегося CRUDController, вам необходимо получить доступ к его собственности admin.

$this->admin->getConfigurationPool() 

Вот глава вашей функции:

public function getUsers($roles) 
{ 
    $queryBuilder = $this->admin->getConfigurationPool()->getContainer()->get('doctrine')->getManager('admin') 
      ->createQueryBuilder(); 

UPDATE:

Если ваш контроллер простой контроллер Symfony, так что вы просто должны назвать доктриной вместо получить бросок администратора ...

$queryBuilder = $this->get('doctrine')->getManager('admin') 
      ->createQueryBuilder(); 
+0

Я только что попробовал, и это не сработает. Эта функция находится в моем собственном классе администратора, простирающемся от администратора Sonata, а не от CRUDController. В некоторых классах администратора, где я использую функцию getUser, он работает отлично. –

+0

Странно, потому что ваша ошибка говорит, что он находится в OrderController – pbenard

+0

Да, я вызываю метод в OrderController, и этот метод находится в классе Admin. Мои контроллеры не распространяются от CRUDController, а от контроллера Symfony. Я не знаю, почему это так, но это именно то, как я получил его от предыдущего работодателя, который это сделал. И изменить его сейчас не будет хорошей идеей. –