【问题标题】:CakePHP View including other viewsCakePHP 视图包括其他视图
【发布时间】:2010-09-10 18:05:31
【问题描述】:

我有一个 CakePHP 应用程序,它会在某些时候显示一个带有产品媒体(图片或视频)的视图.我想将这些“小视图”用于其他几个目的,所以它应该“像”一个蛋糕组件,以便重复利用。

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

【问题讨论】:

标签: php templates cakephp


【解决方案1】:

为了在此处获取信息以防有人偶然发现此问题,请务必注意解决方案因 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() 也是一种选择,但如果不使用缓存,它可能会对性能造成严重影响,因为它必须经过正常操作的所有步骤。

【讨论】:

    【解决方案2】:

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

    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 非常昂贵,因此您需要研究缓存。

    【讨论】:

      【解决方案3】:

      简单使用:

      <?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'); ?>
      

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

      【讨论】:

      • 迄今为止最好的答案 - 元素无权访问控制器数据。使用包含,子视图将可以访问所有内容 - 这根本不是一个坏习惯
      • 你是我的英雄
      【解决方案4】:

      对于 CakePHP 2.x

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

      查看手册了解更多/更好的信息

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

      【讨论】:

      • 也适用于 3.x。谢谢!
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        我想用那些“小视图”来 其他几个目的,所以它应该 “像”一个蛋糕组件,因为 再利用。

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

        【讨论】:

          【解决方案7】:

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

          $this->render('view')
          

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

          【讨论】:

            猜你喜欢
            • 2020-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多