Если вы решили изменить способ построения ЧПУ у ваших ресурсов, то вам может потребоваться сгенерировать новый псевдоним, он же alias для всех старых ресурсов.
Это можено сделать вручную: открыть каждый ресурс, очистить поле "псевдоним" и сохранить ресурс. Работает. Но если на сайте более 10 страниц, то нужен автоматизированный способ, который я представляю в этой заметке.
Последовательность работы сниппета
- Убираем ограничение на время выполнение скрипта
- Делаем выборку ресурсов. Некотоыре блоки кода закомментированы и оставлены для того чтобы упростить настройку выборки
- В цикле проходим по коллекции выбраных ресурсов
-
Генерируем новый alias методом
$resource->cleanAlias($title)Тут стоит заметить, что есть еще несколько способов указать системе на генерацию нового alias:
- Можно стереть старый алиас
$resource->set('alias', '')и черех процессор$modx->runProcessor('resource/update', $resource);сгенерировать новый алиас для ресурса. Процессор корректно отреагирует на пустую строку. -
Если вы хотите просто где-то в коде, или в консоле вызвать метод генерации alias (транслитизации по заданым настройкам), то статичный метод
modResource::filterPathSegment($modx, $alias);вам в пригодится
Можно еще вот так, если почему-то не работает предыдущий вариант
$res = $modx->newObject('modResource');
$res->cleanAlias($alias);
- Можно стереть старый алиас
- Создаем редирект, если обновление ресурса через процессор
resource/updateпрошло успешно. Для создания редиректа используем API пакета autoRedirector - Выводим результат таблицу для наглядного отображения результа
Код сниппета для генерации alias
ini_set('max_execution_time', 0);
//ignore_user_abort(true);
$q = $modx->newQuery('modResource');
// Если нужно сделать выборку по TV
// $q->leftJoin('modTemplateVarResource', 'TV1', 'modResource.id = TV1.contentid AND TV1.tmplvarid = 5');
// $q->leftJoin('modTemplateVarResource', 'TV2', 'modResource.id = TV2.contentid AND TV2.tmplvarid = 4');
// Если нужно применить ко всем ресурсам на сайте, то условие where можно отключить полностью
$q->where(array(
// Если нужно сделать выборку по TV
// 'TV1.value' => 'promo',
// 'AND:TV2.value:NOT LIKE' => 'rus',
'modResource.parent:IN' => array(175),
));
echo "<table style='width:100%'>";
foreach($modx->getCollection('modResource', $q) as $resource){
echo "<tr>";
$old_uri = $resource->get('uri'); // Понадобится для редиректа
// Определяем новый Alias
$title = $resource->get('pagetitle') . '-' . $resource->get('id');
$new_alias = $resource->cleanAlias($title);
$resource->set('alias', $new_alias);
$response = $modx->runProcessor('resource/update', $resource->toArray());
if($response->isError()){
echo "<td>С обновлением ресорса проблемы проблемы:<pre>";
print_r($response_ar->getResponse(). true);
echo "</pre></td>";
return;
}else{
echo "<td>Ок! ".$resource->get('id')." </td>";
echo "<td> ".$new_alias." </td>";
// Если все прошло успешно, то делаем редирект со старой страницы не новую, используя дополнение autoRedirector
// Подключаем autoRedirector
$modelPath = $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'model/';
$modx->addPackage('autoredirector', $modelPath);
$processorProps = array('processors_path' => $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'processors/');
// Создаем правило перенаправления
$arRule = array('uri' => $old_uri, 'res_id' => $resource->get('id'));
if (!$modx->getObject('arRule', $arRule)) {
$response_ar = $modx->runProcessor('mgr/item/create', $arRule, $processorProps);
if($response_ar->isError()){
echo "<td> С редиректом проблемы:<pre>";
print_r($response_ar->getResponse(). true);
echo "</pre></td>";
return;
}else{
echo "<td> Редирект создан </td>";
}
}else{
echo "<td> Такое правило уже есть </td>";
}
}
$modx->error->reset();
echo "</tr>";
}
echo "</table>";
Комментарии (0)
Не писать ответ