Php SilverStripe按代码正确删除页面

Php SilverStripe按代码正确删除页面,php,silverstripe,Php,Silverstripe,这似乎是SS中的一个难点 我试图使用以下代码删除一个页面:$page->doArchive() 但是,这会在SiteTree菜单中留下一个页面的重影,并带有“恢复草稿”选项。然而,这破坏了我的模块的功能,根本不需要 如何完全删除页面,使用户无法查看/恢复它? 编辑:也尝试了: DB::query("DELETE FROM SomePage WHERE ForeignID = {$this->ID}"); DB::query("DELETE FROM SomePage_Live WHERE

这似乎是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),并且仍然在那里它显示了带有恢复草稿选项的页面(在菜单中划掉)

EDIT2:这段凌乱的代码将删除所有记录并删除恢复草稿的功能。但是,已删除的页面图标仍显示在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}");
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}");

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

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

如果您确实需要清理数据库并希望手动执行操作,那么还需要挂接到站点树JavaScript(entwine),以便在删除页面后,它将正确刷新站点树

更新:

下面是一小段代码,说明如何强制更新某些或所有树节点

创建一个定制的缠绕脚本,我们将其保存在
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'

关于缠绕的更多信息,考虑看这个或

SulvFrutpe不删除,它使用存档,您可以通过<代码> $PAGE > doScript();代码>。我认为,如果你正在编写一个模块,你肯定应该使用这种删除页面的方式,因为这是人们所期望的。除非您的模块要从数据库中完全删除记录

如果您确实需要清理数据库并希望手动执行操作,那么还需要挂接到站点树JavaScript(entwine),以便在删除页面后,它将正确刷新站点树

更新:

下面是一小段代码,说明如何强制更新某些或所有树节点

创建一个定制的缠绕脚本,我们将其保存在
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'

<>为了了解更多的信息,考虑一下这个或

我做的唯一方法就是使用原始查询。您需要从PageClassName、PageClassName\u Live和PageClassName\u版本中删除记录。一定有更好的方法可以做到这一点。仍然留下一个“恢复草稿”选项,令人困惑。
SomePage
SiteTree
的子类吗?如果是,您删除它的方式是错误的……您需要完全按照
SiteTree
本身删除这些记录,例如
delete FROM SomePage,其中ID={$pageID}
我这样做的唯一方式是使用原始查询。您需要从PageClassName、PageClassName\u Live和PageClassName\u版本中删除记录。一定有更好的方法可以做到这一点。仍然留下一个“恢复草稿”选项,令人困惑。
SomePage
SiteTree
的子类吗?如果是,您删除它的方式是错误的…您需要完全按照
SiteTree
本身删除这些记录,例如
delete FROM SomePage,其中ID={$pageID}
是我的解决方案中缺少的部分,SiteTree菜单神奇地保留了自己的记录。你有关于刷新sitetree菜单的信息资源吗?这确实很有帮助。我可以从ModelAdmin页面执行此操作吗?还有,“树节点id”是什么?这是
  • 上的ID吗?@Faloude我认为没有必要从ModelAdmin执行此操作,因为那里没有可用的SiteTree?是的,树节点ID基本上就是页面ID。它们也可以作为html数据属性出现在树的叶子上。这是我的解决方案中缺少的部分,sitetree菜单神奇地保存着自己的记录。你有关于刷新sitetree菜单的信息资源吗?这确实很有帮助。我可以从ModelAdmin页面执行此操作吗?还有,“树节点id”是什么?这是
  • 上的ID吗?@Faloude我认为没有必要从ModelAdmin执行此操作,因为那里没有可用的SiteTree?是的,树节点ID基本上就是页面ID。它们也可以作为树叶上的html数据属性提供。