0

在 silverstripe 后端,我通过 ModelAdmin 管理某些 PageTypes。到目前为止效果很好,我唯一不知道的是如何在保存页面时使页面“发布”。

那是我的代码:

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

目前我仍然可以在 Sitetree 中看到 ModelAdmin 创建的页面,并且我可以看到它们处于草稿模式。如果我使用上面的代码,我会收到此错误:Maximum execution time of 30 seconds exceeded in .../framework/model/DataList.php

非常感谢,弗洛里安

4

3 回答 3

1

我发现了同样的需求/缺乏,我建立了一个似乎对我有用的解决方法,也许它可能有用。

public function onAfterWrite()
{
if(!$this->isPublished() || $this->getIsModifiedOnStage())
{
    $this->publish('Stage', 'Live');
    Controller::curr()->redirectBack(); 
}
parent::onAfterWrite();
}
于 2012-11-15T10:00:25.700 回答
1

创建一个扩展ModelAdmin并定义一个updateEditForm函数的类,以将发布按钮添加GridFieldDetailFormGridField.

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 获取您需要的所有代码

于 2012-11-16T04:17:08.770 回答
1

你得到“超过最大执行时间”的原因是因为$this->doPublish();调用$this->write();然后调用$this->onAfterWrite();. 在那里你有你的无限循环。所以这样做onAfterWrite()write()实际上不起作用

你应该只显示保存和发布按钮而不是保存按钮但我想它说起来容易做起来难。好吧,添加一个按钮实际上只是几行代码,但我们还需要提供执行按钮所说的功能的功能。

这听起来像是创建一个允许在模型管理中正确处理页面的新模块的完美调用。我在SS2.4里做过这个,在SS3里怎么做也有一个不错的想法,但是这周没时间,周末在silverstripe irc频道戳我,也许我周末有时间。

于 2012-08-28T18:21:17.103 回答