2015-04-01 51 views
2

我的一個網站有一個奇怪的行爲。有時,有些頁面在沒有任何用戶交互的情況下不發佈。SilverStripe CMS取消發佈,無需用戶干預

在頁面歷史記錄中,沒有關於任何活動的條目。 這些頁面是受保護頁面的子項。

未發佈的頁面並不總是相同的。它在什麼頁面和期間中有所不同。

apache訪問文件沒有提供任何關於外部訪問的信息。

對於測試,我更改了這些頁面的內容。 等待幾天後,這些頁面中的其中一頁再次未發佈。這個頁面的內容沒有改變。所以我可以排除供應商夜間恢復數據庫的可能性。

這怎麼可能?

系統:SilverStripe 3.1.12(CMS /框架)

+0

嗨帕特里克,我很抱歉,但我從未有過這樣的問題。由於我無法重現問題,因此我無法調查問題的癥結所在。這是發生在現場服務器還是本地開發環境?您是否能夠在其他環境中重新創建此問題? – 3dgoo 2015-04-08 23:00:52

+1

我也不能重新創建它。 它只發生在現場服務器上。在本地開發環境一切都很好。 我無法想象問題是什麼。我運行了近15個銀條紋網站,沒有像這樣的問題。 我想我必須打電話給提供商。銀條紋不能成爲這個問題的原因。 – PatrickE 2015-04-09 11:12:45

+0

您是否檢查過沒有任何cron作業正在運行? – 2015-04-09 14:40:47

回答

1

我們可以使用onBeforeUnpublish通知我們,當一個頁面是未發表的,以幫助調試問題。我們通過SiteTree擴展來完成此操作。

我們宣佈我們config.yml文件SiteTree擴展(或替代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(
      '[email protected]', 
      '[email protected]', 
      $config->Title . ' - Page Unpublished', 
      $content 
     ); 

     $email->send(); 
    } 

} 

在上面的代碼中,電子郵件內容具有未發佈頁面的日誌以及未發佈頁面的成員。

這不能解決問題,但它應該有助於跟蹤和調試問題。

+1

這樣做的額外好處是,如果它永遠不會被解僱,但您仍然遇到問題,它就證明它既不是直接做它的人,也不是SilverStripe本身以某種方式取消發佈頁面。 – Turnerj 2016-01-14 00:12:46

1

檢查您是不是在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(); }); 

希望有所幫助。