Drupal 6 Модуль yandexmarket как сделать offer type необязательным?

Главные вкладки

Аватар пользователя mypuzo mypuzo 27 января 2023 в 1:32

Всем доброго времени суток.
Единственный модуль для создания YML фида, который у меня заработал yandexmarket
У меня такая специфика товаров, что нет возможности указывать vendor.
В настройках стиля на данный момент есть возможность только выбрать один из вариантов offer type
(vendor.model, book, artist.title, tour, ticket and event-ticket)
Если выбираю none, то сохранение не происходит.
При этом, поле vendor не является обязательным для заполнения.
Можно ли сделать так, чтобы в генерируемом файле не отображалось type="vendor.model"?

Комментарии

Аватар пользователя VasyOK VasyOK 27 января 2023 в 7:18

С D6 уходить надо было уходить более 10 лет назад.

Всего пару раз занимался составлением фида для яндекс маркета.

В итоге готовые модули с орга чем-то да не устраивали и все делал на views.

Возможно ли это замутить на D6 - не знаю. Скорей всего да.

Нет если кто-то подскажет автору как модуль подрубить - я не против.

Аватар пользователя mypuzo mypuzo 27 января 2023 в 11:37

VasyOK wrote:
С D6 уходить надо было уходить более 10 лет назад.
Всего пару раз занимался составлением фида для яндекс маркета.
В итоге готовые модули с орга чем-то да не устраивали и все делал на views.
Возможно ли это замутить на D6 - не знаю. Скорей всего да.
Нет если кто-то подскажет автору как модуль подрубить - я не против.

Этот модуль уже подрублен и работает. В турбо-страницах яндекса фид проверку проходит успешно, а вот в "поиске по товарам" требуется всего лишь убрать из фида все type="vendor.model". если сделать это в скачанном файле и залить в яндекс, то всё работает. вопрос только в том, как это сделать в модуле, который работает отлично, не считая обязательности этого "type".
как вариант, можно было бы написать скрипт, который будет по cron, например, раз в сутки скачивать этот фид, удалять из него лишнее и размещать по другому адресу уже исправленный фид. Я не программист, поэтому не могу сам такое осуществить.
Уходить с drupal-6 (с ubercart) я думал давно, но не решился, т.к. не имею достаточно знаний для переезда и есть риск того, что в процессе что-то пойдет не так и сайт вылетит из индекса. Плюс, если не ошибаюсь, ubercart не работает на drupal-8 и новее.

Аватар пользователя VasyOK VasyOK 27 января 2023 в 12:14

Перенести контент, урлы, метатеги, микроразметку - и не должен вылететь.

Хотел бы вам очень сказать "Смогли сделать на 6ке, сможете и на 9ке", но не могу. Комерц сейчас - это конечно звездатый модуль даже для мышекликера но обалдевать им сходу не получиться.

Собственно никто не геоврит что обновляться надо на продакшене. Тестовый сайт заведите, поставьте Композером Друпал 9, Комерц. Альтернативы - желтый ubercart d8+ с тонной патчей и basket с очень дружественными для РФ авторами.

Аватар пользователя mypuzo mypuzo 28 января 2023 в 23:19

А можно просто заставить не отображаться в фиде фразу type="vendor.model" ?
за генерацию фида отвечает, предположительно, файл theme.inc

Аватар пользователя mypuzo mypuzo 29 января 2023 в 0:52

А это кусок из yandexmarket.module
В нем, видимо и прописано, что параметр offer type (yml type) обязателен.
В идеале было бы сделать так, чтобы при выборе type = none, в offer фида отображались элементы из "general":
'url', 'price', 'local_delivery_cost', 'currencyId', 'categoryId', 'picture'
Но вместо local_delivery_cost, наверное лучше сделать "name"...

Аватар пользователя mypuzo mypuzo 29 января 2023 в 13:27

Подскажите, пожалуйста, что исправить в php, чтобы он удалял type="vendor.model"?
На данный момент он скачивает xml yandexmarket2 и сохраняет его без изменений как yandexmarket3.xml

<?php
$dom
=new DOMDocument();
$dom->load("https://example.com/yandexmarket2");
$root=$dom->documentElement// This can differ (I am not sure, it can be only documentElement or documentElement->firstChild or only firstChild)
$nodesToDelete=array();
$offers=$root->getElementsByTagName('offer');
// Loop trough childNodes
foreach ($offer as $offer) {
    
$offers=$offer->getElementsByTagName('offer')->item(0)->textContent;
    
// Your filters here
    // To remove the marker you just add it to a list of nodes to delete
    
$nodesToDelete[type="vendor.model"]=$offer;
}
// You delete the nodes
foreach ($nodesToDelete as $node$node->parentNode->removeChild($node);

$dom->save('yandexmarket3.xml');
?>
Аватар пользователя mypuzo mypuzo 29 января 2023 в 20:32

Может, кому-то пригодится...
Проблема решена методом тыка. DOM свою задачу выполняет. Буду благодарен, если подскажете, что осталось лишнее и неверное в коде.

<?php
$dom 
= new DOMDocument();
$dom->load("https://example.com/yandexmarket2");
$root=$dom->documentElement// This can differ (I am not sure, it can be only documentElement or documentElement->firstChild or only firstChild)

$NodeToDelete=array();
$offer=$root->getElementsByTagName('offer');
// Loop trough childNodes
foreach ($offer as $offer) {
    
$offers=$offer->getElementsByTagName('offer')->item(type)->attribute;
    
// Your filters here
    // To remove the marker you just add it to a list of nodes to delete
    
$NodeToDelete[]=$offer;
    
}
// You delete the nodes
foreach ($NodeToDelete as $node$node->RemoveAttribute("type");

$dom->save('yandexmarket3.xml');
?>
Аватар пользователя mypuzo mypuzo 29 января 2023 в 22:12

Извиняюсь за кучу комментов.
Обнаружилась мини-проблемка. В исправленном фиде после запуска DOM информация отображалась без учета последних изменений в товарах. Что именно кэшировалось я не понял. В бэкофисе drupal я внес в исключения кэша исходный фид, DOM и измененный фид. Теперь придраться не к чему. Всё работает. DOM будет запускаться через Cron периодически.