Skip to content

Instantly share code, notes, and snippets.

@fomigo
Created August 9, 2012 15:14
Show Gist options
  • Save fomigo/3305045 to your computer and use it in GitHub Desktop.
Save fomigo/3305045 to your computer and use it in GitHub Desktop.
YML export for miniShop
<?php
$siteName = $modx->getOption('siteName', $scriptProperties, $modx->getOption('site_name')); // Имя сайта
$companyName = $modx->getOption('companyName', $scriptProperties, $modx->getOption('site_name')); // Компания
$bid = $modx->getOption('bid', $scriptProperties, 10); // Цена за клик
$categoriesTpl = $modx->getOption('minishop.categories_tpl'); // Шаблоны категорий
$goodsTpl = $modx->getOption('minishop.goods_tpl'); // Шаблоны товаров
$siteUrl = $modx->makeUrl($modx->getOption('site_start'), '', '', 'full'); // Ссылка на главную страницу сайта
$descTpl = strip_tags($modx->getOption('descTpl', $scriptProperties, '[[+description]]')); // Шаблон для описания товара, без html
// Параметры товаров
$paramsIn = $modx->getOption('paramsIn', $scriptProperties, 'ms'); // Где искать параметры товаров
$warehouse = $modx->getOption('warehouse', $scriptProperties, 1); // Склад, нужен только если параметры в ModGoods
$paramPrice = $modx->getOption('paramPrice', $scriptProperties, 'price'); // Цена
$paramImage = $modx->getOption('paramImage', $scriptProperties, 'img'); // Картинка
$paramCurrency = $modx->getOption('paramCurrency', $scriptProperties, 'RUR'); // Валюта
$paramDelivery = $modx->getOption('paramDelivery', $scriptProperties, 'true'); // Доставка, по умолчанию - да. Можно указать имя параметра.
//////////////////////////////////////////////////////////////////////////////
// Заголовок выгрузки
$yml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$yml .= "<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n";
$yml .= "<yml_catalog date=\"".date('Y-m-d H:i')."\">\n";
$yml .= " <shop>\n";
$yml .= " <name>$siteName</name>\n";
$yml .= " <company>$companyName</company>\n";
$yml .= " <url>$siteUrl</url>\n";
// Курсы валют, приравнены к курсу ЦБРФ
$yml .= " <currencies>\n";
$yml .= " <currency id=\"RUR\" rate=\"1\"/>\n";
$yml .= " <currency id=\"USD\" rate=\"CBRF\"/>\n";
$yml .= " <currency id=\"EUR\" rate=\"CBRF\"/>\n";
$yml .= " </currencies>\n";
// Секция категорий
$sql = "SELECT `id`,`parent`,`pagetitle` FROM {$modx->getTableName('modResource')} WHERE `template` IN ($categoriesTpl) AND `published` = 1 AND `deleted` != 1 AND `parent` != 0 ORDER BY `menuindex` ASC";
$q = new xPDOCriteria($modx, $sql);
if ($q->prepare() && $q->stmt->execute()){
$categories = $q->stmt->fetchAll(PDO::FETCH_ASSOC); // Все ресурсы-категории
// Получем все ID категорий
$categoriesIds = array();
foreach ($categories as $v) {
$categoriesIds[] = $v['id'];
}
}
$yml .= " <categories>\n";
foreach ($categories as $v) {
if (in_array($v['parent'], $categoriesIds)) {
$yml .= ' <category id="'.$v['id'].'" parentId="'.$v['parent'].'">'.$v['pagetitle'].'</category>'."\n";
}
else {
$yml .= ' <category id="'.$v['id'].'">'.$v['pagetitle'].'</category>'."\n";
}
}
$yml .= " </categories>\n";
// Секция описания товаров
if ($paramsIn == 'ms') {
if (!isset($modx->miniShop) || !is_object($modx->miniShop)) {
$modx->miniShop = $modx->getService('minishop','miniShop', $modx->getOption('core_path').'components/minishop/model/minishop/', array());
if (!($modx->miniShop instanceof miniShop)) return '';
}
if ($paramDelivery != 'true' && $paramDelivery != 'false') {$delivery = ",`ModGoods`.`$paramDelivery` as `delivery`";}
$sql = "SELECT `modResource`.`id`,`parent`,`pagetitle`,`longtitle`,`description`,`introtext`,
`ModGoods`.`$paramImage` as `image`, `ModGoods`.`$paramPrice` as `price` $delivery
FROM {$modx->getTableName('modResource')} as `modResource`
LEFT JOIN {$modx->getTableName('ModGoods')} as `ModGoods` ON (`modResource`.`id` = `ModGoods`.`gid` AND `wid` = $warehouse)
WHERE `template` IN ($goodsTpl) AND `published` = 1 AND `deleted` != 1
ORDER BY `pagetitle` ASC";
$q = new xPDOCriteria($modx, $sql);
if ($q->prepare() && $q->stmt->execute()){
$goods = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
else {
if (!is_int($paramPrice)) {
if ($tmp = $modx->getObject('modTemplateVar', array('name' => $paramPrice))) {
$paramPrice = $tmp->get('id');
}
}
if (!is_int($paramImage)) {
if ($tmp = $modx->getObject('modTemplateVar', array('name' => $paramImage))) {
$paramImage = $tmp->get('id');
}
}
if ($paramDelivery != 'true' && $paramDelivery != 'false') {
if (!is_int($paramDelivery)) {
if ($tmp = $modx->getObject('modTemplateVar', array('name' => $paramDelivery))) {
$paramDelivery = $tmp->get('id');
}
}
}
$sql = "SELECT `modResource`.`id`,`parent`,`pagetitle`,`longtitle`,`description`,`introtext`,
`tmplvarid`,`contentid`,`value`
FROM {$modx->getTableName('modResource')} as `modResource`
LEFT JOIN {$modx->getTableName('modTemplateVarResource')} as `modTemplateVarResource` ON (`modResource`.`id` = `modTemplateVarResource`.`contentid`)
WHERE `template` IN ($goodsTpl) AND `published` = 1 AND `deleted` != 1
ORDER BY `pagetitle` ASC";
$q = new xPDOCriteria($modx, $sql);
if ($q->prepare() && $q->stmt->execute()){
$tmp = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
$goods = array();
foreach ($tmp as $v) {
if (!array_key_exists($v['id'], $goods)) {
$goods[$v['id']] = array(
'id' => $v['id']
,'parent' => $v['parent']
,'pagetitle' => $v['pagetitle']
,'longtitle' => $v['longtitle']
,'description' => $v['longtitle']
,'introtext' => $v['longtitle']
,'delivery' => !is_int($paramDelivery) ? $paramDelivery : ''
);
}
if ($v['tmplvarid'] == $paramPrice) {$goods[$v['id']]['price'] = $v['value'];}
if ($v['tmplvarid'] == $paramImage) {$goods[$v['id']]['image'] = $v['value'];}
if ($v['tmplvarid'] == $paramDelivery && empty($goods[$v['id']]['delivery'])) {$goods[$v['id']]['delivery'] = $v['value'];}
}
}
$yml .= " <offers>\n";
foreach ($goods as $v) {
$image = preg_match('/^http/i', $v['image']) ? $v['image'] : $siteUrl.$v['image'];
$delivery = $paramDelivery == 'true' || $paramDelivery == 'false' ? $paramDelivery : $v['delivery'];
$pl = array('[[+pagetitle]]','[[+longtitle]]','[[+description]]','[[+introtext]]');
$vl = array($v['pagetitle'],$v['longtitle'],$v['description'],$v['introtext']);
$description = str_replace($pl, $vl, $descTpl);
$yml .= " <offer id=\"".$v['id']."\" available=\"true\" bid=\"$bid\">\n";
$yml .= " <url>".$modx->makeUrl($v['id'],'','','full')."</url>\n";
$yml .= " <price>".$v['price']."</price>\n";
$yml .= " <currencyId>".$paramCurrency."</currencyId>\n";
$yml .= " <categoryId>".$v['parent']."</categoryId>\n";
$yml .= " <picture>".$image."</picture>\n";
$yml .= " <delivery>".$delivery."</delivery> \n";
$yml .= " <name>".$v['pagetitle']."</name>\n";
$yml .= " <description>".$description."</description>\n";
$yml .= " </offer>\n";
}
$yml .= " </offers>\n";
$yml .= " </shop>\n";
$yml .= "</yml_catalog>\n";
return $yml;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment