Zend 框架:元属性集成 [英] Zend framework: Meta property integration

查看:15
本文介绍了Zend 框架:元属性集成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试根据页面内容向页面的头部添加一些元数据(采用以下格式):

像这样使用 headMeta()->appendName:

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

在标题中生成以下内容:

有没有办法让 Zend 生成带有 property 字段的 meta?

谢谢

解决方案

听起来您需要创建自己的视图助手,扩展标准 Zend Framework HeadMeta 视图助手,并实现一个名为appendProperty(),模仿appendName()的行为.

由于 appendName() 方法似乎是在 __call() 方法中处理的,看起来您的扩展类可以简单地复制相同的 __call() 形成父级,但将 preg_match() 中使用的模式更改为:

'/^(?Pset|(pre|ap)pend|offsetSet)(?PName|HttpEquiv)$/'

'/^(?Pset|(pre|ap)pend|offsetSet)(?PName|HttpEquiv|Property)$/'

[作为旁注,向 ZF 跟踪器提交问题可能是值得的,建议将此正则表达式模式从内联代码中拉出并将其作为类的受保护成员放置.这样,子类 - 就像你的 - 可以简单地声明一个新模式,而不是复制"这么多父代码.但在我向他们建议之前,我必须多看看和测试一下.]

无论如何,只是在黑暗中刺...

更新:2010-12-17

我发现需要做更多的工作才能让它发挥作用.您需要覆盖受保护成员 $_typeKeys 和受保护方法 _normalizeType() 来处理您的新属性"类型.

您的扩展类可能如下所示:

class Kwis_View_Helper_HeadMeta 扩展 Zend_View_Helper_HeadMeta{protected $_typeKeys = array('name', 'http-equiv', 'charset', 'property');公共函数 __call($method, $args){if (preg_match('/^(?Pset|(pre|ap)pend|offsetSet)(?PName|HttpEquiv|Property)$/', $method, $matches)) {$action = $matches['action'];$type = $this->_normalizeType($matches['type']);$argc = count($args);$index = null;if ('offsetSet' == $action) {如果 (0 <$argc) {$index = array_shift($args);--$argc;}}如果 (2 > $argc) {require_once 'Zend/View/Exception.php';$e = new Zend_View_Exception('提供的参数太少;需要键值和内容');$e->setView($this->view);扔 $e;}如果 (3 > $argc) {$args[] = array();}$item = $this->createData($type, $args[0], $args[1], $args[2]);if ('offsetSet' == $action) {返回 $this->offsetSet($index, $item);}$this->$action($item);返回 $this;}return parent::__call($method, $args);}受保护的函数 _normalizeType($type){开关($type){案例财产":返回财产";默认:return parent::_normalizeType($type);}}}

正如之前所观察到的,如果 Zend_View_Helper_HeadMeta::__call() 中检查的 preg_match() 模式被分解为一个名为 something 的受保护成员,那么这可能会更短像$_callPattern.这样扩展类就不必复制大部分的 __call() 方法.它只需要覆盖受保护的成员 $_typeKeys$_callPattern 并实现受保护的方法 _normalizeType(),如上所示.>

I'm trying to add some meta (in the following format) to the head of my pages according to the page content:

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

Using the headMeta()->appendName like this:

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

generates the following in the header:

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

Is there a way to make Zend generates meta with the property field?

Thank you

解决方案

Sounds like you need to create your own view-helper, extend the standard Zend Framework HeadMeta view helper, and implementing a method called appendProperty(), mimicking the behavior of appendName().

Since the appendName() method seems to be handled in the __call() method, it looks like your extended class could simply copy the same __call() form the parent, but change the pattern used in the preg_match() from:

'/^(?P<action>set|(pre|ap)pend|offsetSet)(?P<type>Name|HttpEquiv)$/'

to

'/^(?P<action>set|(pre|ap)pend|offsetSet)(?P<type>Name|HttpEquiv|Property)$/'

[As a side note, it might be worthwhile to file an issue with the ZF tracker, recommending that this regex pattern is pulled out of the inline code and placed instead it as a protected member of the class. This way, a subclass - like yours - could simply declare a new pattern, rather than "duplicating" so much of the parent code. But I'd have to look and test a bit more before I suggest that to them.]

Anyway, just a stab in the dark...

Update: 2010-12-17

I discovered that a bit more is required to make it work. You need to override the protected member $_typeKeys and the protected method _normalizeType() to deal with your new "Property" type.

Your extended class could look something like this:

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);
        }
    }
}

As observed previously, this could be so much shorter if the preg_match() pattern checked in Zend_View_Helper_HeadMeta::__call() was factored out into a protected member called something like $_callPattern. Then the extended class would not have to duplicate the bulk of the __call() method. It would only have to override the protected members $_typeKeys and $_callPattern and implement the protected method _normalizeType(), as shown above.

这篇关于Zend 框架:元属性集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆