Попытка сделать "самопополняющийся" listbox-multiple с migx-записями
0. MODX Revo 2.8.8, Migx 3.0.2-beta1
1. Есть определённый набор сущностей: name+description (migx-конфигурация symptoms_config)
2. Хочу создать список множественного выбора с возможностью его пополнения через кнопку и всплывающую форму
Предпринятые шаги:
1. Создал TV symptoms_selector — список, множественный выбор
Возможные значения:
@EVAL return $modx->runSnippet('getSymptomsList');
2. Создал сниппет getSymptomsList для связи «Название-Id»
$query = $modx->newQuery('migxConfigElement');
$query->where(array('config_id' => 16)); // ID конфигурации symptoms_config
$symptoms = $modx->getCollection('migxConfigElement', $query);
$output = array();
foreach ($symptoms as $symptom) {
$fields = $modx->fromJSON($symptom->get('fields'));
$output[] = $fields['name'] . '==' . $symptom->get('id');
}
return implode('||', $output);
3. Создал дополнительный плагин на onDocFormRender
Он добавляет кнопку рядом с этим мультиселектом и вызывает форму заполнения новой сущности
Всё в порядке — форма открывается, поля на месте.
Но сохраняться эта штука никуда не хочет:)))
Ниже полный код этого плагина (на всякий случай). Загвоздка именно в том, как через Migx-коннектор/Migx-процессор сохранить новое значение и автоматически подставить его в выбранные… Ну и чтобы для следующих страниц была возможность выбрать его.
<?php
if ($modx->event->name == 'OnDocFormRender') {
$resourceId = isset($_REQUEST['id']) ? (int)$_REQUEST['id'] : 0;
if ($resourceId > 0) {
$resource = $modx->getObject('modResource', $resourceId);
$resourceTmplId = $resource->get('template');
if ($resource && $resourceTmplId > 0) {
$template = $modx->getObject('modTemplate', $resourceTmplId);
$symptomTV = $modx->getObject('modTemplateVar', ['name' => 'symptoms_selector']);
if ($symptomTV) {
$tvId = $symptomTV->get('id');
$tvTemplate = $modx->getObject('modTemplateVarTemplate', [
'tmplvarid' => $tvId,
'templateid' => $resourceTmplId
]);
if ($tvTemplate) {
$customScript = "<script>Ext.onReady(function() {
// Ждём полной загрузки формы
setTimeout(function() {
const tvInput = document.querySelector('input[id=\"tvdef{$tvId}\"]');
if (tvInput) {
var tvContainer = tvInput.closest('.x-form-item');
if (tvContainer) {
// Добавляем кнопку после контейнера TV
var buttonHtml = '<div style=\"margin-top: 10px; margin-bottom: 15px;\"><button type=\"button\" onclick=\"addNewSymptomTest()\" class=\"x-btn x-btn-default-small\">+ Добавить новый симптом</button></div>';
tvContainer.insertAdjacentHTML('afterend', buttonHtml);
}
}
}, 500);
// Функция для добавления нового симптома
window.addNewSymptom = function() {
MODx.load({
xtype: 'modx-window',
title: 'Добавить новый симптом',
width: 600,
height: 400,
closeAction: 'close',
layout: 'fit', // Добавляем layout
items: [{
xtype: 'form',
id: 'symptom-add-form',
layout: 'form', // Меняем на 'form' layout
labelWidth: 120,
bodyStyle: 'padding: 15px;',
defaults: {
anchor: '100%',
msgTarget: 'under'
},
items: [{
xtype: 'textfield',
fieldLabel: 'Название',
name: 'name',
allowBlank: false,
width: '100%'
}, {
xtype: 'textarea',
fieldLabel: 'Описание',
name: 'description',
height: 200,
width: '100%',
grow: true
}]
}],
buttons: [{
text: 'Отмена',
handler: function() {
this.ownerCt.ownerCt.close();
}
}, {
text: 'Сохранить',
cls: 'primary-button',
handler: function() {
const form = Ext.getCmp('symptom-add-form');
if (form && form.getForm().isValid()) {
const values = form.getForm().getValues();
Ext.Ajax.request({
url: MODx.config.connector_url,
method: 'POST',
params: {
action: 'mgr/migx/create',
configs: 'symptoms_config',
data: Ext.encode([values])
},
success: function(response) {
var result = Ext.decode(response.responseText);
if (result.success) {
MODx.msg.alert('Успех', 'Симптом добавлен!');
this.ownerCt.ownerCt.close();
setTimeout(function() {
window.location.reload();
}, 1000);
} else {
MODx.msg.alert('Ошибка', result.message || 'Ошибка при сохранении');
}
},
failure: function(response) {
MODx.msg.alert('Ошибка', 'Ошибка при сохранении симптома');
},
scope: this
});
}
}
}]
}).show();
};
$modx->regClientStartupScript($customScript);
}
}
}
}
}
Плагин пока что работает только для уже созданных ресурсов, к шаблонам которых уже прикреплено данное ТВ.Помогите, пожалуйста, «добить» уже этот функционал (Полтора дня сижу и ломаю голову и всё вокруг)… ну или предложить достойную альтернативу подобному самопополняющемуся справочнику.
Бонусный вопрос: как это дело выводить? По идее просто с помощью getImageList можно?
*UPD
url: MODx.config.connector_url,
— сравнил в исходном коде с другими migx tv и там указан путь '/assets/components/migx/connector.php'. Я попробовал и его, но всё равно не работает. Предполагаю, что причина в том, что нет такого процессора 'create'.
но я не понимаю, какой процессор использовать, чтобы создать сущность