Добавить поле в опции MS вкладка "Производитель товара" msVendor .
У меня задача добавить два поля в форму в настройках MS2, вкладка «Производитель»
1. Шаг добавляем JS файл на страницу настроек, я сделал плагин
2. Создал директорию core/components/minishop2/custom/vendor_table/
И создал два файла
index.php
<?php
Регистрируем плагин в системе MS2
ms2_dtls_introtext
ms2_dtls_active
Кейс: Для поисковой оптимизации мы делаем состовной заголовок товара который мы настраиваем для каждого бренда отдельно. В результате мы получили удобную форму.
1. Шаг добавляем JS файл на страницу настроек, я сделал плагин
<?php
switch ($modx->event->name) {
case 'msOnManagerCustomCssJs':
switch ($page) {
case 'orders':
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/minishop2/custom/addjsms2.js');
break;
case 'settings':
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/minishop2/custom/addjsms2vendor.js');
break;
}
break;
}
На событие msOnManagerCustomCssJs 2. Создал директорию core/components/minishop2/custom/vendor_table/
И создал два файла
index.php
<?php
return array(
'map' => array(
'msVendor' => require_once 'msvendor.map.inc.php',
),
);
msvendor.map.inc.php<?php
return array(
'fields' => array(
'dtls_introtext' => NULL,
'dtls_active' => 1,
),
'fieldMeta' => array(
'dtls_introtext' => array(
'dbtype' => 'text',
'phptype' => 'string',
'null' => NULL,
),
'dtls_active' => array(
'dbtype' => 'tinyint',
'precision' => '1',
'attributes' => 'unsigned',
'phptype' => 'integer',
'null' => true,
'default' => 1,
),
),
);
Наследовал ExtJS формы Ext.override(miniShop2.grid.Vendor, {
getFields: function () {
return [
'id', 'name', 'resource', 'country', 'email', 'logo', 'pagetitle',
'address', 'phone', 'fax', 'dtls_introtext', 'dtls_active', 'description', 'actions'
];
},
});
Ext.override (miniShop2.window.CreateVendor, {
getFields: function (config) {
return [
{xtype: 'hidden', name: 'id', id: config.id + '-id'},
{
layout: 'column',
items: [{
columnWidth: .6,
layout: 'form',
defaults: {msgTarget: 'under'},
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_name'),
name: 'name',
anchor: '99%',
id: config.id + '-name'
}],
}, {
columnWidth: .4,
layout: 'form',
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_country'),
name: 'country',
anchor: '99%',
id: config.id + '-country'
}],
}]
}, {
layout: 'column',
items: [{
columnWidth: .4,
layout: 'form',
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_email'),
name: 'email',
anchor: '99%',
id: config.id + '-email'
}],
}, {
columnWidth: .6,
layout: 'form',
items: [{
xtype: 'minishop2-combo-resource',
fieldLabel: _('ms2_resource'),
name: 'resource',
anchor: '99%',
id: config.id + '-resource'
}],
}]
}, {
xtype: 'minishop2-combo-browser',
fieldLabel: _('ms2_logo'),
name: 'logo',
anchor: '99%',
id: config.id + '-logo'
}, {
xtype: 'textarea',
fieldLabel: _('ms2_address'),
name: 'address',
anchor: '99%',
id: config.id + '-address'
}, {
layout: 'column',
items: [{
columnWidth: .5,
layout: 'form',
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_phone'),
name: 'phone',
anchor: '99%',
id: config.id + '-phone'
}],
}, {
columnWidth: .5,
layout: 'form',
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_fax'),
name: 'fax',
anchor: '99%',
id: config.id + '-fax'
}],
}]
}
, {
xtype: 'textarea',
fieldLabel: _('ms2_dtls_introtext'),
name: 'dtls_introtext',
anchor: '99%',
id: config.id + '-dtls_introtext'
}
, {
xtype: 'textarea',
fieldLabel: _('ms2_description'),
name: 'description',
anchor: '99%',
id: config.id + '-description'
}
,
{
xtype: 'xcheckbox',
boxLabel: _('ms2_dtls_active'),
name: 'dtls_active',
anchor: '99%',
id: config.id + '-dtls_active',
}
];
}
});
Добавляем новые поля в БД Регистрируем плагин в системе MS2
<?php
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('vendor_table', '{core_path}components/minishop2/custom/vendor_table/index.php');
}
Ну и последнем шагом добавляем в словарь Minishop2 тема managerms2_dtls_introtext
ms2_dtls_active
Кейс: Для поисковой оптимизации мы делаем состовной заголовок товара который мы настраиваем для каждого бренда отдельно. В результате мы получили удобную форму.
https://i.imgur.com/MUcQA84.png
Поблагодарить автора
Отправить деньги
Комментарии: 8
Я изучал данный вопрос по двум статьям masterdench.ru/dobavit-polya-v-opczii-minishop2.html но и документации docs.modx.pro/komponentyi/minishop2/razrabotka/plaginyi-tovarov, конечно хочется больше информации по данному вопросу.
Так же создал issue где написал порядок написание поля взятых не статей а из логике и в чем уверен что это правильно. Ссылка на issue
То есть если я все правильно понимаю, поля отображаются, все ок. При сохранении формы первый раз все отправляется и сохраняется, а при редактировании уже нет? При редактировании в кастомных полях есть данные или они пустые?
@Артём Зернов
Cпасибо за вопросы.
Добавление
1. При добавление товара данные передаются в массив все данные в БД есть.
Редактирование
1. При открытие в кастомных полях поля пустые.
2. Если мы напишум другую информацию (редактирование) в кастомных полях она обновиться (поля остануться пустых а массиве появиться обновленная информация)
3. Если мы езменим другие поля, а кастомные при изменение оставим без изменение то данные кастомных полей сотруться и кастомные поля перезапишуться на пустоту.
Надеюсь я перечислил все сценирии поведения данной формы.
Cпасибо за вопросы.
Добавление
1. При добавление товара данные передаются в массив все данные в БД есть.
Редактирование
1. При открытие в кастомных полях поля пустые.
2. Если мы напишум другую информацию (редактирование) в кастомных полях она обновиться (поля остануться пустых а массиве появиться обновленная информация)
3. Если мы езменим другие поля, а кастомные при изменение оставим без изменение то данные кастомных полей сотруться и кастомные поля перезапишуться на пустоту.
Надеюсь я перечислил все сценирии поведения данной формы.
Определенно, это указывает на то, что данные, получаемые из процессора при открытии формы на редактирование, либо не поступают от процессора, либо просто не подставляются в поля. Мне что-то подсказывает, что коннектор возвращает только стандартные поля, а про доп. поля ему ничего не известно.
Чтобы это понять, открывайте консоль браузера и в момент открытия формы на редактирование посмотрите, какие данные возвращает коннектор. Если в них нет ваших доп. полей, значит нужно копать серверную часть и смотреть, где вы что-то упустили, что коннектор не возвращает нужные данные.
Если же данные поступают, но не подставляются в поля, то нужно копать клиентскую часть, то есть javascript, и смотреть, почему эти данные не подставляются в соответствующие поля формы.
Понимаю, что вы надеялись скорее всего получить конкретный ответ, но, к сожалению, у меня сейчас не так много времени, чтобы воспроизвести у себя данный кейс и указать на конкретную причину :)
Чтобы это понять, открывайте консоль браузера и в момент открытия формы на редактирование посмотрите, какие данные возвращает коннектор. Если в них нет ваших доп. полей, значит нужно копать серверную часть и смотреть, где вы что-то упустили, что коннектор не возвращает нужные данные.
Если же данные поступают, но не подставляются в поля, то нужно копать клиентскую часть, то есть javascript, и смотреть, почему эти данные не подставляются в соответствующие поля формы.
Понимаю, что вы надеялись скорее всего получить конкретный ответ, но, к сожалению, у меня сейчас не так много времени, чтобы воспроизвести у себя данный кейс и указать на конкретную причину :)
@Артём Зернов
Cпасибо за ответ. Я уже начал копать в данном направление и даже создал вопрос в ветки баг MS2 в GitHub.
Почему я это сделал?.. Вы очень правильно сформулировали, как нужно разбираться в данной проблеме. Я создал вопрос в issue Если будет интересно разобраться в данном вопросе. Я написал мануал уже более обдуманно.
Там же я прикрепил скриншот данных connector. Данные в файле присутствуют. Все таки это баг, так как в соседней вкладке выше описанные действия срабатывают и все работает на ура.
Спасибо Вам за внимание к этой проблеме. Буду так же копать в сторону Ext JS и разбираться более детально как это работает и что содержиться в классах и как они наследуются. Чувствую проблема именно в этом.
Для удобства переношу скриншот коннекторами в комментарий.
Cпасибо за ответ. Я уже начал копать в данном направление и даже создал вопрос в ветки баг MS2 в GitHub.
Почему я это сделал?.. Вы очень правильно сформулировали, как нужно разбираться в данной проблеме. Я создал вопрос в issue Если будет интересно разобраться в данном вопросе. Я написал мануал уже более обдуманно.
Там же я прикрепил скриншот данных connector. Данные в файле присутствуют. Все таки это баг, так как в соседней вкладке выше описанные действия срабатывают и все работает на ура.
Спасибо Вам за внимание к этой проблеме. Буду так же копать в сторону Ext JS и разбираться более детально как это работает и что содержиться в классах и как они наследуются. Чувствую проблема именно в этом.
Для удобства переношу скриншот коннекторами в комментарий.
смотрим тут github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L119
видим что запись идет из грида, доступны там поля заданные тут github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L18
надо править метод github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L117
чтобы был запрос перед выводом окна, примерно так
видим что запись идет из грида, доступны там поля заданные тут github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L18
надо править метод github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L117
чтобы был запрос перед выводом окна, примерно так
updateVendor: function (btn, e, row) {
if (typeof(row) != 'undefined') {
this.menu.record = row.data;
}
var id = this.menu.record.id;
MODx.Ajax.request({
url: this.config.url,
params: {
action: 'mgr/settings/vendor/get',
id: id
},
listeners: {
success: {
fn: function ( r ) {
var w = Ext.getCmp('minishop2-window-vendor-update');
if (w) {
w.close();
}
w = MODx.load({
xtype: 'minishop2-window-vendor-update',
id: 'minishop2-window-vendor-update',
title: this.menu.record['name'],
record: r.object,
listeners: {
success: {
fn: function () {
this.refresh();
}, scope: this
},
}
});
w.fp.getForm().reset();
w.fp.getForm().setValues(r.object);
w.show(e.target);
}, scope: this
}
}
});
},
@Володя
Cпасибо за разъяснение, я понял как это работает. Я внес измнение все заработало.
Ну я не уверен что я прав в логике. Но работает.
Cпасибо за разъяснение, я понял как это работает. Я внес измнение все заработало.
Ну я не уверен что я прав в логике. Но работает.
Ext.override(miniShop2.grid.Vendor, {
getFields: function () {
return [
'id', 'name', 'resource', 'country', 'email', 'logo', 'pagetitle',
'address', 'phone', 'fax', 'dtls_introtext', 'dtls_active', 'description', 'actions'
];
},
});
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.