Наверх

Генерация YML-файла для Яндекс-Маркета

<?php
@ini_set('display_errors', 1);

define('MODX_API_MODE', true);
require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

if ($modx->cacheManager->get('running', array('cache_key' => 'ymarket'))) {
    echo 'Скрипт работает, повторный запуск отменён';
    exit;
}

$running = true;
$modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));

$limit = 500;
$offset = $modx->cacheManager->get('offset', array('cache_key' => 'ymarket'));
$filename = MODX_BASE_PATH . 'yandexmarket.yml';
$tpl_category = '@INLINE <category id="{$id}"{if $parent &&
     ($parent | resource : "class_key") == "msCategory"} parentId="{$parent}"{/if}>{$menutitle ?: $pagetitle}</category>';
$tpl_product = '@INLINE <offer id="{$id}" available="true">
<url>{"site_url" | config}{$id | url}</url>
<price>{$price | replace : " " : ""}</price>
<currencyId>RUR</currencyId>
<categoryId>{$parent}</categoryId>
<picture>{"site_url" | config}{$thumb | replace : "/assets/" : "assets/"}</picture>
<name>{$menutitle ?: $pagetitle}</name>
<model>{$article}</model>
<description>{($description ?: $content) | striptags | replace : "&" : "&amp"}</description>
<vendor>{$_pls["vendor.name"]}</vendor>
<sales_notes>Минимальная сумма заказа составляет 500 руб</sales_notes>
</offer>';

if (!$offset) {
    if (file_exists($filename)) {
        echo 'Файл существует, больше ничего не делаем';
        $running = false;
        $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
        exit;
    }
    echo 'Приступаю к генерации YML-файла' . PHP_EOL;
    $data = '<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="'.date("Y-m-d H:i").'" >
<shop>
<name>'.$modx->getOption('site_name').'</name>
<company>'.$modx->getOption('site_name').'</company>
<url>'.$modx->getOption('site_url').'</url>
<currencies>
<currency id="RUR" rate="1"/>
</currencies>
<categories>'.
    $modx->runSnippet('pdoResources', array(
        'parents' => 0,
        'where' => '{"class_key":"msCategory"}',
        'depth' => 1000,
        'sortby' => '{"menuindex":"ASC"}',
        'limit' => 0,
        'tpl' => $tpl_category
    )) .
'</categories>
<offers>';
    
    if (!$handle = fopen($filename, 'w')) {
        echo "Не могу открыть файл $filename" . PHP_EOL;
        $running = false;
        $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
        exit;
    }
    if (fwrite($handle, $data) === FALSE) {
        echo "Не могу произвести запись в файл $filename" . PHP_EOL;
        $running = false;
        $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
        exit;
    }
    fclose($handle);
    unset($data);
    unset($handle);
    echo 'Записана шапка файла' . PHP_EOL;
    $offset = 0;
}

$end_of_file = false;

if ($data = $modx->runSnippet('msProducts', array(
       'parents' => 0, 'limit' => $limit, 'offset' => $offset, 'tpl' => $tpl_product, 'includeContent' => 1, 'includeTVs' => 'img,image'
    ))) {
    if (is_writable($filename)) {
        if (!$handle = fopen($filename, 'a')) {
            echo "Не могу открыть файл $filename" . PHP_EOL;
            $running = false;
            $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
            exit;
        }
        if (fwrite($handle, $data) === FALSE) {
            echo "Не могу произвести запись в файл $filename" . PHP_EOL;
            $running = false;
            $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
            exit;
        }
        fclose($handle);
    } else {
        echo "Файл $filename недоступен для записи" . PHP_EOL;
        $running = false;
        $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
        exit;
    }
    echo 'Записана группа товаров от '.$offset.' до ' . ($offset + $limit);
    $offset = $offset + $limit;
    $modx->cacheManager->set('offset', $offset, 0, array('cache_key' => 'ymarket'));
    unset($data);
    if ($offset > 200000) {
        $end_of_file = true;
    }
} else {
    $end_of_file = true;
}

if ($end_of_file) {
    $data = '</offers>
    </shop>
    </yml_catalog>';
    if (is_writable($filename)) {
        if (!$handle = fopen($filename, 'a')) {
            echo "Не могу открыть файл $filename" . PHP_EOL;
            $running = false;
            $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
            exit;
        }
        if (fwrite($handle, $data) === FALSE) {
            echo "Не могу произвести запись в файл $filename" . PHP_EOL;
            $running = false;
            $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
            exit;
        }
        fclose($handle);
    } else {
        echo "Файл $filename недоступен для записи" . PHP_EOL;
        $running = false;
        $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
        exit;
    }
    echo 'Генерация файла YML завершена';
    $offset = 0;
    $modx->cacheManager->set('offset', $offset, 0, array('cache_key' => 'ymarket'));
}

$running = false;
$modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket'));
exit;


0 комментариев

    Авторизация

    через сервис Loginza:

    Подписка или RSS

    Буду присылать новые статьи — никакого спама



    Шаблоны MODX

    1 2 Дальше »

    Объектная
    модель
    MODX