Функция публикации серебряных полос для страниц, управляемых ModelAdmin

В бэкэнде Silverstripe я управляю определенными типами страниц через ModelAdmin. Пока это прекрасно работает, единственное, что я не могу понять, это как сделать страницу "опубликованной" при ее сохранении.

Вот мой код:

class ProjectPage extends Page { 
    public function onAfterWrite() {
        $this->doPublish();
        parent::onAfterWrite();
    }
}

В настоящий момент я все еще вижу страницы, созданные ModelAdmin в Sitetree, и вижу, что они находятся в черновом режиме. Если я использую код выше, я получаю эту ошибку: максимальное время выполнения 30 секунд превышено в.../framework/model/DataList.php

Многие, Флориан

3 ответа

Решение

Причина, по которой вы получаете "Превышено максимальное время выполнения", заключается в том, что $this->doPublish(); звонки $this->write(); который затем вызывает $this->onAfterWrite();, И там у вас есть бесконечный цикл. Так делает это в onAfterWrite() или же write() на самом деле не работает

Вы должны просто отобразить кнопку "Сохранить и опубликовать" вместо кнопки "Сохранить". Но я думаю, что это легче сказать, чем сделать. Добавление кнопки - это всего лишь несколько строк, но нам также нужно предоставить функции, которые делают то, что говорит кнопка.

Это звучит как идеальный вызов для создания нового модуля, который позволяет правильно обрабатывать страницы в администраторе модели. Я сделал это в SS2.4, и у меня есть довольно хорошее представление о том, как это сделать в SS3, но на этой неделе не раз, тыкай меня на канал Silverstripe IRC на выходных, может быть, у меня есть время на выходных.

Я нашел такую ​​же потребность / недостаток, и я нашел обходной путь, который, кажется, работает для меня, может быть, это может быть полезно.

public function onAfterWrite()
{
if(!$this->isPublished() || $this->getIsModifiedOnStage())
{
    $this->publish('Stage', 'Live');
    Controller::curr()->redirectBack(); 
}
parent::onAfterWrite();
}

Создайте класс, который расширяет ModelAdmin и определить updateEditForm функция, чтобы добавить кнопку публикации к действиям в GridFieldDetailForm компонент GridField,

public function updateEditForm($form) {

    if ( ! singleton($this->owner->modelClass)->hasExtension('Versioned') ) return;

    $gridField = $form->Fields()->fieldByName($this->owner->modelClass);
    $gridField->getConfig()->getComponentByType('GridFieldDetailForm')->setItemEditFormCallback(function ($form) {
        $form->Actions()->push(FormAction::create('doPublish', 'Save & Publish'));
    });
}

Затем создайте класс, который расширяет GridFieldDetailForm_ItemRequest предоставить обработчик действия для вашей кнопки публикации.

public function doPublish($data, $form) {
    $return = $this->owner->doSave($data, $form);
    $this->owner->record->publish('Stage', 'Live');
    return $return;
}

Убедитесь, что расширения применяются и все готово.

Или вы можете просто взять весь необходимый код с GitHub.

Другие вопросы по тегам