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

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

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

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

Наумов Алексей
13 апреля 2021, 08:41
+1
Сделать этому ресурсу отдельный шаблон и добавить TV-шки.
    Lori
    13 апреля 2021, 08:46
    0
    тут просто TV не подойдет. Просто сама суть задачи: вывести два поля: выпадающий список и просто текстовое поле. В выпадающем списке дочерние ресурсы и при их выборе в текстовом выводится значение одной TV-шки выбранного ресурса. Мне бы просто узнать условие какое писать в плагине? Проверять если id ресурса равно условно 3, то добавить ему кастомное поле, верно?
Николай Савин
13 апреля 2021, 09:22
+2
Да конечно возможно.
Если вы добавляете дополнительное текстовое поле в админке — то у вас всегда доступен объект 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
    13 апреля 2021, 09:30
    0
    круто, получилось! а не подскажете, можно ли в этом поле выводить значение tv дочернего ресурса, чтобы я мог его тут редактировать? такое возможно?
      Николай Савин
      13 апреля 2021, 09:52
      0
      можно ли в этом поле выводить значение tv дочернего ресурса
      По умолчанию нельзя конечно. У нас доступны только поля текущего ресурса.
      Навскидку вижу два пути решения вопроса.
      1. Сделать небольшую инъекцию в процессор get — где просто добавить нужное поле
      2. В JS скрипте при его загрузке делать ajax или fetch запрос за нужными данными и уже там подмешивать куда нужно значение поля
      Lori
      13 апреля 2021, 09:41
      0
      а, нет пардон, не получилось.
      код плагина:
      <?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
        0
        где мне в tab.js проверить id ресурса?
        Ну правильнее всего в начале скрипта первой строкой
          Lori
          13 апреля 2021, 09:51
          0
          правильно ли я сделал:
          Ext.ComponentMgr.onAvailable('modx-panel-resource', function(){
          //Подключаем по id
          if(this.record.id == 452) {
          тут остальной код tab.js
          }
          });
            Николай Савин
            13 апреля 2021, 09:53
            0
            В целом да, но сравните с моим примером. Там читаемость получше будет. Меньше вложенности.
              Lori
              13 апреля 2021, 09:54
              0
              не работает к сожалению ваш пример. теперь вкладка нигде не выводится в принципе
                Николай Савин
                13 апреля 2021, 09:56
                0
                Все там работает — я же не из головы взял код, а прямо из действующего проекта пример привел.
                  Lori
                  13 апреля 2021, 10:05
                  0
                  возможно дело в том, что плагин работает при событии OnDocFormRender, а в вашем примере OnDocFormPrerender. Сейчас проверю
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      13