Добавить поле на редактирование к ресурсу [Решено]

Ребята привет!
Добавил в таблицу modx_site_content два поля, в которых хочу хранить идентификаторы из 1С (36 символов).
Хочу научить modx работать с ними как с обычными полями формы документа и никак не могу понять, как это нормально сделать. Расширял классы пользователей, их профилей, заказов minishop2 — все видит и все работает как надо, но как только пытаюсь добавить в field и fieldMeta эти поля аналогичным образом для modResource — сайт вообще перестает видеть ресурс и при клике для открытия формы на редактирования говорит, что ресурс не найден.
Как правильно поступить в таком случае?

Что сделал:
создал файл с таким кодом
Ext.override(MODx.panel.Resource,{
    getParentMainLeftFields: MODx.panel.Resource.prototype.getMainLeftFields,

    getMainLeftFields: function(config){
        var parentMainLeftFields = this.getParentMainLeftFields.call(this,config);
        
        parentMainLeftFields.push({
            xtype: 'textfield'
            ,fieldLabel: 'ID 1C'
            ,description: '<b>[[*id_1C]]</b>'
            ,name: 'id_1C'
            ,id: 'modx-resource-id_1C'
            ,maxLength: 255
            ,anchor: '100%'
            ,value: config.record.id_1C || ''
        },{
            xtype: 'textfield'
            ,fieldLabel: 'ID родителя 1C'
            ,description: '<b>[[*id_parent_1C]]</b>'
            ,name: 'id_1C'
            ,id: 'modx-resource-id_parent_1C'
            ,maxLength: 255
            ,anchor: '100%'
            ,value: config.record.id_parent_1C || ''
        });
        
        return parentMainLeftFields;
    }
});
Подключаю его при onDocFormRender через
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/smz/js/mgr/resource/field.js');
Поля появляются в форме редактирования. Но сохранить в них ничего нельзя (но если напрямую указать в БД у этих полей значения — выводит четко).
Смотрю $_POST при сохранении ресурса- полей нет, не попадают в объект.
Добавил на onDocFormSave
$modx->regClientStartupScript(MODX_ASSETS_URL . 'components/smz/js/mgr/resource/field.js');
Появились, но все равно пустые.
ЧЯДНТ?
Ilya Gureshidze
21 августа 2019, 18:04
modx.pro
1 170
0

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

Ilya Gureshidze
22 августа 2019, 12:07
2
+1
Как обычно: сам задал вопрос — сам отвечаю.
1. Добавил поля id_1C и id_parent_1C в modx_site_content
2. В плагине на OnMODXInit (у меня там куча полей для расширения разных классов)
написал
$modx->map['modResource']['fields']['id_1C'] = '';
    	$modx->map['modResource']['fields']['id_parent_1C'] = '';
    	$modx->map['modResource']['fieldMeta']['id_1C'] = array(
		'dbtype' => 'varchar',
		'precision' => 50,
		'phptype' => 'string',
		'null' => false,
		'default' => ''
	);
	$modx->map['modResource']['fieldMeta']['id_parent_1C'] = array(
		'dbtype' => 'varchar',
		'precision' => 50,
		'phptype' => 'string',
		'null' => false,
		'default' => ''
	);
3. В плагине на OnDocFormSave и onDocFormPrerender
switch ($modx->event->name) {
    case 'OnDocFormPrerender':
        $id_1C = '';
        $id_parent_1C = '';
        
        if (isset($scriptProperties['resource'])) {
            if (is_object($resource)) {
                $id_1C = $resource->get('id_1C');
                $id_parent_1C = $resource->get('id_parent_1C');
            }
        }
$modx->controller->addHtml(<<<HTML
<script>
    Ext.ComponentMgr.onAvailable('modx-resource-main-left', function(page) {
        page.on('beforerender', function() {
            page.insert(2,{
                xtype: 'textfield'
                ,name: 'id_1C'
                ,value: '{$id_1C}'
                ,anchor: '100%'
                ,layout: 'anchor'
                ,fieldLabel: 'ID 1C'
            });
            page.insert(3,{
                xtype: 'textfield'
                ,name: 'id_parent_1C'
                ,value: '{$id_parent_1C}'
                ,anchor: '100%'
                ,layout: 'anchor'
                ,fieldLabel: 'ID родителя 1C'
            });
        })
    });
</script>
HTML
);
        break;
        
    case 'OnDocFormSave':
        $resource->set('id_1C', $_POST['id_1C']);
        $resource->set('id_parent_1C', $_POST['id_parent_1C']);
        break;
}
return;
Все заработало.
    Игорь
    23 октября 2019, 17:30
    0
    А разве этот код нельзя упростить? Ну или сократить через сжатие?
    switch ($modx->event->name) {
    case 'OnDocFormPrerender':
    $id_1C = '';
    $id_parent_1C = '';

    if (isset($scriptProperties['resource'])) {
    if (is_object($resource)) {
    $id_1C = $resource->get('id_1C');
    $id_parent_1C = $resource->get('id_parent_1C');
    }
    }
    $modx->controller->addHtml(<<<HTML

    HTML
    );
    break;

    case 'OnDocFormSave':
    $resource->set('id_1C', $_POST['id_1C']);
    $resource->set('id_parent_1C', $_POST['id_parent_1C']);
    break;
    }
    return;
      Игорь
      23 октября 2019, 17:35
      0
      Ну так куча полей то для разных целей

      1. Добавил поля id_1C и id_parent_1C в modx_site_content
      2. В плагине на OnMODXInit (у меня там куча полей для расширения разных классов)
      написал
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        3