2016-04-02 4 views
0

Таким образом, у меня есть связь «один-ко-многим» между пользовательской таблицей и пользовательскими кредиторами. При написании отчетов пользователю необходимо выбрать, к какому из его кредиторов подключиться. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу вернуть только зарегистрированных пользователей кредиторов с помощью DoctrineSelect, а не каждого кредитора в базе данных. Я не уверен, как ограничить DoctrineSelect идентификатором зарегистрированного пользователя.Doctrine Select - как выбрать конкретные данные пользователей

Это то, что я сделал до сих пор:

клиент -> кредитор

В моей FIELDSET я следующее:

$this->add(
     [ 
      'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
      'name' => 'creditor', 
      'options' => [ 
       'object_manager' => $this->objectManager, 
       'target_class' => 'Debtor\Entity\Creditor', 

       'label_generator' => function($targetEntity) { 
         return $targetEntity->getTitle() . ' - ' . $targetEntity->getFirstName() . ' - ' . $targetEntity->getLastName(); 
        }, 
       'label' => 'Creditor', 
       'instructions' => 'Attach creditors to this report' 

      ], 
      'attributes' => [ 
       'multiple' => true, 
       'required' => 'required', 
      ] 
     ] 
    ); 

К сожалению, это придает всем кредиторам форме как и те, которые принадлежат пользователю.

Итак, чтобы решить эту я создал следующий класс:

<?php 
namespace Application\Form; 
use Debtor\Service\CreditorService; 
use Zend\Form\View\Helper\FormElement as BaseFormElement; 
use Zend\Form\ElementInterface; 

class FormElement extends BaseFormElement 
{ 
    public function __construct(
     CreditorService $creditorService 
    ) 
    { 
     $this->creditorService = $creditorService; 
    } 

    /** 
    * This function overrides the ZendFormElement method which allows us to set the format of our own elements if required 
    * @param ElementInterface $element 
    * @return string 
    */ 
    public function render(ElementInterface $element) 
    { 

     $attributes = $element->getAttributes(); 

     if (isset($attributes['customElement'])) 
     { 
      $customElement = $attributes['customElement']; 

      switch($customElement) { 

       case 'getCreditors': 
        $creditors = $this->creditorService->findUserCreditors(); 
        $element->setValueOptions($creditors); 
        break; 
      } 
     } 

     return parent::render($element); 
    } 
} 

В моей FIELDSET теперь у меня есть это:

$this->add(
      [ 
       'type' => 'select', 
       'name' => 'creditor', 
       'options' => [ 
        'label' => 'Creditor', 
        'instructions' => 'Attach creditors to this report', 
       ], 
       'attributes' => [ 
        'multiple' => true, 
        'required' => 'required', 
        'class' => 'form-control input-medium select2me', 
        'customElement' => 'getCreditors', <-***************** 
       ] 
      ] 
     ); 

Где мой класс ищет customElement, если обнаружено, что возвращает клиентов кредиторы, использующие следующий код в моем кредиторе:

/** 
    * @return array 
    */ 
    public function findUserCreditors() 
    { 
     $creditors = $this->findByUserAuth(); 
     $creditorArray = []; 

     foreach ($creditors AS $creditorObject) 
     { 
      $creditorArray[$creditorObject->getId()] = $creditorObject->getName(); 
     } 

     return $creditorArray; 

    } 

Это wo rck удовольствие с одной небольшой проблемой. Когда я отредактировать отчет, форма не заранее выбора ранее выбранных кредиторов в раскрывающемся ...

Мой вопрос, хотя это:

Есть ли способ использовать DoctrineSelect и используя мои AuthenticationService, получить зарегистрированный идентификатор пользователей и вернуть конкретные данные?

+0

Почему бы не создать пользовательский элемент выбора (http://stackoverflow.com/questions/34825701/how-to-load-select-option-from-database-in-zf2/34829272#answer-34829272). Все, что вам понадобится, - это сервисная фабрика, зарегистрированная менеджером элемента формы. Эта фабрика может заполнить параметры и получить аутентифицированного пользователя. Если элемент select не очень прост, я лично считаю, что никогда не нужно использовать Doctrine 'ObjectSelect' над настраиваемым элементом. – AlexP

ответ

0

Это было мое решение.

Использование примера 3 из here и предложение об этом post.

Я сделал следующее:

  1. создал хранилище
  2. Литьевой мою службу аутентификации в мою форму и включал в себя authService как пары в поле.

Мой FIELDSET:

$this->add(
     [ 
      'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
      'name' => 'creditor', 
      'options' => [ 
       'label' => 'Creditor: ', 
       'object_manager' => $this->objectManager, 
       'target_class' => 'Debtor\Entity\Report', 
       'property' => 'Report', 
       'is_method' => true, 
       'find_method' => [ 
        'name' => 'findUserCreditors', 
        'params' => [ 
         'authService' => $this->authService 
        ], 
       ] 
      ], 
      'attributes' => [ 
       'multiple' => true, 
       'required' => 'required', 
       'class' => 'form-control input-medium select2me', 
      ] 
     ] 
    ); 

И добавил репозиторий в моем докладе лица путем обновления аннотации следующим образом:

/** 
* @ORM\Entity(repositoryClass="CustomRepository") 
* @ORM\Table(name="report") 
*/ 
class Report 
{ 

И, наконец, добавил класс репозитория:

<?php 
namespace Debtor\Entity; 

use Customer\Service\AuthenticationService; 
use Doctrine\ORM\EntityRepository; 

class CreditorRepository extends EntityRepository 
{ 
    public function findUserCreditors(AuthenticationService $authService) 
    { 
     $userObject = $authService->getIdentity(); 

     $qb = $this->createQueryBuilder('c') 
      ->orderBy('c.created', 'ASC'); 

     $qb->where('c.user = :user') 
      ->setParameter('user' , $userObject); 

     $result = $qb->getQuery()->getResult(); 

     return $result; 
    } 
} 

Если вы боретесь или получаете ошибку, du mp данные репозитория и убедитесь, что он возвращает правильные объекты.