20, 'search_method' => 1, 'custom_list_sorts' => [], 'custom_list_conditions' => [], 'custom_list_fields' => [], ]; const FIELD_NAME = []; public static $searchable_fields = []; public static $sort_exception_field = []; /* * 表示選択が変更されたら、検索条件等をクリアする */ public static function clearSearchConditions(Request $request) { $searchParam = []; $function_id = static::$function_id; // clearが渡されたらリストID以外全部消す。 if($request->input('clear')){ foreach ($request->all() as $key => $value){ if($key !== 'custom_list'){ $request->request->remove($key); } } $searchParam = $request->all(); Session::put('tmp', $searchParam); }else{ if(Session::has('tmp')){ $searchParam = Session::get('tmp'); Session::forget('tmp'); }elseif(Session::has('search_params.'.$function_id)){ $searchParam = Session::get('search_params.'.$function_id); } } $searchParam = array_merge($searchParam, $request->all()); if($request->has('custom_list_sorts') && is_string($request->input('custom_list_sorts'))){ $searchParam['custom_list_sorts'] = []; $searchParam['custom_list_sorts'][] = json_decode($request->input('custom_list_sorts'), true); } Session::put('search_params.'.$function_id, $searchParam); } public static function getCustomLists(): Collection { return CustomList::where('function', static::$function_id) ->get(); } public function getSearcherLists() { $searcherLists = []; $searcherLists['fieldList'] = static::getSearchableFieldList(); $searcherLists['fieldTypeList'] = $this->getFieldType($searcherLists['fieldList']); $searcherLists['operatorList'] = static::getOperatorList(); if(method_exists(static::class, 'getSearchOptions')){ $searcherLists['optionsList'] = static::getSearchOptions(); } return $searcherLists; } public static function getSearchableFieldList() { $searchable_fields = static::FIELD_NAME; $search_exclusion_fields = static::$indication_only_fields ?? []; foreach ($search_exclusion_fields as $exclusion_field) { unset($searchable_fields[$exclusion_field]); } return $searchable_fields; } /** * セレクトボックスの表示用にCustomListの配列を取得 * @return Collection */ public static function getCustomListNames(): Collection { return self::getCustomLists()->pluck('name', 'id'); } public static function getFieldList() { return static::FIELD_NAME; } public static function getIndicationFieldList() { $indicate_fields = static::FIELD_NAME; $indication_exclusion_fields = static::$search_only_fields ?? []; foreach ($indication_exclusion_fields as $exclusion_field) { unset($indicate_fields[$exclusion_field]); } return $indicate_fields; } public static function getSortList() { return CustomListSort::SORT_LIST; } public static function getOperatorList() { return [ 'str' => CustomListCondition::OPERATOR_LIST_STR, 'date' => CustomListCondition::OPERATOR_LIST_DATE, 'num' => CustomListCondition::OPERATOR_LIST_NUM, 'check' => CustomListCondition::OPERATOR_LIST_CHECK, 'select' => CustomListCondition::OPERATOR_LIST_SELECT, ]; } /* * その機能のテーブルの各フィールドの型を取得 */ public function getFieldType($searchableField) { $baseTable = self::getTable(); $tables = $this->getRelatedTables(); $tables[] = $baseTable; $exceptionField = $this->getExceptionFields(); $fieldTypeListRaw = []; foreach ($tables as $table) { $fields = Schema::getColumnListing($table); foreach ($fields as $key => $field){ $fieldType = Schema::getColumnType($table, $field); if($table !== $baseTable){ $field = $table.".".$field; } if(in_array($fieldType, CustomListCondition::NUM_FIELDS)){ $fieldTypeListRaw[$field] = 'num'; } elseif (in_array($fieldType, CustomListCondition::DATE_FIELDS)) { $fieldTypeListRaw[$field] = 'date'; } else { $fieldTypeListRaw[$field] = 'str'; } } } $fieldTypeList = []; foreach (array_keys($searchableField) as $field){ if(array_key_exists($field, $exceptionField)){ $fieldTypeList[$field] = $exceptionField[$field]; }elseif(array_key_exists($field, $fieldTypeListRaw)){ $fieldTypeList[$field] = $fieldTypeListRaw[$field]; }else{ $exploded = explode('.', $field); if(isset($this::$related_tables_options) && count($exploded) > 1 && array_key_exists($exploded[0], $this::$related_tables_options)){ $fieldTypeList[$field] = $fieldTypeListRaw[$this::$related_tables_options[$exploded[0]]['table_name'].'.'.$exploded[1]]; }else{ $fieldTypeList[$field] = 'str'; } } } return $fieldTypeList; } private function getExceptionFields() { $exceptionFields = []; $searchOptions = []; if(method_exists(static::class, 'getSearchOptions')){ $searchOptions = $this::getSearchOptions(); } foreach ($searchOptions as $type => $fields){ foreach ($fields as $field => $options){ $exceptionFields[$field] = $type; } } $customExceptionFields = $this::$field_type_exceptions ?? []; return array_merge($exceptionFields, $customExceptionFields); } private function getRelatedTables() { if(isset($this::$related_tables_options)){ return array_unique(array_column($this::$related_tables_options, 'table_name')); } return []; } /** * 現行DBで改行コードが
タグに変換されて実装されているため、Modelアクセサ用に実装したメソッド * 最終的にはDB内の
タグをすべて改行コードに置換し、アクセサでこのメソッドを通さないよう変更したい * @param $value */ public static function br2nl($value) { if ($value === null) { return $value; } return str_replace(['
', '
', '
'], "\n", $value); } /** * 上に同じくModelミューテタ用のメソッド * @param string $value */ public static function nl2br($value) { if ($value === null) { return $value; } return str_replace(["\n\r", "\n"], '
', $value); } public static function getSampleData(int $count) { $instances = static::take($count)->get(); $instanceArray = []; foreach ($instances as $instance) { $instanceData = []; foreach (static::FIELD_NAME as $column => $label) { $instanceData[$column] = $instance->$column; } $instanceArray[] = $instanceData; } return $instanceArray; } public function getIndexAttribute($field) { $accessor = 'index_'.strtolower(str_replace('.', '_', $field)); if($this->$accessor){ return $this->$accessor; }else{ return $this->br2nl($this->$field); } } public function getLinkHtml($url, $label, $newTab = false){ if($newTab){ return "".$label.''; } return "".$label.''; } public function getSortClass($field) { if(in_array($field, $this::$sort_exception_field)) return ''; $custom_list_sorts = $this->getAttribute('custom_list_sorts'); $key = array_search($field, array_column($custom_list_sorts, 'field')); if($key === false) return 'sort sort-default'; if($custom_list_sorts[$key]['sort']===CustomListSort::ASC){ return 'sort sort-asc'; }elseif ($custom_list_sorts[$key]['sort']===CustomListSort::DESC){ return 'sort sort-desc'; } return 'sort sort-default'; } }