【问题标题】:Has CakePHP anything like Symfony's partials?CakePHP 有什么类似于 Symfony 的部分功能吗?
【发布时间】:2011-04-21 18:30:09
【问题描述】:

如果你想在视图中重用代码,Symfony 有两种基本机制:partials 和 slot。部分很好,因为您可以定义全局部分(您可以在任何模块中使用它们)和模块部分(它们仅在特定模块中可用)。

但是,在 CakePHP 中,您只有常规模板和元素,后者在每个视图中都可用,无论您在哪个模型/控制器中。

CakePHP 有类似 Symfony 的部分功能吗?例如,避免为模型重复表单代码会很好。您可以拥有两个“包含”通用表单的模板(添加和编辑)。

我知道您仍然可以使用元素,但是为模块提供“本地”元素目录似乎可以让事情更有条理。你能建议一个解决方法来模拟这个吗?

谢谢!

【问题讨论】:

    标签: cakephp symfony1 elements partials


    【解决方案1】:

    为什么不在控制器特定的视图目录中创建一个视图 (module_partial.ctp)。这将使代码特定于您希望它所属的控制器。因此,假设您有一个书籍控制器。您想将 BooksController 特定表单添加到您的某些书籍视图中。

    views/books/ 目录中创建一个视图,名为:search_partial.ctp

    search_partial.ctp 将包含您想要的 HTML 代码。

    然后,在任何视图中,只需调用:

    <?php echo $this->render('search_partial'); ?>
    

    这不会阻止其他控制器视图加载它,但它可以保持代码库的可读性和您期望的隔离。

    所有全局变量都将进入视图/元素。

    【讨论】:

    • 这就是元素的用途,这更像是 hack imo
    • 如果你违反了 MVC 规则,或者你改变了核心来做一些它不打算做的事情,这只是一个 hack。这也不行。它允许您在规则内灵活地使框架为用户工作。我认为这是一个优雅的解决方案。
    • 您可以添加false作为第二个参数来跳过布局并渲染视图而不被嵌入:&lt;?php $this-&gt;render('search_partial', false); ?&gt;
    【解决方案2】:

    您可以将元素放入插件中。

    你可以做类似 $this->element('something');在布局中,并在插件和/或主应用程序视图文件夹中包含元素......

    App/plugins/a_plugin/views/elements/something.ctp //only called when a controller from 'a_plugin' is called.
    
    App/views/elements/something.ctp // called if the current plugin does not have 'something.ctp' in the elements folder
    

    对于不重复添加/编辑等视图,请查看此https://github.com/infinitas/infinitas/blob/beta/app_controller.php#L389

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多