diff --git a/CHANGELOG.md b/CHANGELOG.md index e01ad89..6afc0ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,3 +2,13 @@ ## Current dev changes +## 8.x-1.0-alpha3 + +- **Breaking change.** Default filename was changed from products.yml to products.xml, because it's allowed by Yandex, and this is better for XML file. + +## 8.x-1.0-alpha2 + +No breaking changes. + +- Added first example. +- Fixed annotation for Shop info. \ No newline at end of file diff --git a/docs/real-examples.md b/docs/real-examples.md new file mode 100644 index 0000000..f071474 --- /dev/null +++ b/docs/real-examples.md @@ -0,0 +1,138 @@ +# Real code examples + +If you want to contribute, feel free to open the issue. + +## Example #1: Simple product from node + +Simple example based on nodes. + +### 1. Define service + +**MYMODULE.services.yml** + +```yml +services: + MYMODULE.yandex_yml: + class: Drupal\MYMODULE\YandexYmlService + arguments: ['@yandex_yml.generator', '@entity_type.manager'] +``` + +### 2. Create service object + +**/src/YandexYmlService.php** + +```php +generator = $yandex_yml_generator; + $this->entityTypeManager = $entity_type_manager; + } + + /** + * Return timestamp of last any product editing. + */ + public function getLastProductUpdateTime() { + return \Drupal::database()->select('node_field_data', 'n') + ->fields('n', ['changed']) + ->condition('n.type', 'NODE_TYPE') + ->orderBy('n.changed', 'DESC') + ->range(0, 1) + ->execute() + ->fetchField(); + } + + /** + * Generate result file. + */ + public function generateFile() { + /** @var \Drupal\yandex_yml\YandexYml\Shop\YandexYmlShop $shop_info */ + $shop_info = \Drupal::service('yandex_yml.shop') + ->setName('NAME') + ->setCompany('FULLNAME') + ->setEmail('developer@example.com') + ->setCpa(0); + $this->generator->setShopInfo($shop_info); + + $spare_parts = $this->entityTypeManager->getStorage('node') + ->loadByProperties([ + 'type' => 'NODE_TYPE', + 'status' => NodeInterface::PUBLISHED, + ]); + + /** @var \Drupal\yandex_yml\YandexYml\Currency\YandexYmlCurrency $currency */ + $currency = \Drupal::service('yandex_yml.currency'); + $currency->setId('RUB')->setRate(1); + $this->generator->addCurrency($currency); + + /** @var NodeInterface $spare_part */ + foreach ($spare_parts as $spare_part) { + /** @var \Drupal\yandex_yml\YandexYml\Offer\YandexYmlOfferSimple $offer */ + $offer = \Drupal::service('yandex_yml.offer.simple'); + $offer->setId($spare_part->id()) + ->setAvailable(TRUE) + ->setUrl($spare_part->toUrl('canonical', ['absolute' => TRUE]) + ->toString(TRUE) + ->getGeneratedUrl()) + ->setCpa(0) + ->setName($spare_part->label()) + ->setVendor($spare_part->field_manufacturer->value) + ->setPrice($spare_part->field_price->value) + ->setCurrencyId('RUB') + ->setDescription($spare_part->body->value); + if (!$spare_part->field_image->isEmpty()) { + $offer->setPicture($spare_part->field_image->entity->uri->value); + } + $this->generator->addOffer($offer); + } + + $this->generator->generateFile(); + } + +} +``` + +### 3. Add cron job + +**MYMODULE.module** + +```php +/** + * Implements hook_cron(). + */ +function MYMODULE_cron() { + /** @var \Drupal\MYMODULE\YandexYmlService $yandex_yml_generator */ + $yandex_yml_generator = \Drupal::service('MYMODULE.yandex_yml'); + if ($yandex_yml_generator->getLastProductUpdateTime() + (60 * 60 * 12) > \Drupal::time()->getRequestTime()) { + $yandex_yml_generator->generateFile(); + } +} +``` diff --git a/mkdocs.yml b/mkdocs.yml index ea8aa10..d32fed5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,4 +3,5 @@ pages: - 'Home': index.md - 'Installation': installation.md - 'How it works': how-it-works.md - - 'Generate YML': generate-yml.md \ No newline at end of file + - 'Generate YML': generate-yml.md + - 'Real world examples': real-examples.md \ No newline at end of file diff --git a/src/YandexYml/Shop/YandexYmlShop.php b/src/YandexYml/Shop/YandexYmlShop.php index 58ac2e1..6a489b4 100644 --- a/src/YandexYml/Shop/YandexYmlShop.php +++ b/src/YandexYml/Shop/YandexYmlShop.php @@ -15,9 +15,7 @@ class YandexYmlShop { use YandexYmlToArrayTrait; /** - * @YandexYmlElement( - * name = "name" - * ) + * @YandexYmlElement() * * @var string */ @@ -33,54 +31,42 @@ class YandexYmlShop { private $company; /** - * @YandexYmlElement( - * name = "url" - * ) + * @YandexYmlElement() * * @var string */ private $url; /** - * @YandexYmlElement( - * name = "url" - * ) + * @YandexYmlElement() * * @var string */ private $platform; /** - * @YandexYmlElement( - * name = "version" - * ) + * @YandexYmlElement() * * @var string */ private $version; /** - * @YandexYmlElement( - * name = "agency" - * ) + * @YandexYmlElement() * * @var string */ private $agency; /** - * @YandexYmlElement( - * name = "email" - * ) + * @YandexYmlElement() * * @var string */ private $email; /** - * @YandexYmlElement( - * name = "cpa" - * ) + * @YandexYmlElement() * * @var int */ diff --git a/src/YandexYmlGenerator.php b/src/YandexYmlGenerator.php index 95fa2fc..9842c19 100644 --- a/src/YandexYmlGenerator.php +++ b/src/YandexYmlGenerator.php @@ -79,7 +79,7 @@ public function __construct(Time $date_time, DateFormatter $date_formatter) { /** * Generate file on all provided data. */ - public function generateFile($filename = 'products.yml', $destination_path = 'public://') { + public function generateFile($filename = 'products.xml', $destination_path = 'public://') { $this->writeHeader(); $this->writeShopInfo(); $this->writeCurrencies();