Статический издатель silverstripe — страницы, затронутые изменениями объекта данных

есть ли возможность инициировать обновление кеша, если DataObject редактируется? например, обновление News DataObject должно обновить кеш страниц, отображающих эти NewsObject.

большое спасибо, Флориан


person spierala    schedule 17.07.2013    source источник


Ответы (3)


Вот что я могу сделать с помощью модуля 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-адреса в большой массив, а затем добавляет этот массив в статический очередь публикации. Очередь будет постепенно обрабатываться, пока все затронутые страницы не будут опубликованы повторно.

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

person Candidasa    schedule 24.10.2013

Модуль StaticPublisherQueue сделает это за вас.

person thezenmonkey    schedule 15.10.2013
comment
Спасибо! ты понял ридми? например, я не вижу, как создать средство реализации MyEventListener. в файле readme сказано добавить функцию Object#MyEvent(Event $event). Но где и каков точный синтаксис? Я добавил это в config.php: StaticPagesQueueEvent::register_event('NewsUpdateEvent', 'NewsUpdateEventListener'); и это для News DataObject: public function onAfterWrite() { parent::onAfterWrite(); StaticPagesQueueEvent::fire_event(new NewsUpdateEvent($this)); } с остальным я пока в неведении. Знаете ли вы что-нибудь еще? Спасибо! - person spierala; 15.10.2013

В случае, если кто-то еще столкнется с этим и не хочет использовать модуль 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 строки и используйте Page::get, чтобы указать точные страницы, которые необходимо обновить.

person James Cocker    schedule 06.05.2014