【问题标题】:SilverStripe CMS unpublish without user interactionSilverStripe CMS 无需用户交互即可取消发布
【发布时间】:2015-06-06 00:34:13
【问题描述】:

我的一个网站有一个奇怪的行为。有时,有些页面在没有任何用户交互的情况下未发布。

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

未发布的页面并不总是相同的。在哪个页面和哪个时期有所不同。

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

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

这怎么可能?

系统:SilverStripe 3.1.12(CMS/框架)

【问题讨论】:

  • 嗨帕特里克,很抱歉,我以前从未遇到过这样的问题。由于我无法重新创建问题,因此无法调查问题可能是什么。这是在实时服务器上还是在本地开发环境上发生的?您能否在其他环境中重现此问题?
  • 我也无法重新创建它。它只发生在实时服务器上。在本地开发环境中,一切都很好。我无法想象问题可能是什么。我运行了近 15 个 Silverstripe 网站,没有出现此类问题。我想我必须打电话给提供者。 Silverstripe 不是这个问题的原因。
  • 您是否检查过没有任何可能是原因的 cron 作业正在运行?
  • 当您发布它时,请检查*_Live 表中的记录,以确认它是否包含您想要的内容等。当它再次被随机取消发布时,请执行相同的检查以尝试找到相同的行。同时,用一个额外的单词或短语更新一个没有发生这种情况的随机页面。对我来说,唯一想到的是数据库正在回到过去(甚至不是开玩笑)。除非你有一些疯狂的复杂或不同的代码,否则我认为这不是 Silverstripe 的问题。
  • 您确定没有正在发布和取消发布的工作流模块吗?使用日期时间检查字段禁运和到期

标签: database silverstripe


【解决方案1】:

我们可以使用onBeforeUnpublish 通知我们何时取消发布页面以帮助调试问题。我们通过SiteTree 扩展来做到这一点。

我们在config.yml 文件(或替代yml 文件)中声明SiteTree 扩展:

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();
    }

}

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

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

【讨论】:

  • 这样做的额外好处是,如果它从未被解雇但您仍然遇到问题,则证明它既不是直接执行此操作的人,也不是 SilverStripe 本身以某种方式取消发布页面。跨度>
【解决方案2】:

检查您没有在 DataList 上调用 remove(),因为这将从实时数据库中删除一个页面(但它仍处于草稿状态)。 如果您在某处有此代码,那么这就是您的问题所在。只需将 DataList 转换为 ArrayList,这样 remove() 就不会直接操作数据库(只有您的列表实例)。

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

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

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

$pages = DataList::create('YourClassNameHere');
$pages = $pages->filterByCallback(function($page) { return $page->canView(); });

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2011-09-29
    • 1970-01-01
    • 2017-11-04
    • 2016-10-17
    • 2022-11-01
    • 2019-11-27
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多