id
.
Рекомендуется использовать его в качестве простого первичного ключа с автоинкрементом, что обеспечит возможность делать
эффективные связи между разными таблицами и быстродействие базы данных.
TableView может использоваться для построения табличного представления больших срезов данных. Он имеет пагинацию, сортировку по столбцам, форму поиска (сложной фильтрации) и другие возможности.
AjaxDispatcher
. В этом случае автоматически пагинация, сортировка столбцов и поиск будут осуществляться
через ajax вызовы с размещением результатов в тех же элементах DOM. При обычном вызове пагинация, сортировка и поиск будут работать как
обычные html ссылки.
Взаимодействие с данным компонентом осуществляется путем создания экземпляра класса xtables\components\TableView\Tableview
и вызова его двух публичных методов get()
и getSearchForm()
.
getSearchForm()
должен вызываться ПОСЛЕ методаget()
,
Метод get()
возвращает таблицу, построенную с использованием переданных в TableView
параметров настройки,
getSearchForm()
- форму поиска, также построенную на основании указанных параметров.
use xtables\components\TableView\TableView;
$table = new TableView($params);
/**
* @return string html table with all data according to settings in current Particular agent
*/
$mainTable = $table->get();
/**
* @return string html search for for directly adding to page
*/
$searchForm = $table->getSearchForm();
Настроечные параметры для генерации таблицы должны быть составлены в виде ассоциативного массива (или объекта), который передается в конструктор данного компонента. Рекомендуется помещать их в отдельном файле.
date
- для даты; time
- для даты и времени.
add_log
condition_id
edit
pre_condition
pre_order
search
select
structure
table
table_add
dbc (string)
Название подключения к БД из пула подключений в файле config.php
.
Если не указано, то выборка будет производиться из первой по списку БД.
'dbc' => 'pgsql'
table_sample (string)
Таблица строится с использованием шаблона, находящегося в настройках в файле /config/table/table.html
. При необходимости
данный шаблон может быть отредактирован.
Если нужно построить таблицу на дополнительных шаблонах, то нужно определить параметр
table_sample
, указав в нем относительный путь до файла со специфичным шаблоном таблицы
от базового каталога, соответствующего константе XTABLES_BASE
.
При построении специальных шаблонов нужно руководствоваться требованиями, указанными в файле с базовым шаблоном таблицы
/config/table/table.html
. Можно разместить дополнительные шаблоны в том же каталоге, что и базовый, либо в другом.
html
.
Расширение значения не имеет, так как не учитывается. Важно использовать шаблоны, находящиеся в тегах <!--{}-->
в базовом шаблоне.
/config/table/table-report.html
,
'table_sample' => '/config/table/table-specific.html'
structure (array) передача во входных параметрах блокируется
Массив параметров для построения таблицы:
name
- наименование колонки, как оно будет отображаться на странице;
rearrange
- если необходимо осуществлять сортировку по столбцу, где применяется функция,
то необходимо определить полное название, включающее название sql таблицы и столбец, по которому будет сортироваться,
в данном параметре;
params
- массив с параметрами, которые будут переданы в callable функцию;
если в качестве параметра будет указано полное название, включающее название sql таблицу и столбец через точку,
то в качестве параметра будет передано соответствующее значение из выборки из базы данных;
css_classes
- ячейке таблицы будут добавлены css классы, указанные здесь через пробел;
css_style
- если необходимо прямо указать какие-то инлайн стили, то можно
указать их в строке здесь, например: width: 80px; font-weight: bold
.
'del_button'
- системная кнопка удалить: удаляет запись, при наличии в настройках сохраняет лог, обновляет ajax dispatcher,
если компонент загружен с его использованием, либо обеспечивает переход по адресу, указанному в параметре
'path_after_del'
; для использование этой системной кнопки необходимо определить в выборке
select
поле с первичным id
, в противном случае будет сгенерировано сообщение
об ошибке;
'structure' => [
'outgoing_docs.number' => 'Исх. номер',
'outgoing_docs.reg_date' => 'Дата регистрации',
'app\some\class::someMethod' => [
'name' => 'Statistics',
'rearrange' => 'outgoing_docs.some_column',
'params' => [
'outgoing_docs.some_column',
'outgoing_docs.else_column',
'some_param'
],
'css_classes' => 'some-class hidden-sm',
'css_style' => 'widht: 80px; font-size: 24pt'
],
'del_button'
]
select (array) передача во входных параметрах блокируется
Массив параметров для выборки из sql таблиц, необходимо указывать полное название (sql таблица + колонка через точку).
По умолчанию, если имя колонки имеет в своем составе date
, то к нему
применяются правила даты, если time
- правила даты и времени; если поле не имеет в своем имени подобных
обозначений, но необходимо форматировать выводимые данные как дату, то можно
в качестве ключа к соответствующей колонке подставить date
или time
.
'select' => [
'outgoing_docs.number',
'outgoing_docs.reg_date',
'date' => 'outgoing_docs.some_column' // need to format as date
]
pre_order (string) передача во входных параметрах блокируется
Название sql таблицы и столбца для первичной сортировки (используется при выводе таблицы на экран и
формирования sql cache); если не определено, то используется сортировка по первичному ключу id
таблицы, определяемой в
параметре 'table', в порядке убывания (рекомендуется)
'pre_order' => 'outgoing_docs.id DESC'
table (string) передача во входных параметрах блокируется
Основная таблица выборки
'table' => 'outgoing_docs'
table_add (string) передача во входных параметрах блокируется
Дополнительные таблицы, по которым может быть выполнен JOIN
'table_add' => 'LEFT JOIN outgoing_docs as outgoing_docs2 '
. 'ON outgoing_docs.repeated_id = outgoing_docs2.id '
. 'LEFT JOIN projects ON '
. 'outgoing_docs.project_id = projects.id'
distinct_ids (bool)
В случае, если необходимо убирать из показа записи с повторяющимися id
, нужно включить
параметр 'distinct_ids'
и указать в нем в качестве значения полное название sql таблица + столбец через точку
идентификаторов, по которым будет проводится проверка на совпадение (по данному полю должна проводится сортировка).
'distinct_ids' => 'some_table.id'
path (string)
Url, который подставляется в ссылки пагинации и сортировки столбцов.
'path' => 'outgoing/journal'
ajaxDispatcher
в использовании данного параметра нет необходимости, поскольку
пагинация и сортировка осуществляются через ajax запросы тем же диспетчером. Однако можно применять данный параметр и в этом
случае, например, для сохранения совместимости конкретного метода класса проекта при загрузке таблицы обычным способом.
path_after_del (string)
Обеспечивает переход по указанному адресу после выполнения удаления с использованием системной кнопки Удалить, если компонент загружен без использования ajax_dispatcher. По умолчанию используется корневой веб адрес.
'path_after_del' => '/some/url'
edit (array with array values) передача во входных параметрах блокируется
Массив параметров для активации на полях (ячейках) возможностей их редактирования.
'table'
, без таблиц объединенных JOIN.
В качестве параметров редактирования могут быть определены:
'access'
- если нужно ограничить показ всех элементов редактирования определенным группам пользователей,
то нужно использовать данный параметр, указав:
func
- название callable функции;params
- параметры (если в качестве параметров будут указаны sql таблица + колонка через точку,
соответствующие выборке из БД, то будут подставлены соответствующие значения);
output
no_cache
.
callback
- если необходимо выполнить какую-нибудь callable функцию после осуществления обновления данных,
то необходимо указать ее в данном параметре в виде:
func
- имя функции;params
- массив с параметрами;
'reset_cache'
- по умолчанию при обновлении данных происходит очистка кэша текущей sql таблицы;
если необходимо очищать дополнительные таблицы, то нужно включить данный параметр и добавить названия таких дополнительных
таблиц;
'items'
- массив с элементами карточки, в котором ключами
выступают полные имена колонок (sql таблица + колонка через точку), а значениями - массивы с настройками:
'type'
- тип элемента html
формы; поддерживаются input
, textarea
,
radio
, checkbox
, select
;
'values'
- массив со значениями для элементов radio
, checkbox
, select
;
'css_id'
- добавление идентификатора css
;
'css_classes'
- добавление классов css
'max_len'
- максимальная длина поля (количество символов); для ограничения используется js; на странице показывается
оставшееся допустимое к вводу количество символов;
'access'
- если нужно ограничить показ данного поля, нужно определить данный параметр, указав:
func
- название callable функции;params
- параметры (если в качестве параметров будут указаны sql таблица + колонка через точку,
соответствующие выборке из БД, то будут подставлены соответствующие значения);
output
no_cache
.
'sql_type'
- по умолчанию, если имя колонки имеет в своем составе date
, то к нему
применяются правила даты, если time
- правила даты и времени; если поле не имеет в своем имени подобных
обозначений, то можно использовать данный параметр, присвоив ему значения date
или time
.
Массив параметров для определения полей для редактирования данных. Поддерживаются html формы input (text, checkbox, radio), textarea, select.
Может использовать автокомплит на поле ввода, который проверяет на наличие значений в определенном столбце определенной sql
таблицы. Автокомплит обеспечивается классом xtables\base\Autocomplete
(подробности настройки см. Autocomplete).
К ячейке могут добавляться css идентификаторы и классы. Если необходимо сделать поле обязательным к заполнению, то необходимо
добавить ему класс required
. Таким образом, если в результате редактирования такое поле становится пустым,
сохранение карточки блокируется JS
Имеется возможность показывать пользователю количество доступных для ввода символов (если поле имеет ограниченный размер).
При вводе символов показывается остаток, который последовательно меняет свой цвет на желтый (осталось 20 и менее) и красный (достингнут 0).
После этого ввод символов блокируется JS.
'edit' => [
'access' => ['some_group', 'else_group'], // for all edit fields
// 'access' => [
// 'func' => 'some\callable::func',
// 'params' => [
// 'sql_table.column',
// 'sql_table.column2',
// 'some_free_value'
// ]
//],
'reset_cache' => ['some_else_table', 'some_else_table2'], // 'some_else_table'
'callback' => [
'func' => 'some\Func::name',
'params' => [
'param',
'else'
]
],
// 'callback' => 'some\Func::name',
'items' => [
'sql_table.column' => [
'type' => 'select',
'values' => [
'' => '',
'' => '',
],
//'access' => ['some_group', 'else_group'] // for this field only
// 'access' => [
// 'func' => 'some\callable::func',
// 'params' => [
// 'sql_table.column',
// 'sql_table.column2',
// 'some_free_value'
// ]
//],
],
'sql_table.column2' => [
'type' => 'textarea',
'css_id' => 'autocomplete1',
'max_len' => 200,
'css_classes' => 'required'
],
'sql_table.column2' => [
'type' => 'input',
//'sql_type' => 'date'
]
]
]
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'
]
]
cell_link (array)
Добавление ссылок на ячейках с указанием полных sql названий ячейки (таблица + столбец) с параметрами: url, get параметры,
дополнительные css
классы и css
идентификатор. См. CellAction.
'cell_link' => [
'outgoing_docs.number' => [
'path' => 'outgoing/card',
'params' => [
'id' => 'outgoing_docs.id'
],
'css_classes' => 'ajax'
'css_id' => 'some_id',
'target' => '_blank'
],
'outgoing_docs2.number' => [
'path' => 'outgoing/card',
'params' => [
'id' => 'outgoing_docs.repeated_id'
]
]
]
non_sort_columns (array)
Массив с названиями столбцов (таблица + столбец), по котором не нужно добавлять возможность сортировки (по умолчанию добавляестя ко всем столбцам)
'non_sort_columns' => [
'outgoing_docs.address',
'outgoing_docs.content'
]
pre_condition (array) передача во входных параметрах блокируется
Предусловия выборки из таблиц; при осуществлении поиска предусловия заменяются значениями из формы поиска в случае их совпадения
'pre_condition' => [
'outgoing_docs.number' => "outgoing_docs.number != 0"
]
onpage (int)
Количество записей, которое показывается на одной странице; может устанавливаться в 'onpage'
в
конфигурационном файле /config/congig.php
для всех таблиц глобально и в настройках каждой таблицы персонально для нее;
по умолчанию используется значение 200 записей, оно же установлено в качестве максимального
'onpage' => 100
page_range (int)
Количество страниц слева и справа от текущей в строке пагинации; может устанавливаться в 'page_range'
в
конфигурационном файле /config/congig.php
для всех таблиц глобально и в настройках каждой таблицы персонально для нее;
по умолчанию используется значение 5
.
'page_range' => 7
seek_result_limit (int)
Количество записей в одной выборке, если данный параметр отсутствует, то по умолчанию установлено значение
в 50 000 записей, минимальное значение равно 1, максимальное - 500 000 записей в одном срезе данных
(sql LIMIT
).
При построении пагинации не используется OFFSET (смещение).
Пагинация строится на кешируемых массивах резолютирующих идентификаторов,
которые обеспечивают быстроту при больших объемах данных.
Таким образом тяжелый запрос только производит выборку id
и помещает их в кэш.
'seek_result_limit' => 10000
TableView
используется двухуровневый кэш: sql кэш и кэш готовых страниц (готовых таблиц в html
тегах). Для проверки используется строящийся в соответствии с настроечными параметрами запрос к базе данных.'reset_cache'
для соответствующих компонентов CardNew
,
CardView
(группа параметров edit
), TableView
(группа параметров edit
).TableCache::resetCache($table)
. В качестве параметра в этот метод
передается название sql таблицы или массив названий sql таблиц.TableCache::resetAllCache()
.'action'
.
use \xtables\components\TableView\model\TableCache;
TableCache::resetCache('some_sql_table');
TableCache::resetCache(['some_sql_table', 'some_sql_table2']);
TableCache::resetAllCache();
no_cache (bool)
В случае, если необходимо отключить использование кэша в конкретной таблице, нужно включить
параметр 'no_cache'
.
'no_cache' => true
replace (array with array values)
Используется для замены каких-либо значений из БД на другие, например,
может возникнуть необходимость заменять цифру 1 на слово Да или
какое-то слова латинскими буквами на слово русскими (unicode) буквами.
Замена осуществляется классом xtables\base\ReplaceCell
;
подробности по способам замены см. ReplaceCell
Возможны варианты замены: конкретное значение на конкретное значение;
any_int
- любая цифра меняется на заданное значение;
any_string
- любое значение меняется на заданное значение;
empty
- пустое значение меняется на заданное
значение.
'replace' => [
'some_table.some_column' => [
'function' => [
'name' => '\app\SomeClass::someFunction',
'params' => [
'some_table.some_column',
'some_param',
'else_param'
]
],
'numpad' => 6,
'empty' => 'пустое значение',
'any_int' => 'число',
'any_string' => 'строка',
'some_current_value' => 'Да'
],
]
comp_cell (array)
Используется для построения композитных ячеек, то есть ячеек, включающих в себя значения нескольких столбцов.
Построение осуществляется классом xtables\base\CompositeCell
;
подробности по способам замены см. CompositeCell
'comp_cell' => [
'outgoing_docs.number' => [
'delimiter' => ' от ',
'value' => [
'outgoing_docs.number',
' от ',
'outgoing_docs.reg_date'
]
],
]
action (array)
Добавление иконок в первый столбец (создается при наличии хотя бы одной иконки) для каких-то действий. Подробнее см. IconAction.
'action' = [
'icon_add' => [
'title' => 'Добавление исх. к вх. номеру',
'path' => $this->params['icon_path_back'],
'icon' => '<i class="fa fa-plus"></i>',
'css_classes' => 'ajax',
'params' => [
'id' => 'outgoing_docs.id',
'icon_for_id' => $this->params['icon_for_id']
]
]
]
helper (array)
Пояснительные подсказки, обозначаемые знаком вопроса
'items'
- массив с подсказами, ключами в котором являются полные названия
sql таблица + столбец через точку, значением текст подсказки;
'access'
- если нужно ограничить показ подсказок определенным группам пользователей,
то используйте данный параметр, указав:
func
- название callable функции;params
- параметры (если в качестве параметров будут указаны sql таблица + колонка через точку,
соответствующие выборке из БД, то будут подставлены соответствующие значения);
output
no_cache
.
'helper' => [
'items' => [
'outgoing_docs.number' => 'Нажмите на номер, чтобы '
. 'перейти в карточку исходящего документа'
],
'access' => ['some_user_group', 'else_group'] // or callable as shown above
]
search (array) передача во входных параметрах блокируется
Массив параметров формы поиска: url для передачи данных формы, необходимые для поиска поля:
add_condition
- массив с условиями, которые необходимо добавлять при любом непустом значении
из условий поиска, вводимых пользователем (добавлять условия поиска, соединяемые через AND
, лучше
массивом простых значений, это позволит эффективно удалить все дубликаты);
'add_condition' => [
"incoming_docs.active = 1",
"incoming_docs.valid = 1"
]
предустановленное значение поиска pre_condition
отключается при введении пользователем любых поисковых значений,
поэтому если необходимо использовать какие-то предустановленные дополнительные условия поиска, то необходимо
использовать параметр add_condition
;
inputs
- html поле в виде обычного input для ввода произвольного текста, минимальное количество
символов для ввода ограничено 3; количество полей не ограничено; в качестве значения может быть установлено:
name
- строка с полным наименованием ячейки (sql таблица + колонка через точку);
css_classes
- строка с наименованиями css классов, которые должны быть добавлены к input
,
например: для включения показа календаря для ввода даты нужно добавить полю класс
'date'
, даты и времени - 'date-time'
;
css_id
- строка с названием css идентификатора для добавления к input
;
condition
- по умолчанию поиск осущетвляетс по условию содержит LIKE
,
минимальное количество символов составляет 3;equal
- поиск будет определяться по точному вхождению по условию равно,
ограничение на минимальное количество символов применяться не будет;
not_equal
- поиск будет определяться по точному вхождению по условию не равно,
ограничение на минимальное количество символов применяться не будет;
'inputs' => [
'projects.name' => 'Проект',
'outgoing_docs.number' => [
'name' => 'Исходящий номер',
'css_classes' => 'date',
'css_id' => 'some_id',
'condition' => 'equal'
],
'outgoing_docs.number' => [
'name' => 'Исходящий номер',
'condition' => '\SomeClass\In\Namespace::callableFunction'
]
]
public static function callableFuction($key, $value, $back = []) {
$result = Db::getConnect()->prepare("SELECT id FROM some_table WHERE some_column LIKE ?");
$result->execute(['%' . $value . '%']);
while ($data = $result->fetch(\PDO::FETCH_ASSOC)) {
$back[] = $data['id'];
}
return 'some_table_primary.id IN (' . implode(',', $back) . ')';
}
filters
- фильтр с предустановленным условием выборки в виде checkbox; количество фильтров не ограничено
period
- два html поля в виде input для ввода дат (без времени) с --- по --- для осуществления поиска
по временному промежутку; количество периодов не ограничено
selects
- html поле в виде select для осуществления поиска путем выбора одного из значений; количество селектов не
ограничено
hidden_not_for_search
- hidden input, которые передаются во входных параметрах, однако
в качестве условий поиска для TableView не используются, могут быть использованы, если дополнительные параметры необходимы во
встречающем запрос методе
hidden_not_for_search
не защищается от возможной подмены на странице,
'search' => [
'path' => 'outgoing/ajax-data',
'inputs' => [
'outgoing_docs.id' => [
'name' => 'ИД',
'condition' => 'equal'
],
'outgoing_docs.number' => 'Исходящий номер',
'projects.name' => 'Проект',
'outgoing_docs.whom' => 'Кому',
],
'period' => [
'outgoing_docs.reg_date' => 'Период регистрации',
],
'filters' => [
'filter' => [ // as filter key use free name
'label' => 'Без ответов',
'value' => "outgoing_docs.id NOT IN()"
]
],
'selects' => [
'incoming_docs.group' => [
'label' => 'Тип',
'values' => [
'' => 'Все типы',
'' => ''
],
]
],
'hidden_not_for_search' => [
'some_hidden_simple' => 'some_value',
'else_simple' => 'else value'
]
],
popup_menu (array)
Горизонтальное меню в верхней части таблицы.
'title'
- название или иконка, отображаемое в кнопке меню; по умолчанию используется иконка:
'items'
- массив с пунктами меню (ссылки с названиями); для разделителя используйте значение 'divider'
;
'access'
- если нужно ограничить показ меню определенным группам пользователей, то используйте данный параметр,
указав:
func
- название callable функции;params
- параметры;
output
no_cache
.
'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'] // or callable
]
Если необходимо создать несколько групп кнопок, то нужно каждый из указанных массивов обернуть в массив.
'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']
]
]
thead_fix (boolean)
Фиксация заголовка таблицы при прокрутке страницы при значении данного параметра true
.
Фиксация обеспечивается js функцией xtables.theadFix()
, находящейся в файле /js/xtables.js
.
'thead_fix' => true
highlight (array)
Возможна подсветка строки в таблице путем замены цвета фона ячеек в случае совпадения определенных
условий с выборкой из sql таблицы.
@since 1.7.43 возможно добавление строки со свободной информацией css
Для использования нужно создать массив 'highlight'
с параметрами:
в качестве ключа - название callable функции, которая должна вернуть строку с обозначением цвета в соответствии
с правилами определения цвета css, например: red, #fff
и т.п.;
как элементы массива нужно указать:
no_cache
, либо использовать для выделения JS функцию.
Для JS функции полям таблицы можно присвоить css классы в параметре structure
.
'highlight' => [
'\app\some\SomeClass::methodName' => [
'incoming_docs.closed',
'incoming_docs.date'
],
'\app\some\SomeClass::someFuncForHighlight' => [
'incoming_docs.some_column_else',
'some_static_param'
]
]
Пример callable функции:
public static function someFuncForHighlight($value) {
if (strtotime($value) < strtotime('today')) {
return 'yellow';
}
}
public static function someFuncForHighlight($value) {
if (strtotime($value) < strtotime('today')) {
return 'text-decoration: line-through';
}
}
short_pagination (boolean)
По умолчанию в случае наличия более одной страницы в таблице показывается полная пагинация, состоящая из указателей на номера страниц.
В случае включения параметра short_pagination
будет показываться пагинация с указателями на предыдущую и следующую страницу.
/config/table/full-pagination.html
- полная пагинация с номерами страниц;/config/table/short-pagination.html
- пагинация предыдущая-следующая.
'short_pagination' => true