SilverStripe CMS无需用户交互即可取消发布

时间:2015-04-01 11:24:51

标签: database silverstripe

我的网站有一种奇怪的行为。有些页面有时会在未经任何用户交互的情况下取消发布。

在页面历史记录中,没有关于任何活动的条目。 这些页面是安全页面的子项。

未发布的页面并不总是相同。它在不同的页面和期间都有所不同。

apache访问文件不提供任何来自外部的访问信息。

为了测试,我更改了这些页面的内容。 等了几天后,其中一个页面再次未发布。此页面的内容没有变化。所以我可以排除提供商每晚恢复数据库的可能性。

这怎么可能?

系统:SilverStripe 3.1.12(CMS / Framework)

2 个答案:

答案 0 :(得分:1)

我们可以使用onBeforeUnpublish通知我们何时取消发布页面以帮助调试问题。我们通过SiteTree扩展程序执行此操作。

我们在SiteTree文件(或其他config.yml文件)中声明了yml个扩展名:

SiteTree:
  extensions:
    - SiteTreeExtension

在扩展类中,我们添加onBeforeUnpublish函数,以便在取消发布页面时向我们发送电子邮件:

class SiteTreeExtension extends DataExtension {

    public function onBeforeUnpublish() {

        $member = Member::currentUser();
        $config = SiteConfig::current_site_config();

        $pageEditLink = Director::absoluteBaseURL() . 'admin/pages/edit/show/' . $this->owner->ID;

        $content = '<p>Page has been unpublished</p>';
        $content .= '<p><strong>Page name</strong><br />';
        $content .= '<a href="' . $pageEditLink . '">' . $this->owner->Title . '</a></p>';
        $content .= '<p><strong>Page ID</strong><br />';
        $content .= '<a href="' . $pageEditLink . '">' . $this->owner->ID . '</a></p>';

        if ($member) {
            $memberEditLink = Director::absoluteBaseURL() . 'admin/security/EditForm/field/Members/item/' . $member->ID . '/edit';

            $content .= '<p><strong>Member email</strong><br />';
            $content .= '<a href="' . $memberEditLink . '">' . $member->Email . '</a></p>';
            $content .= '<p><strong>Member ID</strong><br />';
            $content .= '<a href="' . $memberEditLink . '">' . $member->ID . '</a></p>';
        }

        $email = Email::create(
            'from@example.com',
            'to@example.com',
            $config->Title . ' - Page Unpublished',
            $content
        );

        $email->send();
    }

}

在上面的代码中,电子邮件内容包含未发布的页面日志和未发布页面的成员。

这并不能解决问题,但它应该有助于跟踪和调试问题。

答案 1 :(得分:1)

检查您是否在DataList上调用remove(),因为这将从实时数据库中删除一个页面(但它保留在草稿中)。 如果你在某个地方有这个代码,这就是你的问题所在。只需将DataList转换为ArrayList,以便remove()不直接操作数据库(只有您的列表实例)。

window.open("domain.com", "_blank", "location=no,clearsessioncache=yes"); 

或者您可以使用filterByCallback()来操作检索到的DataList,而无需实际编辑数据:

$pages = DataList::create('YourClassNameHere');
$pages = $pages->toArray();
$pagesArray = new ArrayList($pages);

foreach ($pagesArray as $page) {
    if (your logic here) {
        $pagesArray->remove($page);
    }
}

希望有所帮助。