Импорт данных через modExtra

Всем привет. Продолжаю разбираться в процессорах и интерфейсе на extjs. Пытаюсь сделать импорт по клику на кнопку через компонент. В /assets/components/paypanel/js/mgr/widgets/domains.grid.js добавил:

Ext.applyIf(config, {
        save_action: 'mgr/domain/importapi',
Дальше делаю всплывающее окно с подтверждением действий:

importApiDomain: function(response) {
        Ext.Msg.confirm(
            _('paypanel_action_download') || _('warning'),
            _('paypanel_confirm_download'),
            function(e) {
                if (e == 'yes') {
                    this.setAction('importapi', 'false', 0);
                } else {
                    this.fireEvent('cancel');
                }
            },this);
    },
при нажатии на Да, должен начаться импорт.



Меню делаю так:

getTopBar: function () {
        return [{
            text: '<i class="icon icon-cogs"></i> ',
            menu: [{
                text: '<i class="icon icon-download"></i> ' + _('paypanel_domain_import'),
                cls: 'paypanel-cogs',
                handler: this.importApiDomain,
                scope: this
            }, {
                text: '<i class="icon icon-upload"></i> ' + _('paypanel_domain_update_prices'),
                cls: 'paypanel-cogs',
                handler: this.updateApiDomain,
                scope: this
            }, '-', {
                text: '<i class="icon icon-download"></i> ' + _('paypanel_domain_import_shop'),
                cls: 'paypanel-cogs',
                handler: this.importShopDomain,
                scope: this
            }, {
                text: '<i class="icon icon-upload"></i> ' + _('paypanel_domain_update_minishop'),
                cls: 'paypanel-cogs',
                handler: this.updateShopDomain,
                scope: this
            }]
        },
Пытался сделать свой процессор /core/components/paypanel/processors/mgr/domain/importapi.class.php, но что-то пошло не так:

<?php

/**
 * Update API REG.RU
 */
class PayPanelImportApiProcessor extends modProcessor
{
    public $classKey = 'PayPanelDomain';

    /** @var paypanel $paypanel */
    public $paypanel;

    /** {@inheritDoc} */
    public function initialize()
    {
        /** @var paypanel $paypanel */
        $this->paypanel = $this->modx->getService('paypanel');
        $this->paypanel->initialize($this->getProperty('context', $this->modx->context->key));

        return parent::initialize();
    }

    /** {@inheritDoc} */
    protected function clearTable()
    {
        $this->modx->query("DELETE FROM {$this->modx->getTableName($this->classKey)}");
        $this->modx->query("ALTER TABLE {$this->modx->getTableName($this->classKey)} AUTO_INCREMENT=1");
    }

    /** {@inheritDoc} */
    public function process()
    {
        $content = $this->paypanel->getFileContent($this->classKey);
        if ($content == false) {
            return $this->failure($this->paypanel->lexicon('err_file_ns'));
        }

        $this->clearTable();
        $this->paypanel->createDefault();

        $api_url = $modx->getOption('paypanel_api_regru_url');
        $api_login = $modx->getOption('paypanel_api_regru_username');
        $api_password = $modx->getOption('paypanel_api_regru_password');
        $api_format = $modx->getOption('paypanel_api_regru_format');
        $api_currency = $modx->getOption('paypanel_api_regru_currency');

        $url = $api_url.'domain/get_prices?output_format='.$api_format.'¤cy='.$api_currency.'&show_renew_data=1&show_update_data=1&password='.$api_password.'&username='.$api_login;

        $json = file_get_contents($url);
        $api_price = json_decode($json);
        $prices = $api_price->answer->prices;

        $modx->addPackage('paypanel', $modx->getOption('core_path').'components/paypanel/model/');

        foreach ($prices as $zone => $data) {

            $extcreate_price_eq_renew = $data->extcreate_price_eq_renew;
            $idn = $data->idn;
            $reg_max_period = $data->reg_max_period;
            $reg_min_period = $data->reg_min_period;
            $reg_price = $data->reg_price;
            $retail_reg_price = $data->retail_reg_price;

            $domain = str_replace(array('_', '-', '—', '  ', 'idn.'), '', trim($zone));
            $domain = '.'.$domain;

            $procent = $modx->getOption('paypanel_api_regru_percent');
            $price_procent = $reg_price / 100 * $procent;
            $price_procent = preg_replace('/(\..{2}).*/', '$1', $price_procent);
            $price = $reg_price + $price_procent;
            $price = preg_replace('/(\..{2}).*/', '$1', $price);

            if (!$object = $modx->getObject('PayPanelDomain', ['zone' => $zone])) {

                $object = $modx->newObject('PayPanelDomain');
                $object->set('zone', $zone);

            }

            $object->set('domain', $domain);
            $object->set('whois', '');
            $object->set('idn', $idn);
            //$object->set('groups', '');
            //$object->set('popular', 0);
            $object->set('min', $reg_min_period);
            $object->set('max', $reg_max_period);
            $object->set('price_retail', $retail_reg_price);
            $object->set('price_partner', $reg_price);
            $object->set('percent', $procent);
            $object->set('advance', $price_procent);
            $object->set('price', $price);
            $object->set('active', 1);

            $object->save();

        }

        return $this->success();
    }

}

return 'PayPanelImportApiProcessor';
Буду признателен за любую помощь. Очень хочется победить эту задачу)
SEQUEL.ONE
28 февраля 2019, 01:05
modx.pro
923
0

Комментарии: 18

Александр Туниеков
28 февраля 2019, 06:04
+1
А что не так то пошло? :) Какая ошибка? В коносоле разработчика в Network что говорит?
    SEQUEL.ONE
    28 февраля 2019, 14:12
    0
    В консоли тишина. Похоже действие при клике на кнопку не исполняется.
      Александр Туниеков
      28 февраля 2019, 14:18
      +1
      покажи эту функцию this.setAction('importapi', 'false', 0);
        Александр Туниеков
        28 февраля 2019, 15:43
        +1
        хм… или эта функция save_action должна вызвать? что-то такого варианта я не встречал…
          SEQUEL.ONE
          28 февраля 2019, 19:31
          0
          setAction: function(method, field, value) {
                  var ids = this._getSelectedIds();
                  if (!ids.length && (field !== 'false')) {
                      return false;
                  }
                  MODx.Ajax.request({
                      url: PayPanel.config.connector_url,
                      params: {
                          action: 'mgr/domain/importapi',
                          method: method,
                          field_name: field,
                          field_value: value,
                          ids: Ext.util.JSON.encode(ids)
                      },
                      listeners: {
                          success: {
                              fn: function() {
                                  this.refresh();
                              },
                              scope: this
                          },
                          failure: {
                              fn: function(response) {
                                  MODx.msg.alert(_('error'), response.message);
                              },
                              scope: this
                          }
                      }
                  })
              },
          Я забыл её вставить. Домой приеду проверю, но похоже ещё нужно допилить.
            Александр Туниеков
            28 февраля 2019, 19:49
            +1
            Явных ошибок не вижу. Раз запроса не проходит ищи этап на каком срывается. Для начала вставь console.log(«test»); в начало этой функции и проверь консоль браузера. Или алертом можешь проверять. Я с телефона сижу счас. Не удобно набирать.
              SEQUEL.ONE
              28 февраля 2019, 22:24
              0
              Вставил функцию setAction, теперь при клике на модальном окне кнопки Да, выдаёт 500ую ошибку и в консоли ругается на setAction.
                SEQUEL.ONE
                28 февраля 2019, 22:28
                0
                Залил на GitHub github.com/SequelONE/PayPanel

                Пока не могу понять в чём дело(
                  Александр Туниеков
                  01 марта 2019, 04:52
                  +1
                  Залил на GitHub github.com/SequelONE/PayPanel
                  что-то мне не сильно охота дебажить чужой компонент :)
                  в консоли ругается на setAction.
                  Когда научитесь собеседников уважать? Ошибку сразу надо писать. Я не телепат же :)
                  выдаёт 500ую ошибку
                  То есть запрос в network уже есть?! В коннектор компонента PayPanel/assets/components/paypanel/connector.php в начало вставьте
                  error_reporting(E_ALL);
                  ini_set('display_errors', 1);
                  И смотрите ошибку в network response. Если что там не понятно, ошибку сюда.
                    SEQUEL.ONE
                    01 марта 2019, 10:50
                    0
                    Выдаёт вот такие ошибки в консоли:

                    Unchecked runtime.lastError: The message port closed before a response was received.
                    2VM369:1 Uncaught SyntaxError: Unexpected token <
                        at doDecode (ext-all.js:1)
                        at Object.decode (ext-all.js:1)
                        at MODx.Ajax.success (modx.js?v=f2cb0b38:604)
                        at Ext.data.Connection.handleResponse (ext-all.js:1)
                        at f (ext-base.js:1)
                        at m (ext-base.js:1)
                        at ext-base.js:1
                    doDecode @ ext-all.js:1
                    (anonymous) @ ext-all.js:1
                    success @ modx.js?v=f2cb0b38:604
                    handleResponse @ ext-all.js:1
                    f @ ext-base.js:1
                    m @ ext-base.js:1
                    (anonymous) @ ext-base.js:1
                    setInterval (async)
                    n @ ext-base.js:1
                    i @ ext-base.js:1
                    request @ ext-base.js:1
                    request @ ext-all.js:1
                    request @ modx.js?v=f2cb0b38:637
                    setAction @ domains.grid.js:371
                    (anonymous) @ domains.grid.js:192
                    (anonymous) @ ext-base.js:1
                    setTimeout (async)
                    defer @ ext-base.js:1
                    callback @ ext-all.js:1
                    c @ ext-all.js:1
                    (anonymous) @ ext-base.js:1
                    onClick @ ext-all.js:1
                    I @ ext-all.js:1
                      Александр Туниеков
                      01 марта 2019, 11:55
                      +1
                      А показ ошибок пхп включили?
                        SEQUEL.ONE
                        01 марта 2019, 12:00
                        0
                        Включил. Компонент работает. Из консоли XHR пропала ошибка 500 на конектор. Теперь код 200. Я немного не въезжаю в ExtJS, мне всего лишь нужно при нажатии на кнопку запустить код процессора(((
                          Александр Туниеков
                          01 марта 2019, 12:07
                          +1
                          Ну вы похоже коносолью браузера не очень умеете пользоваться :(.
                          Так вот ошибка 500 пропала потому, что она теперь показывается. Шелкаете на этой строке и там показывается ответ от сервера. Смотрите что в ответе.
                          https://yadi.sk/i/sthHH3XOTbCjsw
                          SEQUEL.ONE
                          01 марта 2019, 12:13
                          0
                          Огромное спасибо. Я не заметил этих вкладок. Какой кошмар. Теперь я вижу ошибки:

                          <br />
                          <font size='1'><table class='xdebug-error xe-uncaught-exception' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
                          <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Uncaught Error: Call to undefined method PayPanel::initialize() in /var/www/sequelone/data/www/sequel.one/core/components/paypanel/processors/mgr/domain/importapi.class.php on line <i>18</i></th></tr>
                          <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Error: Call to undefined method PayPanel::initialize() in /var/www/sequelone/data/www/sequel.one/core/components/paypanel/processors/mgr/domain/importapi.class.php on line <i>18</i></th></tr>
                          <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
                          <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0012</td><td bgcolor='#eeeeec' align='right'>381208</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='/var/www/sequelone/data/www/sequel.one/assets/components/paypanel/connector.php' bgcolor='#eeeeec'>.../connector.php<b>:</b>0</td></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0797</td><td bgcolor='#eeeeec' align='right'>2038360</td><td bgcolor='#eeeeec'>modConnectorRequest->handleRequest(  )</td><td title='/var/www/sequelone/data/www/sequel.one/assets/components/paypanel/connector.php' bgcolor='#eeeeec'>.../connector.php<b>:</b>28</td></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0799</td><td bgcolor='#eeeeec' align='right'>2039624</td><td bgcolor='#eeeeec'>modConnectorRequest->prepareResponse(  )</td><td title='/var/www/sequelone/data/www/sequel.one/core/model/modx/modconnectorrequest.class.php' bgcolor='#eeeeec'>.../modconnectorrequest.class.php<b>:</b>73</td></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>4</td><td bgcolor='#eeeeec' align='center'>0.0806</td><td bgcolor='#eeeeec' align='right'>2087992</td><td bgcolor='#eeeeec'>modConnectorResponse->outputContent(  )</td><td title='/var/www/sequelone/data/www/sequel.one/core/model/modx/modconnectorrequest.class.php' bgcolor='#eeeeec'>.../modconnectorrequest.class.php<b>:</b>86</td></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>5</td><td bgcolor='#eeeeec' align='center'>0.0807</td><td bgcolor='#eeeeec' align='right'>2088432</td><td bgcolor='#eeeeec'>modX->runProcessor(  )</td><td title='/var/www/sequelone/data/www/sequel.one/core/model/modx/modconnectorresponse.class.php' bgcolor='#eeeeec'>.../modconnectorresponse.class.php<b>:</b>144</td></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>6</td><td bgcolor='#eeeeec' align='center'>0.0815</td><td bgcolor='#eeeeec' align='right'>2218368</td><td bgcolor='#eeeeec'>PayPanelImportApiProcessor->run(  )</td><td title='/var/www/sequelone/data/www/sequel.one/core/model/modx/modx.class.php' bgcolor='#eeeeec'>.../modx.class.php<b>:</b>1764</td></tr>
                          <tr><td bgcolor='#eeeeec' align='center'>7</td><td bgcolor='#eeeeec' align='center'>0.0815</td><td bgcolor='#eeeeec' align='right'>2218368</td><td bgcolor='#eeeeec'>PayPanelImportApiProcessor->initialize(  )</td><td title='/var/www/sequelone/data/www/sequel.one/core/model/modx/modprocessor.class.php' bgcolor='#eeeeec'>.../modprocessor.class.php<b>:</b>173</td></tr>
                          </table></font>
                          SEQUEL.ONE
                          01 марта 2019, 13:49
                          0
                          Спасибо за помощь. Мне удалось победить) Правда хотелось бы, чтобы процесс сохранения сопровождался анимацией. Не подскажете как мне её добавить?
                          Александр Туниеков
                          01 марта 2019, 17:26
                          +1
                          Без понятия :) красивости это не ко мне. А так вообще-то у вас обычный ява-скрипт. Навешать лоадер, например, без проблем можно. Прогресс-бар уже сложнее. Там как то степень готовности получать надо. Можно сделать MODX.console https://yadi.sk/i/8hgGFbfMkIQfnA https://github.com/touol/EmailQueue/blob/b41f3e445f97b9b277dcc890c66b2ee101a61dbf/assets/components/emailqueue/js/mgr/widgets/items.grid.js#L341
                          Александр Туниеков
                          01 марта 2019, 17:41
                          +1
                          За помощь хотя бы рейтинг плюсуйте :)
                          SEQUEL.ONE
                          01 марта 2019, 18:17
                          +1
                          Плюсы закончились в этом треде)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      18