我正在尝试使用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 (存在多个目录,但只有一个目录在选择菜单中列出)。
答案 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,
}
}
到目前为止,这都是控制器的全部内容。您的选择元素已在工厂中填充,您的控制器易于理解且应尽可能小。