Кровельный

Кровельный

С нами с 30 мая 2023; Место в рейтинге пользователей: #7219
Кровельный
16 июня 2023, 12:21
0
Как добавить множественный список с автодополнением в ресурс/документ (свое кастомное поле tags_cloud), также как реализовано tags в ms2?
Например, у ресурса уже есть в бд значения ["тег 1","тег 2","тег 3"], но в супер-селекте они не выводятся и не вводятся. Есть у кого подсказка или решение?

В таблице modx_site_content добавлена структура tags_cloud
Плагин:
<?php
switch ($modx->event->name) {
    case "OnMODXInit":
        $modx->loadClass('modResource');    
        $map = array(
            'modResource' => array(
                'fields' => array(
                    'tags_cloud' => null,
                ),
                'fieldMeta' => array(
                    'tags_cloud' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'json',
                        'null' => true,
                    ),
                ),
            ),
        );
        
        foreach ($map as $class => $data) {
            $modx->loadClass($class);
            foreach ($data as $tmp => $fields) {
                if ($tmp == 'fields') {
                    foreach ($fields as $field => $value) {
                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                            if (isset($data[$key][$field])) {
                                $modx->map[$class][$key][$field] = $data[$key][$field];
                            }
                        }
                    }
                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                    foreach ($fields as $alias => $relation) {
                        if (!isset($modx->map[$class][$tmp][$alias])) {
                            $modx->map[$class][$tmp][$alias] = $relation;
                        }
                    }
                }
            }
        }
        break;
    case 'OnDocFormPrerender':
        $tags_cloud = $resource->get('tags_cloud');
        $tags_cloud = $modx->toJSON($tags_cloud);
        $modx->log(1, print_r($tags_cloud, 1));
        
        $modx->controller->addHtml("
        <script type='text/javascript'>
            Ext.ComponentMgr.onAvailable('modx-panel-resource', function(){
                const leftCol = this.items[1].items[0].items[0].items[0];
                const rightCol = this.items[1].items[0].items[0].items[1];
                config = [] || config || {};
                
                const tags_cloud = {
                    typeAhead: true,
                    triggerAction: 'all',
                    lazyRender: true,
                    resizable: true,
                    anchor: '100%',
                    description: '<b>[[*tags_cloud]]</br>Облако тегов</b>',
                    fieldLabel: 'Облако тегов',
                    id: 'modx-resource-tags_cloud',
                    maxLength:255,
                    msgTarget: 'under',
                    name:'tags_cloud',
                    hiddenName: 'tags_cloud',
                    xtype: 'superboxselect', // combo, modx-combo - одиночный выбор, а combobox и другие не работают
                    store: new Ext.data.JsonStore({
                        id: 'tags_cloud-store',
                        root: 'results',
                        autoLoad: false,
                        autoSave: false,
                        totalProperty: 'total',
                        //fields: ['value'],
                        fields: $tags_cloud,
                        url: MODx.config.connectorUrl,
                        baseParams: {
                            action: 'mgr/item/getoptions',
                            key: 'tags_cloud'
                        }
                    }),
                    mode: 'remote',
                    displayField: 'value',
                    valueField: 'value',
                    
                    extraItemCls: 'x-tags_cloud',
                    expandBtnCls: 'x-form-trigger',
                    clearBtnCls: 'x-form-trigger',
                    renderTo: Ext.getBody(),

                    editable: true,
                    selectOnFocus: false,
                    preventRender: true,
                    forceSelection: true,
                    enableKeyEvents: true,
                    displayField: ['value'],
                    valueField: ['value'],
                    //value: $tags_cloud,
                    hiddenValue: $tags_cloud,
                    emptyText: 'Выбирете или введите теги',
                    tpl: new Ext.XTemplate('<tpl for=\".\"><div class=\"x-combo-list-item\"><span>{value}</span></div></tpl>',{ compiled: true })
                }

                rightCol.items.splice(3, 0,  tags_cloud); // поле выводится там где сменить Шаблон, Пункт меню
            });
        </script>");
    break;
}
Кровельный
08 июня 2023, 10:16
0
Вот самый простой вариант, но только для админа.
<?php
switch ($modx->event->name) {
    case 'OnDocFormPrerender':
        if ($doc = $modx->getObject('modDocument', $id)) {
            if ($doc->get('richtext') == 1 && $modx->user->id == 1) {
                $script = '';
                $script .= "MODx.ux.Ace.replaceTextAreas(Ext.query('#ta'));";
                $script .= "Ext.select('.x-form-textarea.x-form-field.ace_editor');";
                $modx->controller->addHtml('<script>Ext.onReady(function() {' . $script . '});</script>');
            }
        }
        if (!$modx->controller->resourceArray) {
            return;
        }
        break;
    default:
        return;
}
Кровельный
30 мая 2023, 10:57
0
Работа с ТВ: Заменить значение в ТВ — не работает
Пакет уже обновлён до последней версии: mspre-2.4.5-pl

В функции newValue. Файла core/components/mspre/model/mspre/mspretvfield.class.php:55 — закомментируйте эту строку
<?php
/*if (empty($current)) {
    return false;
}*/
И всё. Заработает!