Php 如何使用jQuery动态编辑集合字段(ZF2)
我有一个用ZF2创建的集合。HTML代码按如下方式查找eg:Php 如何使用jQuery动态编辑集合字段(ZF2),php,jquery,zend-framework2,Php,Jquery,Zend Framework2,我有一个用ZF2创建的集合。HTML代码按如下方式查找eg: <fieldset id="benutzer"> <legend>Team</legend> <div class="controls-row"> <span data-template="<input type="hidden" name="projekt[benutzer][__placeholder__][benutzerid]" class="benutzerid"
<fieldset id="benutzer">
<legend>Team</legend>
<div class="controls-row">
<span data-template="<input type="hidden" name="projekt[benutzer][__placeholder__][benutzerid]" class="benutzerid" value=""><input name="projekt[benutzer][__placeholder__][benutzername]" class="benutzername" title="Kollege" placeholder="Name" type="text" value=""><input type="hidden" name="projekt[benutzer][__placeholder__][bearbeiten]" value="0"><input type="checkbox" name="projekt[benutzer][__placeholder__][bearbeiten]" title="Bearbeiten" class="bearbeiten" value="1"><input name="projekt[benutzer][__placeholder__][bemerkung]" title="Bemerkung" placeholder="Bemerkung" type="text" value="">"></span>
<input type="hidden" value="4" class="benutzerid" name="todo[benutzer][0][benutzerid]">
<input type="text" value="Julian" placeholder="Name" title="Kollege" class="benutzername" name="todo[benutzer][0][benutzername]">
<input type="hidden" value="0" name="todo[benutzer][0][bearbeiten]">
<input class="bearbeiten" type="checkbox" checked="checked" value="1" title="Bearbeiten" name="todo[benutzer][0][bearbeiten]">
<input type="text" value="" placeholder="Bemerkung" title="Bemerkung" name="todo[benutzer][0][bemerkung]">
<div>
<div class="row">
<input type="hidden" value="5428" class="benutzerid" name="todo[benutzer][0][benutzerid]">
<input type="text" value="Hans" placeholder="Name" title="Kollege" class="benutzername" name="todo[benutzer][0][benutzername]">
<input type="hidden" value="0" name="todo[benutzer][0][bearbeiten]">
<input class="bearbeiten" type="checkbox" checked="checked" value="1" title="Bearbeiten" name="todo[benutzer][0][bearbeiten]">
<input type="text" value="" placeholder="Bemerkung" title="Bemerkung" name="todo[benutzer][0][bemerkung]">
<div>
</fieldset>
删除集合中的行:
$.fn.resortCollection = function (){ // execute with Collection-Fieldset!
$c = 0;
$fieldset = $(this);
// re-sort the rows, indexes
$.each( $fieldset.find('.controls-row'), function(){
$html = $(this).html();
$newhtml = $html.replace(/\[\d+\]/g, '['+$c+']');
$(this).html($newhtml);
$c++;
});
};
$.fn.deleteRow = function (){
var $row = this.closest('div.controls-row');
var $fieldset = $row.closest('fieldset');
$($row).remove();
$fieldset.resortCollection();
};
如何在对行重新排序时访问DOM的当前状态(包括所做的更改)?实际上
Zend\Form\Element\Collection
保留集合的键。我发现的唯一问题是,如果最初使用选项count
>0定义集合,例如:
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'data',
'options' => array(
'count' => 2,
'allow_add' => true,
)
));
它将始终在集合的开头添加与您使用count
选项定义的一样多的缺失元素。从上面的示例中,如果集合中缺少索引,它将添加索引为0
和1
的元素
我通过扩展Zend\Form\Element\Collection
并重写一个方法修复了这个问题:
namespace MyNamespace;
use Zend\Form\Element\Collection as ZendCollection;
use Zend\Form\Exception;
use Traversable;
class MyCollection extends ZendCollection
{
public function populateValues($data)
{
if (!is_array($data) && !$data instanceof Traversable) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects an array or Traversable set of data; received "%s"',
__METHOD__,
(is_object($data) ? get_class($data) : gettype($data))
));
}
if (sizeof($data)){
foreach ($this->byName as $name => $element) {
if (!isset($data[$name])) {
$this->remove($name);
}
}
}
parent::populateValues($data);
}
}
希望它能帮助您简化代码
namespace MyNamespace;
use Zend\Form\Element\Collection as ZendCollection;
use Zend\Form\Exception;
use Traversable;
class MyCollection extends ZendCollection
{
public function populateValues($data)
{
if (!is_array($data) && !$data instanceof Traversable) {
throw new Exception\InvalidArgumentException(sprintf(
'%s expects an array or Traversable set of data; received "%s"',
__METHOD__,
(is_object($data) ? get_class($data) : gettype($data))
));
}
if (sizeof($data)){
foreach ($this->byName as $name => $element) {
if (!isset($data[$name])) {
$this->remove($name);
}
}
}
parent::populateValues($data);
}
}