Doctrine 2自定义ObjectMultiCheckbox值

时间:2015-04-14 14:20:25

标签: php checkbox doctrine-orm zend-framework2 doctrine

如何使用DoctrineModule\Form\Element\ObjectMultiCheckbox自定义值?

我使用Zend\Form\Element\MultiCheckbox并设置了这样的值:

$this->add(array(
    'type' => 'Zend\Form\Element\MultiCheckbox',
    'name' => 'countries',
    'options' => array(
        'label' => 'Select countries',
        'value_options' => array(
            'value' => 1,
            'label' => 'United Kingdom',
            'continent' => 'Europe'
        )
    )
))

但现在我需要使用Doctrine 2 Multicheckbox,我需要设置自定义值选项。我怎么能这样做?

我目前只有这个:

$this->add(array(
    'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox',
    'name' => 'countries',
    'options' => array(
        'object_manager' => $this->em,
        'target_class'   => 'Module\Entity\Country'
    )
));

我需要这个用于自定义视图渲染。我想向这样的国家展示:

欧洲
  - 瑞典
  - 英国
  - 和其他人......

美国
  - 加拿大
  - 美国
  - 其他国家......

1 个答案:

答案 0 :(得分:2)

<强>解决!

我创建了一个新的表单元素:

ObjectMultiCheckbox:

namespace Application\Form\Element;

use Zend\Form\Element\MultiCheckbox;
use Zend\Stdlib\ArrayUtils;

class ObjectMultiCheckbox extends MultiCheckbox
{
    public function setValue($value)
    {
        if ($value instanceof \Traversable)
        {
            $value = ArrayUtils::iteratorToArray($value);

            foreach ($value as $key => $row)
            {
                $values[] = $row->getId();
            }

            return parent::setValue($values);
        }
        elseif ($value == null)
        {
            return parent::setValue(array());
        }
        elseif (!is_array($value))
        {
            return parent::setValue((array)$value);
        }
    }
}

它并不是很漂亮,但它将表单的对象处理为DoctrineModule\Form\Element\ObjectMultiCheckbox

我使用此代码的实体始终具有标识符'id',因此我可以使用静态代码,如下所示:$row->getId();它很难看,但它有效!