
Речь об исключении алиаса ресурса из 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'
)
$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 — Нет
$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}";}может быть потом где-то боком вылезет, но пока полет нормальный