PHP PFBC 选择与显示不同的值(PHP 表单构建类)


PHP PFBC Select value to be different than Shown (PHP form Build Class)

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 之前(可能是一个错误,必须有更好的方法来检测这种情况):

更改数据库,以便$ppl1而不是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

此类由以下类扩展

  • 复选框
  • 收音机
  • 选择
  • 排序
  • 无序列表

此解决方案对于像 RadioCheckbox 这样的类可能没有用,在这些类中,人们不太可能希望在列表中有一个菜单选项。