Работа с нодами из внешней программы на .NET

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

Аватар пользователя Technician Technician 23 апреля 2012 в 15:16

Есть самописная программа на .NET, которая подгружает из 1С ассортимент и цены, позволяет добавлять к товарам описание и фото, ставит на фото водяные знаки и выгружает всю эту информацию на два сайта (в перспективе - будет еще создавать файлы для Яндекс.Маркет).

Первый сайт - на чистом PHP, вопрос с выгрузкой инфы там решен через web-service на основе SOAP. Фотки выгружаются по FTP. Все работает очень удобно - прямо в интерфейсе программы на любой записи можно нажать "Обновить на сайте" и через две секунды инфа уже по адресу:-). Также можно сделать много изменений и выгрузить все их на сайт одной кнопкой. Выгружаются при этом только измененные записи.

Второй сайт - на Drupal 7. С фотками разбирался так. Выгрузку сделал по FTP (в нужных размерах, причем маленькие фотки без водяных знаков, а крупные - уже с ними). Затем программой сформировал файл для импорта через Feeds, и фотки подцепились. Но заморочек с обновлением инфы таким способом довольно много, поэтому сейчас предпочитаю изменения по фоткам вносить вручную, благо их немного. Что касается изменения инфы о товарах, то на данный момент удается как-то обновляться только через Feeds (ну или вручную по одной ноде). А Feeds - это формирование файла с последующим его импортом. Т.е. много ручных действий с ожиданием. И получается, что обновление инфы на друпаловском сайте занимает на два порядка больше времени. Жутко долго и неудобно.

В свете вышесказанного хочется работать с нодами напрямую из программы. Для этого сервер (сайт на D7) должен уметь работать с SOAP-запросами. Кто-нибудь такое делал? Сейчас нашел модуль SOAP Server, буду его изучать. Но, может быть, есть еще варианты решения?

Комментарии

Аватар пользователя bsyomov bsyomov 23 апреля 2012 в 15:58

У feeds есть возможность по крону, и брать данные из локального файла. Файл с данными можно закачивать тем же ftp.
Также для feeds можно создавать свои обработчики.

Аватар пользователя Technician Technician 23 апреля 2012 в 16:51

Крон поможет только на втором этапе (заменит ручную загрузку на сайт), зато добавит задержку размером в периодичность крона. А самый главный недостаток Cron - отсутствие сообщений об ошибке. Т.е. если инфа не выгрузилась на сайт, я об этом сразу не узнаю.

Причем выгружать файл для загрузки через feeds по крону можно двумя способами, оба с недостатками:
1. Выгружать только измененные записи. Тогда, если feeds по крону не успеет засосать предыдущую выгрузку, то следующая ее прибьет (т.к. имя файла статично).
2. Выгружать всегда всю таблицу. Надежно, но ресурсоемко. Не хочется подгружать работающий сайт однообразной бессмысленной рутиной. Т.е. если у меня 5000 нод, а изменилось 3, то остальные 4997 нод будут обрабатываться впустую.

И у feeds есть еще одна проблема, которая здорово мешает при работе с фото. Если я два раза загружу один и тот же файл, в котором нода ссылается на одно и то же фото, то это фото создастся дважды с именами "photo.jpg" и "photo (1).jpg".

В общем, хотелось бы все-таки избежать использования Feeds.

Аватар пользователя bsyomov bsyomov 23 апреля 2012 в 18:00

"Technician" wrote:
Т.е. если инфа не выгрузилась на сайт, я об этом сразу не узнаю.

Сам по себе, крон умеет отправлять по почте вывод запущенного через него скрипта. Можно написать скрипт-обёртку, которая будет возвращать ошибку, а не запускать крон Drupal через curl|wget|lynx.

Вторая проблема решается разумным периодом импорта и естественно работой только с изменёнными материалами. Для надёжности можно с большим периодом делать полную синхронизацию.

Впрочем, действительно, можно использовать и другие пути, просто этот, на мой взгляд, потребует минимум программирования.

Аватар пользователя Technician Technician 23 апреля 2012 в 18:30

Можно, я не спорю, сделать все и через cron+feeds. И если бы вопрос касался исключительно данного сайта, то я бы уже все настроил, объяснил бы пользователям нюансы и забыл об этом. Но в перспективе возможны еще такие сайты и хотелось бы иметь универсальный и эффективный инструмент, который работает с объектами напрямую. Ведь если немного пофантазировать, то можно было бы вообще создать десктопную программу, которая подключается к любому сайту на Drupal, загружает из него информацию о материалах, загружает сами материалы и позволяет работать с ними оффлайн, а затем выгрузить на сайт. Плюс можно различные групповые операции делать, импорт из внешних источников, и т.д. и т.п. В общем, задача более глобальна, чем разобраться с одним сайтом.

Аватар пользователя Technician Technician 10 ноября 2015 в 11:49

В общем, через Feeds все очень неудобно работает. Большие задержки при обновлении и много лишних действий. В итоге я решил вернуться к идее обновления нод напрямую.

Поставил Services и SOAP Server (как оказалось, это подмодуль к Services), создал endpoint (назвал ws), указал тип сервера - SOAP, поставил галочки на всех ресурсах, к которым может обеспечиваться доступ, и действиях с ними (file, node, system, taxonomy_term, taxonomy_vocabulary, user - хоть и не нужны все, но пока для тестирования).

Попробовал подключиться к этой службе из Visual Studio и получил следующее:

Причем подключиться удалось только через Add Service Reference. Через Add Web Reference ничего не получилось.

Вроде бы работает, но я ждал намного больший список возможных действий. По идее, только для нод должны быть доступны действия retrieve, create, update, delete, index, files, attach_file (они перечислены в настройках endpoint-a), но по факту для нод нет ни одного действия вообще.

Ощущение, что или доступ не открыт на какие-то объекты, или какой-то не тот тип взаимодействия используется. Но информации на эту тему практически нет. Так что пока завис на этом этапе.