【发布时间】:2015-06-05 04:34:29
【问题描述】:
我在 silverstripe.org 网站上观看了第 7 课 - 第 10 课的视频,阅读了此页面上的所有文章:http://docs.silverstripe.org/en/3.1/developer_guides/model/,一直在使用 API 并在 silverstripe/stackoverflow 论坛上搜索了几个小时。我真的被困在试图应用我学到的东西上。这就是我想要做的。我想扩展文章持有者和文章页面的概念。我正在尝试创建另一个页面作为主文章持有者,并且我的站点树将按如下方式组织:
HomePage
|
| _ MasterArticleHolderOne
| |
| | _ ArticleHolderA
| | |
| | | _ ArticlePageA1
| | |
| | | _ ArticlePageA2
| | |
| | | _ ArticlePageA3
| |
| |
| | _ ArticleHolderB
| | |
| | | _ ArticlePageB1
| | |
| | | _ ArticlePageB2
| | |
| | | _ ArticlePageB3
| |
| |
| | _ ArticleHolderB
| |
| | _ ArticlePageB1
| |
| | _ ArticlePageB2
| |
| | _ ArticlePageB3
|
| _ MasterArticleHolderTwo
我希望 MasterArticleHolder 页面这样做:在 CMS 中,MasterArticleHolder 页面将有一个选项可以选择任何现有的 ArticleHolder 页面(这意味着即使是上面的 MasterArticleHolderTwo 也可以显示来自 ArticleHolderA 或 B 或 C 的文章)和然后,MasterArticleHolder 页面将显示作为所选 ArticleHolder 页面子级的所有文章。这些文章需要按 PublicationDate 排序;不按他们所属的持有者分组。
这是我目前编写的代码。 ArticlePage 和 ArticleHolder 完美运行。这是我正在努力解决的 MasterArticleHolder(尽管我确实设法至少在 CMS 中为所有现有的 ArticleHolder 页面创建了复选框,但不知道在编写完其他所有内容后它是否会真正起作用):
文章页面
class ArticlePage extends Page {
private static $db = array(
'PublicationDate' => 'Date',
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Main', DateField::create('PublicationDate','Publication Date')->setConfig('showcalendar', true));
return $fields;
}
}
文章持有者
class ArticleHolder_Controller extends Page_Controller {
public function LatestArticles() {
return ArticlePage::get()
->filter('PublicationDate:LessThanOrEqual', SS_Datetime::now())
->sort('PublicationDate', 'DESC');
}
}
MasterArticleHolder
class MasterArticleHolder extends Page {
private static $many_many = array (
'Categories' => 'ArticleHolder'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Main', CheckboxSetField::create(
'Categories',
'Articles to Display',
ArticleHolder::get()->map('ID','MenuTitle')
));
return $fields;
}
}
class MasterArticleHolder_Controller extends Page_Controller {
public function LatestArticles() {
return ArticlePage::get()
->filter(array('PublicationDate:LessThanOrEqual' => SS_Datetime::now()))
->sort('PublicationDate', 'DESC')
}
}
在我看来,可能存在以下关系,但我只是不知道需要哪一个,如果有的话
- ArticlePage 是 ArticleHolder 的 has_one
- ArticleHolder 是 ArticlePage 的 has_many
- ArticleHolder 与 MasterArticleHolder 是一个 many_many(不知道哪个是 belongs_many_many,但我猜是 Article Holder)
以下关系也可能适用,但对我来说似乎不太可能
- ArticlePage 是一个带有 MasterArticleHolder 的 many_many
现在我通常知道 has_one、has_many 和 many_many 适用于扩展 DataObject 的对象,但我认为由于页面以一种迂回的方式扩展了 DataObject,这些关系可能仍然适用,但我可能完全错了,真的想太多。
希望我能很好地解释自己,让我得到帮助,但不要太多以至于让每个人都不知所措。感谢您的反馈!
【问题讨论】:
标签: silverstripe