Импорт данных через 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';
Буду признателен за любую помощь. Очень хочется победить эту задачу) Комментарии: 18
А что не так то пошло? :) Какая ошибка? В коносоле разработчика в Network что говорит?
В консоли тишина. Похоже действие при клике на кнопку не исполняется.
покажи эту функцию this.setAction('importapi', 'false', 0);
хм… или эта функция save_action должна вызвать? что-то такого варианта я не встречал…
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
}
}
})
},
Я забыл её вставить. Домой приеду проверю, но похоже ещё нужно допилить.
Явных ошибок не вижу. Раз запроса не проходит ищи этап на каком срывается. Для начала вставь console.log(«test»); в начало этой функции и проверь консоль браузера. Или алертом можешь проверять. Я с телефона сижу счас. Не удобно набирать.
Вставил функцию setAction, теперь при клике на модальном окне кнопки Да, выдаёт 500ую ошибку и в консоли ругается на setAction.
Залил на 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. Если что там не понятно, ошибку сюда.
Выдаёт вот такие ошибки в консоли:
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
А показ ошибок пхп включили?
Включил. Компонент работает. Из консоли XHR пропала ошибка 500 на конектор. Теперь код 200. Я немного не въезжаю в ExtJS, мне всего лишь нужно при нажатии на кнопку запустить код процессора(((
Ну вы похоже коносолью браузера не очень умеете пользоваться :(.
Так вот ошибка 500 пропала потому, что она теперь показывается. Шелкаете на этой строке и там показывается ответ от сервера. Смотрите что в ответе.
https://yadi.sk/i/sthHH3XOTbCjsw
Так вот ошибка 500 пропала потому, что она теперь показывается. Шелкаете на этой строке и там показывается ответ от сервера. Смотрите что в ответе.
https://yadi.sk/i/sthHH3XOTbCjsw
Огромное спасибо. Я не заметил этих вкладок. Какой кошмар. Теперь я вижу ошибки:
<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>
Спасибо за помощь. Мне удалось победить) Правда хотелось бы, чтобы процесс сохранения сопровождался анимацией. Не подскажете как мне её добавить?
Без понятия :) красивости это не ко мне. А так вообще-то у вас обычный ява-скрипт. Навешать лоадер, например, без проблем можно. Прогресс-бар уже сложнее. Там как то степень готовности получать надо. Можно сделать MODX.console https://yadi.sk/i/8hgGFbfMkIQfnA https://github.com/touol/EmailQueue/blob/b41f3e445f97b9b277dcc890c66b2ee101a61dbf/assets/components/emailqueue/js/mgr/widgets/items.grid.js#L341
За помощь хотя бы рейтинг плюсуйте :)
Плюсы закончились в этом треде)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.