在zend框架中放置元标记,链接和样式的最佳实践?

时间:2011-07-01 13:12:15

标签: php zend-framework meta-tags zend-app-bootstrap

我有需要设置的项目范围元标记。 我已将它们放在_initMeta类中的受保护方法Bootstrap中。 还有更好的选择吗?如果我想为其他语言提供不同的数据集,该怎么办?

protected function _initMeta(){
    $this->bootstrap('view');
    $view = $this->getResource('view');
    $view->doctype('XHTML1_STRICT');

    $view->headTitle()->headTitle('Foo title');

    $view->headMeta()->appendName('keywords','foo');

    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8')
            ->appendHttpEquiv('Content-Language', 'any');

    $view->headLink()->appendStylesheet('/foo.css')->headLink(array('rel' => 'favicon',
                              'href' => '/favicon.ico'),
                              'PREPEND');
}

3 个答案:

答案 0 :(得分:2)

您有多种方法可以实现这一目标。首先,确保您定义元数据的那一刻,您已经知道将为当前请求加载哪种语言。有时在自助时间可能不容易确定。

话虽如此,除了引导程序之外,您还可以在:

上设置元数据
  • Front Controller Plugin类(例如使用 dispatchLoopStartup() predispatch()方法)。
  • Action Helper class(例如使用 init() preDispatch()方法。)

在这些执行点,您可能已经确定了要使用的语言,并可以相应地设置元数据。对于应用程序中的特定情况,您随后可以在action controllers中更改元数据,这样,如果您之前指定了元数据,那么您永远不会被卡住。

在我自己的工作中,我有这个设置:

  1. Front Controller Plugin,dispatchLoopStartup()方法确定要加载的语言,优先考虑请求对象中的“lang”GET参数,然后是浏览器语言,然后默认网站语言。我还使用它来确定请求是正常请求还是ajax请求;如果是前一种情况,我会注册一个动作助手,请参阅下一步......
  2. Action Helper,preDispatch()方法: 根据语言加载元数据和其他内容,加载Layout和小部件等。
  3. 动作控制器,someAction()方法:如有必要,可以更改一些先前设置的元数据,例如headTitle(),这可能取决于有效加载的内容。
  4. 这种安排对我有意义,也许它可以帮助你的方法?

答案 1 :(得分:2)

我使用config作为基本(引导程序)数据:

的application.ini

resources.view.meta.name.Viewport                       = "width=device-width, initial-scale=1.0"
resources.view.meta.name.MobileOptimized                    = "width"
resources.view.meta.name.HandheldFriendly                   = "true"
resources.view.meta.name.Keywords                       = "basic,keywords"
...
; format resources.view.headStyle.{MEDIA}.nfile = 
resources.view.headStyle.all.1.href                 = "/css/basic.css"
resources.view.headStyle.all.1.conditionalStylesheet            = 
resources.view.headStyle.all.1.extras.title             = "Basic style"
resources.view.headStyle.all.1.extras.charset               = "utf-8"

resources.view.headStyle.all.2.href                 = "/css/ie.css"
resources.view.headStyle.all.2.conditionalStylesheet            = "IE"
resources.view.headStyle.all.2.extras.title             = "Internet Explorer style"
resources.view.headStyle.all.2.extras.charset               = "utf-8"
; print media example
resources.view.headStyle.print.1.href                   = "/css/print.css"
...
; format resources.view.headLink.{REL} = 
resources.view.headLink.humans.href                     = "/humans.txt"
resources.view.headLink.humans.type                     = "text/plain"
; ___ will be replaced by space, __ by point (or set another nest separator)
resources.view.headLink.shortcut___icon.href                = "/favicon.png"
resources.view.headLink.shortcut___icon.type                = "image/png"
...

此时,也许您有一些特殊数据。例如:

project1.ini

project.headLink.author.href                = "https://plus.google.com/XXXXX?rel=author"
project.headLink.image_src.href                     = "/author.jpg"
project.headLink.image_src.type                     = "image/jpg"

最后,你将所有内容混合在一起

bootstrap.php中

(* _initHeadLink()*)的例子:

// $options = your app options (basic)
// $projectOptions = your project options (special)
// $assets_url = your assets url

if ( is_array($headStyle = $options['headStyle']) ) {
    foreach ( $headStyle as $media => $value ) {
        foreach ( $value as $style ) {
            extract($style);
            $this->view->headLink()->appendStylesheet($assets_url . $href, $media, 
                            $conditionalStylesheet, $extras);
        }
    }
}

$headLinks      = array();

if ( isset($options['headLink']) ) 
    $headLinks      = $options['headLink'];

if ( isset($projectOptions['headLink']) ) 
    $headLinks      = array_merge($headLinks, (array) $projectOptions['headLink']);

// *array key, is the value for rel
foreach ( $headLinks as $rel => $value ) {
    $rel            = str_replace(array('___', '__'), array(' ', '.'), $rel);
    $this->view->headLink()->headLink(array_merge(array('rel' => $rel), (array) $value));
}

然后,您可以从Controller中覆盖这些数据:setName,set ...

我希望它有所帮助;)

答案 2 :(得分:0)

我的项目可以提前启动。我将它们添加到我的控制器/操作

$keywords = 'php,zend,framework';
$this->view->headMeta($keywords,'keywords','name',array(),'SET');
... etc.

实际上很快就到了最后。在这一点上,我也会了解语言和其他事情。