/** * table_id - это идентификатор таблицы на странице, к которому привязываются все данные: имена полей формы и т.п. * @param $model_class_name * @param $create_form_html * @param $column_obj_arr * @param array $filters_arr * @param string $order_by * @return string */ public static function html($model_class_name, $create_form_html, $column_obj_arr, $filters_arr = [], $order_by = '', $table_id = '', $filters_position = self::FILTERS_POSITION_NONE) { // TODO: придумать способ автогенерации table_id, который был бы уникальным, но при этом один и тот же когда одну таблицу запрашиваешь несколько раз self::executeOperations(); // // вывод таблицы // $table_container_element_id = uniqid('tableContainer_'); if ($table_id) { $table_container_element_id = $table_id; } // оборачиваем в отдельный div для выдачи только таблицы аяксом - иначе корневой элемент документа не будет доступен в jquery селекторах $html = HTML::div($table_container_element_id, '', function () use($model_class_name, $create_form_html, $column_obj_arr, $filters_arr, $order_by, $table_id, $filters_position) { echo '<div class="row">'; if ($filters_position == self::FILTERS_POSITION_LEFT) { echo '<div class="col-sm-4">'; echo self::filtersHtml($table_id, $filters_arr); echo '</div>'; } $col_sm_class = '12'; if ($filters_position == self::FILTERS_POSITION_LEFT || $filters_position == self::FILTERS_POSITION_RIGHT) { $col_sm_class = '8'; } echo '<div class="col-sm-' . $col_sm_class . '">'; echo self::toolbarHtml($table_id, $create_form_html, $filters_arr); if ($filters_position == self::FILTERS_POSITION_TOP) { echo self::filtersHtml($table_id, $filters_arr); } if ($filters_position == self::FILTERS_POSITION_INLINE) { echo self::filtersHtmlInline($table_id, $filters_arr); } echo '<table class="table table-hover">'; /** @var InterfaceCRUDTableColumn $column_obj */ echo '<thead><tr>'; foreach ($column_obj_arr as $column_obj) { Assert::assert($column_obj instanceof InterfaceCRUDTableColumn); echo '<th>' . Sanitize::sanitizeTagContent($column_obj->getTitle()) . '</th>'; } echo '</tr></thead>'; echo '<tbody>'; $objs_ids_arr = CRUDInternalTableObjectsSelector::getObjIdsArrForClassName($table_id, $model_class_name, $filters_arr, $order_by); foreach ($objs_ids_arr as $obj_id) { $obj_obj = CRUDObjectLoader::createAndLoadObject($model_class_name, $obj_id); /** @var InterfaceCRUDTableColumn $column_obj */ echo '<tr>'; foreach ($column_obj_arr as $column_obj) { Assert::assert($column_obj instanceof InterfaceCRUDTableColumn); /** @var InterfaceCRUDTableWidget $widget_obj */ $widget_obj = $column_obj->getWidgetObj(); Assert::assert($widget_obj); Assert::assert($widget_obj instanceof InterfaceCRUDTableWidget); $col_width_attr = ''; if ($widget_obj instanceof CRUDTableWidgetDelete) { $col_width_attr = ' width="1px" '; } if ($widget_obj instanceof CRUDTableWidgetWeight) { $col_width_attr = ' width="1px" '; } echo '<td ' . $col_width_attr . ' style="word-break: break-all;">'; echo $widget_obj->html($obj_obj); echo '</td>'; } echo '</tr>'; } echo '</tbody>'; echo '</table>'; echo Pager::renderPager($table_id, count($objs_ids_arr)); echo '</div>'; if ($filters_position == self::FILTERS_POSITION_RIGHT) { echo '<div class="col-sm-4">'; echo self::filtersHtml($table_id, $filters_arr); echo '</div>'; } echo '</div>'; }); // Загрузка скриптов $html .= CRUDTableScript::getHtml($table_container_element_id, Url::getCurrentUrlNoGetForm()); return $html; }
/** * Возвращает одну страницу списка объектов указанного класса. * Сортировка: TODO. * Фильтры: массив $context_arr. * Как определяется страница: см. Pager. * @param $model_class_name Имя класса модели * @param $context_arr array Массив пар "имя поля" - "значение поля" * @return array Массив идентикаторов объектов. */ public static function getObjIdsArrForClassName($table_index_on_page, $model_class_name, $filters_arr, $order_by = '') { \OLOG\CheckClassInterfaces::exceptionIfClassNotImplementsInterface($model_class_name, \OLOG\Model\InterfaceLoad::class); $page_size = Pager::getPageSize($table_index_on_page); $start = Pager::getPageOffset($table_index_on_page); $db_table_name = $model_class_name::DB_TABLE_NAME; $db_id = $model_class_name::DB_ID; $db_id_field_name = CRUDFieldsAccess::getIdFieldName($model_class_name); $query_param_values_arr = array(); $where = ' 1 = 1 '; foreach ($filters_arr as $filter_obj) { /* if ($filter_obj instanceof InterfaceCRUDTableFilter) { $column_name = $filter_obj->getFieldName(); $operation_code = $filter_obj->getOperationCode(); $value = $filter_obj->getValue(); $column_name = preg_replace("/[^a-zA-Z0-9_]+/", "", $column_name); switch ($operation_code) { case CRUDTableFilter::FILTER_EQUAL: $where .= ' and ' . $column_name . ' = ? '; $query_param_values_arr[] = $value; break; case CRUDTableFilter::FILTER_IS_NULL: $where .= ' and ' . $column_name . ' is null '; break; case CRUDTableFilter::FILTER_LIKE: $where .= ' and ' . $column_name . ' like ? '; $query_param_values_arr[] = '%' . $value . '%'; break; case CRUDTableFilter::FILTER_IN: if (count($value)) { $in_placeholders_arr = []; foreach ($value as $in_single_value) { $in_placeholders_arr[] = '?'; $query_param_values_arr[] = $in_single_value; } $where .= ' and ' . $column_name . ' in (' . implode(', ', $in_placeholders_arr) . ') '; } break; default: throw new \Exception('unknown filter code'); } } else */ if ($filter_obj instanceof InterfaceCRUDTableFilter2) { list($filter_sql_condition, $filter_placeholder_values_arr) = $filter_obj->sqlConditionAndPlaceholderValue(); if ($filter_sql_condition != '') { $where .= ' and ' . $filter_sql_condition; } $query_param_values_arr = array_merge($query_param_values_arr, $filter_placeholder_values_arr); } elseif ($filter_obj instanceof InterfaceCRUDTableFilterInvisible) { list($filter_sql_condition, $filter_placeholder_values_arr) = $filter_obj->sqlConditionAndPlaceholderValue(); if ($filter_sql_condition != '') { $where .= ' and ' . $filter_sql_condition; } $query_param_values_arr = array_merge($query_param_values_arr, $filter_placeholder_values_arr); } else { throw new \Exception('filter doesnt implement InterfaceCRUDTableFilter nor InterfaceCRUDTableFilter2'); } } if ($order_by == '') { $order_by = $db_id_field_name; } $obj_ids_arr = \OLOG\DB\DBWrapper::readColumn($db_id, "select " . $db_id_field_name . " from " . $db_table_name . ' where ' . $where . ' order by ' . $order_by . ' limit ' . intval($page_size) . ' offset ' . intval($start), $query_param_values_arr); return $obj_ids_arr; }