В 18.09.2017 в 02:32, abushyk сказал:
A. Распаралеливаем.
Суть распаралеливания состоит в том, что бы сообщить модулю, что мы хотим выгрузить. В штатном режиме он просто получает пинок по соотв. адресу и на основании настроек (чекбоксы отбора, органичения по времени...) делает выборку и выгружает полученное. С версии 1.5.12 в модуль добавился функционал, позволяющий принудительно сообщить приложению набор идешек, которые следует выгрузить.
Делается это следующим образом. В main.php шаблона внутри функции main() мы создаем некий адрес нашей выгрузки - например /export/yandex.common/
if(!$has_result && $REQUESTURIPATH=="export/yandex.common"){ }По обращению на этот адрес мойсайт/export/yandex.common будет происходить нечто в результате чего на выходе будет xml-фид.
Далее мы должны собрать коллекцию выгружаемых ID объектов. Каким образом мы это сделаем - не важно (хоть впишем руками, хоть выберем из БД по какому-то запросу). Скорее всего мы будем выбирать их запросами по критерию.
/*Собираем коллекцию*/ ; $stmt = $DBC -> query ($query ); if ($stmt ){ while ($ar = $DBC -> fetch ($stmt )){ $ids_collection = $ar [ "id" ]; } } }В данном примере мы определили к выдаче все объекты со страной с ИД=2 и являющиеся активными (active=1) (Это условие добавлено специально, так как если вы управляете набором выгружаемых, то выгрузчик доверяет вам и уже не налагает проверок поверх выбранного вами не по активности, ни по дате, ни по признаку-чекбоксу, как он это делает в штатном режиме. Это требует от вас чуть больше внимательности при сборке коллекции, но зато оставляет большую гибкость в плане возможности подбора). Условия могут быть более произвольными. Запросов может быть несколько или один с использованием UNION. Главное что бы в конце мы наполнили коллекцию $ids_collection набором выгружаемых ID объектов. Формально мы можем хоть в ручную регулировать результат, вплоть до
if (! $has_result && $REQUESTURIPATH == "export/yandex.common" ){ $ids_collection = array (1 , 3 , 54 ); }Это маргинально, но допустимо.
Когда идешки собраны, мы можем сообщать их в приложение. Иными словами мы должны вызвать модуль выгрузки и дать ему список ID.
Для этого предназначена функция yandexrealty_admin::setExportedIds()
Осталось определить в какую часть модуля передать эти данные. Яндекс-выгрузка имеет два подмодуля admin и site. Они работают почти одинаково. Самый просто вариант определить какой модуль работает в вашем случае:
1. открываем адрес вашей обычной выгрузки
if (! $has_result && $REQUESTURIPATH == "export/yandex.common" ){ $ids_collection = array (); /*Собираем коллекцию*/ $DBC = DBC :: getInstance (); $query = "SELECT id FROM " . DB_PREFIX . "_data WHERE country_id=2 AND active=1" ; $stmt = $DBC -> query ($query ); if ($stmt ){ while ($ar = $DBC -> fetch ($stmt )){ $ids_collection = $ar [ "id" ]; } } . ; require_once SITEBILL_DOCUMENT_ROOT . ; $YRE = new yandexrealty_site (); /*ЕСЛИ МЫ ПОНЯЛИ ЧТО РАБОТАЕТ ADMIN-ПОДМОДУЛЬ*/ require_once SITEBILL_DOCUMENT_ROOT . "/apps/yandexrealty/admin/admin.php" ; $YRE = new yandexrealty_admin (); /*---КОНЕЦ---ЕСЛИ МЫ ПОНЯЛИ ЧТО РАБОТАЕТ ADMIN-ПОДМОДУЛЬ*/ /*ПЕРЕДАЕМ ID В ВЫГРУЗЧИК*/ $YRE -> setExportedIds ($ids_collection ); /*ЗАПУСКАЕМ ВЫГРУЗКУ*/ header ("Content-Type: text/xml" ); echo $YRE -> run_export (); exit (); }
2. по фтп открываем файл /apps/yandexrealty/admin/admin.php
3. находим в нем строку public function export(){
4. сразу после этой строки добавляем строку echo 1;
5. сохраняем и перегружаем страницу с выгрузкой.
6. сли вместо привычного фида мы получим страницу с ошибкой, значит у нас работает подмодуль admin
7. откатываем пункт 4
если ошибку мы не получили, то работает модуль siteТеперь в нашем перехватчике выгрузки добавим нужные включенияПолучив нужные ID выгрузчик просто прогонит их через валидацию и создаст фид. Кеширование выгрузки следует отключить, если вы создаете такие отдельные точки доступа.
Б. Для тех, кто активно перепиливал свои модули в папке apps
Вам понадобится стянуть свежую версию приложения и взять из ее файла admin.php недостающие функции setExportedIds($ids) и измененную collectData(). Если ві меняете путем - запомнил свои правки, обновил, добавил опять свои правки, то будет чуть проще - основные изменения были именно в функциисбора данных - collectData, а ее обычно не меняют.
В. Для тех, у кого есть локализация приложения в папке шаблона
В папке шаблона обычно локализуется site-подмодуль приложения. Поэтому для распараллеливания вам скорее всего придется подключать именно блок
/*ЕСЛИ МЫ ПОНЯЛИ ЧТО РАБОТАЕТ SITE-ПОДМОДУЛЬ*/ require_once SITEBILL_DOCUMENT_ROOT . "/apps/yandexrealty/admin/admin.php" ; require_once SITEBILL_DOCUMENT_ROOT . "/apps/yandexrealty/site/site.php" ; require_once SITEBILL_DOCUMENT_ROOT . "/template/frontend/" . $this -> getConfigValue ("theme" ). "/apps/yandexrealty/site/local_site.php" ; $YRE = new local_yandexrealty_site (); /*---КОНЕЦ---ЕСЛИ МЫ ПОНЯЛИ ЧТО РАБОТАЕТ SITE-ПОДМОДУЛЬ*/Все отличие, что мы дополнительно подключаем локализированную часть из папки шаблона и работает с локальным local_yandexrealty_site вместо стандартного yandexrealty_site
ПС. Я скорее всего не охватил всего, так что кто будет делать эксперименты с этим пишите сюда и в ПП свои вопросы.
если мы правильно вас поняли это распаралеливание можно сделать по каждому пользователю? учитывая его user_id ?
но получается если пользователь попросит создать ему фид то придется лезть в файл и код и ручками опять шаманить, что может привести к всеобщему сбою поскольку можно где то что то подзабыть поставить например точку запятую кавычки и так далее?
А нельзя ли например чтобы исключить случайные ошибки сделать в фтп папке файл и назвать его например user-fid и вот в нем уже делать что то и он будет по названию файла привязываться например к определенному юзеру
например
делаем файл user-fid44 и потом во всем файле просто меняем пользовательский айди на 44 и все.
Профессиональным участникам рынка коммерческой недвижимости Москвы и всех регионов России доступен быстрый и удобный способ размещения на сайт – отправка информации об объектах через XML-выгрузку. Это избавит Вас от необходимости добавления каждого объявления вручную через и даёт возможность ежедневного обновления и поднятия ваших объявлений выше в тематическом разделе.
XML-выгрузка осуществляется бесплатно и только в формате «Пробный»
().
Вы можете отправить запрос на адрес , указав сайт вашей компании и планируемое количество выгружаемых объявлений. Ваша заявка будет рассмотрена и в случае положительного решения вам будет необходимо подготовить файл для выгрузки согласно нижеприведенным требованиям, затем проверить ваш файл, нажав кнопку «Проверить», и если файл соответствует требованиям, нажать кнопку «Добавить»..
Обратите внимание : при подготовке XML-файла, помимо нижеприведённых технических требований, необходимо соблюдать .
URL-адрес XML документа должен быть постоянным и доступным по протоколу HTTP. Максимальное время установления соединения и ожидания ответа от сервера, на котором расположен XML документ — 30 секунд.