Николай Ланец
12 июня 2013 г., 1:39

Массовое обновление URI документов (репост)

Довольно часто всплывает такой вопрос: перенесли сайт на новый движок, закинули через 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, и тогда если что-то еще останется и процесс не очень активно будет протекать, можно будет увеличить лимит выборки.
У меня вот при ручном обновлении документа перестало генерить alias (или затирать прописанный alias), и соответсвенно uri. Вроде, после того как заменил в настройках дружественного url суффикс контейнера с "/" на ".html"… появились такие uri «index/slajderyi/.html» — т.е. и старый суффикс и новый… Сам топик

Добавить комментарий