DynamicDropdownTV - ошибка в dynamicdropdown_multiple

Здравствуйте, установил DynamicDropdownTV
Понял что он до 2.3 версии revo
у меня стоит 2.5, там есть множественный выбор(dynamicdropdown_multiple)
Он вообще не работал, я почти его сделал
Осталось вывести выбранные значения в select
вот



Вот код селекта dynamicdropdown_multiple.tpl
который я изменил

{$tv->get('value')}
<input type="hidden" id="original{$ddId}" name="original{$tv->id}" value="{$tv->get('value')}" />

<div id="div_{$ddId}"  value="{$tv->get('value')}" >
 <a name="cut"></a> 
</div>


<script>
// <![CDATA[
{literal}
MODx.combo.{/literal}{$ddId}{literal} = function(config) {
        config = config || {};
        Ext.applyIf(config,{{/literal}
        name: '{$ddId}'
        ,id: 'select_{$ddId}'
        ,extraItemCls: 'x-tag'
        ,expandBtnCls: 'x-form-trigger'
        ,clearBtnCls: 'x-form-trigger'
        ,width: 400
        ,hiddenName: 'tv{$tv->id}[]'
        ,renderTo: 'div_{$ddId}'
        ,triggerAction: 'all'
        ,mode: 'remote'
        ,children: Ext.util.JSON.decode('{$children}')
        ,parents: Ext.util.JSON.decode('{$parents}') 
        {if $params.title},title: '{$params.title}'{/if}
                {if $params.listWidth},listWidth: {$params.listWidth}{/if}
                        ,maxHeight: {if $params.maxHeight}{$params.maxHeight}{else}300{/if}
                {if $params.typeAhead}
                        ,editable: true
                        ,typeAhead: true
                        ,typeAheadDelay: {if $params.typeAheadDelay && $params.typeAheadDelay != ''}{$params.typeAheadDelay}{else}250{/if}
                {else}
                        ,editable: false
                        ,typeAhead: true
                        ,searchible: true
                {/if}
                {if $params.listEmptyText}
                        ,listEmptyText: '{$params.listEmptyText}'
                {/if}
                ,forceSelection: {if $params.forceSelection && $params.forceSelection != 'false'}true{else}false{/if}
                ,initiated: true
                ,allowBlank: {if $params.allowBlank == 1 || $params.allowBlank == 'true'}true{else}false{/if}
                        ,resizable: false
                        ,pageSize: 0    
                        ,url: {$connector_path}
                        ,fields: ['id','name']
                        ,displayField: 'name'
                        ,valueField: 'id'
                        {if $params.valueDelimiter}
                        ,valueDelimiter: '{$params.valueDelimiter}'
                        {/if} 

                        {literal}
                        ,baseParams: {
                                action: '{/literal}{$action}{literal}'
                                ,resource_id: '{/literal}{$resource.id}{literal}' 
                                ,object_id: '{/literal}{$object_id}{literal}'
                                ,tvname: '{/literal}{{$tv->name}}{literal}' 
                        }
                        ,store: new Ext.data.JsonStore({
                                id:'id',
                                autoLoad: true,
                                root:'results',
                                fields: ['name', 'id'],
                                remoteSort: true,
                                url: {/literal}{$connector_path}{literal},
                                baseParams:{
                                action: '{/literal}{$action}{literal}'
                                ,resource_id: '{/literal}{$resource.id}{literal}' 
                                ,object_id : '{/literal}{$object_id}{literal}'
                                ,tvname : '{/literal}{{$tv->name}}{literal}' 
                        },
                        listeners: {
                                'load': {fn:function(store, records, options ) {
                                        //this.hiddenName = config.paramHiddenName;
                                        //this.setWidth('350');
                                }
                                },scope : this 
                                } 
                        }) 

                        ,listeners: { 
                                'select': {fn:this.selectOption,scope:this}
                                ,'render': {fn:this.initSelect,scope:this}
                        }
                        });
                        MODx.combo.{/literal}{$ddId}{literal}.superclass.constructor.call(this,config);
                        };
                        Ext.extend(MODx.combo.{/literal}{$ddId}{literal},Ext.ux.form.SuperBoxSelect,{
                        selectOption: function() {
                                this.refreshChildren(true);
                                MODx.fireResourceFormChange();  

                        }


    ,initSelect: function() {

        var parent_field = null;

        for(i = 0; i <  this.parents.length; i++) {

                    parent = this.parents[i];

            parent_field = Ext.get('original'+parent);

            if (parent_field){

                this.baseParams[parent] = parent_field.dom.value;

            }

        }

        this.store.load({

            callback: function() {

                this.setValue(Ext.get('{/literal}original{$ddId}{literal}').dom.value);

            },scope:this

       });

        }



});


Ext.reg('modx-combo-{/literal}{$ddId}{literal}',MODx.combo.{/literal}{$ddId}{literal});
Ext.onReady(function() {
var fld{/literal}{$tv->id}{literal} = MODx.load({
xtype: 'modx-combo-{/literal}{$ddId}{literal}'
});
 console.log(fld{/literal}{$tv->id}{literal});
//console.log(fld);
//alert('222');

Ext.getCmp('modx-panel-resource').getForm().add(fld{/literal}{$tv->id}{literal});
{/literal}
});

// ]]>
</script>
Александр Иванов
04 июня 2018, 07:12
modx.pro
3 097
0

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

Александр Иванов
04 июня 2018, 21:18
0
Никто не знает?
    Василий Stepanov
    27 апреля 2019, 00:24
    0
    Не уверен, что данный вопрос для вас еще актуален, но я столкнулся с такой же проблемой и нашел решение.

    1. В файле /core/components/dynamicdropdowntv/processors/mgr/default/getoptions.default.php нужно заменить
    if (!empty($query)) {
    	$c->where(array($namefield . ':LIKE' => $query . '%'));
    } else {
    	$options[] = array('id' => '', 'name' => $firstText);
    }
    на
    if (!empty($query)) {
        $tmp = explode('|', $query);
        $num = true;
        foreach($tmp as $t) {
            $num = ($num && is_numeric($t));
        }
    
        if($num) {
            $c->where(array($idfield . ':IN' => $tmp) );
        } else {
            $c->where(array($namefield . ':LIKE' => $query . '%'));
        }    
    } else {
    	$options[] = array('id' => '', 'name' => $firstText);
    }

    2. Создаем файлы в нужных директориях:
    core/components/dynamicdropdowntv/tv/input/dynamicdropdown_mlti.class.php
    <?php
    /**
     * DynamicDropdownTV
     *
     * Copyright 2012-2013 by Bruno Perner <b.perner@gmx.de>
     *
     * DynamicDropdownTV is free software; you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by the Free
     * Software Foundation; either version 2 of the License, or (at your option) any
     * later version.
     *
     * DynamicDropdownTV is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
     * details.
     *
     * You should have received a copy of the GNU General Public License along with
     * DynamicDropdownTV; if not, write to the Free Software Foundation, Inc., 59
     * Temple Place, Suite 330, Boston, MA 02111-1307 USA
     *
     * @package dynamicdropdowntv
     * @subpackage input render
     *
     * Input Render for DynamicDropdownTV Multiple
     */
    if (!class_exists('DynamicDropdownMultipleInputRender')) {
    	class DynamicDropdownMultipleInputRender extends modTemplateVarInputRender {
    		public function getTemplate() {
    			$corePath = $this->modx->getOption('dynamicdropdowntv.core_path', null, $this->modx->getOption('core_path') . 'components/dynamicdropdowntv/');
    			return $corePath . 'tv/input/tpl/dynamicdropdown_mlti.tpl';
    		}
    		public function process($value, array $params = array()) {
    			$corePath = $this->modx->getOption('dynamicdropdowntv.core_path', null, $this->modx->getOption('core_path') . 'components/dynamicdropdowntv/');
    			// fetch only the tv lexicon
    			$this->modx->lexicon->load('tv_widget');
    			$this->modx->lexicon->load('dynamicdropdowntv:inputoptions');
    			$lang = $this->modx->lexicon->fetch();
    			foreach ($lang as $k => $v) {
    				if (strpos($k, 'dynamicdropdowntv.') !== false) {
    					$k = str_replace('dynamicdropdowntv.', '', $k);
    					$k = str_replace('.', '_', $k);
    				}
    				$this->setPlaceholder('lang_' . $k, $v);
    			}
    			$this->setPlaceholder('params', $params);
    			$resource = is_object($this->modx->resource) ? $this->modx->resource->toArray() : array();
    			$ddId = $this->tv->get('name');
    			$groupPath = 'mgr/' . $params['group'];
    			$defaultPath = 'mgr/default';
    			$actionPath = file_exists($corePath . 'processors/' . $groupPath) ? $groupPath . '/' : $defaultPath . '/';
    			if ($this->tv->get('elements') == '') {
    				$default_processor = 'getoptions.default';
    				$ddProcessor = 'getoptions.' . $ddId;
    			} else {
    				$default_processor = 'getelements.default';
    				$ddProcessor = 'getelements.' . $ddId;
    			}
    			$action = file_exists($corePath . 'processors/' . $actionPath . $ddProcessor . '.php') ? $actionPath . $ddProcessor : $actionPath . $default_processor;
    			$this->setPlaceholder('connector_path', "'" . $this->modx->getOption('dynamicdropdowntv.assets_path', NULL, "' + MODx.config.assets_url + 'components/dynamicdropdowntv/") . "connector.php'");
    			$this->setPlaceholder('resource', $resource);
    			$this->setPlaceholder('object_id', $this->modx->getOption('object_id', $_REQUEST, ''));
    			$this->setPlaceholder('params', $params);
    			$this->setPlaceholder('action', $action);
    			$this->setPlaceholder('children', $this->modx->toJson(explode(',', $params['childs'])));
    			$this->setPlaceholder('parents', $this->modx->toJson(explode(',', $params['parents'])));
    			$this->setPlaceholder('ddId', $ddId);
    		}
    	}
    }
    return 'DynamicDropdownMultipleInputRender';

    core/components/dynamicdropdowntv/tv/input/tpl/dynamicdropdown_mlti.tpl
    <input type="hidden" id="original{$ddId}" name="original{$tv->id}" value="{$tv->get('value')|escape}" />
    
    <div id="div_{$ddId}">
    
    </div>
    
    
    <script type="text/javascript">
    // <![CDATA[
    {literal}
    MODx.combo.{/literal}{$ddId}{literal} = function(config) {
        config = config || {};
        Ext.applyIf(config,{{/literal}
            name: '{$ddId}'
            ,id: 'select_{$ddId}'
            ,width: 400
            ,hiddenName: 'tv{$tv->id}[]'
            ,renderTo: 'div_{$ddId}'
            ,triggerAction: 'all'
            ,mode: 'remote'
            ,children: Ext.util.JSON.decode('{$children}')
            ,parents: Ext.util.JSON.decode('{$parents}')
            ,clearBtnCls: 'x-form-trigger'
            ,expandBtnCls: 'x-form-trigger'    
            {if $params.title},title: '{$params.title}'{/if}
            {if $params.listWidth},listWidth: {$params.listWidth}{/if}
            ,maxHeight: {if $params.maxHeight}{$params.maxHeight}{else}300{/if}
            {if $params.typeAhead}
                ,editable: true
                ,typeAhead: true
                ,typeAheadDelay: {if $params.typeAheadDelay && $params.typeAheadDelay != ''}{$params.typeAheadDelay}{else}250{/if}
            {else}
                ,editable: false
                ,typeAhead: false
            {/if}
            {if $params.listEmptyText}
                ,listEmptyText: '{$params.listEmptyText}'
            {/if}
            ,forceSelection: {if $params.forceSelection && $params.forceSelection != 'false'}true{else}false{/if}
            ,initiated: false
            ,allowBlank: {if $params.allowBlank == 1 || $params.allowBlank == 'true'}true{else}false{/if}
    		,resizable: false
            ,pageSize: 0		
            ,url: {$connector_path}
            ,fields: ['id','name']
            ,displayField: 'name'
            ,valueField: 'id'
            {if $params.valueDelimiter}
                ,valueDelimiter: '{$params.valueDelimiter}'
            {/if}        
            ,clearOnRefresh: {if $params.clearOnRefresh == 1 || $params.clearOnRefresh == 'true'}true{else}false{/if} 
            {literal}
            ,baseParams: {
                {/literal}
    		    action: '{$action}'
                ,resource_id: '{$resource.id}' 
                ,object_id: '{$object_id}'
                ,tvname: '{{$tv->name}}'
                {literal}
            }
            ,store: new Ext.data.JsonStore({
                            id:'id',
                            autoLoad: true,
                            root:'results',
                            fields: ['name', 'id'],
                            remoteSort: true,
                            url: {/literal}{$connector_path}{literal},
                            baseParams:{
                                action: '{/literal}{$action}{literal}'
                                ,resource_id: '{/literal}{$resource.id}{literal}' 
                                ,object_id : '{/literal}{$object_id}{literal}'
                                ,tvname : '{/literal}{{$tv->name}}{literal}' 	                            
                            }
                        }) 
            
            ,listeners: { 
    		    'select': {fn:this.selectOption,scope:this}
                ,'additem': {fn:this.selectOption,scope:this}
                ,'removeitem': {fn:this.selectOption,scope:this}
                ,'render': {fn:this.initSelect,scope:this}
    		}
        });
        MODx.combo.{/literal}{$ddId}{literal}.superclass.constructor.call(this,config);
    };
    Ext.extend(MODx.combo.{/literal}{$ddId}{literal},Ext.ux.form.SuperBoxSelect,{
    	selectOption: function() {
            if(this.children.length >= 1 && typeof(Ext.getCmp('select_'+this.children[0])) != "undefined") {
                this.refreshChildren(true);
            } 
            MODx.fireResourceFormChange();	         
    	}
        ,reload: function() {
            this.store.load({
                callback: function() {
                    if (this.clearOnRefresh){
                        this.setValue('');
                    }
                    this.refreshChildren(true);
                },scope:this
           });
    	}
        ,refreshChildren: function(reload) {
            var ddSelect = null;
            for(i = 0; i <  this.children.length; i++) {
     		    child = this.children[i];
                ddSelect = Ext.getCmp('select_'+child);
                if(typeof(ddSelect) != "undefined"){
                    ddSelect.baseParams.{/literal}{$ddId}{literal} = this.getValue();
                    if (reload){
                        ddSelect.reload();
                    }
                }
            }
    	}    
        ,initSelect: function() {
            var parent_field = null;
            for(i = 0; i <  this.parents.length; i++) {
     		    parent = this.parents[i];
                parent_field = Ext.get('original'+parent);
                if (parent_field){
                    this.store.baseParams[parent] = parent_field.dom.value;
                }
            }
            var original_values = Ext.get('{/literal}original{$ddId}{literal}').dom.value;
            this.setValue(original_values);
            
            // Separate store .. won't fire ever
            this.store.load({
                callback: function() {
                    this.setValue(Ext.get('{/literal}original{$ddId}{literal}').dom.value);
                },scope:this
           });
    	}
    });
    Ext.reg('modx-combo-{/literal}{$ddId}{literal}',MODx.combo.{/literal}{$ddId}{literal});
    Ext.onReady(function() {
        var fld = MODx.load({
            xtype: 'modx-combo-{/literal}{$ddId}{literal}'
        });
        
        Ext.getCmp('modx-panel-resource').getForm().add(fld);
        {/literal}
    });
    // ]]>
    </script>

    core/components/dynamicdropdowntv/tv/inputoptions/dynamicdropdown_mlti.php
    <?php
    /**
     * DynamicDropdownTV
     *
     * Copyright 2012-2013 by Bruno Perner <b.perner@gmx.de>
     *
     * DynamicDropdownTV is free software; you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by the Free
     * Software Foundation; either version 2 of the License, or (at your option) any
     * later version.
     *
     * DynamicDropdownTV is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
     * details.
     *
     * You should have received a copy of the GNU General Public License along with
     * DynamicDropdownTV; if not, write to the Free Software Foundation, Inc., 59
     * Temple Place, Suite 330, Boston, MA 02111-1307 USA
     *
     * @package dynamicdropdowntv
     * @subpackage input render properties
     *
     * Input Render for DynamicDropdownTV Properties Multiple
     */
    $modx->lexicon->load('tv_widget', 'dynamicdropdowntv:inputoptions');
    $lang = $modx->lexicon->fetch('dynamicdropdowntv.', true);
    // get list of dynamic dropdown template variables to select parent dropdown
    $c = $modx->newQuery('modTemplateVar');
    $c->where(array('type:LIKE' => 'dynamicdropdown%'));
    $list[] = array('', $lang['noParent']);
    if ($collection = $modx->getCollection('modTemplateVar', $c)) {
    	foreach ($collection as $object) {
    		if ($_REQUEST['tv'] != $object->get('id')) {
    			$list[] = array($object->get('name'), $object->get('name'));
    		}
    	}
    }
    $list = json_encode($list);
    $modx->smarty->assign('tvlist', $list);
    $modx->smarty->assign('dynamicdropdowntv', $lang);
    $corePath = $modx->getOption('dynamicdropdowntv.core_path', null, $modx->getOption('core_path') . 'components/dynamicdropdowntv/');
    return $modx->smarty->fetch($corePath . 'tv/inputoptions/tpl/dynamicdropdown_multiple.tpl');

    core/components/dynamicdropdowntv/tv/inputoptions/tpl/dynamicdropdown_mlti.tpl
    <div id="tv-input-properties-form{$tv}"></div>
    {literal}
    
    <script type="text/javascript">
    // <![CDATA[
    var params = {
    {/literal}{foreach from=$params key=k item=v name='p'}
     '{$k}': '{$v|escape:"javascript"}'{if NOT $smarty.foreach.p.last},{/if}
    {/foreach}{literal}
    };
    var oc = {'change':{fn:function(){Ext.getCmp('modx-panel-tv').markDirty();},scope:this}};
    
    MODx.load({
        xtype: 'panel'
        ,layout: 'form'
        ,cls: 'form-with-labels'
        ,autoHeight: true
        ,border: false
        ,labelAlign: 'top'
        ,labelSeparator: ''
        ,items: [{
            xtype: 'combo'
            ,store : {/literal}{$tvlist}{literal}
            ,fieldLabel: '{/literal}{$dynamicdropdowntv.parent}{literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.parent_desc}{literal}'
            ,name: 'inopt_parent'
            ,hiddenName: 'inopt_parent'
            ,forceSelection: true
            ,typeAhead: false
            ,editable: false
            ,triggerAction: 'all'
            ,id: 'inopt_parent{/literal}{$tv}{literal}'
            ,value: params['parent'] || ''
            ,width: 600
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_parent{/literal}{$tv}{literal}'
            ,html: '{/literal}{$dynamicdropdowntv.parent_desc}{literal}'
            ,cls: 'desc-under'
        },{
            xtype: 'textfield'
            ,fieldLabel: '{/literal}{$dynamicdropdowntv.group}{literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.group_desc}{literal}'
            ,name: 'inopt_group'
            ,hiddenName: 'inopt_group'
            ,id: 'inopt_group{/literal}{$tv}{literal}'
            ,value: params['group']
            ,width: 600
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_group{/literal}{$tv}{literal}'
            ,html: '{/literal}{$dynamicdropdowntv.group_desc}{literal}'
            ,cls: 'desc-under'
        },{
            xtype: 'combo-boolean'
            ,fieldLabel: _('required')
            ,description: MODx.expandHelp ? '' : _('required_desc')
            ,name: 'inopt_allowBlank'
            ,hiddenName: 'inopt_allowBlank'
            ,id: 'inopt_allowBlank{/literal}{$tv}{literal}'
            ,value: params['allowBlank'] == 0 || params['allowBlank'] == 'false' ? false : true
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_allowBlank{/literal}{$tv}{literal}'
            ,html: _('required_desc')
            ,cls: 'desc-under'
        },{
            xtype: 'textfield'
            ,fieldLabel: _('combo_listwidth')
            ,description: MODx.expandHelp ? '' : _('combo_listwidth_desc')
            ,name: 'inopt_listWidth'
            ,id: 'inopt_listWidth{/literal}{$tv}{literal}'
            ,value: params['listWidth'] || ''
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_listWidth{/literal}{$tv}{literal}'
            ,html: _('combo_listwidth_desc')
            ,cls: 'desc-under'
        },{
            xtype: 'combo-boolean'
            ,fieldLabel: _('combo_typeahead')
            ,description: MODx.expandHelp ? '' : _('combo_typeahead_desc')
            ,name: 'inopt_typeAhead'
            ,hiddenName: 'inopt_typeAhead'
            ,id: 'inopt_typeAhead{/literal}{$tv}{literal}'
            ,value: params['typeAhead'] == 1 || params['typeAhead'] == 'true' ? true : false
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_typeAhead{/literal}{$tv}{literal}'
            ,html: _('combo_typeahead_desc')
            ,cls: 'desc-under'
        },{
            xtype: 'textfield'
            ,fieldLabel: _('combo_typeahead_delay')
            ,description: MODx.expandHelp ? '' : _('combo_typeahead_delay_desc')
            ,name: 'inopt_typeAheadDelay'
            ,id: 'inopt_typeAheadDelay{/literal}{$tv}{literal}'
            ,value: params['typeAheadDelay'] || 250
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_typeAheadDelay{/literal}{$tv}{literal}'
            ,html: _('combo_typeahead_delay_desc')
            ,cls: 'desc-under'
    
        },{
            xtype: 'combo-boolean'
            ,fieldLabel: _('combo_forceselection')
            ,description: MODx.expandHelp ? '' : _('combo_forceselection_desc')
            ,name: 'inopt_forceSelection'
            ,hiddenName: 'inopt_forceSelection'
            ,id: 'inopt_forceSelection{/literal}{$tv}{literal}'
            ,value: params['forceSelection'] == 1 || params['forceSelection'] == 'true' ? true : false
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_forceSelection{/literal}{$tv}{literal}'
            ,html: _('combo_forceselection_desc')
            ,cls: 'desc-under'
    
        },{
            xtype: 'textfield'
            ,fieldLabel: '{/literal}{$dynamicdropdowntv.firstText}{literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.firstText_desc}{literal}'
            ,name: 'inopt_firstText'
            ,id: 'inopt_firstText{/literal}{$tv}{literal}'
            ,value: params['firstText'] || ''
            ,anchor: '100%'
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_firstText{/literal}{$tv}{literal}'
            ,html: '{/literal}{$dynamicdropdowntv.firstText_desc}{literal}'
            ,cls: 'desc-under'
        },{
            xtype: 'combo-boolean'
            ,fieldLabel:'{/literal}{$dynamicdropdowntv.clearOnRefresh}{literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.clearOnRefresh_desc}{literal}'
            ,name: 'inopt_clearOnRefresh'
            ,hiddenName: 'inopt_clearOnRefresh'
            ,id: 'inopt_clearOnRefresh{/literal}{$tv}{literal}'
            ,value: params['clearOnRefresh'] || true
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_clearOnRefresh{/literal}{$tv}{literal}'
            ,html: '{/literal}{$dynamicdropdowntv.clearOnRefresh_desc}{literal}'
            ,cls: 'desc-under'
        },{
            xtype: 'textfield'
            ,fieldLabel:'{/literal}{$dynamicdropdowntv.valueDelimiter}{literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.valueDelimiter_desc}{literal}'
            ,name: 'inopt_valueDelimiter'
            ,id: 'inopt_valueDelimiter{/literal}{$tv}{literal}'
            ,value: params['valueDelimiter'] || '||'
            ,width: 200
            ,listeners: oc
        },{
            xtype: MODx.expandHelp ? 'label' : 'hidden'
            ,forId: 'inopt_valueDelimiter{/literal}{$tv}{literal}'
            ,html:'{/literal}{$dynamicdropdowntv.valueDelimiter_desc}{literal}'
            ,cls: 'desc-under'
        },{
            xtype: 'fieldset'
            ,fieldLabel: '{/literal}{$dynamicdropdowntv.package}{literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.package_desc}{literal}'
            ,labelAlign: 'top'
    		,items: [{
    			xtype: 'textarea'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.where}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.where_desc}{literal}'
    			,name: 'inopt_where'
    			,hiddenName: 'inopt_where'
    			,id: 'inopt_where{/literal}{$tv}{literal}'
    			,value: params['where']
    			,width: 600
    			,height: 150
    			,listeners: oc
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_where{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.where_desc}{literal}'
    			,cls: 'desc-under'
    		},{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.packagename}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.packagename_desc}{literal}'
    			,name: 'inopt_packagename'
    			,id: 'inopt_packagename{/literal}{$tv}{literal}'
    			,value: params['packagename']
    			,anchor: '100%'
    			,listeners: oc
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_packagename{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.packagename_desc}{literal}'
    			,cls: 'desc-under'
    		},{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.prefix}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.prefix_desc}{literal}'
    			,name: 'inopt_prefix'
    			,id: 'inopt_prefix{/literal}{$tv}{literal}'
    			,value: params['prefix']
    			,anchor: '100%'
    			,listeners: oc
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_prefix{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.prefix_desc}{literal}'
    			,cls: 'desc-under'
    		},{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.classname}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.classname_desc}{literal}'
    			,name: 'inopt_classname'
    			,id: 'inopt_classname{/literal}{$tv}{literal}'
    			,value: params['classname']
    			,anchor: '100%'
    			,listeners: oc
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_classname{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.classname_desc}{literal}'
    			,cls: 'desc-under'
    		},{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.idfield}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.idfield_desc}{literal}'
    			,name: 'inopt_idfield'
    			,id: 'inopt_idfield{/literal}{$tv}{literal}'
    			,value: params['idfield']
    			,anchor: '100%'
    			,listeners: oc
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_idfield{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.idfield_desc}{literal}'
    			,cls: 'desc-under'
    		},{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.namefield}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.namefield_desc}{literal}'
    			,name: 'inopt_namefield'
    			,id: 'inopt_namefield{/literal}{$tv}{literal}'
    			,value: params['namefield']
    			,anchor: '100%'
    			,listeners: oc
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_namefield{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.namefield_desc}{literal}'
    			,cls: 'desc-under'
    		}]
        },{
            xtype: 'fieldset'
            ,fieldLabel: '{/literal}{$dynamicdropdowntv.debugfields} ({$dynamicdropdowntv.readonly}){literal}'
            ,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.debugfields_desc}{literal}'
            ,labelAlign: 'top'
    		,items: [{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.childs}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.childs_desc}{literal}'
    			,name: 'inopt_childs'
    			,hiddenName: 'inopt_childs'
    			,id: 'inopt_childs{/literal}{$tv}{literal}'
    			,value: params['childs']
    			,width: 600
    			,listeners: oc
    			,readOnly: true
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_childs{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.childs_desc}{literal}'
    			,cls: 'desc-under'
    		},{
    			xtype: 'textfield'
    			,fieldLabel: '{/literal}{$dynamicdropdowntv.parents}{literal}'
    			,description: MODx.expandHelp ? '' : '{/literal}{$dynamicdropdowntv.parents_desc}{literal}'
    			,name: 'inopt_parents'
    			,hiddenName: 'inopt_parents'
    			,id: 'inopt_parents{/literal}{$tv}{literal}'
    			,value: params['parents']
    			,width: 600
    			,listeners: oc
    			,readOnly: true
    		},{
    			xtype: MODx.expandHelp ? 'label' : 'hidden'
    			,forId: 'inopt_parents{/literal}{$tv}{literal}'
    			,html: '{/literal}{$dynamicdropdowntv.parents_desc}{literal}'
    			,cls: 'desc-under'
    		}]
    	}]
        ,renderTo: 'tv-input-properties-form{/literal}{$tv}{literal}'
    });
    // ]]>
    </script>
    {/literal}

    3. Чистим папку cache.
    4. Используем TV-поле dynamicdropdown_mlti.
    ВНИМАНИЕ: при обновлении компонента изменения удалятся.

    Источники:
    1. https://github.com/Bruno17/DynamicDropdownTV/issues/9
    2. https://github.com/nicar/DynamicDropdownTV/commit/62caff3c3f842efc4f21b123195238a411783207#diff-c621b98b2d9f7f81dbd76642657e04ac
      Владимир
      04 июля 2019, 15:45
      0
      Добрый день! Сделал всё по инструкции, столкнулся с проблемой: в выпадающем списке второго уровня выводятся подразделы всех пунктов списка первого уровня независимо от выбора, при этом в список третьего уровня не выводится уже ничего. Так не должно быть, верно? Или есть нюансы при использовании списков множественного уровня?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3