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';
}
}