的實際問題是,Zend的形式不與尚未發送的值理會,並在排空收集的情況下,您只需將不會發送任何數據,這是爲什麼表格忽略集合,導致表單和/或其字段集不告訴他們的水化器對集合進行任何更改。
最終,您可以責怪this函數,該函數刪除從傳遞給「setData」的數組中未表示的表單中提取的過濾數據。
我管理通過重寫形式的「使用setData」功能附加地處理所傳遞的數據,以包括空數組爲仍處於字段集集合來解決這個問題,但在數據陣列中未表示:
namespace Module\Form;
class Form extends \Zend\Form\Form
{
/**
* Fill the passed data array with placeholder arrays for collections
* existing in the passed fieldset (and its sub-fieldsets) but not
* represented in the data array.
*
* @param \Zend\Form\FieldsetInterface $fieldset
* @param array $data
* @return array
*/
protected static function assertCollectionPlaceholders(\Zend\Form\FieldsetInterface $fieldset, array $data)
{
foreach ($fieldset as $name => $elementOrFieldset) {
if (!$elementOrFieldset instanceof \Zend\Form\FieldsetInterface) {
continue;
}
if (array_key_exists($name, $data) && is_array($data[$name])) {
$data[$name] = static::assertCollectionPlaceholders($elementOrFieldset, $data[$name]);
} else if ($elementOrFieldset instanceof \Zend\Form\Element\Collection) {
$data[$name] = array();
}
}
return $data;
}
/**
* Set data to validate and/or populate elements
*
* Typically, also passes data on to the composed input filter.
*
* @see \Zend\Form\Form
* @param array|\ArrayAccess|Traversable $data
* @return self
* @throws \Zend\Form\Exception\InvalidArgumentException
*/
public function setData($data)
{
if ($data instanceof \Traversable) {
$data = \Zend\Stdlib\ArrayUtils::iteratorToArray($data);
}
if (!is_array($data)) {
throw new \Zend\Form\Exception\InvalidArgumentException(sprintf(
'%s expects an array or Traversable argument; received "%s"',
__METHOD__,
(is_object($data) ? get_class($data) : gettype($data))
));
}
$data = static::assertCollectionPlaceholders($this, $data);
$this->hasValidated = false;
$this->data = $data;
$this->populateValues($data);
return $this;
}
}
通過這樣做,表單和/或其字段集告訴他們水化器集合是空的,並且在Doctrine的水化器的情況下,提示他們移除集合中沒有的元素。