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