Silverstripe 在未来发布页面

Silverstripe publish page in the future

我正在尝试制作一个时间表发布模块(在未来的某个日期发布一个简单的页面)。 我搜索了一个类似的插件并找到了 Embargo-Expiry Module,它还包括 Queued Jobs 模块。我已经成功安装并配置了它们作为 dev-master,但不知道如何配置或使用它们。我在管理区域中只有一个选项卡,如下所示:

所以我需要任何 cron 作业吗?我该怎么做?我只想在 publish 附近有一个新按钮,比如 wordpress,设置 publish/unpublish 日期。

来自 https://github.com/silverstripe-scienceninjas/embargoexpiry 的文档...

Ensure the QueuedJobs module is installed and configured correctly. You should have a cronjob similar to the following in place, running as the webserver user.

*/1 * * * * cd  && sudo -u www php /sites/default/www/framework/cli-script.php dev/tasks/ProcessJobQueueTask

注意:您需要更新 cli-script.php 的路径以引用您自己的环境。 queuedjobs 模块本身还有更多示例 https://github.com/nyeholt/silverstripe-queuedjobs

这是更简单的解决方案:

  1. 将 PublishDate 字段添加到您的页面 class
  2. 设置未来的发布日期并发布页面。
  3. 在页面控制器的index()方法中处理页面可见性。 Return 如果在请求页面时未发布页面,则会出现 404 HTTP 错误。

例如添加/mysite/code/FuturePublishDate.php

<?php

class FuturePublishDate extends DataExtension
{
    private static $db = array(
        'PublishDate' => 'SS_DateTime'
    );

    public function updateCMSFields(FieldList $fields) {
        $datetimeField = new DatetimeField( 'PublishDate', 'Publish From' );

        $dateField = $datetimeField->getDateField();
        $dateField->setConfig( 'dateformat', 'yyyy-MM-dd' );
        $dateField->setConfig( 'showcalendar', true );

        $timeField = $datetimeField->getTimeField();
        $timeField->setConfig( 'timeformat', 'H:m:s' );

        $fields->insertBefore( $datetimeField, 'Content' );
    }

    public function populateDefaults() {
        $this->owner->PublishDate = SS_Datetime::now();
    }
}

class FuturePublishDateController extends Extension
{
    public function beforeCallActionHandler($request, $action) {
        if ('index' !== $action || $this->owner->is_a('ErrorPage_Controller')) {
            return;
        }

        $isDraftPreview = 'Stage' === $request->getVar('stage');

        if( !$isDraftPreview 
            && $this->owner->PublishDate
            && strtotime($this->owner->PublishDate) > strtotime('now')
        ){
            // bug in SS 3.1 in OldPageRedirector
            // $this->owner->httpError( 404 );

            $response = $request->isMedia() ? null : ErrorPage::response_for(404);
            if ($response) {
                return $response;
            }

            throw new SS_HTTPResponse_Exception('404 Not Found', 404);
        }
    }
}

并在mysite/_config/config.yml

中注册
---
Name: mysiteconfig
---
Page:
  extensions:
    - FuturePublishDate
Page_Controller:
  extensions:
    - FuturePublishDateController

在 Page.php 中定义默认操作,以便钩子 beforeCallActionHandler 工作

class Page_Controller extends ContentController
{
    public function index(SS_HTTPRequest $request) {
        return $this->getViewer('index')->process($this);
    }

    public function Menu($level) {
        $items = parent::Menu($level);

        $isDraftPreview = 'Stage' === $this->request->getVar('stage');
        if ($isDraftPreview) {
            return $items;
        }

        $now = strtotime('now');
        $visible = array();
        foreach ($items as $page) {
            if ($page->PublishDate && strtotime($page->PublishDate) <= $now) {
                $visible[] = $page;
            } elseif (!$page->PublishDate) {
                $visible[] = $page;
            }
        }

        return new ArrayList($visible);
    }
}

如果使用SilverStripe 3.3.1,需要在Controller.php

中删除一行
protected function handleAction($request, $action) {
    //DELETED $this->extend('beforeCallActionHandler', $request, $action);

    foreach($request->latestParams() as $k => $v) {

和运行dev/build?flush=1