mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
436 lines
16 KiB
436 lines
16 KiB
8 years ago
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Replace function htmlspecialchars_decode()
|
||
|
*
|
||
|
* @category PHP
|
||
|
* @package PHP_Compat
|
||
|
* @license LGPL - http://www.gnu.org/licenses/lgpl.html
|
||
|
* @copyright 2004-2007 Aidan Lister <aidan@php.net>, Arpad Ray <arpad@php.net>
|
||
|
* @link http://php.net/function.htmlspecialchars_decode
|
||
|
* @author Aidan Lister <aidan@php.net>
|
||
|
* @version $Revision: 1.6 $
|
||
|
* @since PHP 5.1.0
|
||
|
* @require PHP 4.0.0 (user_error)
|
||
|
*/
|
||
|
function php_compat_htmlspecialchars_decode($string, $quote_style = null)
|
||
|
{
|
||
|
// Sanity check
|
||
|
if (!is_scalar($string)) {
|
||
|
user_error('htmlspecialchars_decode() expects parameter 1 to be string, ' .
|
||
|
gettype($string) . ' given', E_USER_WARNING);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!is_int($quote_style) && $quote_style !== null) {
|
||
|
user_error('htmlspecialchars_decode() expects parameter 2 to be integer, ' .
|
||
|
gettype($quote_style) . ' given', E_USER_WARNING);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// The function does not behave as documented
|
||
|
// This matches the actual behaviour of the function
|
||
|
if ($quote_style & ENT_COMPAT || $quote_style & ENT_QUOTES) {
|
||
|
$from = array('"', ''', '<', '>', '&');
|
||
|
$to = array('"', "'", '<', '>', '&');
|
||
|
} else {
|
||
|
$from = array('<', '>', '&');
|
||
|
$to = array('<', '>', '&');
|
||
|
}
|
||
|
|
||
|
return str_replace($from, $to, $string);
|
||
|
}
|
||
|
|
||
|
// Define
|
||
|
if (!function_exists('htmlspecialchars_decode')) {
|
||
|
function htmlspecialchars_decode($string, $quote_style = null)
|
||
|
{
|
||
|
return php_compat_htmlspecialchars_decode($string, $quote_style);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* AVE.cms
|
||
|
*
|
||
|
* @package AVE.cms
|
||
|
* @filesource
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Класс генерации YML
|
||
|
* YML (Yandex Market Language) - стандарт, разработанный "Яндексом"
|
||
|
* для принятия и публикации информации в базе данных Яндекс.Маркет
|
||
|
* YML основан на стандарте XML (Extensible Markup Language)
|
||
|
* описание формата данных YML http://partner.market.yandex.ru/legal/tt/
|
||
|
*/
|
||
|
class AVE_YML
|
||
|
{
|
||
|
|
||
|
/**
|
||
|
* СВОЙСТВА
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Кодировка
|
||
|
*
|
||
|
* @public string
|
||
|
*/
|
||
|
public $from_charset = 'windows-1251';
|
||
|
|
||
|
/**
|
||
|
* Элемент описания магазина
|
||
|
*
|
||
|
* @public string
|
||
|
*/
|
||
|
public $shop = array('name'=>'', 'company'=>'', 'url'=>'');
|
||
|
|
||
|
/**
|
||
|
* Элемент валюты
|
||
|
*
|
||
|
* @public string
|
||
|
*/
|
||
|
public $currencies = array();
|
||
|
|
||
|
/**
|
||
|
* Элемент категории
|
||
|
*
|
||
|
* @public string
|
||
|
*/
|
||
|
public $categories = array();
|
||
|
|
||
|
/**
|
||
|
* Элемент предложения
|
||
|
*
|
||
|
* @public string
|
||
|
*/
|
||
|
public $offers = array();
|
||
|
|
||
|
/**
|
||
|
* Конструктор
|
||
|
*
|
||
|
* @param string $from_charset
|
||
|
*/
|
||
|
function AVE_YML($from_charset = 'windows-1251')
|
||
|
{
|
||
|
$this->from_charset = trim(strtolower($from_charset));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* ВНУТРЕННИЕ МЕТОДЫ
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Преобразование массива в тег
|
||
|
*
|
||
|
* @param array $tags
|
||
|
* @return string
|
||
|
*/
|
||
|
function _ymlArray2Tag($tags)
|
||
|
{
|
||
|
$tag = '';
|
||
|
foreach ($tags as $tag_name => $tag_value)
|
||
|
{
|
||
|
$tag .= '<' . $tag_name . '>' . $tag_value . '</' . $tag_name . '>';
|
||
|
}
|
||
|
$tag .= "\r\n";
|
||
|
|
||
|
return $tag;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Преобразование массива в атрибуты
|
||
|
*
|
||
|
* @param array $attributes
|
||
|
* @param string $tag_name
|
||
|
* @param string $tag_value
|
||
|
* @return string
|
||
|
*/
|
||
|
function _ymlArray2Attribute($attributes, $tag_name, $tag_value = '')
|
||
|
{
|
||
|
$attribute = '<' . $tag_name . ' ';
|
||
|
foreach ($attributes as $attribute_name => $attribute_value)
|
||
|
{
|
||
|
$attribute .= $attribute_name . '="' . $attribute_value . '" ';
|
||
|
}
|
||
|
$attribute .= ($tag_value != '') ? '>' . $tag_value . '</' . $tag_name . '>' : '/>';
|
||
|
$attribute .= "\r\n";
|
||
|
|
||
|
return $attribute;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Подготовка текстового поля в соответствии с требованиями Яндекса
|
||
|
* Запрещены любые html-теги. Стандарт XML не допускает использования в текстовых данных
|
||
|
* непечатаемых символов с ASCII-кодами в диапазоне значений от 0 до 31 (за исключением
|
||
|
* символов с кодами 9, 10, 13 - табуляция, перевод строки, возврат каретки). Также этот
|
||
|
* стандарт требует обязательной замены некоторых символов на эквивалентные им символьные
|
||
|
* примитивы.
|
||
|
* @param string $field
|
||
|
* @return string
|
||
|
*/
|
||
|
function _ymlFieldPrepare($field)
|
||
|
{
|
||
|
$field = htmlspecialchars_decode(trim($field));
|
||
|
$field = strip_tags($field);
|
||
|
$from = array('"', '&', '>', '<', '\'');
|
||
|
$to = array('"', '&', '>', '<', ''');
|
||
|
$field = str_replace($from, $to, $field);
|
||
|
if ($this->from_charset != 'windows-1251')
|
||
|
{
|
||
|
$field = iconv($this->from_charset, 'windows-1251//IGNORE//TRANSLIT', $field);
|
||
|
}
|
||
|
$field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field);
|
||
|
|
||
|
return trim($field);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* формирование элемента catalog
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
function _ymlElementCatalogGet()
|
||
|
{
|
||
|
$eol = "\r\n";
|
||
|
|
||
|
$catalog = '<shop>' . $eol;
|
||
|
|
||
|
// информация о магазине
|
||
|
$catalog .= $this->_ymlArray2Tag($this->shop);
|
||
|
|
||
|
// валюты
|
||
|
$catalog .= '<currencies>' . $eol;
|
||
|
foreach ($this->currencies as $currency)
|
||
|
{
|
||
|
$catalog .= $this->_ymlArray2Attribute($currency, 'currency');
|
||
|
}
|
||
|
$catalog .= '</currencies>' . $eol;
|
||
|
|
||
|
// категории
|
||
|
$catalog .= '<categories>' . $eol;
|
||
|
foreach ($this->categories as $category)
|
||
|
{
|
||
|
$category_name = $category['name'];
|
||
|
unset($category['name']);
|
||
|
$catalog .= $this->_ymlArray2Attribute($category, 'category', $category_name);
|
||
|
}
|
||
|
$catalog .= '</categories>' . $eol;
|
||
|
|
||
|
// товарные позиции
|
||
|
$catalog .= '<offers>' . $eol;
|
||
|
foreach ($this->offers as $offer)
|
||
|
{
|
||
|
$data = $offer['data'];
|
||
|
unset($offer['data']);
|
||
|
$catalog .= $this->_ymlArray2Attribute($offer, 'offer', $this->_ymlArray2Tag($data));
|
||
|
}
|
||
|
$catalog .= '</offers>' . $eol;
|
||
|
|
||
|
$catalog .= '</shop>';
|
||
|
|
||
|
return $catalog;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* ВНЕШНИЕ МЕТОДЫ
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Формирование массива для элемента shop описывающего магазин
|
||
|
*
|
||
|
* @param string $name - Короткое название магазина (название, которое выводится в списке
|
||
|
* найденных на Яндекс.Маркете товаров. Не должно содержать более 20 символов).
|
||
|
* Нельзя использовать слова, не имеющие отношения к наименованию магазина ("лучший", "дешевый"),
|
||
|
* указывать номер телефона и т.п. Название магазина, должно совпадать с фактическим названием
|
||
|
* магазина, которое публикуется на сайте. При несоблюдении данного требования наименование
|
||
|
* может быть изменено Яндексом самостоятельно без уведомления Клиента.
|
||
|
* @param string $company - Полное наименование компании, владеющей магазином.
|
||
|
* Не публикуется, используется для внутренней идентификации.
|
||
|
* @param string $url - URL-адрес главной страницы магазина
|
||
|
*/
|
||
|
function ymlElementShopSet($name, $company, $url)
|
||
|
{
|
||
|
$this->shop['name'] = substr($this->_ymlFieldPrepare($name), 0, 20);
|
||
|
$this->shop['company'] = $this->_ymlFieldPrepare($company);
|
||
|
$this->shop['url'] = $this->_ymlFieldPrepare($url);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Добавление валюты
|
||
|
*
|
||
|
* @param string $id - код валюты (RUR, UAH, USD, EUR...)
|
||
|
* @param float|string $rate - курс этой валюты к валюте, взятой за единицу.
|
||
|
* Параметр rate может иметь так же следующие значения:
|
||
|
* CBRF - курс по Центральному банку РФ.
|
||
|
* NBU - курс по Национальному банку Украины.
|
||
|
* СВ - курс по банку той страны, к которой относится интернет-магазин
|
||
|
* по Своему региону, указанному в Партнерском интерфейсе Яндекс.Маркета.
|
||
|
* @param int $plus - используется только в случае rate = CBRF, NBU или СВ
|
||
|
* и означает насколько увеличить курс в процентах от курса выбранного банка
|
||
|
* @return bool
|
||
|
*/
|
||
|
function ymlElementCurrencySet($id, $rate = 'CBRF', $plus = 0)
|
||
|
{
|
||
|
$rate = strtoupper($rate);
|
||
|
$allow_rate = array('CBRF', 'NBU', 'CB');
|
||
|
if (in_array($rate, $allow_rate))
|
||
|
{
|
||
|
$plus = str_replace(',', '.', $plus);
|
||
|
if ($plus > 0)
|
||
|
{
|
||
|
$this->currencies[] = array(
|
||
|
'id'=>$this->_ymlFieldPrepare(strtoupper($id)),
|
||
|
'rate'=>$rate,
|
||
|
'plus'=>(float)$plus
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$this->currencies[] = array(
|
||
|
'id'=>$this->_ymlFieldPrepare(strtoupper($id)),
|
||
|
'rate'=>$rate
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$rate = str_replace(',', '.', $rate);
|
||
|
$this->currencies[] = array(
|
||
|
'id'=>$this->_ymlFieldPrepare(strtoupper($id)),
|
||
|
'rate'=>(float)$rate
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Добавление категории товаров
|
||
|
*
|
||
|
* @param string $name - название рубрики
|
||
|
* @param int $id - id рубрики
|
||
|
* @param int $parent_id - id родительской рубрики, если нет, то -1
|
||
|
* @return bool
|
||
|
*/
|
||
|
function ymlElementCategorySet($name, $id, $parent_id = -1)
|
||
|
{
|
||
|
if ((int)$id < 1 || trim($name) == '') return false;
|
||
|
if ((int)$parent_id > 0)
|
||
|
{
|
||
|
$this->categories[] = array(
|
||
|
'id'=>(int)$id,
|
||
|
'parentId'=>(int)$parent_id,
|
||
|
'name'=>$this->_ymlFieldPrepare($name)
|
||
|
);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$this->categories[] = array(
|
||
|
'id'=>(int)$id,
|
||
|
'name'=>$this->_ymlFieldPrepare($name)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Добавление товарного предложения
|
||
|
*
|
||
|
* @param int $id - id товара (товарного предложения)
|
||
|
* @param array $data - массив остальных параметров (звездочкой помечены обязательные)
|
||
|
* *url - URL-адрес страницы товара.
|
||
|
* *name - Наименование товарного предложения.
|
||
|
* *description - Описание товарного предложения.
|
||
|
* *price - Цена, по которой данный товар можно приобрести.
|
||
|
* Цена товарного предложения округляеся и выводится в зависимости от настроек пользователя.
|
||
|
* *currencyId - Идентификатор валюты товара (RUR, USD, UAH).
|
||
|
* Для корректного отображения цены в национальной валюте, необходимо использовать
|
||
|
* идентификатор (например, UAH) с соответствующим значением цены.
|
||
|
* *categoryId - Идентификатор категории товара (целое число не более 18 знаков).
|
||
|
* Товарное предложение может принадлежать только одной категории.
|
||
|
* *delivery - Элемент, обозначающий возможность доставить соответствующий товар.
|
||
|
* "false" данный товар не может быть доставлен("самовывоз").
|
||
|
* "true" товар доставляется на условиях, которые указываются в партнерском интерфейсе
|
||
|
* http://partner.market.yandex.ru на странице "редактирование".
|
||
|
* picture - Ссылка на картинку соответствующего товарного предложения.
|
||
|
* Недопустимо давать ссылку на "заглушку", т.е. на картинку где написано
|
||
|
* "картинка отсутствует" или на логотип магазина.
|
||
|
* vendor - Производитель.
|
||
|
* vendorCode - Код товара (указывается код производителя).
|
||
|
* local_delivery_cost - Стоимость доставки данного товара в Своем регионе.
|
||
|
* sales_notes - Элемент, предназначенный для того, чтобы показать пользователям,
|
||
|
* чем отличается данный товар от других, или для описания акций магазина (кроме скидок).
|
||
|
* Допустимая длина текста в элементе - 50 символов.
|
||
|
* manufacturer_warranty - Элемент предназначен для отметки товаров,
|
||
|
* имеющих официальную гарантию производителя. {true|false}
|
||
|
* country_of_origin - Элемент предназначен для указания страны производства товара.
|
||
|
* downloadable - Элемент предназначен для обозначения товара, который можно скачать.
|
||
|
* @param bool $available - Статус доступности товара - в наличии/на заказ.
|
||
|
* "true" - товарное предложение в наличии.
|
||
|
* Магазин готов сразу договариваться с покупателем о доставке товара
|
||
|
* "false" - товарное предложение на заказ.
|
||
|
* Магазин готов осуществить поставку товара на указанных условиях в течение месяца
|
||
|
* (срок может быть больше для товаров, которые всеми участниками рынка поставляются только на заказ)..
|
||
|
* Те товарные предложения, на которые заказы не принимаются, не должны выгружаться в Яндекс.Маркет.
|
||
|
*/
|
||
|
function ymlElementOfferSet($id, $data, $available = true)
|
||
|
{
|
||
|
$allowed = array(
|
||
|
'url',
|
||
|
'price',
|
||
|
'currencyId',
|
||
|
'categoryId',
|
||
|
'picture',
|
||
|
'delivery',
|
||
|
'local_delivery_cost',
|
||
|
'name',
|
||
|
'vendor',
|
||
|
'vendorCode',
|
||
|
'description',
|
||
|
'sales_notes',
|
||
|
'manufacturer_warranty',
|
||
|
'country_of_origin',
|
||
|
'downloadable'
|
||
|
);
|
||
|
|
||
|
foreach ($data as $k => $v)
|
||
|
{
|
||
|
if (!in_array($k, $allowed)) unset($data[$k]);
|
||
|
$data[$k] = strip_tags($this->_ymlFieldPrepare($v));
|
||
|
}
|
||
|
$tmp = $data;
|
||
|
$data = array();
|
||
|
// Стандарт XML учитывает порядок следования элементов,
|
||
|
// поэтому важно соблюдать его в соответствии с порядком описанным в DTD
|
||
|
foreach ($allowed as $key)
|
||
|
{
|
||
|
if (isset($tmp[$key])) $data[$key] = $tmp[$key];
|
||
|
}
|
||
|
$this->offers[] = array(
|
||
|
'id'=>(int)$id,
|
||
|
'data'=>$data,
|
||
|
'available'=>($available) ? 'true' : 'false'
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Получить весь YML файл
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
function ymlGet()
|
||
|
{
|
||
|
$eol = "\r\n";
|
||
|
|
||
|
$yml = '<?xml version="1.0" encoding="windows-1251"?>' . $eol;
|
||
|
$yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $eol;
|
||
|
$yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $eol;
|
||
|
$yml .= $this->_ymlElementCatalogGet();
|
||
|
$yml .= '</yml_catalog>';
|
||
|
|
||
|
return $yml;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
?>
|