DocentBF · 16 февраля 2017, 09:51 На примере CSV. 1. Создаем кнопку, например, в верхнем баре: getTopBar: function() { return [{ text: '<i class="icon icon-chevron-up"></i> ' + _('modExtra_items_export'), handler: this.exportCSV, // функция-обработчик кнопки scope: this }] 2. Добавляем виджет-окно импорта с выбором файла: modExtra.window.ImportCSV = function(config) { config = config || {}; this.ident = config.ident || 'modextra'+Ext.id(); Ext.applyIf(config,{ title: _('modextra_items_import') ,id: this.ident ,fileUpload: true ,autoHeight: true ,width: 650 ,url: modExtra.config.connector_url ,action: 'mgr/item/import' // процессор загрузки и обработки файла, находится по пути modExtra/processors/mgr/item/import.class.php ,fields: [ { xtype: 'fileuploadfield', fieldLabel: _('modextra_window_import_file'), allowBlank: false } ] ,keys: [ { key: Ext.EventObject.ENTER ,shift: true ,fn: function() {this.submit() } ,scope: this } ] }); modExtra.window.ImportCSV.superclass.constructor.call(this,config); }; Ext.extend(modExtra.window.ImportCSV,MODx.Window); Ext.reg('modextra-window-import-csv',modExtra.window.ImportCSV);3. Создаете handler кнопки, расширяя grid: Ext.extend(modExtra.grid.Items, MODx.grid.Grid, { windows: {}, importCSV: function (btn, e) { if (!this.windows.ImportCSV) { this.windows.ImportCSV = MODx.load({ xtype: 'modextra-window-import-csv' ,listeners: { 'success': {fn:function(){this.refresh();},scope:this} ,'failure': {fn:function(){console.log("error")}} } }); } this.windows.ImportCSV.fp.getForm().reset(); this.windows.ImportCSV.show(e.target); }, ...4. Создаем процессор импорта (/core/components/modextra/processors/mgr/item/import.class.php): <?php /** * Import */ include_once MODX_CORE_PATH . 'model/modx/processors/browser/file/upload.class.php'; class modExtraImportProcessor extends modBrowserFileUploadProcessor { public $objectType = 'modExtraItem'; public $classKey = 'modExtraItem'; public $languageTopics = array('modExtra'); public function initialize() { $this->setDefaultProperties(array( 'source' => 0, 'path' => 'assets/components/modExtra/files/', )); if (!$this->getProperty('path')) return $this->modx->lexicon('file_folder_err_ns'); return true; } /** {inheritDoc} */ public function process(){ if (!$this->getSource()) { return $this->failure($this->modx->lexicon('permission_denied')); } $this->source->setRequestProperties($this->getProperties()); $this->source->initialize(); $this->source->setProperties(array('basePath'=>'')); if (!$this->source->checkPolicy('create')) { return $this->failure($this->modx->lexicon('permission_denied')); } $success = $this->source->uploadObjectsToContainer($this->getProperty('path'),$_FILES); $file_n = current($_FILES); $file = is_array($_FILES) ? $file_n['name'] : false; if (empty($success) || !$file) { $msg = ''; $errors = $this->source->getErrors(); foreach ($errors as $k => $msg) { $this->modx->error->addField($k,$msg); } return $this->failure($msg); } else { $file = $_SERVER['DOCUMENT_ROOT'].'/'.$this->getProperty('path').$file; if(($handle = fopen($file,"r"))) { while(($data = fgetcsv($handle,null,';'))) { /* Далее код разборки CSV и сохранение нового объекта $rec = $modx->newObject(); $rec->set('field', $data[$n]) $rec->save(); */ } @unlink($file); } } return $this->success(); } } return 'modExtraImportProcessor';Код написан на скорую руку, может быть кто-то поправит?) Вопросы / Знатоки ExtJS подскажите, загрузка файла 3 +1 2
[aiAssist] Я же просто попросил его создать магазин, а он СДЕЛАЛ ЭТО! Скоро выкачу новую версию, потестирую у себя на маке сначала.
[Theme.Bootstrap] Новая версия с Bootstrap 4 Новая обновленная версия уже в магазине modstore.pro/packages/sites-themes/theme.bootstrap 4.1.0 (15.07.2026) — Added chunks for quick site setup: Scripts, Meta, Menu.*, Crumb...
Редизайн сообщества Спасибо, руки не дошли пока. Много всего другого делаю. Завтра поправлю все замечания.
Reactions — современная система реакций для MODX 3 [1.0.1-pl] — 2026-07-15 Added ReactionsCount: live-обновление рядом с виджетом (span.reactions-count + reactions:updated) без F5
Как ограничить вебмастеру доступ к заказам? Допустим вы закроете доступ к заказам и пользователям через админку, но для полноценной работы с сайтом нужен доступ в БД, а там вся эта информация есть и спрятать её невозможно, т...
Возможно ли реализовать возможность предоплаты за доставку на сайте? Отлично, значит можно не создавать заказ пока оплата не пройдёт успешно, а поскольку класс-обработчик оплаты будет кастомный сможет сами решать какую стоимость пробрасывать. Ещё на...
ImageOptimizer - WebP/AVIF и responsive <picture> для MODX 3 Выпустил новую версию [1.0.3-beta1] — 2026-07-13 Fixed — Inject сохраняет ``, `` и `` на полном HTML-документе (больше не оборачивает страни...
MiniShop3 1.11.0 при клике на radio идет пересчет итоговой суммы в orderUI, в зависимости от способов(оплаты доставки) я так поняла. попробуй код запуска события поставить ниже чем orderUI, после
1. Создаем кнопку, например, в верхнем баре:
2. Добавляем виджет-окно импорта с выбором файла:
3. Создаете handler кнопки, расширяя grid:
4. Создаем процессор импорта (/core/components/modextra/processors/mgr/item/import.class.php):
Код написан на скорую руку, может быть кто-то поправит?)