2

私は CRUD アプリケーションを持っています。私のビューには、さまざまなコントローラーからのアクションへのリンクがあります。

<?php echo $this->Html->link(__('List Docs'), array('controller' => 'docs', 'action' => 'index')); ?>
<?php echo $this->Html->link(__('Add Doc'), array('controller' => 'docs', 'action' => 'add')); ?>
<?php echo $this->Html->link(__('List Images'), array('controller' => 'images', 'action' => 'index')); ?>
<?php echo $this->Html->link(__('Add Image'), array('controller' => 'images', 'action' => 'add')); ?>

//etc..

これで、レンダリングされる各ビューからのアクション リンクを動的に入力したいサイドバーを備えた default.ctp レイアウトもあります。アクションをコントローラーからそれぞれのモデルに移動し、コントローラー内の beforeRender() コールバックで変数を設定できることはわかっていますが、アクションをコントローラー内に保持し、代わりにビュー内に配列を設定して、それを default.ctp レイアウトに渡します。これが私がこれまでに持っているものです:

Docs/index.ctp :

$links_array = array(
    'list_docs' => array('controller' => 'docs', 'action' => 'index'),
    'add_doc' => array('controller' => 'docs', 'action' => 'add'),
    'list_images' => array('controller' => 'images', 'action' => 'index'),
    'add_image' => array('controller' => 'images', 'action' => 'add')
    );
$this->set('links', $links_array);

レイアウト/default.ctp :

print_r($links);

これはNotice (8): Undefined variable: links [APP\View\Layouts\default.ctp, line 93]、レイアウトがビューの前にレンダリングされているためだと思います。

アクションをモデルに移動せずにこれを行う最善の方法は何ですか?

4

3 に答える 3

4
$links_array = array(
'list_docs' => array('controller' => 'docs', 'action' => 'index'),
'add_doc' => array('controller' => 'docs', 'action' => 'add'),
'list_images' => array('controller' => 'images', 'action' => 'index'),
'add_image' => array('controller' => 'images', 'action' => 'add')
);
$this->set('links', $links_array);

...コントローラーにある必要があります。

レイアウトには、ビューで使用可能なすべての変数が表示されます。その$linksため、レイアウトに表示されます。$this->set()(コントローラーではなくビューから変数を設定する必要がある場合は、ビューで使用する必要はありません。使用するだけ$links = ...です)。

于 2013-04-27T05:00:24.553 に答える
3

View ブロックの使用を検討しましたか? マニュアルでは、使用例としてサイドバーも使用しています。ビュー ブロックの使用

// In a view file.
// Create a navbar block
$this->startIfEmpty('navbar');
echo $this->element('navbar', array('links' => $links_array));
$this->end();

// In a parent view/layout
echo $this->fetch('navbar');
于 2013-04-27T08:43:45.317 に答える