При создании мультиязычного сайта бывает так что второй языка добавляется со временем. Сайт наполнен успешно работает, но нужен еще один язык. И вот вы уже создали дополнительный контекст, установили Babel осталось дело за малым - сделать переводы 1000 документов. Столкнулся и я с такой проблемой, но в сети случайно нашел скрипт который облегчает данную задачу и в автоматическом режиме создает копии ресурсов в новом контексте с созданием связи Babel.
Ниже код скрипта который вы можете запустить одним из удобных для вас способов.
1. Создать сниппет вставить код и вызвать сниппет в документе. После этого открыть документ на сайте.
2. С помощью дополнения Console вставить код и выполнить его.
3. Создать в корне сайта файл php и запусть данный файл в адресной строке браузера.
В любом случае на выполнение понадобится время если вы конечно не делаете копии и связи для 10 документов.
$from = array( 'context_key'=>'web', 'cultureKey'=>'ru'); $target = array('context_key'=>'ua', 'cultureKey'=>'ua', 'mark' => ' [UA]'); function getBabelTV($modx){ return $modx->getObject('modTemplateVar',array('name'=>'babelLanguageLinks')); } function babelTVtoArray($str){ if(!$str) return array(); $result = array(); $contexts = explode(';', $str); foreach($contexts as $context){ $obj = explode(':', $context); $result[$obj[0]] = $obj[1]; } return $result; } function arrayToBabelTV($arr){ $new_arr = array(); foreach($arr as $key => $value){ $new_arr[] = $key . ':' . $value; } return implode(';', $new_arr); } function getIdResourceInTarget($id, $modx, $target){ $babelTV = getBabelTV($modx); $str = $babelTV->getValue($id); $babel = babelTVtoArray($str); if(!isset($babel[$target['context_key']])) return ''; else return $babel[$target['context_key']]; } function createResource($options, $tvs, $modx){ $resource = $modx->newObject('modResource'); $content = $options['content']; unset($options['content']); if(!$options['publishedon']) $options['publishedon'] = date("Y-m-d H:i:s"); $resource->fromArray($options); $resource->setContent($content); $resource->save(); foreach($tvs as $tvname => $tvvalue){ $tv = $modx->getObject('modTemplateVar',array('name'=> $tvname)); $tv->setValue($resource->get('id'), $tvvalue); $tv->save(); } return $resource->get('id'); } function copyResourceToTarget(&$resource, $modx, $from, $target){ $babelTV = getBabelTV($modx); $id = $resource->get('id'); $parent = $resource->get('parent'); if($parent !== 0) $parent_in_target = getIdResourceInTarget($parent, $modx, $target); else $parent_in_target = 0; $modx->log(modX::LOG_LEVEL_ERROR, '[[INFO]] resource: ' . $id . ', parent: ' . $parent . ', parent_in_target: ' . $parent_in_target); if(!empty($parent_in_target) || $parent_in_target === 0){ $modx->log(modX::LOG_LEVEL_ERROR, '[[COPY]] resource: ' . $id); $tvs = $resource->getMany('TemplateVars'); $resource_tvs = array(); foreach ($tvs as $tv) { $resource_tvs[$tv->get('name')] = $tv->getValue($id); //$tv->renderOutput($id); } $resource_tvs['babelLanguageLinks'] = $babelTV->getValue($id); $options = $resource->toArray(); $options['parent'] = $parent_in_target; $options['context_key'] = $target['context_key']; $options['pagetitle'] = $options['pagetitle'] . $target['mark']; $new_id = createResource($options, $resource_tvs, $modx); $modx->log(modX::LOG_LEVEL_ERROR, '[[BABEL]] resource: ' . $resource_tvs['babelLanguageLinks']); $babelArr = babelTVtoArray($resource_tvs['babelLanguageLinks']); $babelArr[$from['context_key']] = $id; $babelArr[$target['context_key']] = $new_id; $babelStr = arrayToBabelTV($babelArr); $babelTV->setValue($id, $babelStr); $babelTV->setValue($new_id, $babelStr); $babelTV->save(); } else{ $modx->log(modX::LOG_LEVEL_ERROR, '[[COPY PARENT]] of resource: ' . $id . '(parent: '.$parent.')'); if($parent !== 0) copyResourceToTarget($modx->getObject('modResource', $parent), $modx, $from, $target); copyResourceToTarget($resource, $modx, $from, $target); } } $resources = $modx->getCollection('modResource', array('context_key'=>$from['context_key'])); foreach($resources as $resource){ $resource_in_target = getIdResourceInTarget($resource->get('id'), $modx, $target); if(empty($resource_in_target)) copyResourceToTarget($resource, $modx, $from, $target); }И названия контекстов конечно же стоит поменять.
Смотрите также:
Услуги по MODX Revolution
Посмотреть все услуги
Оптимизация сайта
Заказав услуги по технической оптимизации сайта мы избавим вас от ошибок присутствующих на сайте, а так же увеличим скорость работы вашего сайта.
Создание сайта на MODX
Мы создадим для вас такой сайт, который подойдет именно в вашем случае и станет отличным инструментом привлечения клиентов и увеличения продаж.
Перенос сайта на MODX
Работа по переносу сайта на MODX осуществляется в максимально короткие сроки. Стоимость зависит от сложности переносимого сайта
Продвижение сайта на MODX
Если вы хотите получить быстрые и ощутимые результаты, подняться в топ в минимальные сроки, то доверьте нам продвижение своего сайта.