К содержанию

Как добавить поле в админке только одному ресурсу?

Здравствуйте!

Возможно ли в админке добавить свои поля при редактировании ресурса, но только одному определенному ресурсу? Т.е. чтобы у всех остальных этих полей не было
Lori
Lori
13 апреля 2021, 06:43
modx.pro
1 281
Реклама

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

Наумов Алексей
Наумов Алексей Администратор
13 апреля 2021, 08:41
Сделать этому ресурсу отдельный шаблон и добавить TV-шки.
    Lori
    Lori Старожил
    13 апреля 2021, 08:46
    тут просто TV не подойдет. Просто сама суть задачи: вывести два поля: выпадающий список и просто текстовое поле. В выпадающем списке дочерние ресурсы и при их выборе в текстовом выводится значение одной TV-шки выбранного ресурса. Мне бы просто узнать условие какое писать в плагине? Проверять если id ресурса равно условно 3, то добавить ему кастомное поле, верно?
      Наумов Алексей
      Наумов Алексей Администратор
      13 апреля 2021, 08:50
      вроде все верно звучит, да
    Николай Савин
    Николай Савин Администратор
    13 апреля 2021, 09:22
    Да конечно возможно.
    Если вы добавляете дополнительное текстовое поле в админке — то у вас всегда доступен объект this.record где есть все поля ресурса. Там вы без проблем можете получить доступ и к Id страницы, и к шаблону и родителю и любому другому полю, которое подходит для фильтрации

    switch ($modx->event->name) {    
        case 'OnDocFormPrerender':
            $modx->controller->addHtml("
            <script type='text/javascript'>
    
             Ext.ComponentMgr.onAvailable('modx-panel-resource', function(){
                 //Подключаем по id
                 if(this.record.id !== 1) {return;}
                 //Подключаем по template
                 if(this.record.id !== 4) {return;}
                //Подключаем по parent
                 if(this.record.parent !== 10) {return;}
    
                 const leftCol = this.items[1].items[0].items[0].items[0];
    
                 const en_title = {
                   anchor: '100%',
                   description: '<b>[[*en_pagetitle]]</br>Заголовок на английском</b>',
                   fieldLabel: 'Заголовок на английском',
                   id: 'modx-resource-en-pagetitle',
                   maxLength:255,
                   msgTarget: 'under',
                   name:'en_pagetitle',
                   xtype:'textfield'
                }
                leftCol.items.splice(1, 0,  en_title);
    
            });
        </script>");
            break;
    }
      Lori
      Lori Старожил
      13 апреля 2021, 09:30
      круто, получилось! а не подскажете, можно ли в этом поле выводить значение tv дочернего ресурса, чтобы я мог его тут редактировать? такое возможно?
        Николай Савин
        Николай Савин Администратор
        13 апреля 2021, 09:52
        можно ли в этом поле выводить значение tv дочернего ресурса
        По умолчанию нельзя конечно. У нас доступны только поля текущего ресурса.
        Навскидку вижу два пути решения вопроса.
        1. Сделать небольшую инъекцию в процессор get — где просто добавить нужное поле
        2. В JS скрипте при его загрузке делать ajax или fetch запрос за нужными данными и уже там подмешивать куда нужно значение поля
        Lori
        Lori Старожил
        13 апреля 2021, 09:41
        а, нет пардон, не получилось.
        код плагина:
        <?php
        
        if($modx->event->name != 'OnDocFormRender') return '';
        
        $modx->controller->addLastJavascript('/assets/components/mynamespace/js/tab.js');
        Код tab.js:
        Ext.override(MODx.panel.Resource, {
           getParentFields: MODx.panel.Resource.prototype.getFields,
            
           getFields: function(config){
               
               var parentFields = this.getParentFields.call(this, config);
               
               for(var i in parentFields) {
                   var item = parentFields[i];
                   
                   if(item.id == 'modx-resource-tabs') {
                       item.items.push({
                            id: 'my-custom-tab'
                            ,autoHeight: true
                            ,title: 'Редактирование новостей'
                            ,layout: 'form'
                            ,anchor: '100%'
                            ,items: [{
                                html: '<p>Тут можно привязать товары к новостям</p>'
                                ,bodyCssClass: 'panel-desc'
                                ,border: false
                            },{
                                layout: 'column',
                                width: '100%',
                                anchor: '100%',
                                cls: 'main-wrapper',
                                items: [{
                                    columnWidth: .5,
                                    items: [{
                                        xtype: 'numberfield',
                                        fieldLabel: '<span>Выберите новость</span>',
                                        width: '100%',
                                    }]
                                }, {
                                    columnWidth: .5,
                                    items: [{
                                        xtype: 'textfield',
                                        fieldLabel: '<span>Введите ID товаров через запятую</span>',
                                        width: '100%',
                                    }]
                                }]
                            }]
                       });
                   }
               }
               
               return parentFields;
           } 
        });
        где мне в tab.js проверить id ресурса?
          Николай Савин
          Николай Савин Администратор
          13 апреля 2021, 09:47
          где мне в tab.js проверить id ресурса?
          Ну правильнее всего в начале скрипта первой строкой
            Lori
            Lori Старожил
            13 апреля 2021, 09:51
            правильно ли я сделал:
            Ext.ComponentMgr.onAvailable('modx-panel-resource', function(){
            //Подключаем по id
            if(this.record.id == 452) {
            тут остальной код tab.js
            }
            });
              Николай Савин
              Николай Савин Администратор
              13 апреля 2021, 09:53
              В целом да, но сравните с моим примером. Там читаемость получше будет. Меньше вложенности.
                Lori
                Lori Старожил
                13 апреля 2021, 09:54
                не работает к сожалению ваш пример. теперь вкладка нигде не выводится в принципе
                  Николай Савин
                  Николай Савин Администратор
                  13 апреля 2021, 09:56
                  Все там работает — я же не из головы взял код, а прямо из действующего проекта пример привел.
                    Lori
                    Lori Старожил
                    13 апреля 2021, 10:05
                    возможно дело в том, что плагин работает при событии OnDocFormRender, а в вашем примере OnDocFormPrerender. Сейчас проверю
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        13