gpt4 book ai didi

zend-framework - Zend 框架嵌套复选框

转载 作者:行者123 更新时间:2023-12-04 04:30:01 24 4
gpt4 key购买 nike

我想创建一个 Zend_Form带有嵌套复选框。我确定这是可能的,但我不记得怎么做。这是它的样子:

[x] Top level checkbox 1
[ ] Sub level 1
[x] Sub level 2

[ ] Top level 2
[ ] Sub level 1
[ ] Sub level 2

我将如何实现这个结果?

最佳答案

这个问题我有一个解决方案。这不是最好的,但现在对我来说已经足够了。

首先,您需要将传递给表单的有效数组。
如果您从数据库中选择数据,您的数组将具有类似的结构:

array(
0=>array(
'id'=>1,
'name'=>'Top level 1',
'parent_id'=>0
)
1=>array(
'id'=>2,
'name'=>'Top level 2',
'parent_id'=>0
)
2=>array(
'id'=>3,
'name'=>'Sub level 1',
'parent_id'=>1
)
3=>array(
'id'=>4,
'name'=>'Sub level 2',
'parent_id'=>1
)
4=>array(
'id'=>5,
'name'=>'Sub level 1',
'parent_id'=>2
)
5=>array(
'id'=>6,
'name'=>'Sub level 1',
'parent_id'=>2
)
)

您需要转换此数组。我已经使用了过滤器:
class My_Filter_Array_ParentRelation implements Zend_Filter_Interface {


public function __construct() {
}

public function filter($arr) {
$data = array();
foreach ( $arr as $value ) {
$data[$value['parent_id']][$value['id']] = $value['name'];
}
$data = $this->create($data, 0,0);

return $data;
}

public function create($data, $pid=0,$l) {
$new_data = array();
if ( $data[$pid] ) {
foreach ($data[$pid] as $id => $value) {
$new_data[$id] = str_repeat('---',$l).$value;
if(isset($id)) {
$temp_data = $this->create($data, $id,$l+1);
$new_data = $new_data + $temp_data;
}
}
}

return $new_data;
}
}

这个过滤器有什么作用?它返回一个相对于父元素排序的一维数组。嵌套级别标记为“---”。例子:
array(
1=>'Top level 1',
3=>'---Sub level 1',
4=>'---Sub level 2',
2=>'Top level 2',
5=>'---Sub level 1',
6=>'---Sub level 2'
)

然后我创建表单。它具有特定的元素 category_id。我将为它设置 View 助手。
class My_Form_Product extends Zend_Form {

protected $_categories = array();

public function init() {
$this
->addElement('multiCheckbox', 'category_id', array('label' => 'Category:', 'required' => true, 'multiOptions' => $this->getCategories()));

$this->category_id->helper = 'MultiCheckbox';
}

public function setCategories($categories = array()) {
$this->_categories = $categories;
return $this;
}

public function getCategories() {
return $this->_categories;
}
}

然后你需要查看助手代码:
class My_View_Helper_MultiCheckbox extends Zend_View_Helper_FormElement
{

protected $_inputType = 'checkbox';


protected $_isArray = false;

public function MultiCheckbox($name, $value = null, $attribs = null,
$options = null, $listsep = "\n")
{

$info = $this->_getInfo($name, $value, $attribs, $options, $listsep);
extract($info); // name, value, attribs, options, listsep, disable
$listsep = "\n";

// retrieve attributes for labels (prefixed with 'label_' or 'label')
$label_attribs = array();
foreach ($attribs as $key => $val) {
$tmp = false;
$keyLen = strlen($key);
if ((6 < $keyLen) && (substr($key, 0, 6) == 'label_')) {
$tmp = substr($key, 6);
} elseif ((5 < $keyLen) && (substr($key, 0, 5) == 'label')) {
$tmp = substr($key, 5);
}

if ($tmp) {
// make sure first char is lowercase
$tmp[0] = strtolower($tmp[0]);
$label_attribs[$tmp] = $val;
unset($attribs[$key]);
}
}

$labelPlacement = 'append';
foreach ($label_attribs as $key => $val) {
switch (strtolower($key)) {
case 'placement':
unset($label_attribs[$key]);
$val = strtolower($val);
if (in_array($val, array('prepend', 'append'))) {
$labelPlacement = $val;
}
break;
}
}

// the radio button values and labels
$options = (array) $options;

// build the element
$xhtml = '';
$list = array();

// should the name affect an array collection?
$name = $this->view->escape($name);
if ($this->_isArray && ('[]' != substr($name, -2))) {
$name .= '[]';
}

// ensure value is an array to allow matching multiple times
$value = (array) $value;

// XHTML or HTML end tag?
$endTag = ' />';
if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) {
$endTag= '>';
}

// add radio buttons to the list.
$filter = new Zend_Filter_Alnum();
foreach ($options as $opt_value => $opt_label) {

// Should the label be escaped?
if ($escape) {
$opt_label = $this->view->escape($opt_label);
}

// is it disabled?
$disabled = '';
if (true === $disable) {
$disabled = ' disabled="disabled"';
} elseif (is_array($disable) && in_array($opt_value, $disable)) {
$disabled = ' disabled="disabled"';
}

// is it checked?
$checked = '';
if (in_array($opt_value, $value)) {
$checked = ' checked="checked"';
}

// generate ID
$optId = $id . '-' . $filter->filter($opt_value);

// Wrap the radios in labels
$wrapper_start = '';
$wrapper_end = '</label><br >';
$level = substr_count($opt_label,'---');
$opt_label = str_replace('---','',$opt_label);
$label = '<label '. $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' .$opt_label;
$radio = (('prepend' == $labelPlacement) ? $label : '')
. str_repeat('&nbsp;&nbsp;&nbsp;',$level).'<input type="' . $this->_inputType . '"'
. ' name="' . $name . '"'
. ' id="' . $optId . '"'
. ' value="' . $this->view->escape($opt_value) . '"'
. $checked
. $disabled
. $this->_htmlAttribs($attribs)
. $endTag .' '
. (('append' == $labelPlacement) ? $label : '');
$text = $wrapper_start . $radio . $wrapper_end;

// add to the array of radio buttons
$list[] = $text;
}

// done!
$xhtml .= implode($listsep, $list);

return $xhtml;
}
}

此助手将找到标记 '---' 并在复选框前设置三个间隔符 ( &nbsp; )。

所以保持只显示 Controller Action 。您从 db 获取类别列表,在新数组中对其进行过滤,然后创建表单并发送以形成过滤后的数组:
$categories = Something::getCategories();
$filterCategory = new My_Filter_Array_ParentRelation();

$form = new Admin_Form_Product(array(
'name' => 'Form',
'categories' => $filterCategory->filter($categories->toArray()),
));

$this->view->form = $form;

关于zend-framework - Zend 框架嵌套复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com