我的网站有一种奇怪的行为。有些页面有时会在未经任何用户交互的情况下取消发布。
在页面历史记录中,没有关于任何活动的条目。 这些页面是安全页面的子项。
未发布的页面并不总是相同。它在不同的页面和期间都有所不同。
apache访问文件不提供任何来自外部的访问信息。
为了测试,我更改了这些页面的内容。 等了几天后,其中一个页面再次未发布。此页面的内容没有变化。所以我可以排除提供商每晚恢复数据库的可能性。
这怎么可能?
系统:SilverStripe 3.1.12(CMS / Framework)
答案 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);
}
}
希望有所帮助。