CardNew может использоваться для создания новых записей в sql таблицах БД.
AjaxDispatcher
. В этом случае автоматически после отправки формы и сохранения новых данных
на сервере произойдет загрузка созданной карточки в том же элементе DOM. Если вызов компонента будет осуществлен обычным образом, то
после сохранения произойдет http переадресация на url, указанный в настройках как path_after
.
Взаимодействие с данным компонентом осуществляется путем создания экземпляра класса
xtables\components\CardNew\CardNew
и вызова публичных методов:
get()
- возвращает полностью готовую форму карточки, построенную с использованием переданных в CardNew параметров настройки
getData()
- возвращает массив данных, которые могут быть добавлены в индивидуальный шаблон;
массив состоит из блоков:
'structure'
- массив, в котором ключами будут выступать полные наименования sql таблица + колонка
согласно настройкам; в данном массиве данные для вывода карточки в представлении будут представлены в виде массива:
'name'
- имя для данных (включая подсказку, если она требуется согласно настройкам);
'value'
- поле ввода согласно настроечным параметрам (input, select, textarea, radio, checkbox);
'hidden_inputs'
- блок hidden inputs, согласно настроечным параметрам;
'ajax_dispatcher'
- имя ajDi, необходимо для правильного функционирования карточки;
'popup_menu'
- созданное popup menu, если оно присутствует в параметрах настройки;
'card_title'
- заголовок карточки согласно настройкам.
Пример выходного массива:
[
'structure' => [
'incoming_docs.number' => [
'name' => 'Number',
'value' => 'input, textarea, select, checkbox',
],
],
'hidden_inputs' => [
'' => '',
'' => ''
],
'ajax_dispatcher' => 'ajdi_name',
'popup_menu' => 'popup menu in tags',
'card_title' => 'card title or Card',
...
]
getForm()
- возвращает готовую форму карточки; в данный метод в качестве параметров
должно быть обязательно передано тело карточки $formBody
;$saveButton
:
'css_classes'
- css классы через пробел;
'content'
- содержимое кнопки, включая иконку.
'not_hidden'
- в случае, если данный параметр определен как true
,
то кнопка не будет скрыта; по умолчанию кнопка скрыта.
$saveButton = [
'css classes' => 'some_classes',
'content' => 'Save ......',
'not_hidden' => true
]
Создание карточки по стандартному шаблону:
use xtables\components\CardNew\CardNew;
$card = new CardNew($params);
/**
* @return string html card with all data according to settings in current app component
*/
$somecard = $card->get();
Создание карточки по индивидуальному шаблону:
use xtables\components\CardNew\CardNew;
$card = new CardNew($params);
/**
* @return array ready card data to use in specific card samples for making cardBody
*/
$data = $card->getData();
$cardBody = $this->someMethodForCreate($data);
/**
* @param string $cardBody main card content in html tags
* @param array $saveBut 'css_classes' and 'content' if need change standart one
* @param array $cancelBut 'css_classes' and 'content' if need change standart one
* @return string ready card in html tags
*/
$someCard = $this->getForm($cardBody);
Настроечные параметры для генерации новой карточки должны быть составлены в виде ассоциативного массива (или объекта), который передается в конструктор данного компонента. Рекомендуется помещать их в отдельном файле.
date
- для даты; time
- для даты и времени.
add_log
condition_id
edit
pre_condition
pre_order
search
select
structure
table
table_add
dbc (string)
Название подключения к БД из пула подключений в файле config.php
.
Если не указано, то выборка будет производиться из первой по списку БД.
'dbc' => 'pgsql'
newcard_sample (string)
Карточка строится с использованием шаблона, находящегося в настройках в файле /config/card/newcard.html
. При необходимости
данный шаблон может быть отредактирован.
Если нужно построить карточку на дополнительных шаблонах, то нужно определить параметр
newcard_sample
, указав в нем относительный путь до файла со специфичным шаблоном карточки
от базового каталога, соответствующего константе XTABLES_BASE
. Это является дополнительной и более простой возможностью
к построению полностью индивидуальной карточки с использованием метода данного компонента getData()
, описанного выше.
При построении специальных шаблонов нужно руководствоваться требованиями, указанными в файле с базовым шаблоном таблицы
/config/card/newcard.html
. Можно разместить дополнительные шаблоны в том же каталоге, что и базовый, либо в другом.
html
.
Расширение значения не имеет, так как не учитывается. Важно использовать шаблоны, находящиеся в тегах <!--{}-->
в базовом шаблоне.
'newcard_sample' => '/config/card/newcard-specific.html'
table (string) передача во входных параметрах блокируется
Название sql таблицы, в которую будет осуществляться вставка (поддерживается вставка только в одну таблицу, в дальнейшем карточки разных таблиц могут связываться друг с другом, см. CardView)
'table' => 'incoming_docs'
structure (array with array values) передача во входных параметрах блокируется
Массив параметров для определения полей для ввода данных. Поддерживаются html формы input, textarea, select, radio, checkbox.
checkbox
при сохранении все выбранные значения преобразуются
из массива в строку, используя в качестве разделителя знак запятой ,
В качестве ключей выступают полные названия колонк (sql таблица + колонка через точку), в качестве значений - массив параметров:
'name'
- название, как оно будет отображаться на странице;
'type'
- тип элемента html
формы; поддерживаются input
, textarea
,
radio
, checkbox
, select
; либо скрытый элемент hidden
, данные которого
предустанавливаются и не должны вводиться пользователем;
'values'
- массив со значениями для элементов radio
, checkbox
, select
;
'css_id'
- добавление идентификатора css
;
'css_classes'
- добавление классов css
'value'
- предустановленное значение поля, например, для элементов с типом hidden
или массив параметров для
composite_number
;
'max_len'
- максимальная длина поля (количество символов); для ограничения используется js; на странице показывается
оставшееся допустимое к вводу количество символов; при вводе символов показывается остаток, который последовательно
меняет свой цвет на желтый (осталось 20 и менее) и красный (достингнут 0); после этого ввод символов блокируется JS;
'access'
- если нужно ограничить показ данного поля, нужно определить данный параметр, указав:
func
- название callable функции;params
- параметры (если в качестве параметров будут указаны sql таблица + колонка через точку,
соответствующие выборке из БД, то будут подставлены соответствующие значения);
'sql_type'
- по умолчанию, если имя колонки имеет в своем составе date
, то к нему
применяются правила даты, если time
- правила даты и времени; если поле не имеет в своем имени подобных
обозначений, то можно использовать данный параметр, присвоив ему значения date
или time
.
Если данные должны быть вставлены с какими-то предопределенными значениями, которые не вводит пользователь, то можно
использовать в настройке тип hidden
Может использовать автокомплит на поле ввода, который проверяет на наличие значений в определенном столбце определенной sql
таблицы. Автокомплит обеспечивается классом xtables\base\Autocomplete
(подробности настройки см. Autocomplete).
К ячейке могут добавляться css идентификаторы и классы. Если необходимо сделать поле обязательным к заполнению, то необходимо
добавить ему класс required
'structure' => [
'some_table.group' => [
'name' => 'Тип документа',
'type' => 'select',
'values' => [
'' => '',
'' => '',
]
],
'some_table.group2' => [
'name' => 'Тип документа',
'type' => 'radio',
'values' => [
'' => '',
'' => '',
]
],
'some_table.group3' => [
'name' => 'Тип документа',
'type' => 'checkbox',
'values' => [
'' => '',
'' => '',
]
],
'some_table.from_who' => [
'name' => 'От кого',
'type' => 'textarea',
'css_id' => 'autocomplete1',
'max_len' => 200,
'css_classes' => 'required'
],
'some_table.address' => [
'name' => 'Адрес',
'type' => 'input'
],
'some_table.reg_date' => [
'type' => 'hidden',
'value' => date("d.m.Y")
],
'some_table.number' => [
'type' => 'hidden',
'value' => [
'names' => [
'group',
date("Y") => 'predefined',
'id'
],
'delimiter' => '/'
]
],
'some_table.some_column' => [ // need to format as date when insert to db
'type' => 'input',
'css_classes' => 'date',
'sql_type' => 'date'
]
]
Композитные значения как параметр structure
При создании новой записи имеется возможность добавления композитного значения,
то есть строки, состоящей из вводимых пользователем при заполнении новой карточки данных,
данных predefined
, предопределенных в настройках, и автоматически
создаваемого в базе данных id
(primary autoincrement), разделенные знаком разделителя delimiter
.
Для использования данного вида нужно составить параметр insert
следующим образом:
'type'
- параметр 'hidden'
'value'
- массив с параметрами:
'names'
- массив с параметрами (значения в итоговом результате будут расставлены так, как
они расположены в данном массиве, какие-либо специальные обозначения типов параметров
не требуются xTables разберет их самостоятельно):id
- если нужно подставить автоматический инкремент базы данных, то в качестве
значения нужно использовать id
(можно использовать в разных местах несколько
раз); автоинкремент будет поставлен в том месте, где он расположен в массиве;
callable
, возвращающие строку как результат своего выполнения,
которая может быть добавлена в композитное значение; если в функцию нужно передать массив параметров,
то нужно обозначить функцию в качестве ключа, а массив параметров в качестве значения; xTables проверит
массив параметров и если найдет в нем наименования sql колонок, совпадающие с имеющимися в
настройках, то подставит в них введенные с клиента значения; использование 'id'
для подстановки автоинкрементного значения в параметрах функции не поддерживается;
'delimiter'
- что использовать в качестве разделителя между каждым значением
из массива names
и автоматическим id
insert
.
'structure' => [
'some_table.whom' => [
'type' => 'input'
],
'some_table.outgoing_number_composite' => [
'type' => 'hidden',
'value' => [
'names' => [
'whom',
'some_manual_value',
'\app\SomeClass::newCompositeTest',
'\app\SomeClass::newCompositeTest' => [
[
'some_table.whom',
'some_manual_value'
]
],
'id', // use id for update with autoincrement
'some_manual_value_else',
'some_table.content'
],
'delimiter' => '/'
]
]
]
card_title (string)
Название, которое отображается в верхней части карточки
'card_title' => 'Новая карточка'
callback (string|array)
если необходимо выполнить какую-нибудь callable функцию после осуществления обновления данных, то необходимо указать ее в данном параметре в виде:
func
- имя функции;params
- массив с параметрами;
'callback' => [
'func' => 'some\Func::name',
'params' => [
'param',
'else'
]
],
// 'callback' => 'some\Func::name',
path (string)
Url для вызова новой карточки.
'path' => 'incoming/newcard'
path_after (string)
Путь для перехода после сохранения новой карточки.
'path_after' => 'incoming/card'
reload (boolean)
Если содержимое загружается с помощью ajaxDispatcher, то по умолчанию после создания новой карточки на той же странице будет загружаться
созданная карточка. Если необходимо, чтобы после создания, форма новой карточки перезагружалась (без перезагрузки страницы),
то нужно включить параметр reload
со значением true
(только при загрузке содержимого
аякс-диспетчером).
'reload' => true
reset_cache (string|array)
По умолчанию при обновлении данных происходит очистка кэша текущей sql таблицы; если необходимо очищать дополнительные таблицы, то нужно включить данный параметр и добавить названия таких дополнительных таблиц.
'reset_cache' => ['some_else_table', 'some_else_table2'], // 'some_else_table'
popup_menu (array)
Горизонтальное меню в верхней части новой карточки.
'title'
- название или иконка, отображаемое в кнопке меню; по умолчанию используется иконка:
'items'
- массив с пунктами меню (ссылки с названиями); для разделителя используйте значение 'divider'
;
'access'
- если нужно ограничить показ данного поля, нужно определить данный параметр, указав:
func
- название callable функции;params
- параметры;
'popup_menu' => [
'title' => 'some_text_icon', // some text or icon
'items' => [
'<a href="/incoming/newcard">Новая запись</a>',
'<a href="/incoming/journal">Таблица</a>'
],
'access' => ['some_user_group', 'else_group']
]
Если необходимо создать несколько групп кнопок, то нужно каждый из указанных массивов обернуть в массив.
'popup_menu' => [
[
'title' => 'some_text_icon', // some text or icon
'items' => [
'<a href="/incoming/newcard">Новая запись</a>',
'<a href="/incoming/journal">Таблица</a>'
],
'access' => ['some_user_group', 'else_group']
],
[
'title' => 'some_text_icon', // some text or icon
'items' => [
'<a href="/incoming/newcard">Новая запись</a>',
'<a href="/incoming/journal">Таблица</a>'
],
'access' => ['some_user_group', 'else_group']
]
]
helper (array)
Пояснительные подсказки, обозначаемые знаком вопроса
'items'
- массив с подсказами, ключами в котором являются sql названия столбцов
(как они указаны в массиве 'structure'
), значением текст подсказки;
'access'
- если нужно ограничить показ данного поля, нужно определить данный параметр, указав:
func
- название callable функции;params
- параметры;
'helper' => [
'items' => [
'number' => 'Введите данные номера в поле'
],
'access' => ['some_user_group', 'else_group']
]
add_log (array) передача во входных параметрах блокируется
При необходимости осуществления записи информации о создании новой карточки в лог можно
использовать массив параметров 'add_log'
:
'table'
- название sql таблицы-лога, в которую нужно сохранить информацию об истории;
по умолчанию, если не указано, то будет использоваться log_base
;
'event'
- описание события:event
в json encoded строке;
при совпадении с названием столбцов в редактировавшейся записи
в истории будет использоваться введенное пользователем значение; если нет, то ключ будет проигнорирован;
таким образом, в лог будут попадать только реально редактировавшиеся данные из определенного в параметре списка
полей.
log_base
.
'add_log' => [
//'table' => 'log_table_name', // if not defined will be 'log_base'
'event' => [
'some_table.some_column' => 'name to save in log',
'some_table.some_column2' => 'name2 to save in log'
]
]
Пример новой карточки с вызовом через ajaxDispatcher: