3.10.3 エレメント

多くのアプリケーションはプレゼンテーションコードの小さなブロックがあり、ページからページへと繰り返される必要があり、時にはレイアウト内の異なる場所で使用されます。CakePHP は再利用する必要があるウェブサイトの部分を繰り返すことを助けてくれます。この再利用可能な部分は、エレメントと呼ばれます。広告、ヘルプボックス、ナビゲーション制御、特別メニュー、ログインフォーム、コールアウトなどは、エレメントとして CakePHP では実装されています。エレメントは基本的には小さなビューで、他のビューやレイアウト内でインクルードできます。また他のエレメント内でもインクルードできます。エレメントはビューをより読みやすくし、それ自身のファイル内にエレメントを繰り返し表示することもできます。アプリケーション内でコンテンツの断片を再利用することもできます。

エレメントは /app/views/elements/ フォルダにあります。また、.ctp という拡張子をもちます。ビューの element メソッドを使用して出力されます。

<?php echo $this->element('helpbox'); ?>
  1. <?php echo $this->element('helpbox'); ?>

3.10.3.1 変数をエレメントに渡す

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

element の第2引数を通して、エレメントにデータを渡すことができます。

<?php echo
$this->element('helpbox', 
    array("helptext" => "Oh, this text is very helpful."));
?>
  1. <?php echo
  2. $this->element('helpbox',
  3. array("helptext" => "Oh, this text is very helpful."));
  4. ?>

エレメントファイル内では、渡された全ての配列が、パラメータ配列のメンバーとして有効です(コントローラ内の set() がどのようにビューファイルに作用するかとほぼ同様です)。上記の例では、 /app/views/elements/helpbox.ctp ファイルは $helptext 変数を使用できます。

<?php
echo $helptext; //outputs "Oh, this text is very helpful."
?>
  1. <?php
  2. echo $helptext; //outputs "Oh, this text is very helpful."
  3. ?>

element() 関数はエレメント用のオプションをエレメントに渡したデータと結合します。2つのオプションは、 'cache' と 'plugin' です。例えば次のようになります:

<?php echo
$this->element('helpbox', 
    array(
        "helptext" => "This is passed to the element as $helptext"
        "foobar" => "This is passed to the element as $foobar"
        "cache" => "+2 days" //sets the caching to +2 days.
        "plugin" => "" //to render an element from a plugin
    )
);
?>
  1. <?php echo
  2. $this->element('helpbox',
  3. array(
  4. "helptext" => "This is passed to the element as $helptext"
  5. "foobar" => "This is passed to the element as $foobar"
  6. "cache" => "+2 days" //sets the caching to +2 days.
  7. "plugin" => "" //to render an element from a plugin
  8. )
  9. );
  10. ?>

同じエレメントの、異なるバージョンのキャッシュを生成したい場合は、次のフォーマットでユニークなキャッシュキーを与えます。:

<?php
$this->element('helpbox',
    array(
        "cache" => array('time'=> "+7 days",'key'=>'unique value')
    )
);
?>
  1. <?php
  2. $this->element('helpbox',
  3. array(
  4. "cache" => array('time'=> "+7 days",'key'=>'unique value')
  5. )
  6. );
  7. ?>

requestAction() を利用することで、エレメントの利点を最大限生かすことができます。requestAction() 関数はコントローラのアクションからビュー変数を受け取り、配列として返します。こうすることで、エレメントを本当の MVC スタイルで実行することができます。エレメント用のビュー変数を準備するコントローラのアクションを作成し、次に、エレメントにコントローラからビュー変数を与えるために element() の第2引数内で requestAction() を呼び出します。

これを実行するには、次の Post の例のように、コントローラ内で何か値を追加します。

<?php
class PostsController extends AppController {
    ...
    function index() {
        $posts = $this->paginate();
        if (isset($this->params['requested'])) {
            return $posts;
        } else {
            $this->set(compact('posts'));
        }
    }
}
?>
  1. <?php
  2. class PostsController extends AppController {
  3. ...
  4. function index() {
  5. $posts = $this->paginate();
  6. if (isset($this->params['requested'])) {
  7. return $posts;
  8. } else {
  9. $this->set(compact('posts'));
  10. }
  11. }
  12. }
  13. ?>

また、エレメント内で、ページ付けされた post モデルにアクセスできます。最新の5つの Post をある順番で取得するために次のようにします::

<h2>最新の投稿</h2>
<?php $posts = $this->requestAction('posts/index/sort:created/order:asc/limit:5'); ?>
<?php foreach($posts as $post): ?>
<ol>
    <li><?php echo $post['Post']['title']; ?></li>
</ol>
<?php endforeach; ?>
  1. <h2>最新の投稿</h2>
  2. <?php $posts = $this->requestAction('posts/index/sort:created/order:asc/limit:5'); ?>
  3. <?php foreach($posts as $post): ?>
  4. <ol>
  5. <li><?php echo $post['Post']['title']; ?></li>
  6. </ol>
  7. <?php endforeach; ?>

3.10.3.2 エレメントをキャッシュする

キャッシュパラメータを指定した場合、CakePHP のビューキャッシュの利点があります。true に設定すると、1日キャッシュするでしょう。true 以外の場合は、期限を設定できます。期限の設定についての詳細は、Caching を見てください。

<?php echo $this->element('helpbox', array('cache' => true)); ?>
  1. <?php echo $this->element('helpbox', array('cache' => true)); ?>

ビュー内で1つ以上の同じエレメントを描画し、キャッシュが有効な場合、それぞれのタイミングで 'key' パラメータに異なる名前をセットします。これはそれぞれの有効な呼び出しが、前回の element() 呼び出しのキャッシュ結果を上書きするのを避けるためです。たとえば

<?php
echo $this->element('helpbox', array('cache' => array('key' => 'first_use', 'time' => '+1 day'), 'var' => $var));

echo $this->element('helpbox', array('cache' => array('key' => 'second_use', 'time' => '+1 day'), 'var' => $differentVar));
?>
  1. <?php
  2. echo $this->element('helpbox', array('cache' => array('key' => 'first_use', 'time' => '+1 day'), 'var' => $var));
  3. echo $this->element('helpbox', array('cache' => array('key' => 'second_use', 'time' => '+1 day'), 'var' => $differentVar));
  4. ?>

上記は両方のエレメントの結果が別にキャッシュされることを強調しています。

3.10.3.3 プラグインからエレメントを要求する

プラグインを使用して、プラグイン内でエレメントを使用したい場合、プラグインパラメータを指定するだけです。ビューがプラグインコントローラ/アクションとして描画されている場合、自動的にプラグインに対してエレメントを向けます。エレメントはプラグイン内に存在しない場合、メインの APP フォルダを探します。

<?php echo $this->element('helpbox', array('plugin' => 'pluginname')); ?>
  1. <?php echo $this->element('helpbox', array('plugin' => 'pluginname')); ?>