<?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 = __DIR__ . '/yandexmarket-gen.yml';
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' => 23,
'where' => '{"class_key":"msCategory"}',
'depth' => 0,
'sortby' => '{"menuindex":"ASC"}',
'limit' => 0, 'tpl' => 'categories'
)) .
'</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' => 'offer', 'includeContent' => 1, 'includeTVs' => 'img,image', 'where' => '{"Data.price:>":0}'
))) {
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;
}
unlink(MODX_BASE_PATH . 'yandexmarket.yml');
rename($filename, MODX_BASE_PATH . 'yandexmarket.yml');
fopen($filename, 'w');
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;
categories
<category id="[[+id]]" [[+parent:is=`23`:then=``:else=`parentId="[[+parent]]"`]]>[[+menutitle:default=`[[+pagetitle]]`:clearYML]]</category>
[[pdoResources? &parents=`{$id}` &where=`{ "class_key":"msCategory" }` &depth=`0` &sortby=`{ "menuindex":"ASC" }` &limit=`0` &tpl=`categories`]]offer
<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}</picture>
<name>{$pagetitle | clearYML}</name>
<model>{($article ?: 'id' ~ $id)| clearYML}</model>
<description>{(($content | striptags) ?: $description) | clearYML}</description>
<vendor>{$_pls['vendor.name'] | clearYML}</vendor>
<vendorCode>{($article ?: 'id' ~ $id) | clearYML}</vendorCode>
<sales_notes>Предоплата 100% Товар отгружается кратно упаковкам</sales_notes>
</offer>clearYML
<?php
$output = str_replace(
array('…', '&', '"', '>', '<', '\''),
array('...', '&', '"', '>', '<', '''),
$input);
return str_replace('&', '&', $output);
Объектная
Когда генерация будет завершена, содержимое файла будет скопировано в корень сайта. После этого, чтобы запустить генерацию нового файла, нужно просто удалить файл yandexmarket-gen.yml
У меня настроена задача ежедневно удалять файл в 3 часа ночи. Тогда к утру файл для яндекс-маркета обновляется и каждый день он более-менее свежий.
У меня ничего не происходит.
Категория
<category id="[[+id]]" [[+parent:is=`12`:then=``:else=`parentId="[[+parent]]"`]] > [[+pagetitle:stripString=`&`:stripString=` `:striptags=``:replace=`&==&`]] </category>ПродуктYML любит ругаться на запрещенные символы, поэтому их нужно вырезать или заменять на допустимые
noreplzh@sakura:~/noreplzh.beget.tech/public_html [0] $ php7.4 -d display_errors -d error_reporting=E_ALL ~/noreplzh.beget.tech/public_html/core/components/ymarket/generate.php
Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0
Приступаю к генерации YML-файла
[2023-04-27 21:51:10] (ERROR @ /home/n/noreplzh/noreplzh.beget.tech/public_html/core/components/ymarket/generate.php: 130) PHP warning: unlink(/home/n/noreplzh/noreplzh.beget.tech/public_html/yandexmarket.yml): No such file or directory
Генерация файла YML завершенаnoreplzh@sakura:~/noreplzh.beget.tech/public_html [0] $ php7.4 -d display_errors -d error_reporting=E_ALL ~/noreplzh.beget.tech/public_html/core/components/ymarket/generate.php
Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0