5

我正在填充一个 Select 表单元素,如果我尝试在值中使用 HTML 实体,它会被转换,而不是显示特殊字符。

这段代码:

$form->field_name->addMultiOption('value', ' • label');

渲染:

<option value="one">&amp;nbsp;&amp;bull; label</option>

但我希望它是:

<option value="one">&nbsp;&bull; label</option>

如何在此处使用 HTML 实体?


暗示?

我挖掘了代码,发现它使用标签escape()上 Zend View Abstract 中的函数。也许有人知道如何为特定的表单元素覆盖/重载这个函数?我不想默认覆盖该行为。

Zend_View_Helper_FormSelect类中的函数

protected function _build($value, $label, $selected, $disable)
{
    if (is_bool($disable)) {
        $disable = array();
    }

    $opt = '<option'
         . ' value="' . $this->view->escape($value) . '"'
         . ' label="' . $this->view->escape($label) . '"';

    // selected?
    if (in_array((string) $value, $selected)) {
        $opt .= ' selected="selected"';
    }

    // disabled?
    if (in_array($value, $disable)) {
        $opt .= ' disabled="disabled"';
    }

    $opt .= '>' . $this->view->escape($label) . "</option>";

    return $opt;
}

这是Zend_View_Abstract类中的函数:

private $_escape = 'htmlspecialchars';

/* SNIP */

public function escape($var)
{
    if (in_array($this->_escape, array('htmlspecialchars', 'htmlentities'))) {
        return call_user_func($this->_escape, $var, ENT_COMPAT, $this->_encoding);
    }

    return call_user_func($this->_escape, $var);
}
4

2 回答 2

10

事实证明这并不像我做的那么复杂。

我改变了这个:

$form->field_name->addMultiOption('value', '&nbsp;&bull; label');

对此:

$form->field_name->addMultiOption('value',
    html_entity_decode('&nbsp;&bull;', ENT_COMPAT, 'UTF-8') . ' label');
于 2010-02-23T19:30:09.673 回答
1

您可以在填充特定字段时尝试关闭/清除 Zend 过滤器。

$form->getElement('yourElementName')->clearFilters();
// pupulate the element 

当您清除 Zend 过滤器时,您可以应用您自己的预先填充。

于 2010-02-21T01:19:06.803 回答