【问题标题】:SilverStripe properly removing page by codeSilverStripe 按代码正确删除页面
【发布时间】:2016-12-01 15:19:01
【问题描述】:

这似乎是 SS 中的一个困难领域。

我正在尝试使用以下代码通过代码删除页面:$page->doArchive();

但是,这会在 SiteTree 菜单中留下页面的幽灵,并带有“恢复草稿”选项。然而,这破坏了我的模块的功能,根本不需要。

如何完全删除页面,使用户无法看到/恢复它?

编辑:也试过了:

DB::query("DELETE FROM SomePage WHERE ForeignID = {$this->ID}");
DB::query("DELETE FROM SomePage_Live WHERE ForeignID = {$this->ID}");
DB::query("DELETE FROM SomePage_versions WHERE ForeignID = {$this->ID}");

甚至手动清除了 MySQL 表 (phpmyadmin) 并且 STILL 在那里显示了带有恢复草稿选项的页面(在菜单中被划掉)。

EDIT2:这段乱七八糟的代码会删除所有记录,并取消恢复草稿的能力。但是,已删除的页面图标仍会显示在站点树中,并且会在刷新后消失。

DB::query("DELETE FROM SomePage WHERE ForeignID = {$this->ID}");
DB::query("DELETE FROM SomePage_Live WHERE ForeignID = {$this->ID}");
DB::query("DELETE FROM SomePage_versions WHERE ForeignID = {$this->ID}");
DB::query("DELETE FROM SomePage_versions WHERE ForeignID = 0");

DB::query("DELETE FROM SiteTree WHERE ID = {$pageID}");
DB::query("DELETE FROM SiteTree_Live WHERE ID = {$pageID}");
DB::query("DELETE FROM SiteTree_versions WHERE RecordID = {$pageID}");

问题:如何防止被删除的页面图标“闪退”?

【问题讨论】:

  • 我这样做的唯一方法是使用原始查询。您需要从 PageClassName、PageClassName_Live 和 PageClassName_versions 中删除记录。必须有更好的方法来做到这一点。
  • 仍然留下“恢复草稿”选项,莫名其妙..
  • SomePageSiteTree 的子类吗?如果是,那么您删除它的方式是错误的……您需要完全按照SiteTree 本身删除这些记录,例如。 DELETE FROM SomePage WHERE ID = {$pageID}

标签: php silverstripe


【解决方案1】:

SilverStripe 不会删除,它使用存档,您可以通过 $page->doArchive(); 执行此操作。我认为,如果您正在编写模块,则绝对应该使用这种删除页面的方式,因为这是人们所期望的。除非您的模块是关于从数据库中完全删除记录...

如果您确实需要清理数据库并想要手动执行操作,您还需要挂钩到站点树 JavaScript(缠绕),以便在您删除页面后正确刷新站点树。

更新:

下面是一小段代码,您可以如何强制更新部分或所有树节点。

创建一个自定义的缠绕脚本,我们把它保存在mysite/javascript/tree-hook.js

(function($) {
    $(function(){
        // ss.tree "namespace" is needed to be able to access the tree methods
        $.entwine('ss.tree', function($){
            // Match your custom button selector
            $(".myCustomButton").entwine({
                onmatch: function () {
                    this._super();
                    // bind a namespaced click handler (for easy removal)
                    $(this).on("click.treeHook", function (e) {
                        e.preventDefault();
                        e.stopImmediatePropagation();
                        // pass in all the tree node IDs you need to update
                        $(".cms-tree").updateNodesFromServer([/* IDs */]);
                    });
                },
                onunmatch: function () {
                    this._super();
                    $(this).off("click.treeHook");
                }
            })
        });
    });
})(jQuery);

然后通过将以下内容添加到您的 config.yml 中,将自定义 JS 加载到 CMS 中:

LeftAndMain:
  extra_requirements_javascript:
    - 'mysite/javascript/tree-hook.js'

有关 entwine 的更多信息,请考虑查看此 beginners guidegithub repository

【讨论】:

  • 这是我的解决方案中缺少的部分,站点树菜单神奇地保留了自己的记录。您有关于刷新站点树菜单的任何信息资源吗?
  • 这确实很有帮助。我可以从 ModelAdmin 页面执行此操作吗?另外,什么是“树节点ID”?是
  • 上的ID吗?
  • @Faloude 我认为 ModelAdmin 没有必要这样做,因为 SiteTree 在那里不可用?是的,树节点 ID 基本上只是页面 ID。它们也可用作树叶上的 html 数据属性。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签