From f92aaaf96b5fa0536c9d1c04af7f8da0a6782532 Mon Sep 17 00:00:00 2001 From: halftrainedharry Date: Sun, 18 Sep 2022 12:20:04 +0200 Subject: [PATCH 1/4] Move processors & service class --- .../batcher/{model/batcher/batcher.class.php => src/Batcher.php} | 0 .../Processors/Element/ChangeCategory.php} | 0 .../getlist.class.php => src/Processors/Element/GetList.php} | 0 .../getlist.class.php => src/Processors/Filters/GetList.php} | 0 .../mgr/resource/batch.php => src/Processors/Resource/Batch.php} | 0 .../Processors/Resource/ChangeAuthors.php} | 0 .../changedates.php => src/Processors/Resource/ChangeDates.php} | 0 .../changeparent.php => src/Processors/Resource/ChangeParent.php} | 0 .../Processors/Resource/ChangeTemplate.php} | 0 .../getlist.class.php => src/Processors/Resource/GetList.php} | 0 .../resource/remove.php => src/Processors/Resource/Remove.php} | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename core/components/batcher/{model/batcher/batcher.class.php => src/Batcher.php} (100%) rename core/components/batcher/{processors/mgr/element/changecategory.php => src/Processors/Element/ChangeCategory.php} (100%) rename core/components/batcher/{processors/mgr/element/getlist.class.php => src/Processors/Element/GetList.php} (100%) rename core/components/batcher/{processors/mgr/filters/getlist.class.php => src/Processors/Filters/GetList.php} (100%) rename core/components/batcher/{processors/mgr/resource/batch.php => src/Processors/Resource/Batch.php} (100%) rename core/components/batcher/{processors/mgr/resource/changeauthors.php => src/Processors/Resource/ChangeAuthors.php} (100%) rename core/components/batcher/{processors/mgr/resource/changedates.php => src/Processors/Resource/ChangeDates.php} (100%) rename core/components/batcher/{processors/mgr/resource/changeparent.php => src/Processors/Resource/ChangeParent.php} (100%) rename core/components/batcher/{processors/mgr/resource/changetemplate.php => src/Processors/Resource/ChangeTemplate.php} (100%) rename core/components/batcher/{processors/mgr/resource/getlist.class.php => src/Processors/Resource/GetList.php} (100%) rename core/components/batcher/{processors/mgr/resource/remove.php => src/Processors/Resource/Remove.php} (100%) diff --git a/core/components/batcher/model/batcher/batcher.class.php b/core/components/batcher/src/Batcher.php similarity index 100% rename from core/components/batcher/model/batcher/batcher.class.php rename to core/components/batcher/src/Batcher.php diff --git a/core/components/batcher/processors/mgr/element/changecategory.php b/core/components/batcher/src/Processors/Element/ChangeCategory.php similarity index 100% rename from core/components/batcher/processors/mgr/element/changecategory.php rename to core/components/batcher/src/Processors/Element/ChangeCategory.php diff --git a/core/components/batcher/processors/mgr/element/getlist.class.php b/core/components/batcher/src/Processors/Element/GetList.php similarity index 100% rename from core/components/batcher/processors/mgr/element/getlist.class.php rename to core/components/batcher/src/Processors/Element/GetList.php diff --git a/core/components/batcher/processors/mgr/filters/getlist.class.php b/core/components/batcher/src/Processors/Filters/GetList.php similarity index 100% rename from core/components/batcher/processors/mgr/filters/getlist.class.php rename to core/components/batcher/src/Processors/Filters/GetList.php diff --git a/core/components/batcher/processors/mgr/resource/batch.php b/core/components/batcher/src/Processors/Resource/Batch.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/batch.php rename to core/components/batcher/src/Processors/Resource/Batch.php diff --git a/core/components/batcher/processors/mgr/resource/changeauthors.php b/core/components/batcher/src/Processors/Resource/ChangeAuthors.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/changeauthors.php rename to core/components/batcher/src/Processors/Resource/ChangeAuthors.php diff --git a/core/components/batcher/processors/mgr/resource/changedates.php b/core/components/batcher/src/Processors/Resource/ChangeDates.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/changedates.php rename to core/components/batcher/src/Processors/Resource/ChangeDates.php diff --git a/core/components/batcher/processors/mgr/resource/changeparent.php b/core/components/batcher/src/Processors/Resource/ChangeParent.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/changeparent.php rename to core/components/batcher/src/Processors/Resource/ChangeParent.php diff --git a/core/components/batcher/processors/mgr/resource/changetemplate.php b/core/components/batcher/src/Processors/Resource/ChangeTemplate.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/changetemplate.php rename to core/components/batcher/src/Processors/Resource/ChangeTemplate.php diff --git a/core/components/batcher/processors/mgr/resource/getlist.class.php b/core/components/batcher/src/Processors/Resource/GetList.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/getlist.class.php rename to core/components/batcher/src/Processors/Resource/GetList.php diff --git a/core/components/batcher/processors/mgr/resource/remove.php b/core/components/batcher/src/Processors/Resource/Remove.php similarity index 100% rename from core/components/batcher/processors/mgr/resource/remove.php rename to core/components/batcher/src/Processors/Resource/Remove.php From cb16486c6d992a6b2bbdaff35dfcc57f0aea9621 Mon Sep 17 00:00:00 2001 From: halftrainedharry Date: Sun, 18 Sep 2022 12:47:06 +0200 Subject: [PATCH 2/4] Rewrite for MODX 3 --- assets/components/batcher/connector.php | 22 -- assets/components/batcher/css/mgr.css | 7 +- .../batcher/js/widgets/element.grid.js | 66 ++--- .../batcher/js/widgets/resource.grid.js | 38 +-- core/components/batcher/bootstrap.php | 14 ++ .../batcher/controllers/home.class.php | 49 +++- core/components/batcher/index.class.php | 55 ----- core/components/batcher/src/Batcher.php | 94 +------ .../src/Processors/Element/ChangeCategory.php | 88 ++++--- .../src/Processors/Element/GetList.php | 70 ++++-- .../src/Processors/Filters/GetList.php | 32 +-- .../batcher/src/Processors/Resource/Batch.php | 231 ++++++++++-------- .../src/Processors/Resource/ChangeAuthors.php | 79 +++--- .../src/Processors/Resource/ChangeDates.php | 52 ++-- .../src/Processors/Resource/ChangeParent.php | 68 ++++-- .../Processors/Resource/ChangeTemplate.php | 69 ++++-- .../src/Processors/Resource/GetList.php | 17 +- .../src/Processors/Resource/Remove.php | 38 ++- 18 files changed, 586 insertions(+), 503 deletions(-) delete mode 100644 assets/components/batcher/connector.php create mode 100644 core/components/batcher/bootstrap.php delete mode 100644 core/components/batcher/index.class.php diff --git a/assets/components/batcher/connector.php b/assets/components/batcher/connector.php deleted file mode 100644 index d202bd4..0000000 --- a/assets/components/batcher/connector.php +++ /dev/null @@ -1,22 +0,0 @@ -getOption('batcher.core_path',null,$modx->getOption('core_path').'components/batcher/'); -require_once $batcherCorePath.'model/batcher/batcher.class.php'; -$modx->batcher = new Batcher($modx); - -$modx->lexicon->load('batcher:default'); - -/* handle request */ -$path = $modx->getOption('processorsPath',$modx->batcher->config,$batcherCorePath.'processors/'); -$modx->request->handleRequest(array( - 'processors_path' => $path, - 'location' => '', -)); \ No newline at end of file diff --git a/assets/components/batcher/css/mgr.css b/assets/components/batcher/css/mgr.css index f376ff9..bd6b592 100644 --- a/assets/components/batcher/css/mgr.css +++ b/assets/components/batcher/css/mgr.css @@ -1,19 +1,17 @@ - .batcher-resource-body { padding: 10px 0 10px 20px; } - .batcher-grid .batcher-unpublished, .batcher-grid .batcher-unpublished span, .batcher-grid .batcher-unpublished a { color: gray; } + .x-grid3-body .x-grid3-td-checker { background-image: none !important; } - .batcher-deleted, .batcher-deleted span, .batcher-deleted a, .batcher-grid .batcher-deleted, .batcher-grid .batcher-deleted span, .batcher-grid .batcher-deleted a { color: red !important; @@ -26,9 +24,11 @@ box-shadow: none; color: #3697cd; } + .batcher-btn-link button { font-size: 13px; } + .batcher-btn-link:hover, .batcher-btn-link:focus, .batcher-btn-link:active, @@ -36,6 +36,7 @@ background-color: transparent !important; box-shadow: none !important; } + .batcher-btn-link:hover button, .batcher-btn-link:focus button, .batcher-btn-link:active button, diff --git a/assets/components/batcher/js/widgets/element.grid.js b/assets/components/batcher/js/widgets/element.grid.js index e6214b5..6cfbafb 100644 --- a/assets/components/batcher/js/widgets/element.grid.js +++ b/assets/components/batcher/js/widgets/element.grid.js @@ -4,9 +4,9 @@ Batcher.grid.Elements = function(config) { this.sm = new Ext.grid.CheckboxSelectionModel(); Ext.applyIf(config,{ - url: Batcher.config.connector_url + url: MODx.config.connector_url ,baseParams: { - action: 'mgr/element/getList' + action: 'Batcher\\Processors\\Element\\GetList' ,thread: config.thread } ,fields: ['id', 'name', 'description', 'category', 'category_name'] @@ -55,12 +55,12 @@ Batcher.grid.Elements = function(config) { ,id: 'batcher-element-type' ,store: new Ext.data.SimpleStore({ data: [ - ['modTemplate', _('template')], - ['modTemplateVar', _('tv')], - ['modChunk', _('chunk')], - ['modSnippet', _('snippet')], - ['modPlugin', _('plugin')], - ['modCategory', _('category')] + ['MODX\\Revolution\\modTemplate', _('template')], + ['MODX\\Revolution\\modTemplateVar', _('tv')], + ['MODX\\Revolution\\modChunk', _('chunk')], + ['MODX\\Revolution\\modSnippet', _('snippet')], + ['MODX\\Revolution\\modPlugin', _('plugin')], + ['MODX\\Revolution\\modCategory', _('category')] ], id: 0, fields: ["value", "text"] @@ -68,7 +68,7 @@ Batcher.grid.Elements = function(config) { ,valueField: 'value' ,displayField: 'text' ,mode: 'local' - ,value: 'modTemplate' + ,value: 'MODX\\Revolution\\modTemplate' ,emptyText: _('batcher.filter.element_type') ,listeners: { 'select': {fn:this.filterType,scope:this} @@ -118,7 +118,7 @@ Ext.extend(Batcher.grid.Elements,MODx.grid.Grid,{ } ,clearFilter: function() { this.getStore().baseParams = { - action: 'mgr/element/getList' + action: 'Batcher\\Processors\\Element\\GetList' }; Ext.getCmp('batcher-element-type').reset(); Ext.getCmp('batcher-element-search').reset(); @@ -166,28 +166,28 @@ Ext.extend(Batcher.grid.Elements,MODx.grid.Grid,{ return cs; } - ,batchAction: function(act,btn,e) { - var cs = this.getSelectedAsList(); - if (cs === false) return false; + // ,batchAction: function(act,btn,e) { + // var cs = this.getSelectedAsList(); + // if (cs === false) return false; - MODx.Ajax.request({ - url: this.config.url - ,params: { - action: 'mgr/resource/batch' - ,resources: cs - ,batch: act - } - ,listeners: { - 'success': {fn:function(r) { - this.getSelectionModel().clearSelections(true); - this.refresh(); - var t = Ext.getCmp('modx-resource-tree'); - if (t) { t.refresh(); } - },scope:this} - } - }); - return true; - } + // MODx.Ajax.request({ + // url: this.config.url + // ,params: { + // action: 'mgr/resource/batch' + // ,resources: cs + // ,batch: act + // } + // ,listeners: { + // 'success': {fn:function(r) { + // this.getSelectionModel().clearSelections(true); + // this.refresh(); + // var t = Ext.getCmp('modx-resource-tree'); + // if (t) { t.refresh(); } + // },scope:this} + // } + // }); + // return true; + // } ,changeCategory: function(btn,e) { var cs = this.getSelectedAsList(); if (cs === false) return false; @@ -228,9 +228,9 @@ Batcher.window.ChangeCategory = function(config) { config = config || {}; Ext.applyIf(config,{ title: _('batcher.change_category') - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,baseParams: { - action: 'mgr/element/changecategory' + action: 'Batcher\\Processors\\Element\\ChangeCategory' } ,width: 400 ,fields: [{ diff --git a/assets/components/batcher/js/widgets/resource.grid.js b/assets/components/batcher/js/widgets/resource.grid.js index 4fa535e..36b7e84 100644 --- a/assets/components/batcher/js/widgets/resource.grid.js +++ b/assets/components/batcher/js/widgets/resource.grid.js @@ -4,9 +4,9 @@ Batcher.grid.Resources = function(config) { this.sm = new Ext.grid.CheckboxSelectionModel(); Ext.applyIf(config,{ - url: Batcher.config.connector_url + url: MODx.config.connector_url ,baseParams: { - action: 'mgr/resource/getList' + action: 'Batcher\\Processors\\Resource\\GetList' ,thread: config.thread } ,fields: ['id','pagetitle','template','templatename','alias','deleted','published','createdon','editedon','hidemenu','context_key'] @@ -46,12 +46,14 @@ Batcher.grid.Resources = function(config) { ,dataIndex: 'published' ,sortable: true ,editor: { xtype: 'combo-boolean' ,renderer: 'boolean' } + ,editable: false ,width: 60 },{ header: _('batcher.hidemenu') ,dataIndex: 'hidemenu' ,sortable: true ,editor: { xtype: 'combo-boolean' ,renderer: 'boolean' } + ,editable: false ,width: 60 },{ header: _('batcher.editedon') @@ -175,11 +177,11 @@ Ext.extend(Batcher.grid.Resources,MODx.grid.Grid,{ if(cb.getValue() == 1){ field = 'published'; value = 1; - } + } if(cb.getValue() == 2){ field = 'published'; value = '0'; - } + } if(cb.getValue() == 3){ field = 'deleted'; value = 1; @@ -216,7 +218,7 @@ Ext.extend(Batcher.grid.Resources,MODx.grid.Grid,{ } ,clearFilter: function() { this.getStore().baseParams = { - action: 'mgr/resource/getList' + action: 'Batcher\\Processors\\Resource\\GetList' }; Ext.getCmp('batcher_resource_status').reset(); Ext.getCmp('batcher_resource_template').reset(); @@ -274,7 +276,7 @@ Ext.extend(Batcher.grid.Resources,MODx.grid.Grid,{ MODx.Ajax.request({ url: this.config.url ,params: { - action: 'mgr/resource/batch' + action: 'Batcher\\Processors\\Resource\\Batch' ,resources: cs ,batch: act } @@ -296,9 +298,9 @@ Ext.extend(Batcher.grid.Resources,MODx.grid.Grid,{ MODx.msg.confirm({ title: _('batcher.permanentdelete.title') ,text: _('batcher.permanentdelete.message') - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,params: { - action: 'mgr/resource/remove' + action: 'Batcher\\Processors\\Resource\\Remove' ,resources: cs } ,listeners: { @@ -509,12 +511,12 @@ Ext.extend(Batcher.grid.Resources,MODx.grid.Grid,{ ,width: 160 ,emptyText: _('batcher.filter.field') ,fieldLabel: 'Site filters' - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,fields: ['key', 'value'] ,valueField: 'key' ,displayField: 'value' ,baseParams: { - action: 'mgr/filters/getlist' + action: 'Batcher\\Processors\\Filters\\GetList' } ,emptyValue: 0 },{ @@ -603,9 +605,9 @@ Batcher.window.ChangeParent = function(config) { config = config || {}; Ext.applyIf(config,{ title: _('batcher.change_parent') - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,baseParams: { - action: 'mgr/resource/changeparent' + action: 'Batcher\\Processors\\Resource\\ChangeParent' } ,width: 400 ,fields: [{ @@ -627,9 +629,9 @@ Batcher.window.ChangeTemplate = function(config) { config = config || {}; Ext.applyIf(config,{ title: _('batcher.change_template') - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,baseParams: { - action: 'mgr/resource/changetemplate' + action: 'Batcher\\Processors\\Resource\\ChangeTemplate' } ,width: 400 ,fields: [{ @@ -653,9 +655,9 @@ Batcher.window.ChangeAuthors = function(config) { config = config || {}; Ext.applyIf(config,{ title: _('batcher.change_authors') - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,baseParams: { - action: 'mgr/resource/changeauthors' + action: 'Batcher\\Processors\\Resource\\ChangeAuthors' } ,width: 400 ,fields: [{ @@ -690,9 +692,9 @@ Batcher.window.ChangeDates = function(config) { config = config || {}; Ext.applyIf(config,{ title: _('batcher.change_dates') - ,url: Batcher.config.connector_url + ,url: MODx.config.connector_url ,baseParams: { - action: 'mgr/resource/changedates' + action: 'Batcher\\Processors\\Resource\\ChangeDates' } ,width: 500 ,fields: [{ diff --git a/core/components/batcher/bootstrap.php b/core/components/batcher/bootstrap.php new file mode 100644 index 0000000..83a41ce --- /dev/null +++ b/core/components/batcher/bootstrap.php @@ -0,0 +1,14 @@ +addPsr4('Batcher\\', $namespace['path'] . 'src/'); +} +catch (\Exception $e) { + $modx->log(xPDO::LOG_LEVEL_ERROR, $e->getMessage()); +} diff --git a/core/components/batcher/controllers/home.class.php b/core/components/batcher/controllers/home.class.php index d2f617e..270bbb5 100644 --- a/core/components/batcher/controllers/home.class.php +++ b/core/components/batcher/controllers/home.class.php @@ -25,21 +25,56 @@ * @package batcher * @subpackage controllers */ +use MODX\Revolution\modExtraManagerController; +use Batcher\Batcher; -require_once dirname(dirname(__FILE__)) . '/index.class.php'; +class BatcherHomeManagerController extends modExtraManagerController +{ + public $batcher; -class BatcherHomeManagerController extends BatcherBaseManagerController { + public function initialize() + { + $this->batcher = new Batcher($this->modx); - public function process(array $scriptProperties = array()) { - + $this->addCss($this->batcher->config['cssUrl'].'mgr.css'); + $this->addJavascript($this->batcher->config['jsUrl'].'batcher.js'); + $this->addHtml(''); } - public function getPageTitle() { return $this->modx->lexicon('batcher'); } - public function loadCustomCssJs() { + + public function getLanguageTopics() + { + return array('batcher:default'); + } + + public function checkPermissions() + { + return true; + } + + public function process(array $scriptProperties = array()) + { + } + + public function getPageTitle() + { + return $this->modx->lexicon('batcher'); + } + + public function loadCustomCssJs() + { $this->addJavascript($this->modx->getOption('manager_url').'assets/modext/util/datetime.js'); $this->addJavascript($this->batcher->config['jsUrl'].'widgets/element.grid.js'); $this->addJavascript($this->batcher->config['jsUrl'].'widgets/resource.grid.js'); $this->addJavascript($this->batcher->config['jsUrl'].'widgets/home.panel.js'); $this->addLastJavascript($this->batcher->config['jsUrl'].'sections/home.js'); } - public function getTemplateFile() { return $this->batcher->config['templatesPath'].'home.tpl'; } + + public function getTemplateFile() + { + return $this->batcher->config['templatesPath'].'home.tpl'; + } } \ No newline at end of file diff --git a/core/components/batcher/index.class.php b/core/components/batcher/index.class.php deleted file mode 100644 index ab6e875..0000000 --- a/core/components/batcher/index.class.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * @package batcher - * @subpackage controllers - */ -require_once __DIR__ . '/model/batcher/batcher.class.php'; - -abstract class BatcherBaseManagerController extends modExtraManagerController -{ - /** @var Batcher $batcher */ - public $batcher; - public function initialize() - { - $this->batcher = new Batcher($this->modx); - - $this->addCss($this->batcher->config['cssUrl'].'mgr.css'); - $this->addJavascript($this->batcher->config['jsUrl'].'batcher.js'); - $this->addHtml(''); - } - public function getLanguageTopics() - { - return array('batcher:default'); - } - public function checkPermissions() - { - return true; - } -} diff --git a/core/components/batcher/src/Batcher.php b/core/components/batcher/src/Batcher.php index f25f4ae..dca465e 100644 --- a/core/components/batcher/src/Batcher.php +++ b/core/components/batcher/src/Batcher.php @@ -21,100 +21,28 @@ * * @package batcher */ -/** - * @package batcher - */ -class Batcher { +namespace Batcher; + +use MODX\Revolution\modX; - function __construct(modX &$modx,array $config = array()) { +class Batcher +{ + function __construct(modX &$modx, array $config = array()) + { $this->modx =& $modx; - $corePath = $modx->getOption('batcher.core_path',null,$modx->getOption('core_path').'components/batcher/'); - $assetsUrl = $modx->getOption('batcher.assets_url',null,$modx->getOption('assets_url').'components/batcher/'); + $corePath = $modx->getOption('batcher.core_path', null, $modx->getOption('core_path').'components/batcher/'); + $assetsUrl = $modx->getOption('batcher.assets_url', null, $modx->getOption('assets_url').'components/batcher/'); $this->config = array_merge(array( 'corePath' => $corePath, - 'chunksPath' => $corePath.'elements/chunks/', - 'modelPath' => $corePath.'model/', - 'processorsPath' => $corePath.'processors/', 'templatesPath' => $corePath.'templates/', - 'assetsUrl' => $assetsUrl, - 'connectorUrl' => $assetsUrl.'connector.php', 'cssUrl' => $assetsUrl.'css/', - 'jsUrl' => $assetsUrl.'js/', - ),$config); + 'jsUrl' => $assetsUrl.'js/' + ), $config); - $this->modx->addPackage('batcher',$this->config['modelPath']); if ($this->modx->lexicon) { $this->modx->lexicon->load('batcher:default'); } } - - /** - * Initializes Batcher based on a specific context. - * - * @access public - * @param string $ctx The context to initialize in. - * @return string The processed content. - */ - public function initialize($ctx = 'mgr') { - $output = ''; - switch ($ctx) { - case 'mgr': - if (!$this->modx->loadClass('batcher.request.BatcherControllerRequest',$this->config['modelPath'],true,true)) { - return 'Could not load controller request handler.'; - } - $this->request = new BatcherControllerRequest($this); - $output = $this->request->handleRequest(); - break; - } - return $output; - } - - /** - * Gets a Chunk and caches it; also falls back to file-based templates - * for easier debugging. - * - * @access public - * @param string $name The name of the Chunk - * @param array $properties The properties for the Chunk - * @return string The processed content of the Chunk - */ - public function getChunk($name,$properties = array()) { - $chunk = null; - if (!isset($this->chunks[$name])) { - $chunk = $this->_getTplChunk($name); - if (empty($chunk)) { - $chunk = $this->modx->getObject('modChunk',array('name' => $name),true); - if ($chunk == false) return false; - } - $this->chunks[$name] = $chunk->getContent(); - } else { - $o = $this->chunks[$name]; - $chunk = $this->modx->newObject('modChunk'); - $chunk->setContent($o); - } - $chunk->setCacheable(false); - return $chunk->process($properties); - } - - /** - * Returns a modChunk object from a template file. - * - * @access private - * @param string $name The name of the Chunk. Will parse to name.chunk.tpl - * @return modChunk/boolean Returns the modChunk object if found, otherwise - * false. - */ - private function _getTplChunk($name) { - $chunk = false; - $f = $this->config['chunksPath'].strtolower($name).'.chunk.tpl'; - if (file_exists($f)) { - $o = file_get_contents($f); - $chunk = $this->modx->newObject('modChunk'); - $chunk->set('name',$name); - $chunk->setContent($o); - } - return $chunk; - } } diff --git a/core/components/batcher/src/Processors/Element/ChangeCategory.php b/core/components/batcher/src/Processors/Element/ChangeCategory.php index 162277c..2821ff8 100644 --- a/core/components/batcher/src/Processors/Element/ChangeCategory.php +++ b/core/components/batcher/src/Processors/Element/ChangeCategory.php @@ -27,40 +27,62 @@ * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_template')) { - return $modx->error->failure($modx->lexicon('access_denied')); -} +namespace Batcher\Processors\Element; -if (empty($scriptProperties['element_ids'])) { - return $modx->error->failure($modx->lexicon('batcher.templates_err_ns')); -} +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modTemplate; +use MODX\Revolution\modCategory; -/* Get the element type from request */ -$elementType = 'modTemplate'; -if (!empty($scriptProperties['element_type'])) { - $elementType = $scriptProperties['element_type']; -} -/* get parent */ -if (!empty($scriptProperties['category'])) { - $category = $modx->getObject('modCategory', $scriptProperties['category']); - if (empty($category)) { - return $modx->error->failure( - $modx->lexicon( - 'batcher.category_err_nf', - array('id' => $scriptProperties['category']) - ) - ); - } -} -/* iterate over resources */ -$elementIds = explode(',', $scriptProperties['element_ids']); -foreach ($elementIds as $elementId) { - $element = $modx->getObject($elementType, $elementId); - if ($element == null) { - continue; +class ChangeCategory extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_template')) { + return $this->failure($this->modx->lexicon('access_denied')); + } + + if (empty($this->properties['element_ids'])) { + return $this->failure($this->modx->lexicon('batcher.templates_err_ns')); + } + + /* Get the element type from request */ + $elementType = modTemplate::class; + if (!empty($this->properties['element_type'])) { + $elementType = $this->properties['element_type']; + } + + if ($elementType === modCategory::class) { + return $this->failure(); + } + + /* get parent */ + if (!empty($this->properties['category'])) { + $category = $this->modx->getObject(modCategory::class, $this->properties['category']); + if (empty($category)) { + return $this->failure( + $this->modx->lexicon( + 'batcher.category_err_nf', + array('id' => $this->properties['category']) + ) + ); + } + } + /* iterate over resources */ + $elementIds = explode(',', $this->properties['element_ids']); + foreach ($elementIds as $elementId) { + $element = $this->modx->getObject($elementType, $elementId); + if ($element == null) { + continue; + } + $element->set('category', $this->properties['category']); + $element->save(); + } + + return $this->success(); } - $element->set('category', $scriptProperties['category']); - $element->save(); -} -return $modx->error->success(); + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Element/GetList.php b/core/components/batcher/src/Processors/Element/GetList.php index 94af7d4..99f1261 100644 --- a/core/components/batcher/src/Processors/Element/GetList.php +++ b/core/components/batcher/src/Processors/Element/GetList.php @@ -27,27 +27,47 @@ * @package batcher * @subpackage processors */ -class BatcherTemplateGetListProcessor extends modObjectGetListProcessor { - public $classKey = 'modTemplate'; +namespace Batcher\Processors\Element; + +use MODX\Revolution\Processors\Model\GetListProcessor; +use MODX\Revolution\modTemplate; +use MODX\Revolution\modCategory; +use xPDO\Om\xPDOQuery; +use xPDO\Om\xPDOObject; + +class GetList extends GetListProcessor +{ + public $classKey = modTemplate::class; public $defaultSortField = 'id'; public $defaultSortDirection = 'ASC'; public $checkListPermission = true; - public function prepareQueryBeforeCount(xPDOQuery $c) { - + public function prepareQueryBeforeCount(xPDOQuery $c) + { $search = $this->getProperty('search'); - $type = $this->getProperty('element-type'); if (!empty($search)) { - $c->where(array( - 'name:LIKE' => '%'.$search.'%', - 'OR:description:LIKE' => '%'.$search.'%', - )); + if ($this->classKey === modCategory::class) { + $c->where(array( + 'category:LIKE' => '%'.$search.'%' + )); + } else { + $nameField = 'name'; + if ($this->classKey === modTemplate::class) { + $nameField = 'templatename'; + } + + $c->where(array( + $nameField.':LIKE' => '%'.$search.'%', + 'OR:description:LIKE' => '%'.$search.'%' + )); + } } return $c; } - public function getData() { + public function getData() + { $data = array(); $limit = intval($this->getProperty('limit')); $start = intval($this->getProperty('start')); @@ -59,13 +79,28 @@ public function getData() { $c = $this->modx->newQuery($this->classKey); $c = $this->prepareQueryBeforeCount($c); - $data['total'] = $this->modx->getCount($this->classKey,$c); + $data['total'] = $this->modx->getCount($this->classKey, $c); $c = $this->prepareQueryAfterCount($c); $sortClassKey = $this->getSortClassKey(); - $sortKey = $this->modx->getSelectColumns($sortClassKey,$this->getProperty('sortAlias',$sortClassKey),'',array($this->getProperty('sort'))); + $sortAlias = $this->modx->getAlias($sortClassKey); + + $sort = $this->getProperty('sort'); + if ($sort === 'category_name') { + $sort = 'category'; + } + if ($sort === 'name') { + if ($sortClassKey === modTemplate::class) { + $sort = 'templatename'; + } + if ($sortClassKey === modCategory::class) { + $sort = 'category'; + } + } + $sortKey = $this->modx->getSelectColumns($sortClassKey, $this->getProperty('sortAlias', $sortAlias), '', [$sort]); if (empty($sortKey)) $sortKey = $this->getProperty('sort'); - $c->sortby($sortKey,$this->getProperty('dir')); + $c->sortby($sortKey, $this->getProperty('dir')); + if ($limit > 0) { $c->limit($limit,$start); } @@ -78,21 +113,20 @@ public function prepareRow(xPDOObject $object) { $objectArray = $object->toArray(); $objectArray['category_name'] = '-'; - if ($this->classKey === 'modCategory') { + if ($this->classKey === modCategory::class) { $objectArray['name'] = $objectArray['category']; unset($objectArray['category']); } else { if ($objectArray['category']) { - $category = $this->modx->getObject('modCategory', $objectArray['category']); + $category = $this->modx->getObject(modCategory::class, $objectArray['category']); if ($category) { $objectArray['category_name'] = $category->get('category'); } } } - if ($this->classKey === 'modTemplate') { + if ($this->classKey === modTemplate::class) { $objectArray['name'] = $objectArray['templatename']; } return $objectArray; } -} -return 'BatcherTemplateGetListProcessor'; \ No newline at end of file +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Filters/GetList.php b/core/components/batcher/src/Processors/Filters/GetList.php index 0e70167..1026904 100644 --- a/core/components/batcher/src/Processors/Filters/GetList.php +++ b/core/components/batcher/src/Processors/Filters/GetList.php @@ -1,23 +1,29 @@ modx->newObject('modResource'); + $object = $this->modx->newObject(modResource::class); $object = $object->toArray(); /* * Exclude fields from filter based on system setting. */ $excludeFilters = $this->modx->getOption('batcher.excludefilters'); - if($excludeFilters){ - $excludeArray = explode(',', $excludeFilters); + $excludeArray = []; + if ($excludeFilters) { + $excludeArray = explode(',', $excludeFilters); } - foreach($object as $key => $val){ - if($excludeArray && in_array($key, $excludeArray)){ + if ($excludeArray && in_array($key, $excludeArray)){ continue; } @@ -28,14 +34,12 @@ public function getFilters(){ } return $filters; - } - + } - public function process() { + public function process() + { $filters = $this->getFilters(); - + return $this->outputArray($filters); } - -} -return 'BatcherFilterGetListProcessor'; \ No newline at end of file +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/Batch.php b/core/components/batcher/src/Processors/Resource/Batch.php index af5d3d3..3c5758b 100644 --- a/core/components/batcher/src/Processors/Resource/Batch.php +++ b/core/components/batcher/src/Processors/Resource/Batch.php @@ -27,119 +27,138 @@ * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_document')) return $modx->error->failure($modx->lexicon('access_denied')); +namespace Batcher\Processors\Resource; -if (empty($scriptProperties['resources'])) { - return $modx->error->failure($modx->lexicon('batcher.resources_err_ns')); -} -$batch = $modx->getOption('batch',$scriptProperties,''); -if (empty($batch)) return $modx->error->failure($modx->lexicon('batcher.action_err_ns')); +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modResource; -$resourceIds = explode(',',$scriptProperties['resources']); +class Batch extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_document')) { + return $this->failure($this->modx->lexicon('access_denied')); + } -foreach ($resourceIds as $resourceId) { - $resource = $modx->getObject('modResource',$resourceId); - if ($resource == null) continue; + if (empty($this->properties['resources'])) { + return $this->failure($this->modx->lexicon('batcher.resources_err_ns')); + } + $batch = $this->modx->getOption('batch', $this->properties, ''); + if (empty($batch)) { + return $this->failure($this->modx->lexicon('batcher.action_err_ns')); + } - switch ($batch) { - case 'publish': - if ($resource->get('published') == false) { - $resource->set('published',true); - $resource->set('publishedon',strftime('%Y-%m-%d %H:%M:%S')); - $resource->set('publishedby',$modx->user->get('id')); - } else { - continue; - } - break; - case 'unpublish': - if ($resource->get('published') == true) { - $resource->set('published',false); - $resource->set('publishedon',null); - $resource->set('publishedby',0); - } else { - continue; - } - break; - case 'hidemenu': - if ($resource->get('hidemenu') == false) { - $resource->set('hidemenu',true); - } else { - continue; - } - break; - case 'unhidemenu': - if ($resource->get('hidemenu') == true) { - $resource->set('hidemenu',false); - } else { - continue; - } - break; - case 'cacheable': - if ($resource->get('cacheable') == false) { - $resource->set('cacheable',true); - } else { - continue; - } - break; - case 'uncacheable': - if ($resource->get('cacheable') == true) { - $resource->set('cacheable',false); - } else { - continue; - } - break; - case 'searchable': - if ($resource->get('searchable') == false) { - $resource->set('searchable',true); - } else { - continue; - } - break; - case 'unsearchable': - if ($resource->get('searchable') == true) { - $resource->set('searchable',false); - } else { - continue; - } - break; - case 'richtext': - if ($resource->get('richtext') == false) { - $resource->set('richtext',true); - } else { - continue; - } - break; - case 'unrichtext': - if ($resource->get('richtext') == true) { - $resource->set('richtext',false); - } else { - continue; - } - break; - case 'delete': - if ($resource->get('deleted') == false) { - $resource->set('deleted',true); - $resource->set('deletedon',strftime('%Y-%m-%d %H:%M:%S')); - $resource->set('deletedby',$modx->user->get('id')); - } else { - continue; - } - break; - case 'undelete': - if ($resource->get('deleted') == true) { - $resource->set('deleted',false); - $resource->set('deletedon',null); - $resource->set('deletedby',0); - } else { - continue; + $resourceIds = explode(',', $this->properties['resources']); + + foreach ($resourceIds as $resourceId) { + $resource = $this->modx->getObject(modResource::class, $resourceId); + if ($resource == null) continue; + + switch ($batch) { + case 'publish': + if ($resource->get('published') == false) { + $resource->set('published', true); + $resource->set('publishedon', strftime('%Y-%m-%d %H:%M:%S')); + $resource->set('publishedby', $this->modx->user->get('id')); + } else { + continue 2; + } + break; + case 'unpublish': + if ($resource->get('published') == true) { + $resource->set('published', false); + $resource->set('publishedon', 0); + $resource->set('publishedby', 0); + } else { + continue 2; + } + break; + case 'hidemenu': + if ($resource->get('hidemenu') == false) { + $resource->set('hidemenu', true); + } else { + continue 2; + } + break; + case 'unhidemenu': + if ($resource->get('hidemenu') == true) { + $resource->set('hidemenu', false); + } else { + continue 2; + } + break; + case 'cacheable': + if ($resource->get('cacheable') == false) { + $resource->set('cacheable', true); + } else { + continue 2; + } + break; + case 'uncacheable': + if ($resource->get('cacheable') == true) { + $resource->set('cacheable', false); + } else { + continue 2; + } + break; + case 'searchable': + if ($resource->get('searchable') == false) { + $resource->set('searchable', true); + } else { + continue 2; + } + break; + case 'unsearchable': + if ($resource->get('searchable') == true) { + $resource->set('searchable', false); + } else { + continue 2; + } + break; + case 'richtext': + if ($resource->get('richtext') == false) { + $resource->set('richtext', true); + } else { + continue 2; + } + break; + case 'unrichtext': + if ($resource->get('richtext') == true) { + $resource->set('richtext', false); + } else { + continue 2; + } + break; + case 'delete': + if ($resource->get('deleted') == false) { + $resource->set('deleted', true); + $resource->set('deletedon', strftime('%Y-%m-%d %H:%M:%S')); + $resource->set('deletedby', $this->modx->user->get('id')); + } else { + continue 2; + } + break; + case 'undelete': + if ($resource->get('deleted') == true) { + $resource->set('deleted', false); + $resource->set('deletedon', 0); + $resource->set('deletedby', 0); + } else { + continue 2; + } + break; } - break; - } + if ($resource->save() === false) { - if ($resource->save() === false) { + } + } + return $this->success(); } -} -return $modx->error->success(); + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/ChangeAuthors.php b/core/components/batcher/src/Processors/Resource/ChangeAuthors.php index 3edc77f..6a25142 100644 --- a/core/components/batcher/src/Processors/Resource/ChangeAuthors.php +++ b/core/components/batcher/src/Processors/Resource/ChangeAuthors.php @@ -27,39 +27,58 @@ * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_document')) return $modx->error->failure($modx->lexicon('access_denied')); +namespace Batcher\Processors\Resource; -if (empty($scriptProperties['resources'])) { - return $modx->error->failure($modx->lexicon('batcher.resources_err_ns')); -} +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modResource; +use MODX\Revolution\modUser; -/* validated createdby */ -if (!empty($scriptProperties['createdby'])) { - $createdby = $modx->getObject('modUser',$scriptProperties['createdby']); - if (empty($createdby)) return $modx->error->failure($modx->lexicon('batcher.user_err_nf')); -} -if (!empty($scriptProperties['editedby'])) { - $editedby = $modx->getObject('modUser',$scriptProperties['createdby']); - if (empty($editedby)) return $modx->error->failure($modx->lexicon('batcher.user_err_nf')); -} -if (!empty($scriptProperties['publishedby'])) { - $publishedby= $modx->getObject('modUser',$scriptProperties['publishedby']); - if (empty($publishedby)) return $modx->error->failure($modx->lexicon('batcher.user_err_nf')); -} +class ChangeAuthors extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_document')) { + return $this->failure($this->modx->lexicon('access_denied')); + } -/* iterate over resources */ -$resourceIds = explode(',',$scriptProperties['resources']); -foreach ($resourceIds as $resourceId) { - $resource = $modx->getObject('modResource',$resourceId); - if ($resource == null) continue; + if (empty($this->properties['resources'])) { + return $this->failure($this->modx->lexicon('batcher.resources_err_ns')); + } - if (!empty($scriptProperties['createdby'])) $resource->set('createdby',$scriptProperties['createdby']); - if (!empty($scriptProperties['editedby'])) $resource->set('editedby',$scriptProperties['editedby']); - if (!empty($scriptProperties['publishedby'])) $resource->set('publishedby',$scriptProperties['publishedby']); - - if ($resource->save() === false) { - + /* validated createdby */ + if (!empty($this->properties['createdby'])) { + $createdby = $this->modx->getObject(modUser::class, $this->properties['createdby']); + if (empty($createdby)) return $this->failure($this->modx->lexicon('batcher.user_err_nf')); + } + if (!empty($this->properties['editedby'])) { + $editedby = $this->modx->getObject(modUser::class, $this->properties['editedby']); + if (empty($editedby)) return $this->failure($this->modx->lexicon('batcher.user_err_nf')); + } + if (!empty($this->properties['publishedby'])) { + $publishedby = $this->modx->getObject(modUser::class, $this->properties['publishedby']); + if (empty($publishedby)) return $this->failure($this->modx->lexicon('batcher.user_err_nf')); + } + + /* iterate over resources */ + $resourceIds = explode(',', $this->properties['resources']); + foreach ($resourceIds as $resourceId) { + $resource = $this->modx->getObject(modResource::class, $resourceId); + if ($resource == null) continue; + + if (!empty($this->properties['createdby'])) $resource->set('createdby', $this->properties['createdby']); + if (!empty($this->properties['editedby'])) $resource->set('editedby', $this->properties['editedby']); + if (!empty($this->properties['publishedby'])) $resource->set('publishedby', $this->properties['publishedby']); + + if ($resource->save() === false) { + + } + } + + return $this->success(); } -} -return $modx->error->success(); + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/ChangeDates.php b/core/components/batcher/src/Processors/Resource/ChangeDates.php index d5a381f..1e64437 100644 --- a/core/components/batcher/src/Processors/Resource/ChangeDates.php +++ b/core/components/batcher/src/Processors/Resource/ChangeDates.php @@ -27,26 +27,44 @@ * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_document')) return $modx->error->failure($modx->lexicon('access_denied')); +namespace Batcher\Processors\Resource; -if (empty($scriptProperties['resources'])) { - return $modx->error->failure($modx->lexicon('batcher.resources_err_ns')); -} +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modResource; -/* iterate over resources */ -$resourceIds = explode(',',$scriptProperties['resources']); -foreach ($resourceIds as $resourceId) { - $resource = $modx->getObject('modResource',$resourceId); - if ($resource == null) continue; +class ChangeDates extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_document')) { + return $this->failure($this->modx->lexicon('access_denied')); + } - if (!empty($scriptProperties['createdon'])) $resource->set('createdon',$scriptProperties['createdon']); - if (!empty($scriptProperties['editedon'])) $resource->set('editedon',$scriptProperties['editedon']); - if (!empty($scriptProperties['pub_date'])) $resource->set('pub_date',$scriptProperties['pub_date']); - if (!empty($scriptProperties['unpub_date'])) $resource->set('unpub_date',$scriptProperties['unpub_date']); + if (empty($this->properties['resources'])) { + return $this->failure($this->modx->lexicon('batcher.resources_err_ns')); + } - if ($resource->save() === false) { - + /* iterate over resources */ + $resourceIds = explode(',', $this->properties['resources']); + foreach ($resourceIds as $resourceId) { + $resource = $this->modx->getObject(modResource::class, $resourceId); + if ($resource == null) continue; + + if (!empty($this->properties['createdon'])) $resource->set('createdon',$this->properties['createdon']); + if (!empty($this->properties['editedon'])) $resource->set('editedon',$this->properties['editedon']); + if (!empty($this->properties['pub_date'])) $resource->set('pub_date',$this->properties['pub_date']); + if (!empty($this->properties['unpub_date'])) $resource->set('unpub_date',$this->properties['unpub_date']); + + if ($resource->save() === false) { + + } + } + + return $this->success(); } -} -return $modx->error->success(); + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/ChangeParent.php b/core/components/batcher/src/Processors/Resource/ChangeParent.php index 662a71f..c8cd27c 100644 --- a/core/components/batcher/src/Processors/Resource/ChangeParent.php +++ b/core/components/batcher/src/Processors/Resource/ChangeParent.php @@ -27,29 +27,49 @@ * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_document')) return $modx->error->failure($modx->lexicon('access_denied')); - -if (empty($scriptProperties['resources'])) { - return $modx->error->failure($modx->lexicon('batcher.resources_err_ns')); -} -/* get parent */ -if (empty($scriptProperties['parent'])) { - return $modx->error->failure($modx->lexicon('batcher.parent_err_ns')); -} -$parentResource = $modx->getObject('modResource',$scriptProperties['parent']); -if (empty($parentResource)) return $modx->error->failure($modx->lexicon('batcher.parent_err_nf')); - -/* iterate over resources */ -$resourceIds = explode(',',$scriptProperties['resources']); -foreach ($resourceIds as $resourceId) { - $resource = $modx->getObject('modResource',$resourceId); - if ($resource == null) continue; - - $resource->set('parent',$scriptProperties['parent']); - - if ($resource->save() === false) { - +namespace Batcher\Processors\Resource; + +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modResource; + +class ChangeParent extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_document')) { + return $this->failure($this->modx->lexicon('access_denied')); + } + + if (empty($this->properties['resources'])) { + return $this->failure($this->modx->lexicon('batcher.resources_err_ns')); + } + /* get parent */ + if (empty($this->properties['parent'])) { + return $this->failure($this->modx->lexicon('batcher.parent_err_ns')); + } + $parentResource = $this->modx->getObject(modResource::class, $this->properties['parent']); + if (empty($parentResource)) { + return $this->failure($this->modx->lexicon('batcher.parent_err_nf')); + } + + /* iterate over resources */ + $resourceIds = explode(',', $this->properties['resources']); + foreach ($resourceIds as $resourceId) { + $resource = $this->modx->getObject(modResource::class, $resourceId); + if ($resource == null) continue; + + $resource->set('parent', $this->properties['parent']); + + if ($resource->save() === false) { + + } + } + + return $this->success(); } -} -return $modx->error->success(); + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/ChangeTemplate.php b/core/components/batcher/src/Processors/Resource/ChangeTemplate.php index 1defdd4..32cfb29 100644 --- a/core/components/batcher/src/Processors/Resource/ChangeTemplate.php +++ b/core/components/batcher/src/Processors/Resource/ChangeTemplate.php @@ -27,29 +27,50 @@ * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_document')) return $modx->error->failure($modx->lexicon('access_denied')); - -if (empty($scriptProperties['resources'])) { - return $modx->error->failure($modx->lexicon('batcher.resources_err_ns')); -} -/* get parent */ -if (empty($scriptProperties['template'])) { - return $modx->error->failure($modx->lexicon('batcher.template_err_ns')); -} -$template = $modx->getObject('modTemplate',$scriptProperties['template']); -if (empty($template)) return $modx->error->failure($modx->lexicon('batcher.template_err_nf')); - -/* iterate over resources */ -$resourceIds = explode(',',$scriptProperties['resources']); -foreach ($resourceIds as $resourceId) { - $resource = $modx->getObject('modResource',$resourceId); - if ($resource == null) continue; - - $resource->set('template',$scriptProperties['template']); - - if ($resource->save() === false) { - +namespace Batcher\Processors\Resource; + +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modResource; +use MODX\Revolution\modTemplate; + +class ChangeTemplate extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_document')) { + return $this->failure($this->modx->lexicon('access_denied')); + } + + if (empty($this->properties['resources'])) { + return $this->failure($this->modx->lexicon('batcher.resources_err_ns')); + } + /* get parent */ + if (empty($this->properties['template'])) { + return $this->failure($this->modx->lexicon('batcher.template_err_ns')); + } + $template = $this->modx->getObject(modTemplate::class, $this->properties['template']); + if (empty($template)) { + return $this->failure($this->modx->lexicon('batcher.template_err_nf')); + } + + /* iterate over resources */ + $resourceIds = explode(',', $this->properties['resources']); + foreach ($resourceIds as $resourceId) { + $resource = $this->modx->getObject(modResource::class, $resourceId); + if ($resource == null) continue; + + $resource->set('template', $this->properties['template']); + + if ($resource->save() === false) { + + } + } + + return $this->success(); } -} -return $modx->error->success(); + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/GetList.php b/core/components/batcher/src/Processors/Resource/GetList.php index c224cb5..5fa9970 100644 --- a/core/components/batcher/src/Processors/Resource/GetList.php +++ b/core/components/batcher/src/Processors/Resource/GetList.php @@ -27,10 +27,17 @@ * @package batcher * @subpackage processors */ +namespace Batcher\Processors\Resource; -class BatcherResourceGetListProcessor extends modObjectGetListProcessor +use MODX\Revolution\Processors\Model\GetListProcessor; +use MODX\Revolution\modResource; +use MODX\Revolution\modTemplate; +use xPDO\Om\xPDOQuery; +use xPDO\Om\xPDOObject; + +class GetList extends GetListProcessor { - public $classKey = 'modResource'; + public $classKey = modResource::class; public $objectType = 'resource'; public $defaultSortField = 'pagetitle'; public $defaultSortDirection = 'ASC'; @@ -47,7 +54,7 @@ public function prepareQueryBeforeCount(xPDOQuery $c) $filterType = $this->getProperty('filter_type'); $filterValue = $this->getProperty('filter_value'); - $c->leftJoin('modTemplate', 'Template'); + $c->leftJoin(modTemplate::class, 'Template'); if ($filterField) { switch ($filterType) { @@ -133,6 +140,4 @@ public function prepareRow(xPDOObject $object) return $objectArray; } -} - -return 'BatcherResourceGetListProcessor'; \ No newline at end of file +} \ No newline at end of file diff --git a/core/components/batcher/src/Processors/Resource/Remove.php b/core/components/batcher/src/Processors/Resource/Remove.php index 142e102..9ccc135 100644 --- a/core/components/batcher/src/Processors/Resource/Remove.php +++ b/core/components/batcher/src/Processors/Resource/Remove.php @@ -22,20 +22,38 @@ * @package batcher */ /** - * Change dates for multiple resources + * Delete multiple resources * * @package batcher * @subpackage processors */ -if (!$modx->hasPermission('save_document')) return $modx->error->failure($modx->lexicon('access_denied')); +namespace Batcher\Processors\Resource; -if (empty($scriptProperties['resources'])) { - return $modx->error->failure($modx->lexicon('batcher.resources_err_ns')); -} +use MODX\Revolution\Processors\Processor; +use MODX\Revolution\modResource; -$resourceIds = explode(',',$scriptProperties['resources']); -if(is_array($resourceIds)){ - $modx->removeCollection('modResource', array("id:IN" => array($scriptProperties['resources']) )); -} +class Remove extends Processor +{ + public function process() + { + if (!$this->modx->hasPermission('save_document')) { + return $this->failure($this->modx->lexicon('access_denied')); + } -return $modx->error->success(); + if (empty($this->properties['resources'])) { + return $this->failure($this->modx->lexicon('batcher.resources_err_ns')); + } + + $resourceIds = explode(',', $this->properties['resources']); + if(is_array($resourceIds)){ + $this->modx->removeCollection(modResource::class, array("id:IN" => array($this->properties['resources']) )); + } + + return $this->success(); + } + + public function getLanguageTopics() + { + return ['batcher:default']; + } +} \ No newline at end of file From f9b5808b3214b791f29e68b02fddf8cfc2ce1eb1 Mon Sep 17 00:00:00 2001 From: halftrainedharry Date: Sun, 18 Sep 2022 12:54:25 +0200 Subject: [PATCH 3/4] Change build to GPM 3 --- _build/build.config.sample.php | 40 ------ _build/build.schema.php | 97 -------------- _build/build.transport.php | 118 ------------------ _build/config.json | 25 ---- _build/gpm.yaml | 15 +++ _build/resolvers/setupoptions.resolver.php | 47 ------- _build/resolvers/stercextra.resolver.php | 118 ------------------ _build/setup.options.php | 51 -------- .../docs/{changelog.txt => changelog.md} | 33 ++--- .../batcher/docs/{readme.txt => readme.md} | 36 +++--- 10 files changed, 53 insertions(+), 527 deletions(-) delete mode 100644 _build/build.config.sample.php delete mode 100644 _build/build.schema.php delete mode 100644 _build/build.transport.php delete mode 100644 _build/config.json create mode 100644 _build/gpm.yaml delete mode 100644 _build/resolvers/setupoptions.resolver.php delete mode 100644 _build/resolvers/stercextra.resolver.php delete mode 100644 _build/setup.options.php rename core/components/batcher/docs/{changelog.txt => changelog.md} (55%) rename core/components/batcher/docs/{readme.txt => readme.md} (65%) diff --git a/_build/build.config.sample.php b/_build/build.config.sample.php deleted file mode 100644 index 97920f7..0000000 --- a/_build/build.config.sample.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * Define the MODX path constants necessary for installation - * - * @package batcher - * @subpackage build - */ -define('MODX_BASE_PATH', dirname(dirname(dirname(dirname(__FILE__)))) . '/modx/'); -define('MODX_CORE_PATH', MODX_BASE_PATH . 'core/'); -define('MODX_MANAGER_PATH', MODX_BASE_PATH . 'manager/'); -define('MODX_CONNECTORS_PATH', MODX_BASE_PATH . 'connectors/'); -define('MODX_ASSETS_PATH', MODX_BASE_PATH . 'assets/'); - -define('MODX_BASE_URL','/modx/'); -define('MODX_CORE_URL', MODX_BASE_URL . 'core/'); -define('MODX_MANAGER_URL', MODX_BASE_URL . 'manager/'); -define('MODX_CONNECTORS_URL', MODX_BASE_URL . 'connectors/'); -define('MODX_ASSETS_URL', MODX_BASE_URL . 'assets/'); \ No newline at end of file diff --git a/_build/build.schema.php b/_build/build.schema.php deleted file mode 100644 index 6c260b9..0000000 --- a/_build/build.schema.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * Build Schema script - * - * @package batcher - * @subpackage build - */ -$mtime = microtime(); -$mtime = explode(" ", $mtime); -$mtime = $mtime[1] + $mtime[0]; -$tstart = $mtime; -set_time_limit(0); - -/* define package name */ -define('PKG_NAME','Batcher'); -define('PKG_NAME_LOWER',strtolower(PKG_NAME)); - -/* define sources */ -$root = dirname(dirname(__FILE__)).'/'; -$sources = array( - 'root' => $root, - 'core' => $root.'core/components/'.PKG_NAME_LOWER.'/', - 'model' => $root.'core/components/'.PKG_NAME_LOWER.'/model/', - 'assets' => $root.'assets/components/'.PKG_NAME_LOWER.'/', -); - -/* load modx and configs */ -require_once dirname(__FILE__) . '/build.config.php'; -include_once MODX_CORE_PATH . 'model/modx/modx.class.php'; -$modx= new modX(); -$modx->initialize('mgr'); -$modx->loadClass('transport.modPackageBuilder','',false, true); -echo '
'; /* used for nice formatting of log messages */
-$modx->setLogLevel(modX::LOG_LEVEL_INFO);
-$modx->setLogTarget('ECHO');
-
-$manager= $modx->getManager();
-$generator= $manager->getGenerator();
-
-$generator->classTemplate= <<
-EOD;
-$generator->platformTemplate= <<
-EOD;
-$generator->mapHeader= <<parseSchema($sources['model'] . 'schema/'.PKG_NAME_LOWER.'.mysql.schema.xml', $sources['model']);
-
-
-$mtime= microtime();
-$mtime= explode(" ", $mtime);
-$mtime= $mtime[1] + $mtime[0];
-$tend= $mtime;
-$totalTime= ($tend - $tstart);
-$totalTime= sprintf("%2.4f s", $totalTime);
-
-echo "\nExecution time: {$totalTime}\n";
-
-exit ();
\ No newline at end of file
diff --git a/_build/build.transport.php b/_build/build.transport.php
deleted file mode 100644
index 2083b96..0000000
--- a/_build/build.transport.php
+++ /dev/null
@@ -1,118 +0,0 @@
-
- *
- * This file is part of Batcher, a batch resource editing Extra.
- *
- * Batcher is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.
- *
- * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * @package batcher
- */
-/**
- * Batcher build script
- *
- * @package batcher
- * @subpackage build
- */
-$mtime = microtime();
-$mtime = explode(" ", $mtime);
-$mtime = $mtime[1] + $mtime[0];
-$tstart = $mtime;
-set_time_limit(0);
-
-/* define package */
-define('PKG_NAME','Batcher');
-define('PKG_NAME_LOWER','batcher');
-define('PKG_VERSION','1.1.1');
-define('PKG_RELEASE','pl');
-
-/* define sources */
-$root = dirname(dirname(__FILE__)).'/';
-$sources= array (
-    'root' => $root,
-    'build' => $root .'_build/',
-    'resolvers' => $root . '_build/resolvers/',
-    'data' => $root . '_build/data/',
-    'source_core' => $root.'core/components/'.PKG_NAME_LOWER,
-    'source_assets' => $root.'assets/components/'.PKG_NAME_LOWER,
-    'lexicon' => $root . 'core/components/'.PKG_NAME_LOWER.'/lexicon/',
-    'docs' => $root.'core/components/'.PKG_NAME_LOWER.'/docs/',
-);
-unset($root);
-
-/* override with your own defines here (see build.config.sample.php) */
-require_once $sources['build'] . 'build.config.php';
-require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
-
-$modx= new modX();
-$modx->initialize('mgr');
-$modx->setLogLevel(modX::LOG_LEVEL_INFO);
-$modx->setLogTarget('ECHO'); echo '
'; flush();
-
-$modx->loadClass('transport.modPackageBuilder','',false, true);
-$builder = new modPackageBuilder($modx);
-$builder->createPackage(PKG_NAME_LOWER,PKG_VERSION,PKG_RELEASE);
-$builder->registerNamespace(PKG_NAME_LOWER,false,true,'{core_path}components/'.PKG_NAME_LOWER.'/');
-
-/* load action/menu */
-$menu = include $sources['data'].'transport.menu.php';
-$vehicle= $builder->createVehicle($menu,array (
-    xPDOTransport::PRESERVE_KEYS => true,
-    xPDOTransport::UPDATE_OBJECT => true,
-    xPDOTransport::UNIQUE_KEY => 'text',
-    xPDOTransport::RELATED_OBJECTS => true,
-    xPDOTransport::RELATED_OBJECT_ATTRIBUTES => array (
-        'Action' => array (
-            xPDOTransport::PRESERVE_KEYS => false,
-            xPDOTransport::UPDATE_OBJECT => true,
-            xPDOTransport::UNIQUE_KEY => array ('namespace','controller'),
-        ),
-    ),
-));
-$vehicle->resolve('file',array(
-    'source' => $sources['source_core'],
-    'target' => "return MODX_CORE_PATH . 'components/';",
-));
-$vehicle->resolve('file',array(
-    'source' => $sources['source_assets'],
-    'target' => "return MODX_ASSETS_PATH . 'components/';",
-));
-$builder->putVehicle($vehicle);
-unset($vehicle,$action);
-
-/* now pack in the license file, readme and setup options */
-$builder->setPackageAttributes(array(
-    'license' => file_get_contents($sources['docs'] . 'license.txt'),
-    'readme' => file_get_contents($sources['docs'] . 'readme.txt'),
-//    'setup-options' => array(
-//        'source' => $sources['build'].'setup.options.php',
-//    ),
-));
-$modx->log(modX::LOG_LEVEL_INFO,'Packaged in package attributes.'); flush();
-
-$modx->log(modX::LOG_LEVEL_INFO,'Packing...'); flush();
-$builder->pack();
-
-$mtime= microtime();
-$mtime= explode(" ", $mtime);
-$mtime= $mtime[1] + $mtime[0];
-$tend= $mtime;
-$totalTime= ($tend - $tstart);
-$totalTime= sprintf("%2.4f s", $totalTime);
-
-$modx->log(modX::LOG_LEVEL_INFO,"\n
Package Built.
\nExecution time: {$totalTime}\n"); - -exit (); \ No newline at end of file diff --git a/_build/config.json b/_build/config.json deleted file mode 100644 index e1a8679..0000000 --- a/_build/config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "Batcher", - "lowCaseName": "batcher", - "description": "Batcher is a batch-editing component for MODx Revolution. It allows you to perform basic actions on multiple Resources.", - "author": "Sterc", - "version": "2.0.0", - "package": { - "menus": [{ - "text": "batcher", - "description": "batcher.menu_desc", - "action": "home" - }] - }, - "build": { - "readme": "docs/readme.txt", - "license": "docs/license.txt", - "changelog": "docs/changelog.txt", - "resolver": { - "after": ["setupoptions.resolver.php", "stercextra.resolver.php"] - }, - "setupOptions":{ - "source": "setup.options.php" - } - } -} \ No newline at end of file diff --git a/_build/gpm.yaml b/_build/gpm.yaml new file mode 100644 index 0000000..586b03a --- /dev/null +++ b/_build/gpm.yaml @@ -0,0 +1,15 @@ +name: Batcher +lowCaseName: batcher +description: Batcher is a batch-editing component for MODx Revolution. It allows you to perform basic actions on multiple Resources. +author: Sterc +version: 3.0.0-alpha +menus: + - text: batcher + description: batcher.menu_desc + action: home +build: + readme: core/components/batcher/docs/readme.md + license: core/components/batcher/docs/license.txt + changelog: core/components/batcher/docs/changelog.md + requires: + modx: '>=3.0.0-alpha' \ No newline at end of file diff --git a/_build/resolvers/setupoptions.resolver.php b/_build/resolvers/setupoptions.resolver.php deleted file mode 100644 index d6f5d2c..0000000 --- a/_build/resolvers/setupoptions.resolver.php +++ /dev/null @@ -1,47 +0,0 @@ -xpdo->getObject( - 'modSystemSetting', - array('key' => strtolower($package) . '.' . $key) - ); - - if ($settingObject) { - $settingObject->set('value', $options[$key]); - $settingObject->save(); - } else { - $error = '[' . $package . '] ' . strtolower($package) . '.' . $key . ' setting could not be found,'; - $error .= ' so the setting could not be changed.'; - - $object->xpdo->log( - xPDO::LOG_LEVEL_ERROR, - $error - ); - } - } - } - - $success = true; - break; - case xPDOTransport::ACTION_UNINSTALL: - $success = true; - break; -} - -return $success; diff --git a/_build/resolvers/stercextra.resolver.php b/_build/resolvers/stercextra.resolver.php deleted file mode 100644 index 8356f17..0000000 --- a/_build/resolvers/stercextra.resolver.php +++ /dev/null @@ -1,118 +0,0 @@ -xpdo; -$c = $modx->newQuery('transport.modTransportPackage'); -$c->where( - array( - 'workspace' => 1, - "(SELECT - `signature` - FROM {$modx->getTableName('modTransportPackage')} AS `latestPackage` - WHERE `latestPackage`.`package_name` = `modTransportPackage`.`package_name` - ORDER BY - `latestPackage`.`version_major` DESC, - `latestPackage`.`version_minor` DESC, - `latestPackage`.`version_patch` DESC, - IF(`release` = '' OR `release` = 'ga' OR `release` = 'pl','z',`release`) DESC, - `latestPackage`.`release_index` DESC - LIMIT 1,1) = `modTransportPackage`.`signature`", - ) -); -$c->where( - array( - array( - 'modTransportPackage.package_name' => strtolower($package) - ), - 'installed:IS NOT' => null - ) -); -$c->limit(1); - -/** @var modTransportPackage $oldPackage */ -$oldPackage = $modx->getObject('transport.modTransportPackage', $c); - -$oldVersion = ''; -if ($oldPackage) { - $oldVersion = $oldPackage->get('version_major') . '.' . $oldPackage->get('version_minor'); - $oldVersion .= '.' . $oldPackage->get('version_patch'); - $oldVersion .= '-' . $oldPackage->get('release'); -} - -$version = ''; -if ($options['topic']) { - $topic = trim($options['topic'], '/'); - $topic = explode('/', $topic); - $signature = end($topic); - $version = str_replace(strtolower($package) . '-', '', $signature); -} - -$userNameObj = $modx->getObject( - 'modSystemSetting', - array('key' => strtolower($package) . '.user_name') -); -$userName = ($userNameObj) ? $userNameObj->get('value') : ''; - -$userEmailObj = $modx->getObject( - 'modSystemSetting', - array('key' => strtolower($package) . '.user_email') -); -$userEmail = ($userEmailObj) ? $userEmailObj->get('value') : ''; - -$modxVersionObj = $modx->getObject('modSystemSetting', array('key' => 'settings_version')); -$modxVersion = ($modxVersionObj) ? $modxVersionObj->get('value') : ''; -$managerLang = $modx->getOption('manager_language'); - -$action = ''; -switch ($options[xPDOTransport::PACKAGE_ACTION]) { - case xPDOTransport::ACTION_INSTALL: - $action = 'install'; - break; - case xPDOTransport::ACTION_UPGRADE: - $action = 'upgrade'; - break; - case xPDOTransport::ACTION_UNINSTALL: - $action = 'uninstall'; - - $version = $oldVersion; - $setupOptionsPath = explode('/', $options['setup-options']); - $signature = $setupOptionsPath[0]; - $oldVersion = str_replace(strtolower($package) . '-', '', $signature); - - break; -} - -$params = array( - 'name' => $options['namespace'], - 'url' => $_SERVER['SERVER_NAME'], - 'user_name' => $userName, - 'user_email' => $userEmail, - 'php_version' => phpversion(), - 'modx_version' => $modxVersion, - 'manager_lang' => $managerLang, - 'installation_type' => $action, - 'package_version_from' => $oldVersion, - 'package_version' => $version, - 'date' => time() -); - -/** - * Curl POST. - */ -$curl = curl_init(); -curl_setopt($curl, CURLOPT_URL, $url); -curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: STERC-A64XHC7PNY8G61L79E')); -curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); -curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 120); -curl_setopt($curl, CURLOPT_POST, true); -curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params)); -curl_setopt($curl, CURLOPT_TIMEOUT, 120); - -$response = curl_exec($curl); -$responseInfo = curl_getinfo($curl); -$curlError = curl_error($curl); -curl_close($curl); - -return true; diff --git a/_build/setup.options.php b/_build/setup.options.php deleted file mode 100644 index b7efd50..0000000 --- a/_build/setup.options.php +++ /dev/null @@ -1,51 +0,0 @@ - 'user_name', - 'value' => '', - 'name' => 'Name' - ), - array( - 'key' => 'user_email', - 'value' => '', - 'name' => 'Email address' - ), -); -switch ($options[xPDOTransport::PACKAGE_ACTION]) { - case xPDOTransport::ACTION_INSTALL: - case xPDOTransport::ACTION_UPGRADE: - foreach ($settings as $key => $setting) { - $settingObject = $modx->getObject( - 'modSystemSetting', - array('key' => strtolower($package) . '.' . $setting['key']) - ); - if ($settingObject) { - $settings[$key]['value'] = $settingObject->get('value'); - } - } - break; - case xPDOTransport::ACTION_UNINSTALL: - break; -} - -$output = array(); -foreach ($settings as $setting) { - $str = ''; - $str .= ''; - - $output[] = $str; -} - -$output[] = '

Please enter your name and email address below to receive priority updates about Batcher. -Be the first to know about Batcher updates and new features. This is not required to use Batcher.

'; - -return implode('

', $output); diff --git a/core/components/batcher/docs/changelog.txt b/core/components/batcher/docs/changelog.md similarity index 55% rename from core/components/batcher/docs/changelog.txt rename to core/components/batcher/docs/changelog.md index 218ef19..090e22e 100644 --- a/core/components/batcher/docs/changelog.txt +++ b/core/components/batcher/docs/changelog.md @@ -1,8 +1,11 @@ ---------------------- -Changelog for Batcher ---------------------- -Batcher 2.0.0 -================================================================ +# Changelog for Batcher + +## Batcher 3.0.0 + +- Rewrite for MODX 3 + +## Batcher 2.0.0 + - Added advanced filter option to Resources tab - Added empty value to template filter combobox - Added filter by context @@ -10,29 +13,29 @@ Batcher 2.0.0 - Added Dutch translation - Removed functionality to change TV values -Batcher 1.2.0 -================================================================ +## Batcher 1.2.0 + - Fixes for MODX 2.2 -Batcher 1.1.1 -================================================================ +## Batcher 1.1.1 + - Fixes for MODX 2.1 -Batcher 1.1.0 -================================================================ +## Batcher 1.1.0 + - Added fix for bug with Firefox and batch editing - Updated Russian translation - Added batch change TV default values for a Template - Added batch change TV values for all Resources in a Template - Added batch change Template category -Batcher 1.0.1 -================================================================ +## Batcher 1.0.1 + - Fixed bug with changeDates due to Revo RC-3 changes - Added German translation - Added French translation -Batcher 1.0.0 -================================================================ +## Batcher 1.0.0 + - Added Russian translation - Initial commit \ No newline at end of file diff --git a/core/components/batcher/docs/readme.txt b/core/components/batcher/docs/readme.md similarity index 65% rename from core/components/batcher/docs/readme.txt rename to core/components/batcher/docs/readme.md index 4f1fe88..9caf98e 100644 --- a/core/components/batcher/docs/readme.txt +++ b/core/components/batcher/docs/readme.md @@ -1,25 +1,29 @@ --------------------- -Batcher --------------------- -Version: 2.0.0-pl -Author: Sterc -License: GNU GPLv2 --------------------- -=== BATCHER - PERFORM BASIC ACTIONS ON MULTIPLE RESOURCES AT THE SAME TIME === +# Batcher + +- Version: 3.0.0-alpha +- Author: Sterc +- License: GNU GPLv2 + +## Batcher - Perform basic actions on multiple resources at the same time + Batcher is a batch-editing Extra for MODX Revolution. It allows you to perform basic actions on multiple resources or elements. More information can be found here: https://docs.modx.com/extras/revo/batcher -== REQUIREMENTS == -> MODx Revolution 2.0.0-RC-2 or later -> PHP5 or later +## Requirements + +MODx Revolution 3.0.0-alpha or later -== DOWNLOAD == -It can be downloaded from within the MODX Revolution manager via Package Management, or from the MODX Extras Repository, here: https://rtfm.modx.com/extras/revo/batcher +## Download + +It can be downloaded from within the MODX Revolution manager via Package Management, or from the MODX Extras Repository, here: https://modx.com/extras/package/batcher + +## Usage -== USAGE == After installing, simply reload the page, and the 'Batcher' menu option should be available through the top Extras menu. -== HISTORY == +## History + Batcher was written by Shaun McCormick as a simple search Extra, and first released on June 2nd, 2010. It is now developed and maintained by Sterc at https://github.com/Sterc/Batcher -== BUGS AND FEATURE REQUESTS == +## Bugs and Feature Requests + We greatly value your feedback, feature requests and bug reports. Please issue them on GitHub (https://github.com/Sterc/Batcher/issues/new). \ No newline at end of file From 3cdb368faff1ea7c04aefb2117fe73c07dc63c55 Mon Sep 17 00:00:00 2001 From: halftrainedharry Date: Sun, 18 Sep 2022 12:58:31 +0200 Subject: [PATCH 4/4] Remove unused code files --- _packages/batcher-2.0.0-pl.transport.zip | Bin 84756 -> 0 bytes .../js/sections/template/tvs.defaults.js | 38 ------- .../batcher/js/sections/template/tvs.js | 38 ------- .../js/widgets/template/template.tvs.panel.js | 86 --------------- .../controllers/template/tvdefaults.class.php | 49 --------- .../controllers/template/tvdefaults.php | 46 -------- .../controllers/template/tvs.class.php | 76 ------------- .../batcher/controllers/template/tvs.php | 68 ------------ .../batcher/model/batcher/metadata.mysql.php | 4 - .../batchercontrollerrequest.class.php | 78 -------------- .../model/schema/batcher.mysql.schema.xml | 3 - .../mgr/element/changedefaulttvs.php | 73 ------------- .../processors/mgr/element/changetvs.php | 102 ------------------ .../batcher/processors/mgr/loadtvs.php | 54 ---------- .../batcher/templates/template/tvdefaults.tpl | 1 - .../batcher/templates/template/tvs.tpl | 1 - 16 files changed, 717 deletions(-) delete mode 100644 _packages/batcher-2.0.0-pl.transport.zip delete mode 100644 assets/components/batcher/js/sections/template/tvs.defaults.js delete mode 100644 assets/components/batcher/js/sections/template/tvs.js delete mode 100644 assets/components/batcher/js/widgets/template/template.tvs.panel.js delete mode 100644 core/components/batcher/controllers/template/tvdefaults.class.php delete mode 100644 core/components/batcher/controllers/template/tvdefaults.php delete mode 100644 core/components/batcher/controllers/template/tvs.class.php delete mode 100644 core/components/batcher/controllers/template/tvs.php delete mode 100644 core/components/batcher/model/batcher/metadata.mysql.php delete mode 100644 core/components/batcher/model/batcher/request/batchercontrollerrequest.class.php delete mode 100644 core/components/batcher/model/schema/batcher.mysql.schema.xml delete mode 100644 core/components/batcher/processors/mgr/element/changedefaulttvs.php delete mode 100644 core/components/batcher/processors/mgr/element/changetvs.php delete mode 100644 core/components/batcher/processors/mgr/loadtvs.php delete mode 100644 core/components/batcher/templates/template/tvdefaults.tpl delete mode 100644 core/components/batcher/templates/template/tvs.tpl diff --git a/_packages/batcher-2.0.0-pl.transport.zip b/_packages/batcher-2.0.0-pl.transport.zip deleted file mode 100644 index 1912213e5395d7f492183de2db31b8e95e26330b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84756 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 j>0IVE&L8mqcAZH{78W??0f+Mee^?'+_('template')+': '+Batcher.template.templatename+'' - ,border: false - ,cls: 'modx-page-header' - ,id: 'batcher-panel-header' - },{ - xtype: 'modx-tabs' - ,bodyStyle: 'padding: 10px' - ,defaults: { border: false ,autoHeight: true } - ,border: true - ,stateful: true - ,stateId: 'batcher-template-tvs-tabpanel' - ,stateEvents: ['tabchange'] - ,getState:function() { - return {activeTab:this.items.indexOf(this.getActiveTab())}; - } - ,items: [{ - title: _('batcher.tvs') - ,defaults: { autoHeight: true } - ,items: [{ - html: '

'+_(config.intromsg)+'

' - ,border: false - ,bodyStyle: 'padding: 10px' - ,height: 10 - ,maxHeight: 10 - ,autoScroll: true - },{ - xtype: 'hidden' - ,name: 'template' - ,value: Batcher.template.id - },{ - html: '' - ,xtype: 'panel' - ,border: false - ,width: '97%' - ,anchor: '100%' - ,bodyStyle: 'padding: 15px;' - ,autoHeight: true - ,autoLoad: { - url: Batcher.config.connectorUrl - ,method: 'GET' - ,params: { - action: 'mgr/loadtvs' - ,class_key: 'modResource' - ,template: Batcher.template.id - ,resource: 0 - ,showCheckbox: 1 - } - ,scripts: true - ,callback: function() { - MODx.fireEvent('ready'); - - } - ,scope: this - } - },{ - html: (Batcher.resources ? '
'+Batcher.resources : '') - ,border: false - ,bodyStyle: 'padding: 15px' - }] - }] - }] - }); - Batcher.panel.TemplateTVs.superclass.constructor.call(this,config); -}; -Ext.extend(Batcher.panel.TemplateTVs,MODx.FormPanel); -Ext.reg('batcher-panel-template-tvs',Batcher.panel.TemplateTVs); - - -MODx.triggerRTEOnChange = function() { -}; -MODx.fireResourceFormChange = function(f,nv,ov) { - Ext.getCmp('modx-panel-resource').fireEvent('fieldChange'); -}; \ No newline at end of file diff --git a/core/components/batcher/controllers/template/tvdefaults.class.php b/core/components/batcher/controllers/template/tvdefaults.class.php deleted file mode 100644 index 2a362a5..0000000 --- a/core/components/batcher/controllers/template/tvdefaults.class.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * @package batcher - * @subpackage controllers - */ -class BatcherTemplateTvdefaultsManagerController extends BatcherManagerController { - /** @var modTemplate $template */ - public $template; - public function process(array $scriptProperties = array()) { - if (empty($scriptProperties['template'])) return $this->failure($this->modx->lexicon('batcher.template_err_ns')); - $this->template = $this->modx->getObject('modTemplate',$scriptProperties['template']); - if (empty($this->template)) return $this->failure($this->modx->lexicon('batcher.template_err_nf')); - } - public function getPageTitle() { return $this->modx->lexicon('batcher'); } - public function loadCustomCssJs() { - $managerUrl = $this->modx->getOption('manager_url'); - $this->addJavascript($managerUrl.'assets/modext/util/datetime.js'); - $this->addJavascript($managerUrl.'assets/modext/widgets/element/modx.panel.tv.renders.js'); - $this->addJavascript($this->batcher->config['jsUrl'].'widgets/template/template.tvs.panel.js'); - $this->addLastJavascript($this->batcher->config['jsUrl'].'sections/template/tvs.defaults.js'); - - $tj = $this->template->get(array('id','templatename','description')); - $tj = $this->modx->toJSON($tj); - $this->addHtml(''); - } - public function getTemplateFile() { return $this->batcher->config['templatesPath'].'template/tvdefaults.tpl'; } -} \ No newline at end of file diff --git a/core/components/batcher/controllers/template/tvdefaults.php b/core/components/batcher/controllers/template/tvdefaults.php deleted file mode 100644 index a3a4b40..0000000 --- a/core/components/batcher/controllers/template/tvdefaults.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * Loads the home page. - * - * @package batcher - * @subpackage controllers - */ - -if (empty($_REQUEST['template'])) return $modx->error->failure($modx->lexicon('batcher.template_err_ns')); -$template = $modx->getObject('modTemplate',$_REQUEST['template']); -if (empty($template)) return $modx->error->failure($modx->lexicon('batcher.template_err_nf')); - -$tj = $template->get(array('id','templatename','description')); -$tj = $modx->toJSON($tj); -$modx->regClientStartupHTMLBlock(''); - -$managerUrl = $modx->getOption('manager_url'); -$modx->regClientStartupScript($managerUrl.'assets/modext/util/datetime.js'); -$modx->regClientStartupScript($managerUrl.'assets/modext/widgets/element/modx.panel.tv.renders.js'); -$modx->regClientStartupScript($batcher->config['jsUrl'].'widgets/template/template.tvs.panel.js'); -$modx->regClientStartupScript($batcher->config['jsUrl'].'sections/template/tvs.defaults.js'); -$output = '
'; - -return $output; diff --git a/core/components/batcher/controllers/template/tvs.class.php b/core/components/batcher/controllers/template/tvs.class.php deleted file mode 100644 index 98750d3..0000000 --- a/core/components/batcher/controllers/template/tvs.class.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * @package batcher - * @subpackage controllers - */ -class BatcherTemplateTvsManagerController extends BatcherManagerController { - /** @var modTemplate $template */ - public $template; - public $resourcesOutput = array(); - - public function process(array $scriptProperties = array()) { - $placeholders = array(); - if (empty($scriptProperties['template'])) return $this->failure($this->modx->lexicon('batcher.template_err_ns')); - $this->template = $this->modx->getObject('modTemplate',$scriptProperties['template']); - if (empty($this->template)) return $this->failure($this->modx->lexicon('batcher.template_err_nf')); - - /* get all resources for template */ - $c = $this->modx->newQuery('modResource'); - $c->where(array( - 'template' => $this->template->get('id'), - )); - $c->sortby('pagetitle','ASC'); - $resources = $this->template->getMany('Resources',$c); - $this->resourcesOutput[] = '

'.$this->modx->lexicon('batcher.resources_affect').'

    '; - $i = 1; - foreach ($resources as $resource) { - if ($i > 50) { - $this->resourcesOutput[] = '
  1. - '.$this->modx->lexicon('batcher.and_others',array('count' => (count($resources) - $i - 1))).'
  2. '; - break; - } - $this->resourcesOutput[] = '
  3. - '.$resource->get('pagetitle').' ('.$resource->get('id').')
  4. '; - $i++; - } - $this->resourcesOutput[] = '
'; - - return $placeholders; - } - public function getPageTitle() { return $this->modx->lexicon('batcher'); } - public function loadCustomCssJs() { - $managerUrl = $this->modx->getOption('manager_url'); - - $tj = $this->template->get(array('id','templatename','description')); - $tj = $this->modx->toJSON($tj); - $this->addHtml(''); - $this->addJavascript($managerUrl.'assets/modext/util/datetime.js'); - $this->addJavascript($managerUrl.'assets/modext/widgets/element/modx.panel.tv.renders.js'); - $this->addJavascript($this->batcher->config['jsUrl'].'widgets/template/template.tvs.panel.js'); - $this->addLastJavascript($this->batcher->config['jsUrl'].'sections/template/tvs.js'); - } - public function getTemplateFile() { return $this->batcher->config['templatesPath'].'template/tvs.tpl'; } -} \ No newline at end of file diff --git a/core/components/batcher/controllers/template/tvs.php b/core/components/batcher/controllers/template/tvs.php deleted file mode 100644 index a9ca61f..0000000 --- a/core/components/batcher/controllers/template/tvs.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * Loads the home page. - * - * @package batcher - * @subpackage controllers - */ - -if (empty($_REQUEST['template'])) return $modx->error->failure($modx->lexicon('batcher.template_err_ns')); -$template = $modx->getObject('modTemplate',$_REQUEST['template']); -if (empty($template)) return $modx->error->failure($modx->lexicon('batcher.template_err_nf')); - -/* get all resources for template */ -$c = $modx->newQuery('modResource'); -$c->where(array( - 'template' => $template->get('id'), -)); -$c->sortby('pagetitle','ASC'); -$resources = $template->getMany('Resources',$c); -$ro = '

'.$modx->lexicon('batcher.resources_affect').'

    '; -$i = 1; -foreach ($resources as $resource) { - if ($i > 50) { - $ro .= '
  1. - '.$modx->lexicon('batcher.and_others',array('count' => (count($resources) - $i - 1))).'
  2. '; - break; - } - $ro .= '
  3. - '.$resource->get('pagetitle').' ('.$resource->get('id').')
  4. '; - $i++; -} -$ro .= '
'; - -$tj = $template->get(array('id','templatename','description')); -$tj = $modx->toJSON($tj); -$modx->regClientStartupHTMLBlock(''); - -$managerUrl = $modx->getOption('manager_url'); -$modx->regClientStartupScript($managerUrl.'assets/modext/util/datetime.js'); -$modx->regClientStartupScript($managerUrl.'assets/modext/widgets/element/modx.panel.tv.renders.js'); -$modx->regClientStartupScript($batcher->config['jsUrl'].'widgets/template/template.tvs.panel.js'); -$modx->regClientStartupScript($batcher->config['jsUrl'].'sections/template/tvs.js'); -$output = '
'; - -return $output; diff --git a/core/components/batcher/model/batcher/metadata.mysql.php b/core/components/batcher/model/batcher/metadata.mysql.php deleted file mode 100644 index b3bd0e9..0000000 --- a/core/components/batcher/model/batcher/metadata.mysql.php +++ /dev/null @@ -1,4 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -require_once MODX_CORE_PATH . 'model/modx/modrequest.class.php'; -/** - * Encapsulates the interaction of MODx manager with an HTTP request. - * - * {@inheritdoc} - * - * @package batcher - * @extends modRequest - */ -class BatcherControllerRequest extends modRequest { - public $batcher = null; - public $actionVar = 'action'; - public $defaultAction = 'home'; - - function __construct(Batcher &$batcher) { - parent :: __construct($batcher->modx); - $this->batcher =& $batcher; - } - - /** - * Extends modRequest::handleRequest and loads the proper error handler and - * actionVar value. - * - * {@inheritdoc} - */ - public function handleRequest() { - $this->loadErrorHandler(); - - /* save page to manager object. allow custom actionVar choice for extending classes. */ - $this->action = isset($_REQUEST[$this->actionVar]) ? $_REQUEST[$this->actionVar] : $this->defaultAction; - - return $this->_respond(); - } - - /** - * Prepares the MODx response to a mgr request that is being handled. - * - * @access public - * @return boolean True if the response is properly prepared. - */ - private function _respond() { - $modx =& $this->modx; - $batcher =& $this->batcher; - $viewHeader = include $this->batcher->config['corePath'].'controllers/header.php'; - - $f = $this->batcher->config['corePath'].'controllers/'.$this->action.'.php'; - if (file_exists($f)) { - $viewOutput = include $f; - } else { - $viewOutput = 'Action not found: '.$f; - } - - return $viewHeader.$viewOutput; - } -} \ No newline at end of file diff --git a/core/components/batcher/model/schema/batcher.mysql.schema.xml b/core/components/batcher/model/schema/batcher.mysql.schema.xml deleted file mode 100644 index 91d946b..0000000 --- a/core/components/batcher/model/schema/batcher.mysql.schema.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/core/components/batcher/processors/mgr/element/changedefaulttvs.php b/core/components/batcher/processors/mgr/element/changedefaulttvs.php deleted file mode 100644 index 87c3744..0000000 --- a/core/components/batcher/processors/mgr/element/changedefaulttvs.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * Change template for multiple resources - * - * @package batcher - * @subpackage processors - */ -if (!$modx->hasPermission('save_template')) return $modx->error->failure($modx->lexicon('access_denied')); - - -if (empty($scriptProperties['template'])) return $modx->error->failure($modx->lexicon('batcher.template_err_ns')); -$template = $modx->getObject('modTemplate',$scriptProperties['template']); -if (empty($template)) return $modx->error->failure($modx->lexicon('batcher.template_err_nf')); - -if (empty($scriptProperties['tvs'])) return $modx->error->failure($modx->lexicon('batcher.tvs_err_ns')); - -$tvs = array(); -foreach ($scriptProperties as $key => $value) { - if (substr($key,0,2) != 'tv' || $key == 'tvs') continue; - $id = substr($key,2); - if (empty($scriptProperties['tv'.$id.'-checkbox'])) continue; - - $tv = $modx->getObject('modTemplateVar',$id); - if (!$tv) continue; - - switch ($tv->get('type')) { - case 'url': - if ($scriptProperties['tv'.$tv->get('id').'_prefix'] != '--') { - $value = str_replace(array('ftp://','http://'),'', $value); - $value = $scriptProperties['tv'.$tv->get('id').'_prefix'].$value; - } - break; - case 'date': - $value = empty($value) ? '' : strftime('%Y-%m-%d %H:%M:%S',strtotime($value)); - break; - default: - /* handles checkboxes & multiple selects elements */ - if (is_array($value)) { - $featureInsert = array(); - while (list($featureValue, $featureItem) = each($value)) { - $featureInsert[count($featureInsert)] = $featureItem; - } - $value = implode('||',$featureInsert); - } - break; - } - - $tv->set('default_text',$value); - $tv->save(); -} -return $modx->error->success(); \ No newline at end of file diff --git a/core/components/batcher/processors/mgr/element/changetvs.php b/core/components/batcher/processors/mgr/element/changetvs.php deleted file mode 100644 index 475e376..0000000 --- a/core/components/batcher/processors/mgr/element/changetvs.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * This file is part of Batcher, a batch resource editing Extra. - * - * Batcher is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Batcher is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * Batcher; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - * - * @package batcher - */ -/** - * Change template for multiple resources - * - * @package batcher - * @subpackage processors - */ -if (!$modx->hasPermission('save_template')) return $modx->error->failure($modx->lexicon('access_denied')); - - -if (empty($scriptProperties['template'])) return $modx->error->failure($modx->lexicon('batcher.template_err_ns')); -$template = $modx->getObject('modTemplate',$scriptProperties['template']); -if (empty($template)) return $modx->error->failure($modx->lexicon('batcher.template_err_nf')); - -$resources = $template->getMany('Resources'); - -if (empty($scriptProperties['tvs'])) return $modx->error->failure($modx->lexicon('batcher.tvs_err_ns')); - -$tvs = array(); -foreach ($scriptProperties as $key => $value) { - if (substr($key,0,2) != 'tv' || $key == 'tvs') continue; - $id = (int)substr($key,2); - if (empty($scriptProperties['tv'.$id.'-checkbox'])) continue; - $tv = $modx->getObject('modTemplateVar',$id); - if (!$tv) continue; - - switch ($tv->get('type')) { - case 'url': - if ($scriptProperties['tv'.$tv->get('id').'_prefix'] != '--') { - $value = str_replace(array('ftp://','http://'),'', $value); - $value = $scriptProperties['tv'.$tv->get('id').'_prefix'].$value; - } - break; - case 'date': - $value = empty($value) ? '' : strftime('%Y-%m-%d %H:%M:%S',strtotime($value)); - break; - default: - /* handles checkboxes & multiple selects elements */ - if (is_array($value)) { - $featureInsert = array(); - while (list($featureValue, $featureItem) = each($value)) { - $featureInsert[count($featureInsert)] = $featureItem; - } - $value = implode('||',$featureInsert); - } - break; - } - - - /* change resource values */ - foreach ($resources as $resource) { - /* if different than default and set, set TVR record */ - if ($value != $tv->get('default_text')) { - - /* update the existing record */ - $tvc = $modx->getObject('modTemplateVarResource',array( - 'tmplvarid' => $tv->get('id'), - 'contentid' => $resource->get('id'), - )); - if ($tvc == null) { - /* add a new record */ - $tvc = $modx->newObject('modTemplateVarResource'); - $tvc->set('tmplvarid',$tv->get('id')); - $tvc->set('contentid',$resource->get('id')); - } - $tvc->set('value',$value); - $tvc->save(); - - /* if equal to default value, erase TVR record */ - } else { - $tvc = $modx->getObject('modTemplateVarResource',array( - 'tmplvarid' => $tv->get('id'), - 'contentid' => $resource->get('id'), - )); - if ($tvc != null) $tvc->remove(); - } - } - reset($resources); -} -return $modx->error->success(); \ No newline at end of file diff --git a/core/components/batcher/processors/mgr/loadtvs.php b/core/components/batcher/processors/mgr/loadtvs.php deleted file mode 100644 index 934f2c5..0000000 --- a/core/components/batcher/processors/mgr/loadtvs.php +++ /dev/null @@ -1,54 +0,0 @@ -getOption('manager_theme',null,'default'); -$templatePath = $modx->getOption('manager_path') . 'templates/' . $theme . '/'; -if (!file_exists($templatePath)) { /* fallback to default */ - $templatePath = $modx->getOption('manager_path') . 'templates/default/'; -} -$modx->getService('smarty', 'smarty.modSmarty', '', array( - 'template_dir' => $templatePath, -)); -$version = $modx->getVersionData(); -if (version_compare($version['full_version'],'2.2.0-dev','>=')) { - /** @var modSmarty $smarty */ - $smarty = $modx->getService('smarty', 'smarty.modSmarty', '', array( - 'template_dir' => $modx->getOption('manager_path') . 'templates/default/', - )); - $smarty->setTemplatePath($modx->getOption('manager_path') . 'templates/default/'); - - require_once $modx->getOption('core_path',null,MODX_CORE_PATH).'model/modx/modmanagercontroller.class.php'; - require_once $modx->getOption('manager_path',null,MODX_MANAGER_PATH).'controllers/default/resource/resource.class.php'; - class BatcherTVLoader extends ResourceManagerController { - public function process(array $scriptProperties = array()) {} - public function getPageTitle() { return ''; } - public function loadCustomCssJs() {} - public function getTemplateFile() { return ''; } - public function checkPermissions() { return true;} - } - $resource = $modx->newObject('modResource'); - $resource->set('template',$_REQUEST['template']); - - $tvLoader = new BatcherTVLoader($modx); - $modx->controller =& $tvLoader; - $tvLoader->resource =& $resource; - $o = $tvLoader->loadTVs(); -} else { - $resource = $modx->newObject('modResource'); - $resource->set('template',$_REQUEST['template']); - - $tvFile = $modx->getOption('manager_path').'controllers/'.$modx->getOption('manager_theme',null,'default').'/resource/tvs.php'; - if (!file_exists($tvFile)) { - $tvFile = $modx->getOption('manager_path').'controllers/default/resource/tvs.php'; - } - - $o = include $tvFile; -} -@session_write_close(); -//echo '
';echo htmlentities($o);
-echo $o;
-die();
\ No newline at end of file
diff --git a/core/components/batcher/templates/template/tvdefaults.tpl b/core/components/batcher/templates/template/tvdefaults.tpl
deleted file mode 100644
index 56ec820..0000000
--- a/core/components/batcher/templates/template/tvdefaults.tpl
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file diff --git a/core/components/batcher/templates/template/tvs.tpl b/core/components/batcher/templates/template/tvs.tpl deleted file mode 100644 index 56ec820..0000000 --- a/core/components/batcher/templates/template/tvs.tpl +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file