|
<?php |
|
// Получаем через сниппет знаечние родительского блока или обходим весь сайт |
|
$startid = (isset($startid)) ? $startid : 0; |
|
|
|
// Собираем все в xml файл и выводим: |
|
// --------------------------------------------- |
|
//Формируем из функции наш список |
|
$docs = getDocs($modx, $startid); |
|
$output = '<?xml version="1.0" encoding="windows-1251"?>'.PHP_EOL; |
|
$output = '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">'.PHP_EOL; |
|
$output .='<yml_catalog date="[*editedon:date=`%Y-%m-%d %H:%M`*]">'.PHP_EOL; |
|
$output .='<shop>'.PHP_EOL; |
|
$output .='<name>[(site_name)]</name>'.PHP_EOL; |
|
$output .='<company>[(site_name)]</company>'.PHP_EOL; |
|
$output .='<url>[(site_url)]</url>'.PHP_EOL; |
|
$output .='<currencies> |
|
<currency id="RUR" rate="1"/> |
|
<currency id="EUR" rate="CBRF"/> |
|
<currency id="USD" rate="CBRF"/> |
|
</currencies>'.PHP_EOL; |
|
|
|
/* ------------------Категории------------------ */ |
|
$output .='<categories>'.PHP_EOL; |
|
foreach ($docs as $doc) { |
|
if ($doc['isfolder'] == 1){ |
|
$output .= '<category id="'.$doc['id'].'" '.($doc['parent'] != $startid ? 'parentId="'.$doc['parent'].'"' : '').'>'.$doc['pagetitle'].'</category>'.PHP_EOL; |
|
} |
|
} |
|
$output .='</categories>'; |
|
/* --------------------------------------------- */ |
|
|
|
|
|
/* --------------------Товары------------------- */ |
|
$output .='<offers>'.PHP_EOL; |
|
foreach ($docs as $doc) { |
|
if ($doc['isfolder'] == 0 && $doc['tv']['price'] != 'По запросу' && $doc['tv']['price'] != ''){ |
|
|
|
/*Этот ужас конкретно для моей задачи (нужно было выдернуть руб, евро и прочее. удалить все десятичные)*/ |
|
//Вместо цены в output ставим $doc['tv']['price'] |
|
//Вместо $cur_offer указываем валюту |
|
|
|
preg_match("/(?![\W])[\S].*(?>[\d]+)/i", $doc['tv']['price'], $price_array, PREG_OFFSET_CAPTURE); |
|
$price = str_replace(' ','', $price_array[0][0]); |
|
$price = explode(',', $price); |
|
$price = $price[0]; |
|
if (strripos($doc['tv']['price'], 'евро') !== false){ |
|
$cur_offer ='EUR'; |
|
}elseif(strripos($doc['tv']['price'], 'EURO') !== false){ |
|
$cur_offer ='EUR'; |
|
}elseif(strripos($doc['tv']['price'], '€') !== false){ |
|
$cur_offer ='EUR'; |
|
}elseif(strripos($doc['tv']['price'], '$') !== false){ |
|
$cur_offer ='USD'; |
|
}else{ |
|
$cur_offer ='RUR'; |
|
} |
|
/*******/ |
|
|
|
$output .= '<offer id="'.$doc['id'].'" available="true">'; |
|
$output .= '<url>[(site_url)][~'.$doc['id'].'~]</url>'; |
|
$output .= '<price>'.$price.'</price>'; |
|
$output .= '<currencyId>'.$cur_offer.'</currencyId>'; |
|
$output .= '<categoryId>'.$doc['parent'].'</categoryId>'; |
|
$output .= '<picture>[(site_url)]'.$doc['tv']['catalogitem.image'].'</picture>'; |
|
$output .= '<delivery>true</delivery>'; |
|
$output .= '<name>'.$doc['pagetitle'].'</name>'; |
|
|
|
//Максимальное кол-во символов в тексте |
|
$max_length = 170; |
|
//Удаляем из описания теги и html сущности |
|
$desc = yandex_text2xml($doc['content'], true); |
|
$output .= '<description>'.cut_words($max_length, $desc).'</description>'; |
|
|
|
$output .= '</offer>'; |
|
|
|
|
|
} |
|
} |
|
$output .='</offers>'; |
|
/* --------------------------------------------- */ |
|
$output .='</shop>'; |
|
$output .= '</yml_catalog>'; |
|
|
|
return $output; |
|
|
|
|
|
|
|
// Функции для сборки |
|
// --------------------------------------------- |
|
// Для обрезки текст |
|
function cut_words($maxlen, $text) { |
|
$len = (mb_strlen($text) > $maxlen)? mb_strripos(mb_substr($text, 0, $maxlen), ' ') : $maxlen; |
|
$cutStr = mb_substr($text, 0, $len); |
|
$temp = (mb_strlen($text) > $maxlen)? $cutStr. '...' : $cutStr; |
|
return $temp; |
|
} |
|
|
|
function yandex_text2xml($text, $bHSC = false, $bDblQuote = false) |
|
{ |
|
|
|
if ($bHSC) |
|
{ |
|
$text = htmlspecialchars(strip_tags($text)); |
|
if ($bDblQuote) |
|
$text = str_replace('"', '"', $text); |
|
} |
|
$text = preg_replace('/[\x01-\x08\x0B-\x0C\x0E-\x1F]/', "", $text); |
|
$text = str_replace("'", "'", $text); |
|
|
|
return $text; |
|
} |
|
|
|
|
|
// Перебераем тв-парамтры |
|
function getTV($modx, $docid, $template_vars){ |
|
$val_tv = $modx->getTemplateVars($template_vars, '*', $docid); |
|
$output = array(); // делаем массив с полученными тв-параметрами |
|
foreach ($val_tv as $key=>$v){ |
|
$output[$v['name']] = $v['value']; // Нам нужно только название и значение |
|
} |
|
return $output; |
|
} |
|
|
|
|
|
|
|
//Разбираем документы |
|
function getDocs($modx, $startid){ |
|
//Выбираем и сортируем нужные нам параметры |
|
$docs = $modx->getActiveChildren($startid, 'menuindex', 'asc', 'parent,id,editedon,template,published,searchable,pagetitle,type,isfolder,content'); |
|
// Полуачем нужные нам TV-парамтеры |
|
$template_vars = array( |
|
'price', //цена |
|
'catalogitem.image', //картинка |
|
//... и т.д |
|
); |
|
//Разбираем и обьединяем |
|
foreach ($docs as $key => $doc){ |
|
|
|
$id = $doc['id']; |
|
$docs[$key]['tv'] = getTV($modx, $id, $template_vars); // Добавляем тв параметры |
|
$docs = array_merge($docs, getDocs($modx, $id)); |
|
|
|
} |
|
// Отдаем обратно |
|
return $docs; |
|
} |