ホームページ >バックエンド開発 >PHPチュートリアル >Cakephp ノート - レイヤー 2 を表示
Cakephp メモ - ビュー層 2
CakePHP のビュー層はさまざまな部分で構成できます。各部分には異なる目的があります。
ビュー ブロックは $scripts_for_layout に配置され、ビュー/レイアウト内の任意の場所にスロットやブロックを定義できる柔軟な API を提供します。 ブロックは、サイドバーのようなものを実装するための理想的な方法であり、レイアウトの先頭/末尾にリソースをロードするのに最適な場所です。ブロックは、キャプチャ ブロックとして定義する方法と、直接割り当てる方法の 2 つの方法で定義できます。 start()、append()、および end() メソッドは、キャプチャ ブロックと連携して動作します。
<span style="color:rgb(0,128,128)"> 1</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 建立一个边栏块</span> <span style="color:rgb(0,128,128)"> 2</span> <span style="color:rgb(128,0,128)">$this</span>->start('sidebar'); <span style="color:rgb(0,128,128)"> 3</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->element('sidebar/recent_topics'); <span style="color:rgb(0,128,128)"> 4</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->element('sidebar/recent_comments'); <span style="color:rgb(0,128,128)"> 5</span> <span style="color:rgb(128,0,128)">$this</span>-><span style="color:rgb(0,128,128)">end</span>(); <span style="color:rgb(0,128,128)"> 6</span> <span style="color:rgb(0,128,128)"> 8</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 随后添加一个边栏</span> <span style="color:rgb(0,128,128)"> 9</span> <span style="color:rgb(128,0,128)">$this</span>->append('sidebar'); <span style="color:rgb(0,128,128)">10</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->element('sidebar/popular_topics'); <span style="color:rgb(0,128,128)">11</span> <span style="color:rgb(128,0,128)">$this</span>-><span style="color:rgb(0,128,128)">end</span>();
start() を複数回使用してブロックに追加することもできます。 assign() を使用すると、いつでもブロックをクリアまたは上書きできます:
<span style="color:rgb(0,128,128)">1</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 清除之前定义的边栏块的内容。</span> <span style="color:rgb(0,128,128)">2</span> <span style="color:rgb(128,0,128)">$this</span>->assign('sidebar', '');
バージョン 2.3 では、ブロックを操作するための新しいメソッドがいくつか追加されました。 prepend() 既存のブロックの内容を先頭に追加します:
<span style="color:rgb(0,128,128)">1</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 预置到边栏。</span> <span style="color:rgb(0,128,128)">2</span> <span style="color:rgb(128,0,128)">$this</span>->prepend('sidebar', 'this content goes on top of sidebar');
startIfEmpty() メソッドは、ブロックが空または未定義の場合にブロックを生成します。ブロックがすでに存在する場合、startIfEmpty() で定義された内容は無視されます。ブロックが存在しない場合に、ブロックのデフォルトのコンテンツ を 定義したい場合に、このメソッドを使用します: :
<span style="color:rgb(0,128,128)"> 1</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在视图文件中。 </span><span style="color:rgb(0,128,128)"> 2</span> <span style="color:rgb(0,128,0)">// 创建一个导航栏块。</span> <span style="color:rgb(0,128,128)"> 3</span> <span style="color:rgb(128,0,128)">$this</span>->startIfEmpty('navbar'); <span style="color:rgb(0,128,128)"> 4</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->element('navbar'); <span style="color:rgb(0,128,128)"> 5</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->element('notifications'); <span style="color:rgb(0,128,128)"> 6</span> <span style="color:rgb(128,0,128)">$this</span>-><span style="color:rgb(0,128,128)">end</span>(); <span style="color:rgb(0,128,128)"> 7</span> <span style="color:rgb(0,128,128)"> 8</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在父视图/布局中。</span> <span style="color:rgb(0,128,128)"> 9</span> <span style="color:rgb(128,0,128)">$this</span>->startIfEmpty('navbar'); <span style="color:rgb(0,128,128)">10</span> <span style="color:rgb(0,0,255)">Default</span> content <span style="color:rgb(0,128,128)">11</span> <span style="color:rgb(128,0,128)">$this</span>-><span style="color:rgb(0,128,128)">end</span>(); <span style="color:rgb(0,128,128)">12</span> <span style="color:rgb(0,128,128)">13</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('navbar');
上記の例では、navbar ブロックには最初の部分で追加されたコンテンツが含まれています。このブロックがサブビューで定義されると、そのデフォルトの内容は無視されます。
显示块
可以使用 fetch() 方法显示块。 fetch 将安全地输出一个块,如果块不存在,就返回 ‘’。
<span style="color:rgb(0,128,128)">1</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('sidebar');
还可以根据一个块是否存在来决定是否显示其内容。要想在布局、继承视图文件中有条件的显示头或者其它标签时,这种方法非常有用:
<span style="color:rgb(0,128,128)">1</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在 app/View/Layouts/default.ctp 中</span> <span style="color:rgb(0,128,128)">2</span> <?php <span style="color:rgb(0,0,255)">if</span> (<span style="color:rgb(128,0,128)">$this</span>->fetch('menu')): ?> <span style="color:rgb(0,128,128)">3</span> <div <span style="color:rgb(0,0,255)">class</span>="menu"> <span style="color:rgb(0,128,128)">4</span> <h3>Menu options</h3> <span style="color:rgb(0,128,128)">5</span> <?php <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('menu'); ?> <span style="color:rgb(0,128,128)">6</span> </div> <span style="color:rgb(0,128,128)">7</span> <?php <span style="color:rgb(0,0,255)">endif</span>; ?>
在 2.3.0 版,还可以在块没有内容时为其提供默认值。这使为空状态添加占位符变得更容易。可以使用两个参数提供默认值:
<span style="color:rgb(0,128,128)">1</span> <div <span style="color:rgb(0,0,255)">class</span>="shopping-cart"> <span style="color:rgb(0,128,128)">2</span> <h3>Your Cart</h3> <span style="color:rgb(0,128,128)">3</span> <?php <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('cart', 'Your cart is empty'); <span style="color:rgb(0,128,128)">4</span> </div>
块替代了被废弃的 $scripts_for_layout 布局变量。HtmlHelper 关联到视图块,它的 script() 、 css() 和 meta()方法在与 inline = false 选项共同使用时使用相同的相同的名字更新一个块。
<span style="color:rgb(0,128,128)"> 1</span> <?php <span style="color:rgb(0,128,128)"> 2</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在视图文件中。</span> <span style="color:rgb(0,128,128)"> 3</span> <span style="color:rgb(128,0,128)">$this</span>->Html->script('carousel', <span style="color:rgb(0,0,255)">array</span>('inline' => <span style="color:rgb(0,0,255)">false</span>)); <span style="color:rgb(0,128,128)"> 4</span> <span style="color:rgb(128,0,128)">$this</span>->Html->css('carousel', <span style="color:rgb(0,0,255)">null</span>, <span style="color:rgb(0,0,255)">array</span>('inline' => <span style="color:rgb(0,0,255)">false</span>)); <span style="color:rgb(0,128,128)"> 5</span> ?> <span style="color:rgb(0,128,128)"> 6</span> <span style="color:rgb(0,128,128)"> 7</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在布局文件中。</span> <span style="color:rgb(0,128,128)"> 8</span> <!DOCTYPE html> <span style="color:rgb(0,128,128)"> 9</span> <html lang="en"> <span style="color:rgb(0,128,128)">10</span> <head> <span style="color:rgb(0,128,128)">11</span> <title><?php <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('title'); ?></title> <span style="color:rgb(0,128,128)">12</span> <span style="white-space:pre"> </span> <?php <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('script'); ?> <span style="color:rgb(0,128,128)">13</span> <span style="white-space:pre"> </span> <?php <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('css'); ?> <span style="color:rgb(0,128,128)">14</span> </head> <span style="color:rgb(0,128,128)">15</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 下面是剩余的布局尊容...</span>
HtmlHelper 还允许你控制使用哪个 scripts 和 CSS 块:
<span style="color:rgb(0,128,128)">1</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在视图文件中。</span> <span style="color:rgb(0,128,128)">2</span> <span style="color:rgb(128,0,128)">$this</span>->Html->script('carousel', <span style="color:rgb(0,0,255)">array</span>('block' => 'scriptBottom')); <span style="color:rgb(0,128,128)">3</span> <span style="color:rgb(0,128,128)">4</span> <span style="color:rgb(0,128,0)">//</span><span style="color:rgb(0,128,0)"> 在布局文件中。</span> <span style="color:rgb(0,128,128)">5</span> <span style="color:rgb(0,0,255)">echo</span> <span style="color:rgb(128,0,128)">$this</span>->fetch('scriptBottom');