Перейти к содержимому


Фотография
- - - - -

Как добавить в результат Экспорта в YML Имена категорий товара?


Лучший Ответ .polega. , 15 March 2015 - 12:59

слегка ошибся во вложенностях :)

пробуйте ещё раз. прокомментировал код для понимания, что и зачем.

<?php if ($this->checkPosition('category')) : ?>
<?php $primary_cat = $item->getPrimarycategory(); //получаем основную категорию
      $parent_cat_id = $item->getPrimarycategory()->parent; //получаем ИД родительской категории
      if ($parent_cat_id != 0) : //если существует родитель
         $parent_cat = $this->app->table->category->get($parent_cat_id); //получаем родительскую категорию
         $parent_parent_cat_id = $this->app->table->category->get($parent_cat_id)->parent; //получаем ИД родителя родителя
         if ($parent_parent_cat_id != 0) : //если существует родитель родителя
            $parent_parent_cat = $this->app->table->category->get($parent_parent_cat_id); //получаем категорию родителя родителя
            $parent_parent_parent_cat_id = $this->app->table->category->get($parent_parent_cat_id)->parent; //получаем ИД родителя родителя родителя
            if ($parent_parent_parent_cat_id != 0) : //если существует родитель родителя родителя
               $parent_parent_parent_cat = $this->app->table->category->get($parent_parent_parent_cat_id); //получаем категорию родителя родителя родителя
            else : 
               $parent_parent_parent_cat_id = 0; //если не существует родитель родителя родителя, то сделаем его 0
            endif;
         else : 
            $parent_parent_cat_id = 0; //если не существует родитель родителя, то сделаем его 0
         endif;
      else : 
         $parent_cat_id = 0; //если не существует родитель, то сделаем его 0
      endif; ?>

<category><?php if ($parent_parent_parent_cat_id !=0) : echo $parent_parent_parent_cat->name . "/"; endif; ?>
<?php if ($parent_parent_cat_id !=0) : echo $parent_parent_cat->name . "/"; endif; ?>
<?php if ($parent_cat_id !=0) : echo $parent_cat->name . "/"; endif; ?>
<?php echo $primary_cat->name; ?></category>
<?php endif; ?>

Перейти к сообщению


  • Закрытая тема Тема закрыта
Сообщений в теме: 11

#1 happy home

happy home

Отправлено 12 March 2015 - 15:06

Здравствуйте.
Встала вот такая задача.
 
Сейчас в файл .yml экспортируются вот эти поля (из карточки товара):
....
<offers>
<offer id="ID карточки товара" available="true">
<url>url адрес карточки товара</url>
<price>Цена товара</price>
<currencyId>Валюта</currencyId>
<categoryId>ID категории</categoryId>
<picture>Путь к изображению</picture>
<name>Заголовок карточки товара</name>
<vendor>Продавец</vendor>
<description>Описание товара</description>
<param name="Название параметра">Значение параметра</param>
</offer>
<offers>
А, необходимо, чтобы получилось вот так (Добавить дерево категорий до материала):
....
<offers>
<offer id="ID карточки товара" available="true">

<Category>Имя Категории</Category>
<SubCategory>Имя Под-Категории1</SubCategory>
<SubCategory2>Имя Под-Категории2</SubCategory2>
<SubCategoryN>Имя Под-КатегорииN</SubCategoryN>

<url>url адрес карточки товара</url>
<price>Цена товара</price>
<currencyId>Валюта</currencyId>
<categoryId>ID категории</categoryId>
<picture>Путь к изображению</picture>
<name>Заголовок карточки товара</name>
<vendor>Продавец</vendor>
<description>Описание товара</description>
<param name="Название параметра">Значение параметра</param>
</offer>
<offers>
Жирным шрифтом выделено то, что необходимо добавить - Названия категорий с учетом их вложенности до той, где находится материал.
Пример приведен для случая вложенности: Категория(id 2)/Под-Категория1(id 10)/Под-Категория2(id 16)/Под-КатегорияN(id 40)
 
В начале yml файла между тегами <categories></categories> есть структура, которая указывает "родительскую" принадлежность:
 
<category id="2">Категория</category>
<category id="10" parentId="2">Под-Категория1</category>
<category id="16" parentId="10">Под-Категория2</category>
<category id="40" parentId="16">Под-КатегорияN</category>
 
Но, как ее преобразовать в требуемый формат?
 
Предположу, что можно, наверное, в файл:
/media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/positions.xml

добавить сами позиции следующим образом:
  
<positions layout="ymlexport">
   <position name="[b]Category[/b]">[b]Category[/b]</position>
   <position name="[b]SubCategory[/b]">[b]SubCategory[/b]</position>
   <position name="[b]SubCategory2[/b]">[b]SubCategory2[/b]</position>
   <position name="[b]SubCategoryN[/b]">[b]SubCategoryN[/b]</position>
   <position name="title">Title</position>
   <position name="price">Price</position>
   <position name="properties">Properties</position>
   <position name="image">Image</position>
   <position name="description">Description</position>
   <position name="vendor">Vendor</position>
   <position name="country_of_origin">Country of origin</position>
</positions>
 
 

Но чем и как их наполнить ????? Чувствую, не верно я мыслю.....
 
Помогите пожалуйста решить задачу!
Заранее, спасибо всем кто откликнется!!!
 
----------
Пробовал добавить позицию <position name="Category">Category</position>, а в нее в настройках [ Назначить поля: ymlexport ] добавить элемент "Item Category", не получилось...
---------
Видимо необходимо еще редактировать файл:
/media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/ymlexport.php

Сообщение отредактировал SmetDenis: 16 March 2015 - 11:52
тег code!

  • 0

#2 .polega.

.polega.

Отправлено 12 March 2015 - 19:16

Видимо необходимо еще редактировать файл: /media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/ymlexport.php

 

вот вам мой кусок этого файла, который отвечает за вывод категории:

   <?php $htmlcat = array(); $htmlcat = $this->app->category->getItemsRelatedCategoryIds($this->_item->id); // получаем массив категорий, всего у меня 4 категории (ИД соответственно - 6,7,8,9)
   if ($htmlcat[3]==6 || $htmlcat[2]==6 || $htmlcat[1]==6 || $htmlcat[0]==6) {$category_string='квартира';} // присваиваем переменной $category_string нужную текстовую строку, в зависимости от того, какой категории принадлежит айтем
   if ($htmlcat[3]==7 || $htmlcat[2]==7 || $htmlcat[1]==7 || $htmlcat[0]==7) {$category_string='дом';}
   if ($htmlcat[3]==8 || $htmlcat[2]==8 || $htmlcat[1]==8 || $htmlcat[0]==8) {$category_string='участок';}
   if ($htmlcat[3]==9 || $htmlcat[2]==9 || $htmlcat[1]==9 || $htmlcat[0]==9) {$category_string='коммерческая';}
   ?>
   <?php if ($this->checkPosition('category')) : ?>
   <category><?php echo $category_string; ?></category> <!-- собственно выводим категорию -->
   <?php endif; ?>

поскольку мои названия категорий на сайте не устраивали валидатор Яндекса, пришлось сделать анализ массива и присвоение нужного названия, отличного от названия категории. Если ваши названия устраивают Яндекс и айтем находится в одной категории, то этот анализ можно убрать и сделать просто:

   <?php if ($this->checkPosition('category')) : ?>
         <category><?php echo $item->getPrimarycategory()->name; ?></category>
   <?php endif; ?>

ну и соответственно назначить позиции:

screenshot_ 2015-03-12 20.10.54.jpg

 

как-то так :)


Сообщение отредактировал realtygroupinfo: 12 March 2015 - 20:53

  • 2

#3 happy home

happy home

Отправлено 13 March 2015 - 03:26

Спасибо за совет.

Айтемы у меня находятся в нескольких категориях, (имеется ввиду, что материал принадлежит сразу нескольким категориям, одна из которых родительская

 

 

ну и соответственно назначить позиции: screenshot_ 2015-03-12 20.10.54.jpg

Это, если я правильно понял, в настройках [ Назначить поля: ymlexport ] в созданную позицию "category" добавляем элемент "categories", у меня в списке элементов Ядра есть только элемент "Item Category"... У Вас на скриншоте элемент "categories" это стандартный элемент Ядра или это Пользовательский элемент?

Спасибо.

 

Задача такая: Необходимо сохранить и передать в файл YML категорию (сохранив глубину вложения) в которой находится Материал (Айтем) Валидацией Яндекса можно пренебречь. Чтобы можно было осуществить Экспорт/Импорт материалов на другой сайт посредством файла YML

Цель: передать Структуру категорий и Указать Категорию и Подкатегорию для каждого Айтема

 

------------- Что получилось и что хочется получить:

 

1. Добавил в файл: /media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/ymlexport.php

Предложенный Вами код:

   <?php if ($this->checkPosition('category')) : ?>
         <category><?php echo $item->getPrimarycategory()->name; ?></category>
   <?php endif; ?>

2. В файле: /media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/positions.xml

Создал позицию: <position name="category">Category</position>

 

3. В настройках [ Назначить поля: ymlexport ] В созданную позицию Category  добавил Элемент "Item Category"

 

В итоге:

Удалось в Файле YML, после экспорта, получить "конечную категорию" Подкатегорию к которой принадлежит Айтем (Материал)

 

Пример:

 ....

<categoryId>16</categoryId>
<category>Название Подкатегории с ID 16</category>

 ....

 

Но Подкатегория с ID 16 принадлежит родительской (вложена с нее) категории с ID 10 которая в свою очередь принадлежит категории с ID 2

 

1. Можно ли вывести вложенность вот в таком формате:

 

<Category>Категория с ID 2/Подкатегория с ID 10/Подкатегория с ID 16</Category>

 

где (/) это разделитель (может быть любым)

 

То есть подправить в файле /media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/ymlexport.php

Вот этот код:

   <?php if ($this->checkPosition('category')) : ?>
         <category><?php echo $item->getPrimarycategory()->name; ?></category>
   <?php endif; ?>

так, чтобы результат выводился в созданной позиции - <position name="Category">Category</position> в нужном виде.

 

ИЛИ

 

2. Можно ли вывести вложенность вот в таком формате:

 

<Category>Категория с ID 2</Category>
<SubCategory>Подкатегория с ID 10</SubCategory>
<SubCategory2>Подкатегория с ID 16</SubCategory2>

 

То есть добавить в файл /media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/ymlexport.php

Блоки с кодом, которые выводили бы Корневую категорию/Вложенную категорию/Вложенную категорию1/Вложенную категорию2 в соответствующие им (созданные руками позиции) например:

 

<position name="Category">Category</position> - для Подкатегории с ID 2

<position name="SubCategory">SubCategory</position> - для Подкатегории с ID 10

<position name="SubCategory2">SubCategory2</position> - для Подкатегории с ID 16

<position name="SubCategoryN">SubCategoryN</position> - - для Подкатегории с ID N и т.д.

 

в последовательности вложения категорий?

 

Спасибо!


Сообщение отредактировал happy home: 13 March 2015 - 06:24

  • 0

#4 .polega.

.polega.

Отправлено 13 March 2015 - 09:28

в созданную позицию "category" добавляем элемент "categories", у меня в списке элементов Ядра есть только элемент "Item Category"... У Вас на скриншоте элемент "categories" это стандартный элемент Ядра или это Пользовательский элемент?

это стандартный элемент ядра. Название, я так понял, может отличаться в зависимости от версии Зуу.

 

1. Можно ли вывести вложенность вот в таком формате: Категория с ID 2/Подкатегория с ID 10/Подкатегория с ID 16

попробуйте поискать на форуме, как выводить категории, подкатегории, родительские, дочерние и т.п.,

и поиграть с этим. Можно реализовать и первый и второй варианты.

 

В итоге будет примерно так (для вашего первого варианта, могу ошибиться в синтаксисе PHP, пусть гуру поправят :) )

<?php
$category_name = $item->getPrimarycategory()->name;
$parent_category = $item->getPrimarycategory()->parent;
$parentcategory = $this->app->table->category->get($parent_category);
$parentparentcategory = $this->app->table->category->get($parentcategory);
$parent_category_name = $parentcategory->name;
$parent_parent_category_name = $parentparentcategory->name;
?>

<?php if ($this->checkPosition('category')) : ?>
      <category><?php echo $parent_parent_category_name . "/" . $parent_category_name . "/" . $category_name; ?></category>
<?php endif; ?>

  • 1

#5 happy home

happy home

Отправлено 13 March 2015 - 09:57

Спасибо Вам огромное за быстрый ответ и, вообще, за отклик и помощь!

Буду пробовать...

 

------

 

Попробовал и в результате получилось, но есть одно НО..

 

В результате выполнения кода:

<category><?php echo $parent_parent_category_name . "/" . $parent_category_name . "/" . $category_name; ?></category>

 

Имеем результат:

<category>/Вложенная категория/Вложенная категория1</category>

 

а, по идее, должно получиться так:

<category>Корневая категория/Вложенная категория/Вложенная категория1</category>

 

То есть "съедается" Корневая категория, что до первого разделителя, которую должен, видимо подставлять параметр parent_parent_category_name

 

Подскажите пожалуйста кто знает, как исправить ситуацию?

Может кто то из техподдержки подскажет или поправит решение

Заранее спасибо!


Сообщение отредактировал happy home: 13 March 2015 - 10:36

  • 0

#6 happy home

happy home

Отправлено 14 March 2015 - 16:25

АП!

Уважаемые разработчики, помогите пожалуйста подправить код любезно предоставленный пользователем realtygroupinfo


  • 0

#7 .polega.

.polega.

Отправлено 14 March 2015 - 20:38

То есть "съедается" Корневая категория, что до первого разделителя, которую должен, видимо подставлять параметр parent_parent_category_name

пересмотрел ещё раз - вроде должно работать.

мне не на чем проверить этот код, писал на коленке.

 

попробуйте по порядку вывести все переменные и посмотреть, что в них.

примерно так:

<?php
$category_name = $item->getPrimarycategory()->name;
$parent_category = $item->getPrimarycategory()->parent;
$parentcategory = $this->app->table->category->get($parent_category);
$parentparentcategory = $this->app->table->category->get($parentcategory);
$parent_category_name = $parentcategory->name;
$parent_parent_category_name = $parentparentcategory->name;
?>

<?php if ($this->checkPosition('category')) : ?>
      <?php echo $parentcategory; ?> <br/>
      <?php echo $parentparentcategory; ?> <br/>
      <?php echo $parent_category_name; ?> <br/>
      <?php echo $parent_parent_category_name; ?> <br/>

      <category><?php echo $parent_parent_category_name . "/" . $parent_category_name . "/" . $category_name; ?></category>
<?php endif; ?>

и ещё. может у конкретного объекта нет родительской категории?

 

 

"съедается" Корневая категория

у всех объектов (айтемов), или только у некоторых?


Сообщение отредактировал realtygroupinfo: 14 March 2015 - 20:39

  • 1

#8 happy home

happy home

Отправлено 15 March 2015 - 06:42

Здравствуйте уважаемый realtygroupinfo

В очередной раз, огромное Вам спасибо за попытку помочь! И за то, что находите время для ответов!

 

1. Добавил код (..попробуйте по порядку вывести все переменные и посмотреть, что в них. примерно так...) в файл: /media/zoo/applications/jbuniversal/templates/catalog/renderer/item/<ВАШ ТИП>/ymlexport.php

 

При попытке запуска Экспорта в YML (нажатием на кнопку "Запустить") получаю результат (на скриншоте ниже):

1.jpg

Экспорт не идет и выводится текст с ошибкой...

 

2. "..и ещё. может у конкретного объекта нет родительской категории?.." Вроде, у всех есть родительская категория

 

3.

"съедается" Корневая категория

у всех объектов (айтемов), или только у некоторых?

 

Тут ситуация такая:

 

- Если Глубина вложения такая: Корневая категория/Вложенная категория/Айтем

то, в yml результат такой: <category>/Корневая категория/Вложенная категория</category>

 

То есть всё ОК

 

НО,

 

- Если Глубина вложения такая: Корневая категория/Вложенная категория/Вложенная категория1/Айтем

то, в yml результат такой: <category>/Вложенная категория/Вложенная категория1</category>

 

Пропала (съелась): Корневая категория

 

И

 

- Если Глубина вложения такая: Корневая категория/Вложенная категория/Вложенная категория1/Вложенная категория2/Айтем

то, в yml результат такой: <category>/Вложенная категория1/Вложенная категория2</category>

 

Пропали (съелись): Корневая категория/Вложенная категория

 

То есть в YML файл попадают только "Категория самого Айтема" и "Категория, в которую вложена Категория самого Айтема"... Если идти от Айтема вверх к Корню, то сохраняются (передаются в YML) две первые Категории, по дереву  вложенности от Айтема верх к Корню Дерева


Сообщение отредактировал happy home: 15 March 2015 - 06:46

  • 0

#9 .polega.

.polega.

Отправлено 15 March 2015 - 11:11

попробуйте этот код.

для вложенности в 3 категории должно работать.

<?php if ($this->checkPosition('category')) : ?>
<?php $primary_cat = $item->getPrimarycategory();
      $parent_cat_id = $item->getPrimarycategory()->parent;
      if ($parent_cat_id !=0) : $parent_cat = $this->app->table->category->get($parent_cat_id); endif;
      if ($parent_cat_id !=0) : $parent_parent_cat_id = $this->app->table->category->get($parent_cat_id)->id;
         if ($parent_parent_cat_id !=0) : $parent_parent_cat = $this->app->table->category->get($parent_parent_cat_id); endif;
      else : $parent_parent_cat_id =0;
      endif; ?>

<category><?php if ($parent_parent_cat_id !=0) : echo $parent_parent_cat->name . "/"; endif; ?>
<?php if ($parent_cat_id !=0) : echo $parent_cat->name . "/"; endif; ?>
<?php echo $primary_cat->name; ?></category>
<?php endif; ?>

если для трёх будет нормально, попробуйте по аналогии сделать для вложенности в 4 категории.

какая у вас вообще может быть максимальная вложенность?


  • 1

#10 happy home

happy home

Отправлено 15 March 2015 - 11:32

Не устану говорить Вам спасибо за помощь!)))

 

У меня сейчас максимальная глубина вложенности категорий равна ЧЕТЫРЕМ.

 

Теперь действительно в файле YML Путь до Айтема состоит из ТРЕХ уровней вложенности, но, снова есть одно НО...

 

Вложенность должна быть например: 1/2/3/Айтем, а получилась 2/2/3/Айтем Дублируется второй уровень вложенности от Айтема - то есть получилось так:

 

<category>Вложенная категория/Вложенная категория/Вложенная категория1</category>

 

вместо:

 

<category>Корневая категория/Вложенная категория/Вложенная категория1</category>


Сообщение отредактировал happy home: 15 March 2015 - 11:33

  • 0




Click to return to top of page in style!