Как генерировать ALIAS из MENUTITLE вместо PAGETITLE?

Друзья, подскажите пожалуйста, есть ли решение, настройка в MODX REVO, что бы alias создавался из menutitle, а если поле пустое то из pagetitle. Как это сделать? Дело в том что pagetitle всегда огромные, пишутся для SEO, и содержание такое сложное, когда translit отработает, то получается немного не то название простое по смыслу которое хотелось бы, а вот в menutitle всегда пишу короткое и простое название для меню. Хотелось бы из него брать заголовок для aliasa, а если пусто, то как обычно из pagetitle. Есть решения?

Есть плагин у меня на событие OnDocFormSave
if ($modx->event->name == 'OnDocFormSave') {
  if($menutitle != ''){
         $resource->set('alias',$menutitle);
    }else{
        $resource->set('alias',$pagetitle);
    }  
    $resource->save();
}


Но он не работает почему то :( а должен.
Роман
05 февраля 2020, 13:07
modx.pro
1
670
0

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

Тимур
05 февраля 2020, 13:34
1
0
Потому что при сохранении документа плагин получает объект сохраненного документа. Поэтому ваш код будет выглядеть следующим образом:
if ($modx->event->name == 'OnDocFormSave') {
    if (!empty($resource->get('menutitle'))) {
        $resource->set('alias',$resource->get('menutitle'));
    }
    else {
        $resource->set('alias',$resource->get('pagetitle'));
    }
    $resource->save();
}
    Роман
    05 февраля 2020, 13:43
    0
    БЛАГОДАРЮ!
      Роман
      05 февраля 2020, 14:19
      0
      А не подскажете, как еще добавить проверку, если alias уже вписан руками, его не менять?
      А то если по умолчанию вписываю alias при создании ресурса, он его затирает при сохранении и пишет из menutitle если не пустое, иначе из pagetitle, тут порядок.

      Если делаю дополнительную проверку, то все равно не работает
      if ($modx->event->name == 'OnDocFormSave') {
          if(!empty($resource->get('alias'))){
          if (!empty($resource->get('menutitle'))) {
              $resource->set('alias',$resource->get('menutitle'));
          }
          else {
              $resource->set('alias',$resource->get('pagetitle'));
          }
          }
          $resource->save();
      }
        Тимур
        05 февраля 2020, 14:24
        1
        0
        if ($modx->event->name == 'OnDocFormSave') {
            if (empty($resource->get('alias'))) {
                if (!empty($resource->get('menutitle'))) {
                    $resource->set('alias',$resource->get('menutitle'));
                }
                else {
                    $resource->set('alias',$resource->get('pagetitle'));
                }
                $resource->save();
            }
        }
          Роман
          05 февраля 2020, 15:01
          0
          Благодарю! Ошибся, !empty написал, работает. А можно в плагине получить id шаблона ресурса который сохраняем? Просто хочу все это с alias делать только для страниц с определенным шаблоном.
            Тимур
            05 февраля 2020, 15:08
            0
            Объект
            $resource
            хранит в себе все данные о странице, в том числе и шаблон.
            $resource->get('template')
            Роман
            05 февраля 2020, 17:46
            0
            Почему то не работает проверка empty($resource->get('alias') и когда ресурс только создается и обновляется, не проходит почему то. С этой проверкой плагин перестает работать, берет alias из pagetitle и все.
            if ($modx->event->name == 'OnDocFormSave') {
                if (empty($resource->get('alias'))) {
                    if (!empty($resource->get('menutitle'))) {
                        $resource->set('alias',$resource->get('menutitle'));
                    }
                    else {
                        $resource->set('alias',$resource->get('pagetitle'));
                    }
                    $resource->save();
                }
            }
              Тимур
              05 февраля 2020, 17:53
              0
              Видимо в момент создания документа он и так пустой. Проверьте поля объекта через отладку.
              $modx->log(MODX_LOG_LEVEL_DEBUG, print_r($resource->toArray()));
              В журнал ошибок выведет объект
              $resource
                Роман
                05 февраля 2020, 18:00
                0
                Такой результат, но это обновление ресурса, и все равно, видно что menutitle один, а берет pagetitle почему то. Алиас затер и сохранил ресурс. Такой результат.
                [2020-02-05 14:55:57] (ERROR @ /home/bmlandin/public_html/ladygincms/core/model/modx/modx.class.php : 1671) [OnDocFormSave]Array
                (
                    [id] => 135
                    [type] => document
                    [contentType] => text/html
                    [pagetitle] => Тумба для ТВ аппаратуры1
                    [longtitle] => 
                    [description] => 
                    [alias] => tumba-dlya-tv-apparaturyi1
                    [alias_visible] => 1
                    [link_attributes] => 
                    [published] => 1
                    [pub_date] => 0
                    [unpub_date] => 0
                    [parent] => 12
                    [isfolder] => 
                    [introtext] => 
                    [content] => 
                    [richtext] => 1
                    [template] => 3
                    [menuindex] => 4
                    [searchable] => 1
                    [cacheable] => 1
                    [createdby] => 1
                    [createdon] => 2020-02-05 13:02:41
                    [editedby] => 1
                    [editedon] => 2020-02-05 14:55:57
                    [deleted] => 
                    [deletedon] => 0
                    [deletedby] => 0
                    [publishedon] => 2020-02-05 13:02:00
                    [publishedby] => 1
                    [menutitle] => Тумба44
                    [donthit] => 
                    [privateweb] => 
                    [privatemgr] => 
                    [content_dispo] => 0
                    [hidemenu] => 
                    [class_key] => msProduct
                    [context_key] => web
                    [content_type] => 1
                    [uri] => catalog/tumby/tumbyi-dlya-texniki/tumba-dlya-tv-apparaturyi1
                    [uri_override] => 0
                    [hide_children_in_tree] => 0
                    [show_in_tree] => 1
                    [properties] => 
                    [article] => 
                    [price] => 0
                    [old_price] => 0
                    [weight] => 0
                    [image] => 
                    [thumb] => 
                    [vendor] => 0
                    [made_in] => 
                    [new] => 
                    [popular] => 
                    [favorite] => 
                    [tags] => 
                    [color] => 
                    [size] => 
                    [source] => 2
                    [create-resource-token] => 5e3ad5aec6e295.86174906
                    [reloaded] => 1
                    [parent-original] => 12
                    [ta] => 
                    [parent-cmp] => 12
                    [syncsite] => 1
                    [categories] => Array
                        (
                        )
                
                    [query] => Поиск
                    [ext-comp-1068] => 50
                    [tvs] => 1
                    [tv34] => 
                    [tv49] => не выбрано
                    [tv46] => <span>рекомендуем</span> посмотреть
                    [tv44] => Array
                        (
                            [0] => 
                        )
                
                    [tv45] => Нет
                    [tv48] => Вы смотрели
                    [tv47] => Да
                    [action] => resource/update
                    [resource_groups] => []
                    [options] => Array
                        (
                        )
                
                    [vendor.id] => 
                    [vendor.name] => 
                    [vendor.resource] => 0
                    [vendor.country] => 
                    [vendor.logo] => 
                    [vendor.address] => 
                    [vendor.phone] => 
                    [vendor.fax] => 
                    [vendor.email] => 
                    [vendor.description] => 
                    [vendor.properties] => 
                )
                Так выглядит сейчас плагин

                <?php
                if ($modx->event->name == 'OnDocFormSave') {
                    
                    
                    if (empty($resource->get('alias'))) {
                        if (!empty($resource->get('menutitle'))) {
                            $resource->set('alias',$resource->get('menutitle'));
                        }
                        else {
                            $resource->set('alias',$resource->get('pagetitle'));
                        }
                    }
                    $resource->save();
                    
                    
                }
                
                $modx->log(MODX_LOG_LEVEL_DEBUG, print_r($resource->toArray()));
                $resource->save(); вынес из IF про alias
                  Тимур
                  05 февраля 2020, 18:20
                  0
                  Вы можете и сами посмотреть в логах, что при сохранении документа, даже с пустым alias, modx подставляет pagetitle в alias и передает объект плагину на событие уже с заполненным alias. То есть проверить alias на пустоту нельзя. Даже если посмотреть объект на событие OnBeforeDocFormSave, то там alias тоже уже сгенерирован.
                    Роман
                    05 февраля 2020, 18:28
                    0
                    То есть можно забыть про эту идею через плагин? Алиас всегда будет перезаписан pagetitle.
                      Баха Волков
                      06 февраля 2020, 22:25
                      +1
                      Да, про плагин забудьте, транслитерация происходит с помощью extjs событий keyup и blur поля pagetitle. Вот метод который это проделывает.

                      Вам нужен плагин который зарегистрирует ваш js скрипт на страницу и в котором будут переопределены поведения полей
                        Роман
                        06 февраля 2020, 22:34
                        0
                        Спасибо, понятно, очинка выделки не стоит.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        13