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"];
我想将它们用作select,用户可以在这些名称之间进行选择。 这是我为每个人使用的代码:
$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
查询数据库的内容关于可能发生什么的任何想法?
答案 0 :(得分:1)
PFBC确实有办法解决这个问题 - 如果你将数组键从0更改为&#34; 0:pfbc&#34; 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>
从技术上讲,这是过度杀伤 - 如果数组中的第一项是0索引,PFBC只会错误(在我看来)。如果数组在启动后其中包含0索引,那么选择框元素将按预期呈现。上面的功能是纠正&#39;任何出现的0指数。
答案 1 :(得分:0)
所以我发现了问题:
在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按我的预期工作:
<select id="person" required="" name="person">
<option value="1">
name
</option>
<option value="2">
name2
</option>
<option value="3">
name3
</option>
</select>
希望这有帮助!
答案 2 :(得分:0)
非常感谢您的回答。有同样的问题。我似乎只是通过简单地将数组的索引从1开始而不是0来实现它。
我的情况:
$ ppl = array(“1”=&gt;“通过问卷调查带来客户”,“0”=&gt;“向客户发送问卷”);
答案 3 :(得分:0)
解决方案:对于下拉列表中的选择,请在列表开头添加空白值。
刚遇到同样的问题。 我的数据库中的所有值始终以1或更大的值开头,因为0等于未找到对象。我不允许0作为有效的objectID。
我添加了一行“-----选择值-----”作为条目并将其作为[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 强>
此类由以下类扩展
此解决方案可能对无线电或复选框这样的类没用,因为在这些类中,人们不太可能想要列表中的菜单选项。