PFBC 是一个简单但完全没有文档记录的框架,对于入门非常有用,它比其他框架复杂,而且看起来非常好 开箱即用。
http://code.google.com/p/php-form-builder-class/
我在 PHP 中有以下两个数组:
$area = [0=>"name", 10=>"name2", 11=>"name3"];
$ppl = [0=>"name", 1=>"name2", 2=>"name3"];
我想将它们用作选择,用户可以在其中选择名称。这是我用于每个的代码:
$form->addElement(new Element'Select(htmlentities("Area type:"),
"area", $area, array("required" => 1)
));
$form->addElement(new Element'Select(htmlentities("Person:"),
"ppl", $ppl, array("required" => 1)
));
我期待有这个:
<select id="area" required="" name="area">
<option value="1">
name
</option>
<option value="10">
name2
</option>
<option value="11">
name3
</option>
</select>
我得到了第一个数组 ($area),但对于第二个数组 ($ppl),我得到了:}
<select id="ppl" required="" name="ppl">
<option value="name">
name
</option>
<option value="name2">
name2
</option>
<option value="name3">
name3
</option>
</select>
--我需要数字代码作为值,因为我将使用用户选择的内容通过该 id 查询数据库
对可能发生的事情有什么想法吗?
PFBC 确实有一些东西可以处理这个问题 - 如果你将数组键从 0 更改为 "0:pfbc",PFBC''OptionElement::getOptionValue() 会将其识别为关联数组。
我编写了一个函数将数组转换为适合 PFBC 的数组:
function getPfbcSafeArray(array $array){
// This looks overcomplicated but we want to ensure we don't accidently re-order this array
// Doing
// $array['0:pfbc'] = $array[0];
// unset($array[0]);
// would put 0 at end
$keys = array_keys($array);
$index = array_search(0, $keys);
if ($index !== false) {
$keys[$index] = "0:pfbc";
$array = array_combine($keys, $array);
}
return $array;
}
//An array that has first item as 0
$area = [0=>"name", 10=>"name2", 11=>"name3"];
//pass $area through getPfbcSafeArray() as we pass it to $form->addElement()
$form->addElement(new Element'Select(htmlentities("Area type:"),
"area", getPfbcSafeArray($area), array("required" => 1)
));
将生成
<select id="area" required="" name="area">
<option value="0">
name
</option>
<option value="10">
name2
</option>
<option value="11">
name3
</option>
</select>
从技术上讲,这是矫枉过正 - PFBC 只有在数组中的第一项是 0 索引时才做错(在我看来)。如果数组在启动后具有 0 索引,则选择框元素将按预期呈现。上面的函数是"纠正"任何出现的 0 索引。
所以我发现了问题:
Somwhere 在 PFBC 创建 Select 元素的过程中,它使用第三个参数(在我的示例中为 $area
或 $ppl
)生成一个名为 options
的内部属性,可能是为了覆盖自己免受 ["name", "name2", "name3"]
类型的单个数组的影响,OptionElement.php
内部以下代码会导致问题。
public function __construct($label, $name, array $options, array $properties = null) {
$this->options = $options;
if(!empty($this->options) && array_values($this->options) === $this->options)
$this->options = array_combine($this->options, $this->options);
parent::__construct($label, $name, $properties);
}
错误在这里:array_values($this->options) === $this->options
在我的第二个数组 $ppl
中,我有一个从零开始的完美索引表
$ppl = [
0 => "name",
1 => "name2",
2 => "name3"
]
这会触发控件认为我有一个简单的数组而不是自定义键,如下所示: $array_values($ppl) === $ppl
返回boolean(true)
第二个数组$area不同,因为它缺少键:
$area = [
0 => "name",
10=> "name2",
11=> "name3"
]
所以$array_values($area) === $area
回报boolean(false)
我的解决方案,在接触 PFBC 之前(可能是一个错误,必须有更好的方法来检测这种情况):
更改数据库,以便$ppl
从1
而不是0
开始
$ppl = [
1 => "name",
2 => "name2",
3 => "name3"
]
顺便说一下,$array_values($ppl) === $ppl
返回boolean(false)
现在我的选择按我预期工作:
<select id="person" required="" name="person">
<option value="1">
name
</option>
<option value="2">
name2
</option>
<option value="3">
name3
</option>
</select>
希望这有帮助!
非常感谢您的回答。有同样的问题。似乎我通过简单地将数组的索引更改为从 1 而不是 0 开始来让它工作。
我的情况:
$ppl = array("1" =>"通过问卷调查","0" =>"向客户发送问卷");
解决方案:对于下拉列表中的选择,请在列表开头添加空白值。
刚刚遇到了同样的问题。我的数据库中的所有值总是以 1 或更大开头,因为 0 相当于找不到对象。我不允许 0 作为有效的对象 ID。
我添加了"-----选择值-----"行作为条目,并将其作为[0],然后给了我0,1,2...问题。将 [0] 更改为 [''] 空白,PFBC 代码将正常工作。同意另一种选择是修改 PFBC 代码,但这是一个变通方法。
现在这两个都可以工作:
$ppl = [
'' => "-----Select on of the values-----",
0 => "name",
1 => "name2",
2 => "name3"
]
和
$ppl = [
'' => "-----Select on of the values-----",
1 => "name",
2 => "name2",
3 => "name3"
]
如前所述,问题出在类中:
''PFBC''OptionElement
此类由以下类扩展
- 复选框
- 收音机
- 选择
- 排序
- 无序列表
此解决方案对于像 Radio 或 Checkbox 这样的类可能没有用,在这些类中,人们不太可能希望在列表中有一个菜单选项。