Fi1osof 12 июня 2013 0 1
Довольно часто всплывает такой вопрос: перенесли сайт на новый движок, закинули через phpmyadmin документы, а uri пустые. Или вообще раньше не использовались ЧПУ, а сейчас захотелось, такое вот критическое обновление. В общим причин много бывает, да и не суть. Топик о том, как массово обновить uri документов на MODX Revolution через API MODX-а.

Исходные данные: сайт с кучей ресурсов без актуального uri.
Цель: обновить все документы, чтобы у всех появились uri.

Для начала надо еще один момент оговорить: у вас уже на сайте все документы могут иметь алиасы, а могут быть и без алиасов. То есть если алиасов нет, и надо еще чтобы они так же были автоматически созданы, то надо включить автоматическую генерацию алиасов. А если хотите еще и транслитерацию автоматическую, то надо еще, к примеру, поставить и настроить translit. Но это уже отдельная тема и по ней инфу можно найти в других топиках.

Итак, чтобы у нас сгенерировались новые uri, нам всего лишь надо обновить ресурсы. И лучше это делать не через ->save(), а именно через процессор resource/update, так как только там полный набор всех проверок. И этот способ годится и для обновления групп ресурсов, TV-параметров и т.п. (само собой с некоторыми модификациями).

Вот небольшой скрипт, который можно выполнять через Console.
<?php

$q = $modx->newQuery('modResource', array( 
    'parent:IN' => array(0),    // Перечисляем id разделов, если надо, но если документов не очень много, то можно с корня
));
// Это условие указывает поиск только документов без uri
$q->andCondition(array(    
    'uri' => null,    
    'OR:uri:=' => '',   
));

// Вот этот вывод полезен, если убрать условие родителя
print "Всего найдено документов по условию: ". $modx->getCount('modResource', $q);

// Сортируем по id
$q->sortby('id');

// Указываем лимит
$q->limit(1);

foreach($modx->getCollection('modResource', $q) as $doc){
    $modx->error->reset();
    $modx->runProcessor('resource/update', $doc->toArray());
    if($modx->error->hasError()){
        print_r($modx->error->getErrors());
    }
}

Здесь очень важный момент: $q->limit(1);
Лучше именно один и использовать. Объясню. Когда вы отправляете на обновление ресурс, обновляется не только он, но и дочерние. Потому если вы обновляете в корне сайта какой-то документ-раздел, тогда и внутренние тоже получат новые uri.

Но после того, как пройдете все документы первого уровня, на всякий случай удалите условие поиска по родителю, оставив только условия не заполненного uri, и тогда если что-то еще останется и процесс не очень активно будет протекать, можно будет увеличить лимит выборки.
1 комментарий
s
sanch0ss 20 октября 2015г в 18:35 #
У меня вот при ручном обновлении документа перестало генерить alias (или затирать прописанный alias), и соответсвенно uri. Вроде, после того как заменил в настройках дружественного url суффикс контейнера с "/" на ".html"… появились такие uri «index/slajderyi/.html» — т.е. и старый суффикс и новый…
Сам топик
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.