(Symfony 4 Forms) Передача результатов не-сущностного запроса в функцию формы - PullRequest
0 голосов
/ 15 января 2019

Я не знаю, как сказать моему классу типа формы принять параметр функции choice_value для входящего массива ключ / значение.

Вот как выглядит моя функция buildForm типа формы:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('tiers', ChoiceType::class, [
            'choices'  => $this->userSubscriptionTierRepository->getTiersSubscribedToByUser($this->userProvider->getCurrentUser()),
            'choice_label' => 'name',
            'required' => false,
            'multiple' => true,
            'expanded' => false,
            'attr'=> array('class'=>'custom-select'),
            'choice_value' => function (array $val /* this is wrong */) {
                return $val['tierNumber'];
            }
            ])
    ;
}

Внизу, где 'choice_value', я не знаю, как правильно объявить функцию, чтобы принять входящее значение.

Вот как выглядит функция "getTiersSubscribeedToByUser" для выбора:

/**
 * @param User $user
 * @return array
 */
public function getTiersSubscribedToByUser(User $user) : array
{
    $qb = $this->createQueryBuilder('t');
    $qb->select('t.tierNumber, COUNT(t.tierNumber)')
        ->innerJoin('t.subscriptions', 'subscriptions', 'WITH', 'subscriptions.isCancelled != :true')
        ->where('subscriptions.subscriber = :user')
        ->groupBy('t.tierNumber')
        ->orderBy('t.tierNumber', 'ASC')
        ->setParameter('user', $user)
        ->setParameter('true', true);

    $query = $qb->getQuery();
    return $query->getResult();
}

А вот как выглядят результаты getTiersSubscribeedToByUser:

array:3 [▼
  0 => array:2 [▼
    "tierNumber" => 1
    1 => "2"
  ]
  1 => array:2 [▼
    "tierNumber" => 2
    1 => "1"
  ]
  2 => array:2 [▼
    "tierNumber" => 3
    1 => "1"
  ]
]

Итак, я должен указать значение выбора класса типа формы, чтобы принять то, что выглядит следующим образом:

1 => array:2 [▼
        "tierNumber" => 2
        1 => "1"

Как мне это сделать?

Это дает мне ошибку:

Argument 1 passed to App\Form\FeedFilterType::App\Form\{closure}() must be of the type array, integer given

1 Ответ

0 голосов
/ 15 января 2019

Значение выбора даст вам именно то, что он говорит, ценность каждого выбора. Если вы отправляете $val['tierNumber'], в соответствии с данным массивом, вы получите целое число true, но оно ожидает массив.

Согласно документации для choice_value:

This can be a callable or a property path. If null is given, an incrementing integer is used as the value. If you pass a callable, it will receive one argument: the choice itself.

Поскольку вы не используете EntityType, вам не нужно обрабатывать choice_value, поскольку ваш выбор не является объектом:

Если вы передадите вызываемый объект, он получит один аргумент: выбор сам. При использовании поля EntityType аргумент будет объект сущности для каждого выбора или нуль в некоторых случаях, которые вам нужно рукоятка:

'choice_value' => function (MyOptionEntity $entity = null) {
    return $entity ? $entity->getId() : '';
},

Вы пытались не использовать choice_value?

Документация здесь: https://symfony.com/doc/4.1/reference/forms/types/choice.html#choice-value

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...