Как вернуть старую кнопку "Уничтожить ресурсы" в MODX
Полезно для тех кого не устраивает менеджер для удаления ресурсов, начиная с версии 2.7:
Оказалось довольно просто: создаем плагин returnKilButton
И два события OnManagerPageBeforeRender и OnResourceToolbarLoad


Код плагина
И опубликовал в modstore
modstore.pro/packages/utilities/returnkillbutton
Оказалось довольно просто: создаем плагин returnKilButton
И два события OnManagerPageBeforeRender и OnResourceToolbarLoad


Код плагина
<?php
/**
* Created by Andrey Stepanenko.
* User: webnitros
* Date: 10.01.2019
* Time: 12:36
*/
switch ($modx->event->name) {
case 'OnManagerPageBeforeRender':
if ($modx->hasPermission('purge_deleted')) {
$modx->controller->addHtml('<script>Ext.onReady(function() {
var tree = Ext.getCmp("modx-resource-tree");
tree.emptyRecycleBin = function() {
MODx.msg.confirm({
title: _("empty_recycle_bin")
,text: _("empty_recycle_bin_confirm")
,url: MODx.config.connector_url
,params: {
action: "resource/emptyRecycleBin"
}
,listeners: {
"success":{fn:function() {
Ext.select("div.deleted",this.getRootNode()).remove();
MODx.msg.status({
title: _("success")
,message: _("empty_recycle_bin_emptied")
});
var trashButton = this.getTopToolbar().findById("emptifier");
trashButton.disable();
trashButton.setTooltip(_("empty_recycle_bin") + " (0)");
this.fireEvent("emptyTrash");
},scope:this}
}
});
}
tree.deleteDocument = function(itm,e) {
var node = this.cm.activeNode;
var id = node.id.split("_");id = id[1];
var pagetitle = node.ui.textNode.innerText;
MODx.msg.confirm({
title: pagetitle ? _("resource_delete") + " " + pagetitle : _("resource_delete")
,text: _("resource_delete_confirm")
,url: MODx.config.connector_url
,params: {
action: "resource/delete"
,id: id
}
,listeners: {
"success": {fn:function(data) {
var trashButton = this.getTopToolbar().findById("emptifier");
if (trashButton) {
if (data.object.deletedCount == 0) {
trashButton.disable();
} else {
trashButton.enable();
}
trashButton.setTooltip(_("empty_recycle_bin") + " (" + data.object.deletedCount + ")");
}
var n = this.cm.activeNode;
var ui = n.getUI();
ui.addClass("deleted");
n.cascade(function(nd) {
nd.getUI().addClass("deleted");
},this);
Ext.get(ui.getEl()).frame();
},scope:this}
}
});
}
});</script>');
}
break;
case 'OnResourceToolbarLoad': // ПРИОРИТЕТ 1000
if ($modx->hasPermission('purge_deleted')) {
/* @var array $items */
if (count($items) > 0) {
foreach ($items as $k => $item) {
if ($item['cls'] == 'tree-trash') {
unset($items[$k]);
break;
}
}
$deletedResources = $modx->getCount('modResource', array('deleted' => 1));
$items[] = array(
'id' => 'emptifier',
'cls' => 'tree-trash',
'tooltip' => $modx->lexicon('empty_recycle_bin') . " ({$deletedResources})",
'disabled' => ($deletedResources == 0) ? true : false,
'handler' => 'this.emptyRecycleBin',
);
exit($modx->toJSON($modx->error->success('', array_values($items))));
}
}
break;
}Так же плагин добавлени в мою сборку siteDevИ опубликовал в modstore
modstore.pro/packages/utilities/returnkillbutton
Комментарии: 31
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
В логе
но работает, так что одобрил. Просьба исправить это warning.
Пытался удалить 4500 ресурсов, довольно трудно сделать это через менеджер.
Еще до этого надо было удалить 1 ресурс, но не хочу я переходить куда то для этого действия.
еще баг сегодня обнаружил.
modx.pro/news/16963#comment-105981
Хотя пару дней назад мне показалось что я сам поставил ресурс который не хотел удалять на удаление.
Мне вот даже ситуации не представляется где бы помог менеджер для удаления. Сколько раз пытался удалять, ну достаточно того что и так все удалялось.
Fi1osofFi1osofUPD: То есть если два компонента зависят от какого-то состояния, то не надо для них отдельные запросы делать, а сделать один и подписать их оба на него.
Fi1osofПочему оно так устроено что нужно обязательно прервать процесс через exit.
Было бы круче если бы items как передавался в массив так и возвращался обратно.
Получается работать будет только один процесс, либо тот кто его остановит.
Fi1osof1. Вы делаете неправильно. Вот пример: forums.modx.com/thread/87107/adding-icon-to-the-resource-toolbar
Там возвращают через return $this->modx->error->success('',$items);
Посмотрите в эту сторону.
2. Не вижу у вас где именно вы объявляете переменную $items. Полагаю нигде. В этом тоже может быть засада. MODX не всегда корректно использует ссылки на объекты. В результате передается не объект, а его копия, и теряется связь с оригиналом.
Попробуйте вот так: $items = & $scriptProperties['items']; и добавляйте уже в него.
А exit в вашем случае для того, чтобы отдать контент. Плагины просто так контент не отдают, простые print и print_r в них просто записываются в логи MODX и все.
Если объекты PHP, то уверен, что ты просто оговорился.
Fi1osofmodPlugin расширяет класс modElement. При выполнении там выполняется extract($scriptProperties, EXTR_SKIP); То есть все переданные параметры из общего массива экстрактятся в отдельные переменные. Это и позволяет в плагинах работать с переменными без объявления их, типа как в коде выше с переменной $items, которая нигде не объявлялась.
Но проблема в том, что при экспорте используется параметр EXTR_SKIP. При таком экспорте переменных создаются именно новые сущности, а не просто передается ссылки на существующие переменные. В этом и проблема.
Чтобы было понятней, вот пример:
MODX создал переменную $items=[$item1, $item2] и отправляет в ивент параметром. Ивент нашел 3 плагина и начинает по порядку их выполнять с передачей в них этой переменной.
В первый плагин переменная пришла с двумя элементами. Вы добавляете туда еще элемент $items[] = $item; и у вас тут 3 элемента. ОК, выполняется второй плагин. Как вы думаете, сколько там будет элементов в $items? Если думаете, что 3, то думаете неправильно. Для первого плагина $items — локальная переменная, никак не связанная с исходным элементов $itesm. То есть в первом плагине стало 3 элемента, а во втором (и далее) все те же 2.
Чтобы такого не произошло, надо или добавлять так: $scriptProperties['items'][] = $item; или создать свою связанную переменную $items = & $scriptProperties['items']; и работать уже с ней, как со ссылкой. Вот тогда можно выполнять несколько плагинов.
P.S. если бы они использовали EXTR_REFS вместо EXTR_SKIP, то экспортировались бы сразу ссылки и проблемы не было бы. Я даже где-то писал об этом давно (может даже тикет создавал или PR), но результата не было.
Я, кстати, тоже несколько раз порывался сделать PR с EXTR_REFS, но забил. Простейшие изменения принимаются годами, а тут даже надеяться не на что. С этим нужно разбираться, а у них ни времени ни желания нету, а возможно и знаний.
Fi1osofПоэтому для себя давно уже опускаю разделение одних на других. В данном случае мне правильней было говорить именно про массивы.
Т.е. разработчики MODX не знают как работают объекты и ссылки. Описанный выше код я считаю опасным. Ибо при изменении $this->modx глобальный объект $modx тоже измениться. А если убрать ссылки, то даже если сделать так $this->modx = null, глобальный объект останется невредимым.
В менеджере кнопочку «Уничтожить всё» религия не позволяет нажимать?
Удобнее видеть всё элементы на удаление в одном месте. Так как товары по-умолчанию в ms2 не отображаются в дереве элементов.