, Arpad Ray * @link http://php.net/function.htmlspecialchars_decode * @author Aidan Lister * @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 .= "\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 . '' : '/>'; $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 = '' . $eol; // информация о магазине $catalog .= $this->_ymlArray2Tag($this->shop); // валюты $catalog .= '' . $eol; foreach ($this->currencies as $currency) { $catalog .= $this->_ymlArray2Attribute($currency, 'currency'); } $catalog .= '' . $eol; // категории $catalog .= '' . $eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name']); $catalog .= $this->_ymlArray2Attribute($category, 'category', $category_name); } $catalog .= '' . $eol; // товарные позиции $catalog .= '' . $eol; foreach ($this->offers as $offer) { $data = $offer['data']; unset($offer['data']); $catalog .= $this->_ymlArray2Attribute($offer, 'offer', $this->_ymlArray2Tag($data)); } $catalog .= '' . $eol; $catalog .= ''; 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 = '' . $eol; $yml .= '' . $eol; $yml .= '' . $eol; $yml .= $this->_ymlElementCatalogGet(); $yml .= ''; return $yml; } } ?>