Попытка сделать "самопополняющийся" 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'.
но я не понимаю, какой процессор использовать, чтобы создать сущность
Евгений
4 часа назад
modx.pro
22
0

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0