1

設定する必要があるプロジェクト範囲のメタ タグがあります。クラスの保護されたメソッド_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');
}
4

3 に答える 3

2

これを達成するにはいくつかの方法があります。何よりもまず、メタデータを定義する時点で、現在のリクエストに対してどの言語がロードされるかをすでに知っていることを確認してください。これは、ブートストラップ時に簡単に判断できない場合があります。

そうは言っても、ブートストラップに加えて、次のメタデータを設定できます。

これらの実行時点で、おそらく使用する言語をすでに決定しており、それに応じてメタデータを設定できます。アプリケーションの特定のケースについては、アクション コントローラーでメタデータを後からいつでも変更できるため、以前にメタデータを指定した場合でも、実際に動けなくなることはありません。

私自身の仕事では、この設定があります:

  1. フロント コントローラ プラグイン、dispatchLoopStartup() メソッド:ロードする言語を決定し、リクエスト オブジェクトの「lang」GET パラメータ、ブラウザ言語、デフォルト サイト言語の順に優先順位を付けます。また、これを使用して、リクエストが通常のリクエストか ajax リクエストかを判断します。前者の場合は、アクション ヘルパーを登録します。次を参照してください...
  2. アクション ヘルパー、preDispatch() メソッド: 言語やその他のものに応じてメタデータを読み込み、レイアウトやウィジェットなどを読み込みます。
  3. アクション コントローラ、 someAction() メソッド:必要に応じて、以前に設定されたメタデータの一部を変更します( headTitle()など) 。これは、効果的に読み込まれたコンテンツに依存する可能性があります。

この取り決めは私には理にかなっています。おそらくあなたのアプローチに役立つでしょうか?

于 2011-07-01T19:38:04.727 に答える
2

基本(ブートストラップ)データの構成を次のように使用します。

アプリケーション.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));
}

次に、コントローラーからこれらのデータをオーバーライドできます: setName、set...

役に立てば幸いです;)

于 2012-11-03T04:20:17.070 に答える
0

私のプロジェクトでは、ブートストラップは早い段階です。それらをコントローラー/アクションに追加します

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

実際には、ほぼ最後に非常に遅くなります。この時点で、私は言語やその他のことについても知っているでしょう.

于 2011-07-01T20:58:36.360 に答える