g0dzilla

g0dzilla

С нами с 22 ноября 2017; Место в рейтинге пользователей: #274
DocentBF
16 февраля 2017, 09:51
2
+1
На примере 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';
Код написан на скорую руку, может быть кто-то поправит?)