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 を始めたので、専門家からの提案が必要でした。この前の投稿に従いましたが、私にはやや不明確でした。

4

1 に答える 1

11

これは、静的オプションに対して行う 1 つの方法です。

....

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

注意してください....

コンストラクター内でフォームを作成しているため、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;
}

しかし、それは素晴らしいことではありません。考え直してください...

フォームを作成できるようにフォームを拡張することは、まったく正しくありません。新しいタイプのフォームを作成するのではなく、フォームを設定するだけです。これには工場が必要です。また、ここでファクトリを使用する利点は、サービス マネージャを使用してサービスを提供できるように設定できることです。この方法では、コントローラから手動で行う代わりに、サービス マネージャが自分自身を注入できます。もう 1 つの利点は、サービス マネージャーがあればいつでもこのフォームを呼び出せることです。

もう 1 つの重要な点は、それが理にかなっている場合は、コントローラーからコードを取り除く方がよいと思うということです。コントローラーはスクリプト ダンプではないので、オブジェクトが自分自身を管理できるようになっていると便利です。私が言おうとしているのは、オブジェクトに必要なオブジェクトを注入するのは良いことですが、コントローラーからデータを渡すだけでは依存関係が大きくなりすぎるため、問題があるということです。コントローラーから飼料オブジェクトをスプーンではなく、スプーンを注入します。

とにかく、コードが多すぎます...

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',
            ...
于 2012-09-17T14:56:39.247 に答える