【问题标题】:Generic classes Silverstripe 3.2通用类 Silverstripe 3.2
【发布时间】:2016-03-24 19:35:13
【问题描述】:

我有几个通用函数,我在多个不同的页面和 DataObjects 中使用它们。我正在尝试找出存放这些的最佳位置。目前我在 Page.php 中有它们,但由于它们不适用于所有页面,我想将它们移动并存储在 mysite/code 的子文件夹中的类中,称为 helpers。如果需要,这也将帮助下一个开发人员定位和更新这些类。 (如果这是在 silverstripe 中完成的方式,我可以将它留在 Page.php 类中)

<?php
     public class GetPublishedArticles {
         public function GetAllPublishedArticlesByType($class){
               error_log('Hit GPA',0);
               $pages = $class::get();//->filter(array('Published'=>1));
               if($pages->count()){
                   return $pages;
                }
                else{
                     return false;
                }
         }  
     }
Template:
 <% loop GetAllPublishedArticlesByType('Page') %>
     $Link
 <% end_loop %>

我尝试过的事情。

  • 将它们添加到 mysite/code/helpers 文件夹中,运行 dev/build/flush=all 但无论什么功能都不会命中。即使我在那里的任何地方输入乱码也不会引发 php 错误
  • 将它们添加到 mysite/code 文件夹。运行 dev/build/flush=all 会强制进行一些更改,并且在此处键入 gibberish 会导致开发构建时出现 php 错误。仍然无法从模板访问
  • 我尝试将 GetPublishedArticles 类添加到 Page.php 上的 $has_one 数组 - 仍然没有。
  • 将该函数直接添加到page.php。 - 这按预期工作。

那么我怎样才能利用这个可重用的代码呢?将其添加到页面是可行的,但如果其他开发人员尝试更改,可能会使其难以定位。

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    从模板来看,函数定义在

    1. 当前控制器(Page_Controller)
    2. 控制器故障转移对象(页面)

    为了使某些功能在不同的页面上可用,但保持 DRY 原则,您应该将它们定义为扩展,并为选定的页面类型声明扩展。

    class PublishedArticlesController extends Extension {
        // define your methods
    }
    
    # in mysite/_config/config.yml
    ArticlePage_Controller:
      extensions:
        - PublishedArticlesController
    

    【讨论】:

    • 我得进去看看这个,但看起来这就是我要找的。​​span>
    • @AndrewMacNaughton 还应该指出这适用于任何数据对象,而不仅仅是页面,在这些情况下应该使用 DataExtension
    • 感谢你们两位。得到它的工作,我认为它真的会帮助我们很多。
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2018-07-26
    相关资源
    最近更新 更多