Populate Multi select drop 下拉 zend 3

Populate Multi select drop drop down zend 3

大家好,我很难在表单中填充多 select 下拉列表。 到目前为止我尝试过的是为我的表单添加工厂,就像这样

class MovieFormFactory
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $entityManager = $container->get('doctrine.entitymanager.orm_default');
        $actors = $entityManager->getRepository(Actor::class)->findAll();
        $form = new MovieForm();
        $form->setActors($data);

        
        return $form;
    }

}

我的表格

Class MovieForm extends Form
{

    private $actors = [];
    public function setActors($actorsData){ 
      $this->actors = $actors
    }
    public function __construct()
    {
        parent::__construct('post-form');

        $this->setAttribute('method', 'post');

        $this->addElements();
        $this->addInputFilter();
        

      $this->add([
        'type'  => 'select',
        'name' => 'actors',
        'attributes' => [
            'id' => 'actors',
            'multiple' => true
        ],
        'options' => [
            'label' => 'Actors',
            'value_options' => $this->actors,
        ],
    ]);

        $this->add([
            'type'  => 'select',
            'name' => 'directors',
            'attributes' => [
                'id' => 'directors',
            ],
            'options' => [
                'label' => 'Director',
                'value_options' => $this->getOptionForSelect($directors),
            ],
        ]);

    }

    /**
     * This method adds elements to form (input fields and submit button).
     */
    protected function addElements()
    {

        // Add "title" field
        $this->add([
            'type'  => 'text',
            'name' => 'title',
            'attributes' => [
                'id' => 'title'
            ],
            'options' => [
                'label' => 'Title',
            ],
        ]);

        // Add "description" field
        $this->add([
            'type'  => 'textarea',
            'name' => 'description',
            'attributes' => [
                'id' => 'description'
            ],
            'options' => [
                'label' => 'Description',
            ],
        ]);

        // Add "tags" field
//        $this->add([
//            'type'  => 'text',
//            'name' => 'actors',
//            'attributes' => [
//                'id' => 'actors',
//                'multiple' => 'multiple'
//            ],
//            'options' => [
//                'label' => 'Actors',
//                'value_options' => $this->getOptionForSelect(),
//            ],
//        ]);

        // Add "status" field
        $this->add([
            'type'  => 'select',
            'name' => 'status',
            'attributes' => [
                'id' => 'status'
            ],
            'options' => [
                'label' => 'Status',
                'value_options' => [
                    MovieStatusEnum::STATUS_DRAFT => MovieStatusEnum::STATUS_DRAFT,
                    MovieStatusEnum::STATUS_PUBLISHED => MovieStatusEnum::STATUS_PUBLISHED,
                ]
            ],
        ]);

        // Add the submit button
        $this->add([
            'type'  => 'submit',
            'name' => 'submit',
            'attributes' => [
                'value' => 'Create',
                'id' => 'submitbutton',
            ],
        ]);
    }

    /**
     * This method creates input filter (used for form filtering/validation).
     */
    private function addInputFilter()
    {

        $inputFilter = new InputFilter();
        $this->setInputFilter($inputFilter);

        $inputFilter->add([
            'name'     => 'title',
            'required' => true,
            'filters'  => [
                ['name' => 'StringTrim'],
                ['name' => 'StripTags'],
                ['name' => 'StripNewlines'],
            ],
            'validators' => [
                [
                    'name'    => 'StringLength',
                    'options' => [
                        'min' => 1,
                        'max' => 1024
                    ],
                ],
            ],
        ]);

        $inputFilter->add([
            'name'     => 'description',
            'required' => true,
            'filters'  => [
                ['name' => 'StripTags'],
            ],
            'validators' => [
                [
                    'name'    => 'StringLength',
                    'options' => [
                        'min' => 1,
                        'max' => 4096
                    ],
                ],
            ],
        ]);

        $inputFilter->add([
            'name'     => 'actors',
            'required' => true,
        ]);

        
    }

    private function getOptionForSelect($data)
    {
        foreach ($data as $person) {
            $selectData[$person->getId()] = $person->getName();
        }
        return $selectData;
    }

}

这是我在module.config.php

注册的工厂
 'form_elements' => [
        'factories' => [
            Form\MovieForm::class => Form\Factory\MovieFormFactory::class
        ]
    ],

但似乎没有任何效果我无法在制作电影时展示我的演员并且在编辑电影时无法展示 selected 演员可以请一些人在这里指导我我是 zend 的新手。

在构造函数中,value_options' => $this->actors行是错误的,因为$this->actors还没有设置。在你的工厂你写:

$form = new MovieForm();
$form->setActors($data);

因此,您必须在 class MovieForm 中声明 public 方法 setActors(),它将负责设置选项数组。

public function setActors($array)
{
    $this->get('actors')->setValueOptions($array);
}