Skip to content

Commit

Permalink
Документация
Browse files Browse the repository at this point in the history
  • Loading branch information
notdest committed Mar 27, 2018
1 parent 43f9923 commit c16ef6d
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 67 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Yml генератор на php
[Мероприятия](https://yandex.ru/support/partnermarket/export/event-tickets.html) | [Мероприятия](docs/event.md)
[Лекарства](https://yandex.ru/support/partnermarket/export/medicine.html) | [Лекарства](docs/medicine.md)

Остальные типы пока на подходе. Кстати не обязательно их все проверять, используются обычно общие поля и какой-то один тип.
Не обязательно проверять все, используются обычно общие поля и какой-то один тип.

**Простота встраивания.** Для каждого типа описаний сделан свой пример использования по принципу "удали лишнее". Порядок следования полей такой же, как и в документации, за исключением вынесенных в конструктор. Примеры выглядят вот так:
```php
Expand All @@ -44,8 +44,10 @@ $offer ->cbid(80) // Размер ставки на карточке това
Мероприятия | [examples/event.php](examples/event.php) | 26.03.2018
Лекарства | [examples/medicine.php](examples/medicine.php) | Невозможна <br>26.03.2018

Остальные будут немного позже. Валидация проводилась с помощью [сервиса Яндекса](https://webmaster.yandex.ru/tools/xml-validator/), указывая тип *"Маркет"*.
Валидация проводилась с помощью [сервиса Яндекса](https://webmaster.yandex.ru/tools/xml-validator/), указывая тип *"Маркет"*.

Также был сделан нагрузочный тест [examples/stress-test.php](examples/stress-test.php). Не смотря на установленный memory_limit в 128M у компьютера заканчивалась память(4 Гб). При запуске на 100,000 товарных предложений занятая память поднималась с 1.3 до 2.7 Гб и больше не опускалась. При этом был сгенерирован xml-файл весом 157 Мб (разрешено 500 Мб). Это был максимальный объем, который получилось сгенерировать через браузер. При запуске из консоли на 200,000 товарных предложений потребление памяти выросло с 0.96 до 3.7 Гб, после окончания работы снова вернулось к 0.9 Гб. При этом был создан файл весом 314 Мб. Рекомендую не устанавливать нагрузочный тест на рабочий сервер, т.к. он очень удобен для DOS-атаки.

В случае необходимости внести изменения, рекомендую сначала ознакомиться с документацией по классам [ymlDocument](docs/ymlDocument.md) и [ymlOffer](docs/ymlOffer.md).

**P.S.** Ставь звездочки, если считаешь, что проект должен быть в топе.
4 changes: 2 additions & 2 deletions docs/audiobook.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
|language | - |
|table_of_contents | - | `contents()`
|type | =audiobook | спрятан в конструкторе
|performed_by | - |performer('Николай Фоменко')
|performance_type | - |performance('радиоспектакль')
|performed_by | - |`performer()`
|performance_type | - |`performance()`
|storage | - |
|format | - |
|recording_length | - |`length()`
Expand Down
6 changes: 3 additions & 3 deletions docs/yml.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ version | - | `cms()`
agency | - |
email | email |
`currencies` | разделитель - точка | `currency()`
`categories` | int > 0 для id и parentId |
`delivery-options` | не больше 5 шт, int и т.д.|
cpa | boolean, 0 и 1 на выходе | `delivery()`
`categories` | int > 0 для id и parentId | `category()`
`delivery-options` | не больше 5 шт, int и т.д.| `delivery()`
cpa | boolean, 0 и 1 на выходе |
offers | | в конструкторе соответсвующего<br> типа оффера


Expand Down
49 changes: 28 additions & 21 deletions docs/ymlDocument.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,54 @@
YmlDocument Class
============

наследуется от http://php.net/manual/ru/class.domdocument.php
Наследуется от [DomDocument](http://php.net/manual/ru/class.domdocument.php)

`__construct($name, $company ,$enc = "UTF-8")` - тут создается сам xml и добавляются первые обязательные параметры.

`__construct($name, $company ,$url ,$enc = "UTF-8")`
Тут создается сам xml и добавляются первые обязательные параметры. **Их надо проверить!!!**
---------
Далее идет группа параметров самого магазина(общие поля):

`cms($name,$version = false)` добавляем cms и опционально версию
`url($url)` - проверяем длину, 50 символов.

`agency($name)` студия, тупо добавляем
`cms($name,$version = false)` - добавляем cms и опционально версию.

`email($mail)` валидируем и добавляем
`agency($name)` - студия, просто добавляем.

`function delivery($cost,$days,$before = -1)` добавить одну доставку. много проверок
`email($mail)` - валидируем и добавляем.

`cpa($val = true)` на входе bool, на выходе "0" или "1"
`delivery($cost,$days,$before = -1)` - добавить одну доставку. много проверок.

`currency($id,$rate,$plus = 0)` проверяем отсутствие запятых в числах. Опционально надбавка сверху курса
`cpa($val = true)` - на входе bool, на выходе "0" или "1".

`category($id,$name,$parentId = false)` int > 0 . Опционально ид родителя
`currency($id,$rate,$plus = 0)` - проверяем отсутствие запятых в числах. Опционально надбавка сверху курса.

`category($id,$name,$parentId = false)` - id целые и положительные . Опционально id родителя.

------------------
Далее идет группа функций, которые возвращают товарные предложения нужного типа.<br>
**Возможно требует внимания**, поскольку я часто забываю здесь установить обязательный параметр, или путаю значение для `type`.

`simple( $price, $currency,$category,$name, $url='' )` - создаем упрощенный оффер, проверяем длину имени
`simple( $name, $id, $price, $currency, $category, $from = NULL )` - создаем упрощенный оффер, проверяем длину имени.

`arbitrary( $price, $currency,$category,$vendor,$model, $url='' )` - создаем произвольный оффер
`arbitrary( $model, $vendor, $id, $price, $currency, $category, $from = NULL )` - создаем произвольный оффер.

`book( $price, $currency,$category,$name, $url='' )` - оффер с книгами, на имя забил
`book($name, $publisher, $age, $age_u, $id, $price, $currency, $category, $from = NULL)` - оффер с книгами.

`audiobook( $price, $currency,$category,$name, $url='' )` - оффер с аудиокнигами, на имя забил
`audiobook( $name, $publisher, $id, $price, $currency, $category, $from = NULL )` - оффер с аудиокнигами.

`music( $price, $currency,$category,$name, $url='' )` - музыка, на имя забил
`artist( $title, $id, $price, $currency, $category, $from = NULL )` - аудио и видеопродукция.

`video( $price, $currency,$category,$name, $url='' )` - видео, name становится title
`tour( $name,$days,$included,$transport, $id, $price, $currency, $category, $from = NULL )` - туры, побоялся устанавливать ограничение на длину имени.

`tour( $price, $currency,$category,$name,$days,$included,$transport, $url='' )` - тур, явно напутал type
`event( $name,$place,$date, $id, $price, $currency, $category, $from = NULL)` - событие, длину имени тоже не ограничиваю.

`event( $price, $currency,$category,$name,$place,$date, $url='' )` - событие, явно напутал type
`medicine( $name, $id, $price, $currency, $category, $from = NULL )` - лекарства. Ряд параметров устанавливаю принудительно.

---------------
`newOffer( $price, $currency,$category,$type,$url )` - служебная функция, **все сверху её юзают**
Далее идет ряд служебных `protected`-функций:

`newOffer( $id, $price, $currency, $category, $type, $from )` - вызывается при создании любого типа оффера, требует и проверяет поля обязательные для всех типов.

`exc($text)` - обижаемся и выкидываем исключени
`exc($text)` - короткий псевдоним для выкидывания исключений.

`add($name,$value=false)` - добавляем элемент в этом, глобальном пространстве
`add($name,$value=false)` - Добавляем элемент к элементу `shop`. Все общие поля магазина используют эту функцию.
72 changes: 33 additions & 39 deletions docs/ymlOffer.md
Original file line number Diff line number Diff line change
@@ -1,83 +1,77 @@
YmlOffer Class
============
Смотри исходник, а не визуализацию в браузере
Унаследован от класса [DomElement](http://php.net/manual/ru/class.domelement.php).

http://php.net/manual/ru/class.domelement.php


`protected $type` - переменная, в которую в конструкторе записывается тип нашего Offer, т.е. упрощенный, произвольный, книги и т.д.
`protected $type` - переменная, в которую в конструкторе записывается тип нашего Offer, т.е. 'упрощенный', 'произвольный', 'книги' и т.д.

`protected $permitted` - массив, в который в конструкторе записывается список разрешенных полей для данного типа товарного предложения.

`protected $aliases` - в этом массиве записываются короткие имена для некоторых полей, например *origin* вместо *country_of_origin*. **Атеншн!!! проверь работу без алиасов**
`protected $aliases` - в этом массиве записываются короткие имена для некоторых полей, например *origin* вместо *country_of_origin*. Методы можно вызывать и по оригинальным названием полей. Но! Если псевдоним сделан вне этого массива, то вызов возможен только по псевдониму.

----------------------

`public __construct($type)` - в нем мы только записываем тип предложения и какие функции разрешены для этого типа. Переменная `$p` создавалась из **Таблички** с перечислением полей, и сюда не включаются поля доступные всем предложениям. Вместо этого они просто объявляются как public. Если поле обязательное, то оно вообще прячется в конструкторе данного типа предложения в ymlDocument.php, а здесь запрещается, чтобы повторно не вызвали.
`__construct($type,$enc)` - в нем мы только записываем тип предложения и какие функции разрешены для этого типа. Переменная `$p` создавалась из таблицы [Обзор_полей.ods](Обзор_полей.ods). Некоторых полей здесь нет, они просто объявлены как `public`. Если поле обязательное, то оно вообще прячется в конструкторе данного типа предложения в *ymlDocument.php*, а здесь запрещается, чтобы повторно не вызвали.

----------------
Дальше идет небольшой блок полей, доступных всем предложениям. Они ещё в добавок все записываются как атрибуты корневого элемента "offer", а не как самостоятельное поле с значением.

`public id($id)` - короче 20 символов и только буквы и цифры.

Дальше идет небольшой блок полей, доступных всем предложениям. Некоторые записываются как атрибут поля `offer`.

`public available($val=true)` - boolean.
`available($val=true)` - boolean, атрибут.

`bid($bid)` - integer, атрибут.

`public bid($bid)` - integer.
`cbid($cbid)` - integer, атрибут.

`fee($fee)` - integer, атрибут.

`public cbid($cbid)` - integer.
`url($url)` - не длиннее 512 символов.

`oldprice($oldprice)` - целое и положительное.

`public fee($fee)` - integer.
`dlvOption($cost,$days,$before = -1)` - добавляет опцию доставки, проверят их количество и типы. Невозможно вызвать как `delivery-options` или `option`.

`url` и тд
`description($txt,$tags = false)` - проверяет длину и добавляет, при необходимости через CDATA.

---------------
### Вот с этой функцией очень надо разобраться ###

`__call($method, $args)` - "волшебный метод", в котором спрятанно всё разграничение полей между типами офферов. Сначала мы расшифровываем псевдоним функции, если он есть. Потом проверяем, а разрешено ли данное поле у данного типа оффера. Потом идут "значения, которые просто добавляем" - чтобы не создавать десятки однотипных функций без проверок, мы просто добавляем поле по имени. Потом флаги, у которых тоже проверка только на boolean. Ну и если до сих пор мы не нашли ни чего нужного - значит этой функциии нужны более сложные проверки, добавляем подчеркивание и вызываем.
`__call($method, $args)` - "волшебный метод", в котором спрятано всё разграничение полей между типами офферов. Сначала мы расшифровываем псевдоним функции, если он есть. Потом проверяем, а разрешено ли данное поле у данного типа оффера. Потом идут "значения, которые просто добавляем" - чтобы не создавать десятки однотипных функций без проверок, мы просто добавляем поле по имени. Потом флаги, у которых тоже проверка только на boolean. Ну и если до сих пор мы не нашли ничего нужного - значит этой функции нужны более сложные проверки, добавляем подчеркивание и вызываем.

---------------
А вот здесь идут те самые функции с чуть более сложными проверками. Все они принимают **массив** входных параметров из функции `__call()`

`protected _page_extent($args)` - int>0.


`protected _description($args)` - длина 175.
Далее идут те самые функции с чуть более сложными проверками. Все они принимают **массив** входных параметров из функции `__call()`. Также они все `protected`, чтобы нельзя было вызвать минуя ограничение.

`_minq($args)` - int>0, нельзя вызвать как min-quantity. Есть возможность вызвать для лекарств, которой тоже не должно быть.

`protected _sales_notes($args)` - длина 50
`_stepq($args)` - int>0, нельзя вызвать как step-quantity.

`_page_extent($args)` - int>0.

`protected _age($args)` - 0, 6, 12, 16 или 18 для age, 0<=age<=12 для month
`_sales_notes($args)` - не длиннее 50 символов.

`_age($args)` - проверка на список допустимых значений.

`protected _param($args)` - просто 2-3 входных параметра
`_param($args)` - нет проверок, но специфично добавляется.

`_picture( $args )` - проверка на количество и длину адреса.

`protected _picture( $args )` - не больше 10шт, не длинне 512 символов
`_group_id($args)` - int не длиннее 9 цифр.

`_barcode($args)` - список допустимых длин.

`protected _barcode($args)` - 8, 12 или 13 цифр
`_year($args)` - int.

`_dimensions($args)` - float 3 раза.

`protected _year($args)` - int
`_weight($args)` - float.


`protected _dimensions($args)` - 3 раза float


`protected _weight($args)` - float


`protected _cpa($args)` - на выходе 0 или 1
`_cpa($args)` - boolean, на выходе 0 и 1

------------
Пара служебных функций
Далее несколько служебных функций.

`check($expr , $msg)` - сокращение для выкидывания исключений.

`public addStr( $name,$val,$limit )` - добавить строчку с ограничением длины
`addStr( $name,$val,$limit )` - добавить строчку с ограничением длины.


`public add( $name,$val=false )` - просто добавить элемент
`add( $name,$val=false )` - просто добавить элемент.
Binary file added docs/Обзор_полей.ods
Binary file not shown.
Binary file removed docs/Разбор изменений.ods
Binary file not shown.
Binary file removed docs/обзор.ods
Binary file not shown.
1 change: 1 addition & 0 deletions ymlDocument.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ public function category($id,$name,$parentId = false)
public function simple( $name, $id, $price, $currency, $category, $from = NULL )
{
$offer = $this->newOffer( $id, $price, $currency, $category,'simple', $from );
$offer->addStr('name',$name,120);
return $offer;
}

Expand Down

0 comments on commit c16ef6d

Please sign in to comment.