【问题标题】:Silverstripe DataObjects as Pages Part 2 tutorial - Admin CheckboxSilverstripe 数据对象作为页面第 2 部分教程 - 管理员复选框
【发布时间】:2012-01-30 23:09:45
【问题描述】:

我正在使用来自DataObjects as Pages 2 的代码,因此您可以为您在管理员的“产品”选项卡下创建的每个产品选择一个到多个类别。

我的问题是如何显示类别的父页面(称为 ProductsList.php)标题?详情请看图

或者这里是解释:因为我所有的类别页面都在一个或多个父级之下,并且某些类别页面在网站上重复,例如丰田和本田。我希望在“类别”复选框下显示父页面的标题,例如“销售”和“出租”,以便管理员知道要选择哪些重复的类别。

以下是类别复选框字段的一些相关代码:

 //Relate to the category pages
  static $belongs_many_many = array(
    'Categories' => 'CategoryPage'
  );

 //Categories
    $Categories = DataObject::get('CategoryPage');
    $fields->addFieldToTab("Root.Categories", new CheckboxsetField('Categories', 'Categories', $Categories));

我正在尝试通过 SS 解决问题,因此感谢您提供任何帮助。

非常感谢。

山姆

编辑/更新:

我设法使用以下代码将类别选项卡显示为父子,例如 Sale-Toyota、Sale-Honda、Rental-BMW、Rental-Toyota。但是,它们都无序/随机显示。有关如何正确分组它们的任何建议,例如所有销售都在一起,所有租赁都在一起?

代码:将以下代码添加到 CategoryPage.php

function CheckboxSummary(){
    return $this->Parent()->Title . ' - ' . $this->Title;
}

并将 $Categories->map('ID', 'CheckboxSummary') 添加到 Product.php 中的复选框集的选项中

 $Categories = DataObject::get('CategoryPage'); 
 $fields->addFieldToTab("Root.Categories", new CheckboxsetField('Categories', 'Categories', $Categories->map('ID', 'CheckboxSummary')));

谢谢:)

【问题讨论】:

    标签: php content-management-system silverstripe


    【解决方案1】:

    您可以为每个“父页面”构建一个复选框集(确保设置正确的 URLSegment):

    $salePage = DataObject::get_one('Page', "URLSegment = 'sale'");
    $Categories = $salePage->Children();
    $fields->addFieldToTab("Root.Categories", new CheckboxsetField('Categories', 'Sale', $Categories));
    

    更新

    关于您在更新问题中提到的使用“CheckboxSummary”的解决方案,最简单的解决方案是使用“asort()”对您提供给 CheckboxSetField 的数组进行排序:

    $Categories = DataObject::get('CategoryPage');
    $map = $Categories->map('ID', 'CheckboxSummary');
    asort($map);
    $fields->addFieldToTab("Root.Categories", new CheckboxsetField('Categories', 'Categories', $map)); 
    

    关于 asort() 的作用,请参阅http://php.net/manual/en/function.asort.php

    【讨论】:

    • 感谢 Schellmax。我已经尝试过您的代码,但它出现了一个错误:“未捕获的异常:Object->__call():方法 'children' 在 'DataObjectSet' 上不存在”,位于 xxx\sapphire\core\Object 的第 724 行。 php 我添加代码的页面位于 Product.php 中的 Product extends DataObject{} 类中。我该如何解决这个问题?还有其他人建议使用功能 CheckboxSummary(){return $this->Parent()->Title 。 '-'。 $this->Title;} 但我不确定以后如何实现它。我不介意类别显示像 Sale-Toyota、Rental-Toyota 是否更容易。非常感谢您的帮助! :)
    • 我的错,对不起。你必须用 DataObject::get_one 替换 DataObject::get - 我已经更新了上面的代码。
    • 谢谢 S,我尝试了你的新代码,但它只会显示一个父级及其子级类别(取决于我将代码放在最后的哪个类别),例如仅显示 Sale 及其子级,而不是所有父母和孩子。但是我设法显示了父母-孩子,例如Sale-Toyota,Rental-Toyota,请参见上面的编辑,但是所有父母和类别都显示无序,有没有想过如何对它们进行分组?不要担心它是否会太复杂,因为我只需要忍受它。无论如何,非常非常感谢您的帮助!我真的很感谢你为我腾出时间。再次感谢!
    • 当然,您必须为每个类别页面重复上述代码 - 只要定义了这些类别(并且编辑器不可编辑),这才有效。但我会尝试回复您的排序问题,我会在上面更新我的答案。
    • 使用“CheckboxSummary”方法的解决方案更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2013-12-03
    相关资源
    最近更新 更多