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

时间:2014-04-04 13:50:54

标签: php html-select pfbc

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

查询数据库的内容

关于可能发生什么的任何想法?

4 个答案:

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

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

此类由以下类扩展

  • 复选框
  • 无线电
  • 选择
  • 排序
  • UnorderedList

此解决方案可能对无线电复选框这样的类没用,因为在这些类中,人们不太可能想要列表中的菜单选项。