Похоже, вам нужно создать свой собственный помощник вида, расширить стандартный Zend Framework HeadMeta
помощник вида и реализовать метод под названием appendProperty()
, имитирующий поведение appendName()
.
Поскольку метод appendName()
кажется обработанным в методе __call()
, похоже, что ваш расширенный класс может просто скопировать тот же __call()
из родительского объекта, но изменить шаблон, используемый в preg_match()
, из:
'/^(?P<action>set|(pre|ap)pend|offsetSet)(?P<type>Name|HttpEquiv)$/'
до
'/^(?P<action>set|(pre|ap)pend|offsetSet)(?P<type>Name|HttpEquiv|Property)$/'
[В качестве примечания, возможно, стоит подать проблему с трекером ZF, порекомендовав, чтобы этот шаблон регулярных выражений был извлечен из встроенного кода и размещен вместо него как защищенный член класса. Таким образом, подкласс, как и ваш, может просто объявить новый шаблон, а не «дублировать» большую часть родительского кода. Но мне придется посмотреть и проверить немного больше, прежде чем я предложу им это.]
Во всяком случае, просто удар в темноте ...
Обновление: 2010-12-17
Я обнаружил, что для его работы требуется немного больше. Вам необходимо переопределить защищенный элемент $_typeKeys
и защищенный метод _normalizeType()
, чтобы иметь дело с вашим новым типом «Свойство».
Ваш расширенный класс может выглядеть примерно так:
class Kwis_View_Helper_HeadMeta extends Zend_View_Helper_HeadMeta
{
protected $_typeKeys = array('name', 'http-equiv', 'charset', 'property');
public function __call($method, $args)
{
if (preg_match('/^(?P<action>set|(pre|ap)pend|offsetSet)(?P<type>Name|HttpEquiv|Property)$/', $method, $matches)) {
$action = $matches['action'];
$type = $this->_normalizeType($matches['type']);
$argc = count($args);
$index = null;
if ('offsetSet' == $action) {
if (0 < $argc) {
$index = array_shift($args);
--$argc;
}
}
if (2 > $argc) {
require_once 'Zend/View/Exception.php';
$e = new Zend_View_Exception('Too few arguments provided; requires key value, and content');
$e->setView($this->view);
throw $e;
}
if (3 > $argc) {
$args[] = array();
}
$item = $this->createData($type, $args[0], $args[1], $args[2]);
if ('offsetSet' == $action) {
return $this->offsetSet($index, $item);
}
$this->$action($item);
return $this;
}
return parent::__call($method, $args);
}
protected function _normalizeType($type)
{
switch ($type) {
case 'Property':
return 'property';
default:
return parent::_normalizeType($type);
}
}
}
Как отмечалось ранее, это может быть намного короче, если шаблон preg_match()
, зарегистрированный в Zend_View_Helper_HeadMeta::__call()
, был преобразован в защищенный элемент, называемый чем-то вроде $_callPattern
. Тогда расширенному классу не придется дублировать основную часть метода __call()
. Для этого потребуется только переопределить защищенные элементы $_typeKeys
и $_callPattern
и реализовать защищенный метод _normalizeType()
, как показано выше.