为选择元素添加值选项

时间:2017-07-15 19:07:09

标签: zend-framework2

我正在尝试使用Zend Framework 2的表单类为select对象设置多个值,但它只传递一个值。这是我的代码:

ans.length - 2

我知道它与$ album_name有关,但我不知道如何使用它来获取所有目录(如果我尝试通过[]写入$ album_name),我收到警告

public function addphotosAction()
{
    $identity = $this->identity();
    $files = array();
    $album_name = array();

    foreach (glob(getcwd() . '/public/images/profile/' . $identity . '/albums/*', GLOB_ONLYDIR) as $dir) {
        $album_name = basename($dir);

        $files[$album_name] = glob($dir . '/*.{jpg,png,gif,JPG,PNG,GIF}', GLOB_BRACE);
    }

    $form = new AddPhotosForm();

    $form->get('copy-from-album')->setValueOptions(array($album_name));

    return new ViewModel(array('form' => $form, 'files' => $files));
}

`Warning: Illegal offset type in C:\xampp\htdocs\module\Members\src\Members\Controller\ProfileController.php on line 197` 行。

正如我所说的,我对如何编辑它以获取所有目录感到茫然。

任何帮助都将不胜感激。

谢谢!

以下是我要描述的内容的屏幕截图:http://imgur.com/OGifNG9 (存在多个目录,但只有一个目录在选择菜单中列出)。

1 个答案:

答案 0 :(得分:1)

我真的建议你去工厂做。使用工厂,您将编写此代码一次,并可以在代码中的其他位置使用它。出于面向对象的原因,我应该使用PHP自己的DirectoryIterator类而不是glob。控制器中的代码应尽可能小。请查看以下示例代码。

具有目录迭代器的表单工厂

表单工厂为表单实例初始化表单类,因此该代码不会显示在控制器中。例如,您可以将其重新用于继承的编辑表单。

<?php
namespace Application\Form\Factory;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Application\Form\AddPhotosForm;

class AddPhotosFormFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $oServiceLocator)
    {
        $oParentLocator = $oServiceLocator->getServiceLocator();

        // please adjust the dir path - this is only an example
        $aDirectories = [];
        $oIterator = new \DirectoryIterator(__DIR__);

        // iterate and get all dirs existing in the path
        foreach ($oIterator as $oFileinfo) {
            if ($oFileinfo->isDir() && !$oFileinfo->isDot()) {
                $aDirectories[$oFileinfo->key()] = $oFileinfo->getFilename();
            }
        }

        // set option attribute for select element with key => value array of found dirs
        $oForm = new AddPhotosForm();
        $oForm->get('mySelectElement')
            ->setAttributes('options', $aDirectories);

        return $oForm;
    }
}

这就是工厂本身。您唯一需要做的就是将其写在 module.config.php 文件中。

...
'form_elements' => [
    'factories' => [
        AddPhotosForm::class => AddPhotosFormFactory::class,
    ],
],
...

使用::class不仅可以清除内容,还可以减少使用字符串,这样可以在IDE中轻松记住类名自动完成功能。

控制器

在工厂我们清理了控制器。在控制器代码中应尽可能小。使用工厂是许多问题的解决方案,这可能在以后的编码过程中发生。所以保持它总是干净简单。

...
public function indexAction()
{
    $oForm = $this->getServiceManager()
        ->get('FormElementManager')
        ->get(AddPhotosForm::class);

    return [
        'form' => $oForm,
    }
}

到目前为止,这都是控制器的全部内容。您的选择元素已在工厂中填充,您的控制器易于理解且应尽可能小。