示例#1
0
 /**
  * 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;
 }