用于 ModelAdmin 管理页面的 silverstripe dopublish 功能

Posted

技术标签:

【中文标题】用于 ModelAdmin 管理页面的 silverstripe dopublish 功能【英文标题】:silverstripe dopublish function for ModelAdmin managed Pages 【发布时间】:2012-08-22 21:13:44 【问题描述】:

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

这是我的代码:

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

目前我仍然可以在 Sitetree 中看到 ModelAdmin 创建的页面,并且我可以看到它们处于草稿模式。如果我使用上面的代码,我会收到此错误: 超过 30 秒的最大执行时间 .../framework/model/DataList.php

非常感谢, 弗洛里安

【问题讨论】:

现在有一些模块用于管理 ModelAdmin 中的页面类型,例如github.com/Little-Giant/silverstripe-catalogmanager 【参考方案1】:

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

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

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

【讨论】:

有一个模块会很棒!我在 2.4 中一直在使用 unclecheese 的“remodeladmin”方法;猜想事情也应该适用于 3.0。快速浏览了一下,认为这里可能有助于添加“发布/取消发布”操作:github.com/silverstripe/sapphire/pull/526 你好!谢谢!另一件对我有帮助的事情是,在控制器中执行此操作时也会获得未发布的页面: $projectPages = ProjectPage::get(); 它不是一个模块,但请参阅 my answer 了解一个可以满足您需要的现成扩展。【参考方案2】:

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

public function onAfterWrite()

if(!$this->isPublished() || $this->getIsModifiedOnStage())

    $this->publish('Stage', 'Live');
    Controller::curr()->redirectBack(); 

parent::onAfterWrite();

【讨论】:

【参考方案3】:

创建一个扩展ModelAdmin 的类,并定义一个updateEditForm 函数,以将发布按钮添加到GridFieldGridFieldDetailForm 组件中的操作。

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;

确保应用扩展并完成。

或者,你也可以grab all the code you need from GitHub。

【讨论】:

以上是关于用于 ModelAdmin 管理页面的 silverstripe dopublish 功能的主要内容,如果未能解决你的问题,请参考以下文章

Django网站管理--ModelAdmin

Wagtail ModelAdmin 内联?

如何在 django admin 中组合两个或多个 ModelAdmin

有没有办法根据条件在新页面中显示特定的内联?

同一模型的多个版本的 django 管理页面

鹡鸰模型管理员。自定义用户的几个部分