Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

telegram: @Accusser
skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

MODX копирования ресурсов с созданием связи Babel

Сайдбар

MODX копирования ресурсов с созданием связи Babel

13 июля 2018

При создании мультиязычного сайта бывает так что второй языка добавляется со временем. Сайт наполнен успешно работает, но нужен еще один язык. И вот вы уже создали дополнительный контекст, установили 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 MODX Shopkeeper 3 обновление с shopkeeper 2

MODX Shopkeeper 3

Смотреть

MODX MODX Revo вывод статей на сайте

MODX вывод статей

Смотреть








Комментарии ()


    Услуги по MODX Revolution

    Посмотреть все услуги

    Оптимизация сайта

    Подробнее & Заказать

    Создание сайта на MODX Revolution

    Подробнее & Заказать

    Перенос сайта на MODX Revolution

    Подробнее & Заказать

    Продвижение сайта на MODX

    Подробнее & Заказать