
Речь об исключении алиаса ресурса из 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) },{ // ...
В файле: core/lexicon/ru/resource.inc.php
Грамматическая ошибка в строчке:
Слово «учаВствовать», правильно пишется «участвовать».
Решение супер!
Вот добавить бы в стандартную сборку дистрибутива MODX такую галочку для ресурсов.
Когда заходишь в ресурс, красная ошибка «Ресурс не найден»
(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'
)
лишние
перед
На 2.6.5 сделал — не работает. Сайт работает, но ресурс не исключает. От описаного выше отличается следующий кусок.
core/model/modx/modresource.class.php
save ()
У вас (исходный вариант):
У меня (исходный):
Т.е. у меня нет Я сделал Может нужны какие-то особенные настройки?
У меня:
Использовать вложенные URI — да
Строгий режим дружественных URI — Нет
Использовать вложенные URL — Да
Использовать «замороженные» URI — Нет
на
и все должно работать, еще вместо
я использовал
может быть потом где-то боком вылезет, но пока полет нормальный