这似乎是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}");
问题:如何阻止已删除页面图标的“闪烁”?
答案 0 :(得分:3)
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
:
LeftAndMain:
extra_requirements_javascript:
- 'mysite/javascript/tree-hook.js'
有关缠绕的更多信息,请考虑查看此beginners guide或github repository