====== Методы для обработки форм ======
Методы обработки форм классов [[api:qpage|QPage и QUserControl]] предназначены для создания или изменения статей контента посредством HTML-форм, но могут также использоваться для программной модификации содержимого контентов.
===== AddFormToContent =====
Метод используется для создания новых статей:
public int AddFormToContent(string content_name, string status_name)
и обновления существующих:
public int AddFormToContent(string content_name, string status_name, int content_item_id)
Необходимо передать:
* Имя контента (поддерживается [[:development:container#выбор_источника|динамическое изменение контента]])
* Имя статуса (обычно -- "Published")
* ID статьи (при обновлении)
Перед вызовом AddFormToContent значения полей статьи должны находиться в коллекции [[development:Values]], данные в которую могут попасть либо автоматически при отправке на сервер HTML-формы (имена полей формы должны формироваться с помощью функции [[api:qpage:other#FieldName]]), либо вручную, с помощью функции [[api:qpage:values#AddValue]] (ключи также должны быть созданы с помощью [[api:qpage:other#FieldName]]).
Возвращает ID созданной/обновленной статьи. Также этот ID записывается в коллекцию [[development:Values]] c ключом ''new_content_item_id''.
Если в веб-форме есть поля ввода типа file с корректными именами (имена полей должны формироваться с помощью функции [[api:qpage:other#FieldName]]), то соответствующие файлы будут сохранены в [[:content:library|библиотеку контента]]. Если файл с таким именем уже существует, то файл будет сохранен под измененным именем с числовым индексом, например ''image[1].jpg''. Также при необходимости будут сгенерированы динамические изображения.
Поддерживается полноценная работа с расщепленными статьями, включая Many-To-Many и Many-To-One поля. Значения таких полей должны представлять собой строку идентификаторов связанных статей, разделенных запятыми.
Метод поддерживает отправку уведомлений. Если такое поведение нежелательно, можно использовать [[#AddFormToContentWithoutNotification]].
В методе производятся следующие проверки на сохраняемые поля:
* Тип поля (числовой, дата)
* Обязательность
* Уникальность
* Допустимая длина и маска ввода (поле типа String)
Кроме того:
* При обновлении статьи создается ее версия.
* Вся работа с БД происходит в одной транзакции.
Реализовано с помощью метода [[api:dbconnector:update_article#AddFormToContent]] класса [[api:DBConnector]].
===Пример===
AddValue(FieldName("Users", "Login"), Login);
AddValue(FieldName("Users", "Password"), Password);
AddFormToContent("Users", "Published");
===== AddFormToContentWithoutNotification =====
public int AddFormToContentWithoutNotification(string content_name, string status_name)
public int AddFormToContentWithoutNotification(string content_name, string status_name, int content_item_id)
Методы работают аналогично [[#AddFormToContent]], но без посылки уведомлений.
===== UpdateContentItem =====
public void UpdateContentItem()
Работает подобно [[#AddFormToContent]] с параметром content_item_id, но в данном случае ID статьи передается через коллекцию [[api:qpage#Values]](ключ //content_item_id//). Имя контента вычисляется по ID статьи. Если в коллекции [[api:qpage#Values]] будут присутствовать не все поля, то значения обнулятся. Если же это поведение нежелательно, то нужно использовать перегруженную версию с параметром ''updateEmpty = false''.
UpdateContentItem инициирует отправку уведомлений. Если это поведение нежелательно, можно использовать [[#UpdateContentItemWithoutNotification]].
public void UpdateContentItem(bool updateEmpty, string statusName)
Эта перегруженная версия метода позволяет обновлять статус статьи (если статус менять не нужно, то передайте в метод пустую строку), а также обновлять только несколько полей статьи с помощью параметра ''updateEmpty = false'' (данный вариант предпочтительнее, чем несколько вызовов [[#UpdateContentItemField]]).
Реализовано с помощью метода [[api:dbconnector:update_article#UpdateContentItem]] класса [[api:DBConnector]].
===Пример===
AddValue("content_item_id", 12345);
AddValue(FieldName("Users", "Login"), Login);
AddValue(FieldName("Users", "Password"), Password);
UpdateContentItem();
===== UpdateContentItemWithoutNotification =====
public void UpdateContentItemWithoutNotification()
Работает подобно [[#UpdateContentItem]], но без посылки уведомлений.
===== UpdateContentItemField =====
public void UpdateContentItemField(string content_name, string field_name, int content_item_id)
Метод работает аналогично [[#AddFormToContent]] c параметром content_item_id, но он предназначен для обновления только одного поля статьи. Если необходимо обновление сразу нескольких полей, лучше воспользоваться методом [[#UpdateContentItem]] с параметром ''UpdateEmpty = false''. По умолчанию метод не инициирует отправку уведомлений. Если это поведение надо изменить, можно воспользоваться перегруженной версией:
public void UpdateContentItemField(string content_name, string field_name, int content_item_id, bool with_notification)
Реализовано с помощью метода [[api:dbconnector:update_article#UpdateContentItemField]] класса [[api:DBConnector]].
===Пример===
AddValue(FieldName("Users", "Login"), "newLogin");
UpdateContentItemField("Users", "Login", Value("cid"));
===== AddUpdateContentItemLink =====
public int AddUpdateContentItemLink(string LinkFieldName, int ItemID, string LinkItems, string TargetLinkItems)
Добавляет или обновляет заданное поле связи типа M2M (параметр //LinkFieldName//) для заданной статьи (параметр //ItemID//). Возвращает 1 в случае удачного завершения, -1 -- при неудачном. Значение поля передается в параметре //LinkItems//. Оно представляет собой строку идентификаторов связанных статей, разделенных запятыми. Параметр //TargetLinkItems// позволяет ограничить набор обновляемых идентификаторов. Формат этого параметра такой же, как и у параметра //LinkItems//. Если обновление затрагивает все идентификаторы, то в качестве параметра //TargetLinkItems// нужно передать пустую строку.
===Пример===
AddUpdateContentItemLink("Books", NumValue("AuthorID"), Value("12345,45678,7890, 23415, 8907"), "");
===== RemoveContentItem =====
public void RemoveContentItem(int content_item_id)
Удаляет статью по заданному идентификатору. Метод поддерживает уведомления.
Реализовано с помощью метода [[api:dbconnector:update_article#DeleteContentItem]] класса [[api:DBConnector]].
===== DeleteContentItem =====
public void DeleteContentItem()
Удаляет статью по заданному идентификатору, который передается через коллекцию [[api:qpage#Values]] (ключ content_item_id). Метод поддерживает уведомления.
Реализовано с помощью метода [[api:dbconnector:update_article#DeleteContentItem]] класса [[api:DBConnector]].