Генерация URI с помощью плагина

Всем доброго времени суток!

Написал простой плагин для генерации URI и повесил его на события OnDocFormSave и OnDocFormPrerender, но при сохранении ресурса сгенерированный URI обновляется только после обновления страницы с редактируемым ресурсом. Как это исправить?
Никита Боднар
15 декабря 2020, 14:04
modx.pro
684
0

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

Alexey
15 декабря 2020, 15:15
0
Привет! Повесь плагин на OnBeforeDocFormSave вместо OnDocFormSave
    Никита Боднар
    15 декабря 2020, 15:19
    0
    Безрезультатно.
      Alexey
      15 декабря 2020, 15:26
      0
      Код плагина в студию
        Никита Боднар
        15 декабря 2020, 19:11
        0
        <?php
        $resource = $modx->getObject('modResource', $id);
        $resourceAlias = $resource->get('alias');
        
        $resourceParent = $modx->getObject('modResource', $resource->get('parent'));
        
        if ($resourceParent) {
            $resourceParentAlias = $resourceParent->get('alias');
            
            $resourceParentIsTabsContainer = $resourceParent->getTVValue('resourceTabsContainer');
            
            if ($resourceParentIsTabsContainer) {
                $resource->set('uri_override', true);
                $resource->set('uri', $resourceParentAlias.'#'.$resourceAlias);
                
                $resource->save();
            }
        }
          Alexey
          16 декабря 2020, 09:33
          0
          А для чего повешено на событие OnDocFormPrerender?
            Никита Боднар
            16 декабря 2020, 10:07
            0
            Уже убрал это событие. Думал, что поможет в решении проблемы.
              Alexey
              16 декабря 2020, 13:06
              0
              <?php
              $eventName = $modx->event->name;
              switch($eventName) {
                  case 'OnBeforeDocFormSave':
                      //$resource = $modx->getObject('modResource', $id);
                      $resourceAlias = $resource->get('alias');
                      $resourceParent = $modx->getObject('modResource', $resource->get('parent'));
                      if ($resourceParent) {
                          $resourceParentAlias = $resourceParent->get('alias');
                          
                          $resourceParentIsTabsContainer = $resourceParent->getTVValue('resourceTabsContainer');
                          
                          if ($resourceParentIsTabsContainer) {
                              $resource->set('uri_override', true);
                              $resource->set('uri', $resourceParentAlias.'#'.$resourceAlias);
                              
                              //$resource->save();
                          }
                      }
                      break;
              }

              Плагин меняет URI, делает его замороженным, если tv-поле родителя ресурса равно true.

              Едиственный момент: в этом плагине я закомментил первую и последнюю сроки — они по факту не нужны

              Вот такой код корректно всё отрабатывает: URI меняет сразу. У тебя не так? Где не так? На фронте или в админке? Прошу конкретики
                Никита Боднар
                16 декабря 2020, 13:39
                0
                Ничего не изменилось. В админке. Содержимое поля меняется фактически, но новое значение отображается только после обновления страницы.
                  Alexey
                  16 декабря 2020, 13:53
                  0
                  Спецом открывал вкладку «настройки» ресурса, все на лету меняется при сохранении. MODX 2.8.1
                    Никита Боднар
                    16 декабря 2020, 14:06
                    0
                    А на каких событиях плагин висит?
                      Alexey
                      16 декабря 2020, 14:27
                      0
                      OnBeforeDocFormSave
                      Никита Боднар
                      16 декабря 2020, 14:31
                      0
                      В коде это событие я вижу, галочка на вкладке «Системные события» тоже стоит?
                      Alexey
                      16 декабря 2020, 14:32
                      0
                      Никита Боднар
                      16 декабря 2020, 14:40
                      0
                      Всё заработало внезапно! Спасибо большое)
                      Никита Боднар
                      16 декабря 2020, 14:41
                      0
                      Немного оффтоп-вопрос — есть ли способ внутри сниппета узнать, есть ли у ресурса TV-поле?
                      Alexey
                      16 декабря 2020, 14:55
                      0
                      То есть, нужна проверка, прикреплено ли в принципе tv к этому ресурсу? Не важно, пустая она или нет?
                      Никита Боднар
                      16 декабря 2020, 15:03
                      0
                      Именно!
                      Alexey
                      17 декабря 2020, 15:13
                      0
                      $template_id = 2; //id шаблона ресурса
                      $tv_id = 5; //id tv-поля
                      
                      $q = $modx->newQuery('modTemplateVarTemplate');
                      $q->where([
                          'tmplvarid' => $tv_id,
                          'templateid' => $template_id
                      ]);
                      $q->limit(1);
                      
                      return $modx->getCount('modTemplateVarTemplate', $q);

                      Как известно, tv-поля прикрепляются не к самим ресурсам, а к шаблонам.

                      Вот сниппет, который возвращает 0 если tv не прикреплен к указанному шаблону и 1, если прикреплен.
                      Никита Боднар
                      17 декабря 2020, 15:22
                      0
                      Уже разобрался, но решил задачу немного иным путём.
                      $parentIsTabsContainerTV = $modx->getObject('modTemplateVarResource', array(
                          'contentid' => $parentID,
                          'tmplvarid' => $resourceIsTabsContainerTVID
                      ));
                      Alexey
                      17 декабря 2020, 15:46
                      0
                      В этом случае, если tv-поле не заполнено, но прикреплено к ресурсу, результат все равно будет отрицательный
                      Никита Боднар
                      17 декабря 2020, 15:50
                      0
                      У меня там чекбокс, который нельзя снять, поэтому норм.
                      Никита Боднар
                      17 декабря 2020, 15:50
                      0
                      Но в любом случае спасибо за помощь. Возможно, воспользуюсь вашим вариантом в будущем.
                      Никита Боднар
                      16 декабря 2020, 15:55
                      0
                      Нет, код всё-таки неверно отрабатывает. Теперь у меня URI меняется вообще у любого ресурса, у которого есть родитель, даже если у него нет TV «resourceTabsContainer».
                      Alexey
                      17 декабря 2020, 15:21
                      0
                      На тесте всё корректно отрабатывает.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
24