15

我有一个 CakePHP 应用程序,它会在某些时候显示一个带有产品媒体(图片或视频)的视图,我想知道是否有另一个视图会威胁视频或威胁图片,具体取决于标志。我想将这些“小视图”用于其他几个目的,所以它应该“像”一个蛋糕组件,以便重用。

你们建议在蛋糕约定中使用什么(而不是使用原始include('')命令)

4

7 回答 7

9

为了在此处获取信息以防有人偶然发现此问题,请务必注意,解决方案因 CakePHP 版本而异。

对于 CakePHP 1.1

$this->renderElement('display', array('flag' => 'value'));

在您看来,然后/app/views/elements/您可以创建一个名为 的文件display.thtml,其中$flag将包含您传递给它的任何值。

对于 CakePHP 1.2

$this->element('display', array('flag' => 'value'));

在您看来,然后/app/views/elements/您可以创建一个名为 的文件display.ctp,其中$flag将包含您传递给它的任何值。


在这两个版本中,元素都可以访问视图可以访问的所有数据+您传递给它的任何值。此外,正如有人指出的那样,requestAction()这也是一种选择,但如果在不使用缓存的情况下完成,可能会严重影响性能,因为它必须完成正常操作的所有步骤。

于 2008-09-18T17:37:26.810 回答
7

在您的控制器中(在此示例中为帖子控制器)。

function something() {
    return $this->Post->find('all');
}

在您的元素目录 (app/views/element) 中创建一个名为 posts.ctp 的文件。

在posts.ctp中:

$posts = $this->requestAction('posts/something'); 
foreach($posts as $post): 
    echo $post['Post']['title']; 
endforeach; 

那么在你看来:

<?php echo $this->element('posts'); ?>

这主要取自这里的 CakePHP 书: Creating Reusable Elements with requestAction

我确实相信使用 requestAction 非常昂贵,因此您需要研究缓存。

于 2008-09-28T11:57:50.363 回答
7

只需使用:

<?php include('/<other_view>.ctp'); ?>

在 .ctp 中,您的操作结束。

例如,构建一个归档函数

function archived() {
  // do some stuff
  // you can even hook the index() function
  $myscope = array("archived = 1");
  $this->index($myscope);
  // coming back, so the archived view will be launched
  $this->set("is_archived", true); // e.g. use this in your index.ctp for customization
}

可能调整您的索引操作:

function index($scope = array()) {
  // ...
  $this->set(items, $this->paginate($scope));
}

您的 archive.ctp 将是:

<?php include('/index.ctp'); ?>

控制器操作和视图代码的理想重用。

于 2013-07-23T09:13:30.930 回答
5

对于 CakePHP 2.x

Cake 2.x 的新功能是扩展给定视图的能力。因此,虽然元素非常适合拥有少量可重用代码,但扩展视图允许您重用整个视图。

有关更多/更好的信息,请参阅手册

http://book.cakephp.org/2.0/en/views.html#extending-views

于 2012-09-19T15:56:16.667 回答
1

如果您希望元素可以访问调用视图可以访问的相同数据,则元素可以工作。

如果您希望嵌入式视图能够访问其自己的数据集,您可能需要使用类似requestAction(). 这允许您嵌入一个完整的视图,否则它将是独立的。

于 2008-09-18T17:42:10.513 回答
0

我想将这些“小视图”用于其他几个目的,所以它应该“像”一个蛋糕组件,以便重用。

这是通过“助手”完成的,如此处所述。但我不确定这真的是你想要的。“元素”的建议似乎也是正确的。这在很大程度上取决于您要完成的工作。我的两分钱...

于 2008-09-25T05:47:10.960 回答
0

在 CakePHP 3.x 中,您可以简单地使用:

$this->render('view')

这将从与父视图相同的目录呈现视图。

于 2015-07-09T12:28:05.270 回答