定义数据对象的 URL - 银条3.1


Define the URL of an Dataobject - Silverstripe 3.1

如何更改数据对象的 url?我可以使用此函数在以下 url 下获取数据对象。

www.domain.tld/articles/art?=1234

    public function ArticleByID() {
    $articleID = isset($_GET['art']) ? $_GET['art'] : false;
    return $articleID ? Articles::get()->filter(array('ShortNumber' => $articleID))->First() : false;
}

但我想要的是例如这个www.domain.tld/articles/1234 或 www.domain.tld/members/member-name

您可以创建一个show()函数,您将在ArticleHolder上调用该函数来获取并返回所需的Articles页面,网址为www.domain.tld/articles/show/1234

文章持有人.php

...
class ArticleHolder_Controller extends Page_Controller {
    ...
    public function show(SS_HTTPRequest $request) {
        if ($request->param('ID') && $article = Articles::get()->filter(array('ShortNumber' => $page->param('ID')))->First()) {
            return $this->customise(array(
                'Title' => $article->Title,
                'Content' => $article->Content,
                'MetaTitle' => $article->MetaTitle,
                'MetaDescription' => $article->MetaDescription,
                'MetaKeywords' => $article->MetaKeywords
            ))->renderWith(
                array('ArticlesPage', 'Page')
            );
        }
        return $this->httpError(404);
    }
    ...
}

或者,更好的是,使用URLSegment来获取您的文章。为此,您需要在Article课上URLSegment

ssbits.com 有一个很好的教程:http://www.ssbits.com/tutorials/2010/dataobjects-as-pages-part-2-using-model-admin-and-url-segments-to-create-a-product-catalogue/

本教程适用于 Silverstripe

2.4,但代码应该在 Silverstripe 3.1 中进行细微调整。

还有一个基于本教程的模块称为DataObjectAsPage:https://github.com/arambalakjian/DataObjects-as-Pages

您可以将其用作代码的基础。