Наверх

Исключение алиаса ресурса в URL дочерних ресурсов

В разделе «Репосты» расположены чужие статьи, которые мне понравились или показались полезными.

Сегодня выяснилось, что указанные мной ссылки ведут в никуда, и я решил восстановить эту информацию, благо, сам постоянно использую эту доработку.


Речь об исключении алиаса ресурса из url дочерних объектов способом, предложенным bertoost, за что огромное ему спасибо.

Были споры о необходимости лезть в ядро, но, тем не менее, интерес к этому есть, поэтому я воссоздал эти изменения на github.

Итак, для этого требуется:

1. Создать в таблице modx_site_content поле exclude_alias_in_childs (boolean), сделать к нему индекс;
2. Внести изменения согласно https://github.com/modxcms/revolution/compare/2.x...Tramp1357:Tramp1357-patch-1

Править modx.mysql.schema.xml не обязательно, если не планируется перепостроение схемы.

Если изменения п.2 внести в стандартный дистрибутив MODX, то необходимость в п.1 отпадает: после установки с нуля всё будет работать из коробки.

Источник: https://modxclub.ru/topics/isklyuchenie-aliasa-resursa-v-url-dochernix-resursov-2.html

UPD. Вот изменения (на случай, если в на гитхабе код будет удалён).

Первый файл — это файл модели ресурса core/model/modx/mysql/modresource.map.inc.php

<?php
/**
 * @package modx
 * @subpackage mysql
 */
$xpdo_meta_map['modResource']= array (
  'package' => 'modx',
  'version' => '1.1',
  'table' => 'site_content',
  'extends' => 'modAccessibleSimpleObject',
  'inherit' => 'single',
  'fields' => 
  array (
    'type' => 'document',
    'contentType' => 'text/html',
    'pagetitle' => '',
    'longtitle' => '',
    // ...
    'show_in_tree' => 1,
    'exclude_alias_in_childs' => 0, // Добавляем поле
    'properties' => NULL,
  ),
  'fieldMeta' => 
  array (
    'type' => 
    array (
      'dbtype' => 'varchar',
      'precision' => '20',
      'phptype' => 'string',
      'null' => false,
      'default' => 'document',
    ),
    // ...
    'exclude_alias_in_childs' => // Указываем его свойства
      array (
        'dbtype' => 'tinyint',
        'precision' => '1',
        'phptype' => 'integer',
        'null' => false,
        'default' => 0,
        'index' => 'index',
      ),
    'properties' => 
    array (
      'dbtype' => 'mediumtext',
      'phptype' => 'json',
      'null' => true,
    ),
  ),
  'indexes' => 
  array (
    'alias' => 
    array (
      'alias' => 'alias',
      'primary' => false,
      'unique' => false,
      'type' => 'BTREE',
      'columns' => 
      array (
        'alias' => 
        array (
          'length' => '',
          'collation' => 'A',
          'null' => true,
        ),
      ),
    ),
    // ...
    'exclude_alias_in_childs' => // И добавляем индекс по новому полю
    array (
      'alias' => 'exclude_alias_in_childs',
      'primary' => false,
      'unique' => false,
      'type' => 'BTREE',
      'columns' =>
        array (
          'exclude_alias_in_childs' =>
            array (
              'length' => '',
              'collation' => 'A',
              'null' => false,
            ),
        ),
    ),
  ),
  // ...
  'composites' => 
  array (
	// ...
  ),
  'aggregates' => 
  array (
    // ...
  ),
);

Второй файл — core/model/modx/modresource.class.php

В методе save() ищем строку
$refreshChildURIs = ($this->get('refreshURIs') || $this->isDirty('uri') || $this->isDirty('alias') || $this->isDirty('alias_visible') || $this->isDirty('parent') || $this->isDirty('context_key'));
и добавляем в список полей exclude_alias_in_childs:
$refreshChildURIs = ($this->get('refreshURIs') || $this->isDirty('uri') || $this->isDirty('alias') || $this->isDirty('alias_visible') || $this->isDirty('parent') || $this->isDirty('context_key')); || $this->isDirty('exclude_alias_in_childs'));

В методе getAliasPath() ищем строку
$parentResources[]= "{$parentAlias}";
и заменяем на
if (empty ($currResource['exclude_alias_in_childs'])) {$parentResources[]= "{$parentAlias}";}

В методе prepareTreeNode() перед return добавляем:
if ($this->get('exclude_alias_in_childs')) {
    $node['text'] = "<span style=\"color:#b44e4e!important;font-style:italic;font-weight:normal;font-size: smaller\">ea </span>{$node['text']}";
}

Третий файл — это лексикон core/lexicon/ru/resource.inc.php

В него добавляем подпись для чекбокса:
$_lang['resource_exclude_alias_in_childs'] = 'Не использовать в URL';
$_lang['resource_exclude_alias_in_childs_help'] = 'Если включено, то псевдоним ресурса не будет участвовать в формировании URL дочерних ресурсов';

И четвёртый файл — собственно сама разметка страницы редактирования manager/assets/modext/widgets/resource/modx.panel.resource.js

Находим описание чекбокса resource_uri_override и перед ним вставляем наш новый чекбокс:
// ...
},{
	xtype: 'xcheckbox'
	,boxLabel: _('resource_exclude_alias_in_childs')
	,description: _('resource_exclude_alias_in_childs_help')
	,hideLabel: true
	,name: 'exclude_alias_in_childs'
	,id: 'modx-resource-exclude_alias_in_childs'
	,inputValue: 1
	,checked: parseInt(config.record.exclude_alias_in_childs)
},{
// ...


13 комментариев

  1. Вадим Реддит 31 июля 2016, 16:13 # 0
    После добавления комментария появляется комментарий с аватаром, который передает vk к примеру. Аватар подгружается с вк и тем самым дает повод для ошибки ssl, как исправить?
    1. Илья Уткин 31 июля 2016, 16:15 # 0
      Не знаю
    2. Андрей Шевяков 26 января 2017, 11:11(Комментарий был изменён) # 0
      На github.com/ilyautkin/revolution-exclude_alias/pull/1/files
      В файле: core/lexicon/ru/resource.inc.php

      Грамматическая ошибка в строчке:
      $_lang['resource_exclude_alias_in_childs_help'] = 'Если включено, то псевдоним ресурса не будет учавствовать в формировании URL дочерних ресурсов';
      Слово «учаВствовать», правильно пишется «участвовать».

      Решение супер!
      Вот добавить бы в стандартную сборку дистрибутива MODX такую галочку для ресурсов.
      1. Мимошел 26 мая 2017, 12:49 # 0
        Ссылки на гитхаб ведут на 404.
        1. Илья Уткин 30 мая 2017, 10:11 # 0
          Поправил
        2. Шведов Дмитрий 23 июня 2017, 17:51 # 0
          Как исправить ошибку?
          Когда заходишь в ресурс, красная ошибка «Ресурс не найден»
          (ERROR @ /home/u437736/mostbest.ru/www/core/xpdo/om/xpdoobject.class.php: 240) Error 42S22 executing statement:
          Array
          (
          [0] => 42S22
          [1] => 1054
          [2] => Unknown column 'exclude_alias_in_childs' in 'field list'
          )
          1. Илья Уткин 18 июля 2017, 08:52 # 0
            Не знаю… я сам ещё этим способом не пользовался, так что подсказать не смогу.
            1. Влад 10 сентября 2017, 16:36 # 0
              Решили проблему? если да, то как?
            2. Димати 21 сентября 2017, 16:16 # 0
              Здравствуйте, а на версию 2.5.8 встанет?
              1. Илья Уткин 21 сентября 2017, 17:43 # 0
                Не знаю. Пробуйте, только не забудьте сначала сделать бэкап всего сайта.
              2. Константин 25 июля 2018, 23:22 # 0
                2.6.5 полет нормальный
                1. Дмитрий 17 января 2019, 20:33(Комментарий был изменён) # 0
                  Здесь же ошибка или я что-то не понимаю?

                  $refreshChildURIs = ($this->get('refreshURIs') || $this->isDirty('uri') || $this->isDirty('alias') || $this->isDirty('alias_visible') || $this->isDirty('parent') || $this->isDirty('context_key')); || $this->isDirty('exclude_alias_in_childs'));
                  лишние
                  );
                  перед
                  || $this->isDirty('exclude_alias_in_childs'));
                  На 2.6.5 сделал — не работает. Сайт работает, но ресурс не исключает. От описаного выше отличается следующий кусок.

                  core/model/modx/modresource.class.php

                  save ()

                  У вас (исходный вариант):
                  $refreshChildURIs = ($this->get('refreshURIs') || $this->isDirty('uri') || $this->isDirty('alias') || $this->isDirty('alias_visible') || $this->isDirty('parent') || $this->isDirty('context_key'));
                  У меня (исходный):
                  $refreshChildURIs = ($this->get('refreshURIs') || $this->isDirty('uri') || $this->isDirty('alias') || $this->isDirty('parent') || $this->isDirty('context_key'));
                  Т.е. у меня нет
                  || $this->isDirty('alias_visible')
                  Я сделал
                  $refreshChildURIs = ($this->get('refreshURIs') || $this->isDirty('uri') || $this->isDirty('alias') || $this->isDirty('alias_visible') || $this->isDirty('parent') || $this->isDirty('context_key')); || $this->isDirty('exclude_alias_in_childs'));
                  Может нужны какие-то особенные настройки?

                  У меня:
                  Использовать вложенные URI — да
                  Строгий режим дружественных URI — Нет
                  Использовать вложенные URL — Да
                  Использовать «замороженные» URI — Нет
                  1. gaalex 28 августа 2019, 12:59 # 0
                    В версии 2.6 и выше не работало, надо потому что свойство не подтягивалось из базы, надо заменить строку
                    $query->select($this->xpdo->getSelectColumns('modResource', '', '', array('parent', 'alias', 'uri', 'uri_override')));
                    на
                    $query->select($this->xpdo->getSelectColumns('modResource', '', '', array('parent', 'alias', 'uri', 'uri_override', 'exclude_alias_in_childs')));
                    и все должно работать, еще вместо
                    if (empty ($currResource['exclude_alias_in_childs'])) {$parentResources[]= "{$parentAlias}";}
                    я использовал
                    if (($currResource['exclude_alias_in_childs']) == false) {$parentResources[]= "{$parentAlias}";}
                    может быть потом где-то боком вылезет, но пока полет нормальный

                    Авторизация

                    через сервис Loginza:


                    Шаблоны MODX

                    1 2 Дальше »

                    Объектная
                    модель
                    MODX