Руководства
Введение в веб-платформу Falcon Space. C чего начать?Мануал для начинающего разработчика Falcon SpaceВидео о создании сайтов на Falcon SpaceВопросы и ответы для тех, кто начал разрабатывать на Falcon SpaceТиповые ситуации для админа-разработчика в панели управления Как создать таблицу на сайте по шагамКак создать форму на сайте по шагамКак создать дашборд в личном кабинете пользователяПример создания системы по учету Кадры (HR) на сайтеКак улучшить свой код - заметки по ревизии кодаКак сделать аналитический отчет или таблицу на сайтеПодробное описание процесса создания формы Обратная связьСоздание системы уведомлений из внешних источников (через API)Как отслеживать историю действий пользователя или историю событий по объекту системыКак сделать отслеживание посещений сайта конкретными людьми?Как сделать перевод сайта на другой язык для нетехнического специалистаКак сделать функционал оценки полезности материалаСоздание из под editor структуры личных кабинетов (роли, страницы)Улучшение адаптивности страниц под мобильные устройстваСоблюдение порядка в проекте в процессе сопровождения сайтаКак считать показатели год-к-году (YoY) в отчете по периодамКак добирать данные по объекту из внешних источников по API
Основа Falcon SpaceОсновные компонентыВозможностиКоммуникация пользователейДизайн, стилизация, юзабилити
Гид по стилям Falcon SpaceРуководство по юзабилити сайтов на Falcon SpaceЭлементы стилизации в разметке страниц кабинетов на Falcon SpaceУправление темами сайта. Как создать новую тему дизайна сайтаКак внедрять готовую верстку в страницуКак внедрить форму настроек внешнего вида сайтаГорячие клавиши Falcon SpaceСоздание своей темы для сайтаОграничения по изменению дизайнаКак сделать дизайн сайта со скругленными элементами (или без скруглений)Как сделать свою верхнюю полоску сайта (customHeader)Как внедрить новый шрифтКак через CSS управлять стилями конкретных страницКак показать элемент увеличенным при наведении (например ячейка таблицы)Изменение стилизации через CSSКак поменять столбцы местами на смартфоне (order-1 order-md-2)Как сделать анимацию иконокАнимация элементов. Как работать с анимациейДобавление анимацииУправление анимацией для форм, таблицКастомные CSS файлы для страницыПанели с тенью и со скруглением Как внедрить свой CSS на каждой странице порталаКак сделать основное меню горизонтальнымКак убрать все тени и сделать дизайн плоскимКастом разметка верхней панели (TopMakeup)Интерфейс кабинета - это не методы репозитория CRUD!Как сделать липкую панель сверху страницыКак сделать основное меню белымВывод справа на странице float панелиКак поменять степень затемнения фона у диалогового окнаУправление иконкой в окне alert справа вверху окнаКак стилизовать иконкуВывод на экран денежных сумм (отображение рублей, валюты) - as-moneyКак увеличить картинку на страницеВизуализация воронки на основе данныхКак сделать модальное окно определенной шириныПанели показа подсказок (для базовых инструкций по странице)Как сделать левое меню по умолчанию свернутым?
Лендинги
Работа с лендингами (lands)Как создать новый лендинг?Как максимально быстро создать лендинг на базе Falcon SpaceКак внедрить лендинг со своим шаблоном и стилямиКак создать сайт полностью на лендингах?Как устроен механизм лендингов внутриКак переместить лендинг на главную страницу (или на любую другую)Как сделать набор типовых лендингов (например, карточки товаров)?Как сделать копию лендинга с другим адресом или перенести лендинг на другой сайтКак использовать много раз одну секцию в разных лендахКак отключить секцию лендинга или менять их порядок на лендингеКак задать высоту/подложку секции лендингаКак для ленда подключить скрипты или CSSКак прописать SEO параметры для лендаКак создать свой шаблон новой секции лендинга?Как редактировать секцию лендингаГде посмотреть список лендингов?Как сделать меню лендинга или меню сайта на лендахКак сделать подстановочными фавикон, seo title у лендингаКак сделать так, чтобы PWA работал для лендингов
Универсальный APIИнтеграции
Подключение к удаленным серверам SQL Server через Linked ServerZapier интеграция на платформе Falcon SpaceПрием платежей через Яндекс.КассуИнтеграция с Робокассой (платежный шлюз)Пополнение средств через Yookassa (Юкасса)Прием платежей на сайте через CloudPaymentsИнтеграция с платежным шлюзом LifePayУведомление от ТБанка по операциям с расчетным счетомИнтернет-эквайринг Тинькоф БанкИнтеграция API DaData.ru подсказки по адресамИнтеграция коллтрекинга МАНГО ОФИС (режим Площадка)Интеграция API Курсы валют Центрального Банка РФИнтеграция API Почта РФИнтеграция API Служба доставки СДЭК (CDEK)Интеграция API Служба доставки Деловые линииИнтеграция API IpGeoBase Город по IP-адресуИнтеграция API DaData.ru Город по IP-адресуКак вычислить расстояние между 2 геоточками через Google MapsКак сделать интеграцию с Мой СкладКак сделать вебхук для передачи данных с Тильды на Falcon SpaceСканирование штрихкодов и QR кодов через камеру смартфонаПолучение данных контрагента по ИННВнедрение подсказок dadata на сайтВывод точек на карте Яндекс. Интеграция с Яндекс КартыИнтеграция с телефонией Zadarma.comПолучение данных о контрагенте - интеграция ЗаЧестныйБизнесИнтеграция с AMO CRMИмпорт контактов в CRM из Google КонтактыВход/регистрация через ВКонтакте(vk.com)Интеграция CRM с онлайн чатом на сайте (Replain)Как связать yandex metrika clientID с пользователем сайта?Как сделать обработку входящей почты (создание клиента в CRM из Email)Интеграция сайта с ChatGPT (openAI)Интеграция с Яндекс МетрикаИнтеграция с Youtube. Получение роликов каналаИнтеграция с Ozon, Wildberries - извлечение статистикиИнтеграция с API Яндекс Вебмастер
КаталогиНавигацияДокументыДополнительные компонентыПродвижение, SEOСистемные моменты
Отслеживание изменений хранимых процедур и страниц (logChanges)Логирование изменений объектов на примере хранимых процедурРабота с редактором кода в личном кабинете разработчикаЛогирование событий в приложении (trace)Действия в браузере actions JSONКак быстро перенести решение (таблицы, формы, страницы) на другую базу?Настройка диалоговых окон и alert окошекМелкие удобства для разработчика в личном кабинетеКак отследить и ограничить большое количество однородных запросов на сайтеИзменение процедуры поиска, процедуры общих элементов Layout, процедуры периодического запускаКак изменить длительность показа сообщенийФорма обратной связи по ошибкам, предложениям suggestionКак разграничивать права на уровне бизнес-логики хранимых процедурБезопасная обработка данных и проверка доступа в хранимых процедурахИспользование типовой разметки в виде сниппетов для решения различных задачКак логировать клики на определенных элементах в системеОбработка старых браузеров (сообщение об устаревшем браузере)Безопасность. Как скрыть некоторые заголовки (http headers) в запросахОтображение сообщения об offline (Нет сети)Рабочее место разработчика через терминалОбновляемые метки времени в сообщениях на сайтеПодсказка по интерфейсам хранимых процедур компонентовЗащита от CSRF атак через дополнительный токен в формахДополнительные параметры в @parameters (во многих хранимых процедурах)Как логировать события в Falcon в другую базу (чтобы ограничить рост основной базы данных)Сообщение об использовании куки (Cookies)Как искать код некоего компонента (таблицы, формы и т.д.) на страницеКак сделать так, чтобы почта отправлялась асинхронно без задержекРабота со сниппетами кодаУниверсальная кнопка действия as_submitРежим показа таблицы/формы в alert окнеРеализация системы анализа IP посетителей
Системное администрированиеHOWTO
Как сделать отдельный универсальный поискМодальная ссылка (as-modal)Как идентифицировать анонимного пользователя (по куки)?Дашборды. Как вызвать коллбек после загрузки дашбордаКак вынести правила редиректа в отдельный файл configСтраницы. Как сделать редирект на другую страницу при загрузкеСтраницы. Как изменить текст на главнойСтраницы. Как использовать дополнительные параметры на страницеСтраницы. Как выводить списковые данные в теле страницы (repeater)Страницы. Настройки страницы для формирования главного менюСтраницы. Мне нужен в URL параметр itemID, но там передается из-за сущностей InstanceIDСтраницы. Как сделать мастер описания функционала страницыКак добавить событие в календарь GoogleКак сделать кнопку определенного действияКак сделать горячие клавиши для событий (нажатие кнопки)Как показывать баланс пользователя вверху кабинета?Где взять фото пользователяКак сделать поддомены с разными языками для сайтаКак управлять страницей “404 Страница не найдена”Отслеживание всех действий пользователя в системеКак выводить денежные данныеКак дать возможность некоторым ролям вводить html в формах?Что делать если открытая вкладка (tab) сбрасывается при перезагрузке страницы?Как реализовать создание периодического отчета на почтуПопап (popup) окна - показ модальной формы по событию или таймаутуКак быстро просматривать типовые отчеты с возможностью редактирования SQLКак максимизировать показатели Google PageSpeed для сайта на Falcon SpaceКак реализовать окно уведомления об использовании куки (cookies)Вывод на странице штрихкода (barcode) и QR кодаКак в тексте сделать ссылки кликабельнымиКак внедрить на сайте автоопределение города с возможностью выбораКак внедрить оглавление в текстКак вставить универсальный поиск в любое место страницыКак определить координаты lat lng пользователя в текущий моментКак сделать сортировку дерева с Drag-and-DropКак обновить часть страницы по клику на кнопкеЗагрузка дашборда по ссылке as-dashboard-linkКак запретить копировать текст с сайта. Как добавлять ссылку копирайта в текст при копировании с сайтаКак изменить шаблоны хранимых процедур для Формы, Таблицы и др.Определение местоположения пользователя по IP через API (as-ip)Форма Нашли ошибку по Ctrl+EnterКак определить откуда пришел пользователь на сайт? Фиксация источника посещения пользователем сайтаКак сделать ссылку, которая скроллит к элементу на страницеКак показать/скрыть область на странице по ссылке - as-collapseКак сделать обновление интрефейса у другого пользователя по некоему событию
Таблицы
Как сделать таблицу в модальном окне (открывается в диалоговом окне)Как реализовать подтаблицу (вложенная таблица), подформу в таблицеКак связать 2 таблицы Загрузка таблицы по ссылкеКак связать таблицу и редактирование сущности (зависимая страница)Как использовать комментарии в таблицахКак добавить в фильтре значение Не выбрано со значениемКак установить ширину колонки в таблице Как добавить диапазон даты или чисел (слайдер) в фильтрКак сделать операции только для некоторых строкКак делать различный набор столбцов одной таблицы для разных ролейКак убрать показ количества строк результата в заголовке таблицы? Как сделать сортировку в таблицеКак сделать Editable для галочки (Да/Нет) в AS CRUDКак редактировать колонку с датойКак скрыть строчные операции в таблице для определенных строкКак добавить коллбек после загрузки таблицыОтображение таблиц на смартфонеКак работать с галочками в таблицеЧастые ошибки при настройке таблицы (почему не работает таблица)Как обновить подтаблицу после выполнения некой операцииКак обрабатывать групповые операции через модальную формуКак создать предустановленные фильтры для таблицыКак сделать сворачивание таблицы (collapse table)Как убрать старые dict процедуры в формах и таблицахКак сделать фильтр с деревом галочекКак отключить сохранение состояния таблицы (фильтры)Как сделать ссылку на всю строку таблицыКак передать через URL значение фильтраКак сделать обрезание ячеек таблицыСортировка строк в таблицеСоздание сущности с учетом значений фильтровОптимизация запроса SQL - извлечение данных для таблицыКастомная разметка в таблицеРежим кастом вывода через JS (custom)Как настроить дополнительные шапку и подвал у таблицыКак сделать зависимые фильтры в таблицеИмпорт данных в формате файлов txt, csv через таблицуКак гибко управлять видимостью столбцов таблицыКак сделать раскрытие подстроки через любую ссылкуРежим быстрой фильтрации строк без обращения на серверВыпадающая панель рядом с названием таблицы dropdownPanelКак убрать при загрузке установку фокуса ввода на фильтр (data-nofocus)?Как сделать аналитику по периодам (таблица с интервалами дат)Кастомизация вида операций таблицыСтилизация фильтров таблицы
Формы
Как вывести форму во всплывающем окне рядом с кнопкой (popover)Загрузка формы по ссылкеКак принимать в форму не 1 параметр (itemID), а несколько входящих параметров? data-param-p1Как сделать модальную форму Как добавить коллбек после загрузки формы и после сохранения формы.Как показывать на форме прогресс заполнения (прогресс заполнения формы)Как сделать форму в виде мастера шаговКак сделать подтверждение действия в СМС (SMS) в формеКак установить поля в форме по умолчанию при загрузкеКак показывать изменяющуюся информацию при изменении полейФормы. Как сделать в форме более 1 кнопки действий (несколько кнопок действий на форме)Как правильно обрабатывать цены (дробные числа) на формеКак передать в форму скрытый параметрКак в форме добавить примеры заполнения полей (example)Как выбрать значение списка через справочник в модальном окнеКак сделать окно подтверждения действия формыДинамическое изменение itemID у формы в зависимости от других элементов страницыКак скрывать/показывать, обновлять область на странице при изменении поля формыКак добавить новый элемент, если в списке на форме его нетКак перезагрузить страницу после сохранения формыКак вывести списковые данные или таблицу внутри формыКак сделать зависимые поля в форме (Страна, Город)Как сделать кастомную HTML разметку для формы (jsRender)Как создать кастом форму с подтверждением действия по Email или SMSУстановка фоновой панели для формыКак сделать задержку при сохранении формы (saveDelay)Подсказки-ограничители длины для полей в формеКак динамически изменять тип поля формыКак сохранить значение поля в браузере, чтобы каждый раз его не вбивать при загрузке (оставлять последнее сохраненное). Запоминание поля формы в браузереКак выводить разные данные на одной форме для разных ролейКак сделать форму с сохранением состоянияКак сделать поля с анимацией значенийИспользование Google Recaptcha в формахКак обновить таблицу после сохранения формы в модальном окнеКак указать произвольную маску для поля ввода в формеКастом проверка полей формы через JSКак в выборе даты (datepicker) задать доступные датыКак создать форму для редактирования сущностиЗагрузка формы в выпадающем окне (dropdown)Добавление смайликов (emoji) в поля формКак у формы сделать progress bar при загрузке формыРабота с датами в формахПоказ количества символов рядом с полем в формеКнопка очистки формы ResetКонтроль заполнения ключевых форм на сайтеКак сделать форму с простым подтверждением действия (confirm)Как поменять соотношение длины метки и поляКак при сохранении формы вывести сообщение printlog, а не alert
Поля формы
Поле Список поиска значения (autocomplete, search-select) Как в форме вывести список галочек (множественный выбор поля)Как сделать списки select и chosen с категориями (optgroup)Как сделать выбор адреса и сохранение координат места (lat,lng).Установка графика работы (поле формы weekTime)Как в форму в SaveItem передать некий скрытый параметр (например Куки или параметр URL)Как работать с полем типа Слайдер (ползунок)Как использовать в форме поле Выбор файлов. Типы полей формы files, remoteFile, fileContentКак редактировать текст элементов  HTML в Rich-редактореУправление настройками поля через options_ поляВставка ссылок по шаблону (ютуб ссылка, patternString)Как использовать Флажки и выбор радио с картинкойКак работать с полем ТаймерКак сделать выбор цвета в формеКак вывести дерево с выбором галочекКак выводить и сохранять множественный список через chosen поле.Обработка даты из поля datetime-localРедактор текста - код поля формы html2Как работать с полем Дробное числоКак настроить выбор вариантов для поля Интервал датВыбор из элементов с табуляцией - поле формы tabsТип поля imageCheckbox (флажок-картинка)Поле формы Градиент (gradient)
Загрузка файлов, картинок
Работа с ресурсами. Загрузка картинок, файловУправление файлами на сервере (файловый менеджер)Загрузка на форме текстовых файлов и обработка их в процедуре SaveItemКак добавить в колонку таблицы управление файламиЗагрузка файлов с drop областью и гибкой разметкой (компонент as-files)Как приводить картинки к заданным размерам при загрузке на сайтИмпорт и парсинг файла CSVЧем отличается код типа ресурса от типа объектаКак получить ссылку на ресурсКак установить права доступа на менеджер ресурсов?Как загружать фото с обрезкой Как увеличить размер подгружаемых файлов (как загружать большие файлы)Передача файлов по FTPКак искать битые ресурсы, картинкиПодбор оптимальных параметров менеджера ресурсовПодгружаемые файлыМассовая загрузка картинок в систему ресурсовНе грузится файл через менеджер ресурсовФайлы загружаются на сервер, но при скачивании выходит ошибка 404.3 (загрузка ODT, Проблема с MIME типами)Поддержка Webp формата для оптимизации картинокМассовая оптимизация картинок в менеджерах ресурсовНе выводятся картинки на сайте (401, 403 ошибка при загрузке картинок)Как установить JS callback после выполнения crop картинкиНе отображается картинка юзера справа вверхуКак изменить текст "Нет файлов" в as-resourceManager?Обработка спецсимволов в названии файлов Как поставить водяной знак на картинку при загрузкеКак оптимизировать качество картинок при загрузке на сайтКак создавать для загружаемой картинки копии с разными размерамиКак загружать файл, когда задействовано диалоговое окноКак загрузить файл по конкретному путиКак сделать возможность грузить только 1 фотоКак поставить фильтр на типы файлов и ограничить форматы загрузки картинок?Как обработать событие после удаления или добавления файлов? Не выводятся картинки в менеджере ресурсов. Что делать?Как вставить менеджер ресурсов в форму с заданным itemID
HOWTO SQLHOWTO JSHOWTO ВерсткаРешение проблем

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности

Интеграция Яндекс YML. Импорт-экспорт каталога товаров в YML

Общие сведения о YML

Введение в YML

Данный документ описывает работы с данными в формате YML.

YML (Yandex Market Language) - стандарт, разработанный Яндексом для принятия и размещения информации в базе данных Яндекс.Маркет. При использовании файла YML формата регулярное обновление каталога на Яндекс.Маркет будет происходить автоматически и отражать все актуальные изменения (наличие, цена, появление новых товаров).

                Единый формат позволяет быстро и эффективно обрабатывать информацию и размещать ее в каталоге Яндекс.Маркет.

                Стандарт YML основан на XML (Extensible Markup Language) —  (XML DTD).

Краткое описание формата файла YML

Ниже приведено краткое описание элементов присутствующих в формируемом файле YML. Подробное описание доступно по следующим ссылкам:

 https://yandex.ru/support/partnermarket/export/yml.html#yml-format

https://yandex.ru/support/partnermarket/elements/shop.html

https://yandex.ru/support/partnermarket/offers.html

https://yandex.ru/support/partnermarket/elements/param.html

 

Файл YML состоит из общей информации о магазине и списка товарных предложений - офферов.

 

Основные элементы YML

Элемент

Описание / Пример

xml header

Стандартный XML-заголовок. Должен начинаться с первой строки, с нулевого символа.

Допустимые кодировки YML-файла: UTF-8, windows-1251.

Пример :

yml_catalog

Любой XML-документ может содержать только один корневой элемент. Формат YML в качестве корневого использует элемент <yml_catalog>. Атрибут date элемента должен соответствовать дате и времени генерации YML-файла на стороне магазина. Дата должна иметь формат YYYY-MM-DD hh:mm.

shop

Элемент содержит описание магазина (shop), его предложений (offers) и акций (promos, gifts)*

 *! Внимание.: В нашем примере разделы  promos и gifts не формируются и не обрабатываются при парсинге файла.

Описание элементов раздела shop.

Описание элементов, входящих в раздел shop

Элемент

Описание / Пример

Обязательность

name

Короткое название магазина.

<name>BestSellername>

Обязательно

company

Полное наименование компании, владеющей магазином

<company>Tne Best inc.company>

Обязательно

url

URL главной страницы магазина. Максимальная длина ссылки — 512 символов.

<url>http://best.seller.ruurl>

Обязательно

currencies

Элемент currencies задает список курсов валют магазина. Каждая из валют описывается отдельным элементом currency.

<currencies>

<currency id="RUR" rate="1"/>

currencies>

 

Обязательно

categories

Список категорий магазина.

В формате YML в родительском элементе categories содержится список категорий магазина. Каждая категория описывается отдельным элементом category.

<categories>

<category id="1">Книгиcategory>

<category id="2" parentId="1">Детективыcategory>

categories>

Обязательно

Описание элементов раздела offers.

Описание элементов входящих в раздел  offers

Элемент

Описание / Пример

Обязательность

id

Идентификатор предложения. Макс. длина — 20 символов. Должен быть уникальным для каждого предложения.

В YML является атрибутом для offer.

Обязательно

name

 Полное название предложения.

Обязательно

url

URL страницы товара на сайте магазина.

Максимальная длина ссылки — 512 символов

Обязательно

price

Актуальная цена товара.

Разделитель целой и дробной части — точка

Обязательно

currencyId

 

Валюта, в которой указана цена товара: RUR, USD.

Цена и валюта должны соответствовать друг другу.

Обязательно

categoryId

! Внимание. Используется только в формате YML.

Идентификатор категории товара, присвоенный магазином (целое число, не более 18 знаков).

Обязательно

description

Описание предложения. Длина текста не более 3000 символов (включая знаки препинания). 

Необязательно

param

 

 

Все важные характеристики товара — цвет, размер, объем, материал, вес, возраст, пол, и т.д.

В YML элемент offer может содержать несколько элементов param (один элемент param — одна характеристика).

 

Проверка файла YML

Полученные файлы можно проверить с помощью сервиса - Валидатор XML-видов.

Схема валидации документа – Маркет.

Ссылка  - https://webmaster.yandex.ru/tools/xml-validator/

Результат проверки должен быть:

XML соответствует схеме XSD. 

Пример файла YML

<!--?xml version="1.0" encoding="UTF-8"?-->
<yml_catalog date="2019-11-01 17:22">
<shop>
<name>BestSeller</name>
<company>Tne Best inc.</company>
<url>Ошибка! Недопустимый объект гиперссылки.&gt;
 <currencies>
<currency id="RUR" rate="1"></currency>
</currencies>
<categories>
<category id="1">Бытовая техника</category>
<category id="10" parentid="1">Мелкая техника для кухни</category> </categories>
 <offers>
<offer id="9012">
<name>Мороженица Brand 3811</name> <url>http://best.seller.ru/product_page.asp?pid=12345</url>
<price>8990</price>
<currencyid>RUR</currencyid>
<categoryid>10</categoryid>
<param name="Цвет">белый
<dimensions>20.1/20.551/22.5</dimensions> </offer>
</offers>
<gifts> <!-- подарки не из прайс‑листа --> </gifts>
<promos> <!-- промоакции --> </promos>
</url></shop>
</yml_catalog> 

Выгрузка в файл

Реализован функционал по выгрузке данных из БД Falcon в файл формата YML.

Информация выгружается из следующих таблиц БД:

  • [as_cat_categories] Категории в раздел <categories>
  • [as_cat_products] Товары в раздел <offers>
  • [as_cat_productAttrs] + [as_cat_filters] Параметры в раздел <param >.

Из таблицы [as_cat_categories] выгружаются следующие поля:

[id], [name], [parentID].

Из таблицы [as_cat_products] выгружаются следующие поля:

[id], [name], [price],'RUR' AS currencyId, [url], [desc], categoryID.

Из таблицы [as_cat_filters] выгружаются следующие поля:

[title].

Из таблицы [as_cat_productAttrs] выгружаются следующие поля:

[value],  [intValue], [decimalValue].

Выгрузка осуществляется следующими процедурами:

  1. [as_cat_getYMLFilterValue]
  2. [as_cat_products_getYMLHeaderData].

Процедура [as_cat_getYMLFilterValue]

Входные параметры:

  @productID и @filterID.

Результат:

 возвращает строку вида белый.

Вызов:

Вызывается в процедуре [as_cat_products_getYMLHeaderData] в курсоре.

Примеры вызова:

EXECUTE [dbo].[as_cat_getYMLFilterValue] @productID= 10030  , @filterID = 91

Процедура [as_cat_products_getYMLHeaderData]

Входные параметры:

Переменная

Тип данных

Значение по умолчанию

Примечание

Обязательные параметры файл YML

@shopName

nvarchar(max)

'BestSeller'

- Короткое название магазина.

@shopCompany

nvarchar(max)

'Tne Best inc.'

- Полное наименование компании, владеющей магазином.

@shopURL

nvarchar(512)

'http://best.seller.ru'

- URL главной страницы магазина

Дополнительные параметры файл YML

@isUploadCategorys

bit

0

1 - передавать структуру категорий из as_cat_categories

@isUploadAttrs

bit

0

1 - выгружать атрибуты товара в секцию param

Процедура через дополнительные параметры  @isUploadCategorys и @isUploadAttrs позволяет регулировать содержание файла YML. В т.ч. загружать / не загружать категории из таблицы [as_cat_categories].

И загружать / не загружать атрибуты товара из таблицы [as_cat_productAttrs].

Результат:

                Выводит данные в формате файла YML.

Вызов:

                Вручную, по необходимости.

Примеры вызова:

EXECUTE [dbo].[as_cat_products_getYMLHeaderData] 

  @shopName='TEST_Seller'

, @shopCompany= 'The TEST inc.'

, @shopURL = 'http://TEST_Seller.seller.ru'

, @isUploadCategorys =1

, @isUploadAttrs =1

В результате мы имеем инструмент выводящий отформатированные данные полностью соответствующие спецификации файла YML и проходящие валидацию.

Недостатком процедуры [as_cat_products_getYMLHeaderData] является то, что полученный текст файла необходимо вручную сохранять в файл на диске.

! Примечание: для корректной работы формат файла должен быть UTF-8 !

Процедура [as_cat_products_getYML_File]

Процедура [as_cat_products_getYML_File] запускает вышеуказанную процедуру [as_cat_products_getYMLHeaderData] и создает на диске файл с результатами выполнения этой процедуры.

По сути это оболочка вызова процедуры и создания файла. Других действий не производится.

Технически в процедуре запускаются системная хранимая процедура master..xp_cmdshell  и SQLCmd —   утилита, входящая в состав SQL Server, предназначенная для выполнения скриптов Transact-SQL из командной строки.

Входные параметры:

Переменная

Тип данных

Значение по умолчанию

Примечание

Обязательные параметры

@outputFilePath

NVARCHAR(1000)

нет

 путь к файлу результата (без указания имени файла)

 

Остальные обязательные параметры: @shopName, @shopCompany, @shopURL, @isUploadCategorys, @isUploadAttrs – приведены в таблице выше.

Формат имени выходного файла формируется по шаблону  out_YYYYMMDDTHH_mm.xml,

Где out_ - постоянная часть,  .xml - расширение.  YYYYMMDDTHH_mm  - шаблон даты и времени формирования.

Пример имени файла: out_20200413T14_42.xml

Права доступа:

возможно, будет нужна однократная настройка сервера, для запуска xp_cmdshell, описание по ссылке:

Параметр конфигурации сервера «xp_cmdshell»

https://docs.microsoft.com/ru-ru/sql/database-engine/configure-windows/xp-cmdshell-server-configuration-option?view=sql-server-ver15

Результат:

                Создает по указанному пути @outputFilePath  файл с именем в формате out_YYYYMMDDTHH_mm.xml.

                Возвращаемое значение: 0 Success (успешное завершение) или 1 Failure (неуспешное завершение).

Вызов:

                Вручную, по необходимости.

Примеры вызова:

EXEC [dbo].[as_cat_products_getYML_File] @outputFilePath ='E:\' , @isUploadCategorys = 1 , @isUploadAttrs = 0

! Примечание: для корректной работы формат файла должен быть UTF-8 !

! Примечание: Кодировки файла результата не проверяются. После создания файла необходимо проверить кодировку и, если необходимо пересохранить файл в нужной UTF-8.

(Пересохранить файл можно в блокноте.)

Ссылки:

Служебная программа sqlcmd

https://docs.microsoft.com/ru-ru/sql/tools/sqlcmd-utility?view=sql-server-ver15

Парсинг файла YML и обновление данных в БД.

Также существуют процедуры парсинга (разбора) файла YML и внесения изменений / новых данных в БД Falcon.

Процедура [as_cat_parsingYML]

UPD: 2020-07-10

Процедура  анализирует содержимое полученной переменной типа XML и в зависимости от входящих параметров может выводить диагностическую информацию по полученным данным или вносить изменения в таблицы БД.

Входные параметры:

Переменная

Тип данных

Значение по умолчанию

Примечание

Обязательные параметры

@XML_input

xml

нет

входной параметр - переменная типа XML

@isUpdateDB

bit

0

делать ли изменения в базе или диагностика файла

0 - читаем файл только для диагностики

1 - вносим изменения в БД из файла

@isUpdateAttrs

bit

1

чтение / обновление атрибутов as_cat_productAttrs

1 -работает с атрибутами

0 - пропустить работу с атрибутами

Необязательные параметры

@param_username

nvarchar(256)

NULL Имя пользователя, если не указан, берем серверного CURRENT_USER

@isUpdateCategoriesForAdminONLY

bit

0 При значении = 1 дает возможность изменять / добавлять категории

!Примечание: параметр @isUpdateAttrs (обработка атрибутов) работает при условии если @isUpdateDB=1.

!Примечание: параметр @param_username – используется для определения Поставщика - через поле ctr_contacts.USERNAME - это логин пользователя в системе.

Если в БД [as_cat_suppliers] найден поставщик то будет выполнено обновление / вставка в таблицу [as_cat_supplierProducts]. 

!Примечание: параметр - @isUpdateCategoriesForAdminONLY не доступен из интерфейса – т.к. Категории никак изменять поставщик не может.

Алгоритм и условия работы.

Процедура читает данные из входящей переменной типа XML. Предполагается, что в данных содержится информация из файла YML.

Информация может содержать следующие данные:

  • Категории         раздел <categories>     табл.БД [as_cat_categories]
  • Товары         раздел <offers>         табл.БД [as_cat_products]
  • Параметры товаров  раздел <param >       табл.БД [as_cat_productAttrs]

 

Т.к. мы синхронизируем разные БД, то идентификатор  (id) одинаковых товаров или категорий в разных БД может быть разным. Для получения связи с идентификаторами внешних систем в таблицы [as_cat_categories] и [as_cat_products] добавлено поле outerID nvarchar(64).

Если в БД существуют таблицы as_cat_YMLImportLog и as_cat_YMLImportLogData, то в них будут записываться входные данные и результат работы процедуры.

В дальнейшем из этих таблиц будет формироваться журнал результатов (например, при импорте из файла).

Возможные ошибки (заносится в таблицу as_cat_YMLImportLog):

  • 'Ошибка! НЕ ОПРЕДЕЛЕНА СТРОКА yml_catalog в файле!'
  • 'Ошибка! В БД нет поля для сравнения outerID в табл.as_cat_categories!'
  • 'Ошибка! В БД нет поля для сравнения outerID в табл.as_cat_products!'

Перед запуском процедуры необходимо проверить наличие и заполнение поля outerID!

При чтении данных, читается идентификатор записи (в разделе <categories> или <offers>).

Полученный идентификатор сверяется со значениями в поле outerID.

Если в поле outerID есть запись с таким же идентификатором, то происходит обновление записи.

Если в поле outerID нет искомого идентификатора, то происходит вставка новой строки данных.

Также для корректного обновления или вставки новых данных атрибутов (таблица as_cat_productAttrs) необходимо, чтобы были одинаковыми (в БД приемнике данных  и БД источнике ) следующие  объекты БД:

  1. таблица as_cat_filters - список всех атрибутов. Если в данной таблице не будет поля атрибута, прочитанного из файла, то будет выведено сообщение следующего содержания:

ОШИБКА! НЕ ОПРЕДЕЛЕН справочник (as_cat_filters) для атрибута: Производитель для offerID: 1.

 (заносится в таблицу as_cat_YMLImportLogData)

  1. таблица as_geo_regions - если используется справочник населенных пунктов.
  2. все кастомизированные таблицы справочников as_cat_cust_ ...
  3. все кастомизированные процедуры cat_filter_get_ ...

 Возможны обновления следующих таблиц БД:

  • [as_cat_categories] Данные из раздела <categories>
  • [as_cat_products] Данные из раздела <offers>
  • [as_cat_productAttrs] Данные из раздела <param >

 Результат:

                парсинг входящих данных и обновление таблиц БД

                процедура в результате своей работы выводит строку с общими параметрами работы и подробный журнал выполненных операций. Примеры результатов вывода будут рассмотрены ниже.

 Режимы работы:

Процедура может быть запущена в 2-х режимах:

1 – выводит только диагностическую информацию по полученным данным

2 – чтение полученных данных и вносит изменения в таблицы БД.

 

Пример вызова в режиме диагностики:

В этом режиме достаточно передать только данные XML.

DECLARE @xml xml

SELECT @xml = CAST(x.data as XML)

FROM OPENROWSET(BULK 'E:\YML_realty_ALL.XML', SINGLE_BLOB) AS x (data)

EXECUTE [dbo].[as_cat_parsingYML] @xml

Пример результата в режиме диагностики:

 Диагностика:

yml_catalog: Есть;

shop: Есть;

categories: Есть;

offers: Есть;

offerONE: Есть;

promos: Нет;

gifts: Нет;

param: Есть;

 

АТРИБУТ - № категории: 1;

АТРИБУТ - № под-категории: 1;

АТРИБУТ - № offer (Продукт): 1;

 

Категорий найдено в файле:21

Обновление Категорий в БД: нет;

Продуктов найдено в файле:7

Обновление Продуктов в БД: нет;

журнал выполненных операций – пустой, т.к. никаких операций с БД не проводилось.

Пример вызова в режиме изменения БД:

DECLARE @xml xml

SELECT @xml = CAST(x.data as XML)
FROM OPENROWSET(BULK 'E:\out_20200417T19_51_ATTRIB_1_UTF-8.xml', SINGLE_BLOB) AS x (data) 

EXECUTE [dbo].[as_cat_parsingYML] @xml , @isUpdateDB = 1, @isUpdateAttrs = 1

Пример результата вызова в режиме изменения БД

Диагностика:

yml_catalog: Есть;

shop: Есть;

categories: Есть;

offers: Есть;

offerONE: Есть;

promos: Нет;

gifts: Нет;

param: Есть;

АТРИБУТ - № категории: 1;

АТРИБУТ - № под-категории: 1;

АТРИБУТ - № offer (Продукт): 1;

Категорий найдено в файле:21

Обновление Категорий в БД: Да;

Добавлено  Категорий: 0

Обновлено Категорий: 21

Продуктов найдено в файле:7

Обновление Продуктов в БД: Да;

Добавлено  продуктов: 0

Обновлено продуктов: 7

 

Параметры: Продуктов найдено в файле:7

Параметры: общее кол-во строк:23

Параметры: NULL строк:0

Параметры: Добавлено записей: 0

Параметры: Обновлено записей: 23

 

 журнал выполненных операций

operationName

dbTableName

itemID

outerID

notes

UPDATE

as_cat_products

11495

1014

NULL

UPDATE

as_cat_productAttrs

11489

1

filterID 1 Производитель paramText: Nokia

UPDATE

as_cat_productAttrs

11489

1

filterID 2 Платформа paramText: Android

UPDATE

as_cat_productAttrs

11489

1

filterID 3 Размер экрана paramText: 5.40

UPDATE

as_cat_productAttrs

11489

1

filterID 4 Мощность, Вт paramText: 225

UPDATE

as_cat_productAttrs

11489

1

filterID 5 Проводной paramText: Да

UPDATE

as_cat_productAttrs

11490

2

filterID 1 Производитель paramText: Nokia

UPDATE

as_cat_productAttrs

11490

2

filterID 2 Платформа paramText: IOS

UPDATE

as_cat_productAttrs

11495

1014

filterID 11 Марка спецтехники paramText: Kubota

Журнал выполненных операций с ошибкой. Пример: Журнал результатов импорта файла - Данные 

#

Ошибка

Текст ошибки

Операция

Таблица БД

Код товара

Внешний код

Прим.

13

Нет

Без ошибки

UPDATE

as_cat_productAttrs

11107

10008

filterID 93 Страна paramText: Россия

14

Ошибка

ОШИБКА! НЕ ОПРЕДЕЛЕН справочник (as_cat_filters) для атрибута : Адрес2 offerID: 10013 paramText: ул. Бакланова.

ERROR

as_cat_filters

 

10013

 

15

Нет

Без ошибки

UPDATE

as_cat_productAttrs

11109

11094

filterID 16 Тип Операции paramText: Продажа

Работа с категориями

Т.к. категории никак изменять поставщик не может, то  автоматическая заливка категорий из файла – отключена ( @isUpdateCategoriesForAdminONLY= 0 ).

Если у товара категория не определена в нашем справочнике (это поле OuterID в нашем справочнике категорий), то такому товару присваивается категория – Разное. (Категория с таким именем/названием должна быть в справочнике.)

Если и категории Разное нет в справочнике в Журнал результатов импорта файла - Данные – будет записана ошибка SQL.

Журнал результатов импорта файла - Данные 1

Журнал результатов импорта файла - Данные 2

Процедура [as_cat_parsingYMLbyFile]

Процедура [as_cat_parsingYMLbyFile] дополняет вышеописанную процедуру [as_cat_parsingYML].

Т.к. процедура [as_cat_parsingYML] получает как входной параметр переменную типа XML, то нет возможности прочитать данные напрямую из файла.

Процедура [as_cat_parsingYMLbyFile] читает данные из указанного файла и передает для дальнейшего парсинга в процедуру [as_cat_parsingYML].

Входные параметры:

Переменная

Тип данных

Значение по умолчанию

Примечание

@XMLFilePath

NVARCHAR(1000)

нет

 путь к файлу

@isUpdateDB

bit

0

делать ли изменения в базе или диагностика файла

0 - читаем файл только для диагностики

1 - вносим изменения в БД из файла

@isUpdateAttrs

bit

1

чтение / обновление атрибутов as_cat_productAttrs

1 - работает с атрибутами

0 - пропустить работу с атрибутами

! Внимание: для запуска необходимы дополнительные права доступа на операцию BULK!

Для использования параметра BULK требуется разрешение ADMINISTER BULK OPERATIONS или ADMINISTER DATABASE BULK OPERATIONS.

Результат:

                Результат полностью аналогичен результату работы процедуры [as_cat_parsingYML]..

Вызов:

                Вручную, по необходимости.

Примеры вызова:

EXECUTE [dbo].[as_cat_parsingYMLbyFile] @XMLFilePath = 'E:\out_20200417T19_51_ATTRIB_1_UTF-8.xml' ,

                                        @isUpdateDB_input = 1, @isUpdateAttrs_input = 1

Процедура [as_cat_parsingYML_STR]

Процедура [as_cat_parsingYML_STR] отличается от предыдущей процедуры [as_cat_parsingYML] типом данных входного параметра.

Процедура [as_cat_parsingYML_STR] на вход получает данные в виде строки.

Преобразует строку в XML и производит разбор полученных данных так же, как и процедура [as_cat_parsingYML].

! Примечание: для запуска дополнительных прав доступа не требуется.

Обязательные требования к входной строке.

  1. Тип данных должен быть Nvarchar(max)
  2. Строка в формате Unicode должна начинаться с N'
  3. 1-я строка - декларация XML - кодировка должна быть заменена с "UTF-8" на "UTF-16" (эта операция производится внутри процедуры).

Входные параметры:

                 @xml_STR Nvarchar(max) – переменная типа Nvarchar(max)

Результат:

                парсинг входных данных и обновление таблиц БД

                вывод результата работы в текстовом виде

Вызов:

 Вручную, по необходимости.

Примеры вызова:

DECLARE @xml_str NVarchar(max)

SET @xml_str = N'
EXECUTE [dbo].[as_cat_parsingYML_STR] @xml_str

Пример результата:

Получена строка, символов: 188693

смена кодировки в 1-й строке: "UTF-8" == > "UTF-16":

конвертация строки в xml

yml_catalog: Есть; shop: Есть; categories: Есть; offers: Есть; offerONE: Есть; promos: Нет; gifts: Нет

АТРИБУТ - № категории: 1; АТРИБУТ - № под-категории: 0; АТРИБУТ - № offer (Продукт): 1

Обработка Категорий: Начало

Категорий найдено в файле:6

Добавлено  Категорий: 6

 ID: 2000 2001 2002 2003 2004 2005

Обновлено Категорий: 0

 ID:

Обработка Категорий: Конец

Обработка продуктов: Начало

Продуктов найдено в файле:131

Добавлено  продуктов: 131

 ID: 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 …

Обновлено продуктов: 0

 ID:

Обработка продуктов: Конец

Заключение

В данном документе описан полный цикл работы с форматом YML в БД Falcon.

Дополнительно

https://habr.com/ru/post/216985/

https://webmaster.yandex.ru/tools/xml-validator/

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Нужна бесплатная консультация?
Планируете делать веб-проект?
Если видео Youtube плохо грузится, то попробуйте найти видео в ВК видео на канале Falcon Space
Сайт использует Cookie. Правила конфиденциальности OK
Подождите...