Вопрос по drop-down-menu, zend-framework2, php – Создайте выпадающий список в Zend Framework 2

5

Я знаю, что это звучит намного проще, но я хочу опубликовать свой вопрос, поскольку он связан с Zend Framework 2. Я знаю эту форму из примера модуля Zend.

namespace Album\Form;

use Zend\Form\Form;

class AlbumForm extends Form
{
    public function __construct($name = null)
    {
        // we want to ignore the name passed
        parent::__construct('album');
        $this->setAttribute('method', 'post');
        $this->add(array(
            'name' => 'id',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));
        $this->add(array(
            'name' => 'artist',
            'attributes' => array(
                'type'  => 'text',
            ),
            'options' => array(
                'label' => 'Artist',
            ),
        ));
        $this->add(array(
            'name' => 'title',
            'attributes' => array(
                'type'  => 'text',
            ),
            'options' => array(
                'label' => 'Title',
            ),
        ));
        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Go',
                'id' => 'submitbutton',
            ),
        ));
    }
}

И это называется так

<?php
$form = $this->form;
$form->setAttribute('action', $this->url('album', array('action' => 'add')));
$form->prepare();

echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('title'));
echo $this->formRow($form->get('artist'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();

Как я могу добавить выпадающий список для поля художника, где список хранится в ассоциативном массиве. Так как я попал в Zend Framework 2, я хотел получить предложения от экспертов. Я следовалэтот предыдущий пост но это было несколько непонятно для меня.

решил это, назначив опции в контроллере 125369

Ваш Ответ

1   ответ
11

....

$this->add(array(
    'type' => 'Zend\Form\Element\Select',
    'name' => 'number'
    'options' array(
        'options' => array( '1' => 'one', '2', 'two' )
    )
));

Be warned....

Поскольку вы создаете форму в конструкторе, у вас не будет доступа к ServiceManger. Это может вызвать проблемы, если вы хотите заполнить из базы данных.

Давайте попробуем что-то вроде ...

class AlbumForm extends Form implements ServiceManagerAwareInterface
{

public function __construct()
{
    ....

    $this->add(array(
        'type' => 'Zend\Form\Element\Select',
        'name' => 'number'
    ));

    ....
}

....

public function initFormOptions()
{
    $this->get('number')->setAttribute('options', $this->getNumberOptions());
}

protected function getNumberOptions()
{
    // or however you want to load the data in
    $mapper = $this->getServiceManager()->get('NumberMapper');
    return $mapper->getList();
}

public function getServiceManager()
{
    if ( is_null($this->serviceManager) ) {
        throw new Exception('The ServiceManager has not been set.');
    }

    return $this->serviceManager;
}

public function setServiceManager(ServiceManager $serviceManager)
{
    $this->serviceManager = $serviceManager;
}

But that's not great, rethink...

Расширение формы, так что вы можете создать форму, не совсем правильно. Мы не создаем новый тип формы, мы просто настраиваем форму. Это требует фабрики. Кроме того, преимущества использования фабрики здесь заключаются в том, что мы можем настроить ее таким образом, чтобы мы могли использовать диспетчер сервисов для его обслуживания, чтобы менеджер сервисов мог внедрить себя вместо того, чтобы мы делали это вручную из контроллера. Другое преимущество заключается в том, что мы можем вызывать эту форму всякий раз, когда у нас есть менеджер сервисов.

Еще один момент, на который стоит обратить внимание, это то, что там, где это имеет смысл, я думаю, лучше выводить код из контроллера. Контроллер не является дампом сценария, поэтому приятно иметь объекты, которые заботятся о себе. То, что я пытаюсь сказать, - это то, что хорошо внедрить объект с необходимыми ему объектами, но не хорошо просто передать ему данные из контроллера, потому что это создает слишком большую зависимость.Don't spoon feed objects from the controller, inject the spoon.

Во всяком случае, слишком много разглагольствовать больше кода ...

class MySpankingFormService implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceManager )
    {
        $mySpankingNewForm = new Form;

        // build that form baby,
        // you have a service manager,
        // inject it if you need to,
        // otherwise just use it.

        return $mySpankingNewForm;
    }
}

контроллер

<?php

class FooController
{
    ...
    protected function getForm()
    {
        if ( is_null($this->form) ) {
            $this->form =
                $this->getServiceManager()->get('MySpankingFormService');
        }
        return $this->form;
    }
    ...
}

module.config.php

...
'service_manager' => array (
        'factories' => array (
            ...
            'MySpankingFormService'
                => 'MyNameSpacing\Foo\MySpankingFormService',
            ...
@ Эльзо - для меня это был захват DI и конфигурации времени выполнения. Я работал полный рабочий день над проектом с использованием ZF2 в течение 9 недель, и я только что встал на ноги. Вроде, как бы, что-то вроде.
Внедрение диспетчера служб выполняется точно так же, как если бы вы вводили что-либо еще, но вызывая общедоступный установщик извне объекта. Тем не менее, это не здорово, так как вы должны постоянно об этом рассказывать, как о нежелательной сироте. В этом примере это не кажется слишком сложным, но быстро выходит из-под контроля. Я придерживаюсь того, что сказал ранее, помещать фабрику в конструктор удобно, но это не очень хороший шаблон и, конечно, не тот, который хорошо подходит для ZF2. по крайней мере, по моему опыту.
DonT & APOS; у меня достаточно времени, чтобы скорректировать этот ответ для примера с альбомом, но я рассмотрю возможность добавления примера в сообщение в блоге, если будет достаточно интереса.
Формы ZF2 более запутанны, чем ZF1
@tomwrong, спасибо за такой сложный пример, но, тем не менее, Эльзо сказал, что формы ZF2 более запутанны, и было бы гораздо полезнее для таких парней, как я, которые обязательно посетят этот пост в будущем в погоне за ZF2, в случае, если смогут тот же код для стандартного примера альбома. Я имею в виду, что ваше объяснение было хорошим, не могли бы вы показать нам, как адаптировать то же самое для стандартного модуля Album, особенно для внедрения сервис-менеджера. Может быть, мы просим слишком много, но, как новички, легко последовать примеру модуля Album и интерпретировать ваше удивительное объяснение на грани принятия :) 125369

Похожие вопросы