2013-07-17 3 views

ответ

1

Вот что я мог бы сделать, используя модуль StaticPublishQueue. В вашем NewsDataObject.php:

function onAfterWrite() { 
    parent::onAfterWrite(); 

    $url = array(); 
    $pages = $this->Pages(); //has_many link to pages that include this DataObject 
    foreach($pages as $page) { 
     $pagesAffected = $page->pagesAffected(); 
     if ($pagesAffected && count($pagesAffected) > 0) { 
      $urls = array_merge((array)$urls, (array)$pagesAffected); 
     } 
    } 
    URLArrayObject::add_urls($urls); 
} 

Это занимает каждая из страниц, которые ссылается ваш DataObject, спрашивает его все это URL и URL любых связанных страниц (например, виртуальные страницы, которые ссылаются на эту страницу), компилирует все URL-адресов в большой массив, а затем добавляет этот массив в статическую очередь публикации. Очередь будет постепенно обрабатываться до тех пор, пока все затронутые страницы не будут переизданы.

Система событий позволяет добавить слой абстракции между повторной публикацией и триггерами для повторной публикации, но для чего-то простого вам необязательно использовать его. Вместо этого вы можете напрямую добавлять страницы в очередь. (Возможно, вам также понравится это прочитать blog post describing the StaticPublishQueue module)

0

Модуль StaticPublisherQueue будет обрабатывать это для вас.

+0

thx! вы понимаете readme? например, я не вижу, как создать реализатор MyEventListener. readme говорит добавить функцию Object # MyEvent (событие $ event). Но где и что такое синтаксис? Я добавил это в config.php: StaticPagesQueueEvent :: register_event ('NewsUpdateEvent', 'NewsUpdateEventListener'); и что в новостях DataObject: public function onAfterWrite() { parent :: onAfterWrite(); StaticPagesQueueEvent :: fire_event (новый NewsUpdateEvent ($ this)); } с остальными Я все еще в темноте. Вы знаете больше? спасибо! – spierala

0

В случае, если кто-то еще сталкивается с этим и не хочет использовать модуль StaticPublishQueue вместо StaticPublisher, он кажется возможным в StaticPublisher, для меня работает следующее: :

function onAfterWrite() { 
    parent::onAfterWrite(); 

    $urls = array(); 

    $pages = Page::get(); 
    foreach($pages as $page) { 
     $urls[] = $page->Link(); 
    } 

    $sp = new FilesystemPublisher(); 
    $sp->publishPages($urls); 
} 

Обратите внимание на последние 2 строки и используйте страницу :: get, чтобы указать точные страницы, которые необходимо обновить.

Смежные вопросы