创建一个HTML选择元素生成器
生成一个HTML单选元素的过程与生成单选按钮的过程类似。但标签的结构不同,因为需要生成一个SELECT标签和一系列OPTION标签。
如何做...
1.首先,创建一个新的Application\Form\Element\Select类,该类扩展Application\Form\Generic。
2. 我们之所以要扩展Generic而不是Radio,是因为元素的结构完全不同。
namespace Application\Form\Element;
use Application\Form\Generic;
class Select extends Generic
{
// code
}3. 类的常量和属性只需要稍微添加到 Application\Form\Generic中即可。与单选按钮或复选框不同,不需要考虑间隔符或所选文本的位置。
const DEFAULT_OPTION_KEY = 0;
const DEFAULT_OPTION_VALUE = 'Choose';
protected $options;
protected $selectedKey = DEFAULT_OPTION_KEY;4. 现在我们把注意力转移到设置选项上。由于HTML选择元素可以选择单个或多个值,所以$selectedKey属性可以是字符串或数组。因此,我们不为这个属性添加类型提示。然而,重要的是,我们要确定是否已经设置了多重属性。这可以通过继承父类的$this->attributes属性获得。
5. 如果已经设置了多重属性,就必须将name属性表述为一个数组。因此,如果是这种情况,我们将在名称后面加上[]。
6. 在我们定义核心的getInputOnly()方法之前,我们需要定义一个方法来生成select标签。然后我们使用sprintf()返回最终的HTML,使用$pattern、$name和getAttribs()的返回值作为参数。
7. 我们用<select name="%s" %s>替换$pattern的默认值。然后,我们在属性中循环,将它们添加为键值对,中间有空格。
8. 接下来,我们定义一个方法来获取将与选择标签相关联的选项标签。
9. 你还记得,$this->options数组中的key代表返回值,而数组中的value部分代表屏幕上出现的文本。如果$this->selectedKey是数组形式,我们检查值是否在数组中。否则,我们假设$this->selectedKey是一个字符串,我们简单地判断它是否等于键。如果选定的键匹配,我们添加选定的属性。
10. 最后我们准备覆盖核心的getInputOnly()方法。
11. 你会注意到,这个方法的逻辑只需要捕获前面代码中描述的getSelect()和getOptions()方法的返回值。我们还需要添加最后的</select>标签。
如何运行...
将上述代码复制到Application/Form/Element文件夹下新建一个Select.php文件。然后定义一个chap_06_form_element_select.php调用脚本,设置自动加载和锚定新类。
接下来,使用第一个示例中定义的数组$wrappers定义包装器。你也可以使用在创建HTML单选元素生成器配方中定义的$statusList数组。然后你可以创建select元素的实例。第一个实例是单选,第二个是多选。
查看是否有来自$_GET的状态输入,并设置选项。任何输入都将成为选定的键。否则,选定的键就是默认值。你会记得,第二个实例是多重选择,所以从$_GET获得的值和默认设置都应该是数组的形式。
最后,一定要定义一个提交按钮(如本章创建通用表单元素生成器示例中所示)。
实际的显示逻辑与单选按钮示例相同,只是我们需要渲染两个独立的HTML选择实例。
下面是实际输出。

此外,您还可以看到元素在查看源页面中的出现方式。

最后更新于