Zend Framework: интеграция мета-свойств - PullRequest
6 голосов
/ 16 декабря 2010

Я пытаюсь добавить мета (в следующем формате) в заголовок моих страниц в соответствии с содержанием страницы:

<meta property="og:title" content="some content" />

Использование headMeta () -> appendName следующим образом:

$this->view->headMeta()->appendName('og:title', 'some content');

генерирует в заголовке следующее:

<meta name="og:title" content="some content" />

Есть ли способ заставить Zend генерировать meta с полем property ?

Спасибо

1 Ответ

8 голосов
/ 16 декабря 2010

Похоже, вам нужно создать свой собственный помощник вида, расширить стандартный 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(), как показано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...