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
这是更简单的解决方案:
- 将 PublishDate 字段添加到您的页面 class
- 设置未来的发布日期并发布页面。
- 在页面控制器的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
我正在尝试制作一个时间表发布模块(在未来的某个日期发布一个简单的页面)。
我搜索了一个类似的插件并找到了 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
这是更简单的解决方案:
- 将 PublishDate 字段添加到您的页面 class
- 设置未来的发布日期并发布页面。
- 在页面控制器的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