OctoberCMS 插件使用自定义查询扩展搜索过滤器
OctoberCMS plugin extend search filter with custom query
我创建了一个名为 "Property" 的插件,在列表中,我将多个地址字段显示在一列中,这将组合多个地址字段,如邮政编码、街道类型、街道号码等。 .
而且我可以在列表中显示它们。下面是我到目前为止为实现它所做的工作。
plugins\technobrave\properties\models\property\columns.yaml
columns:
id:
label: Property Address
type: property_address
searchable: true
sortable: false
plugins\technobrave\properties\Plugin.php
public function registerListColumnTypes()
{
return [
// A local method, i.e $this->evalUppercaseListColumn()
'property_address' => [$this, 'evalPropertydDetailsListColumn'],
];
}
public function evalPropertydDetailsListColumn($value, $column, $record)
{
$property_array_data = array();
$current_property = Property::where('id', $record->id)->first();
if($current_property)
{
if( ($current_property->lot != NULL) || ($current_property->lot != '') )
{
$property_array_data[] = $current_property->lot;
}
if( ($current_property->unit != NULL) || ($current_property->unit != '') )
{
$property_array_data[] = $current_property->unit;
}
if( ($current_property->street_number != NULL) || ($current_property->street_number != '') )
{
$property_array_data[] = $current_property->street_number;
}
if( ($current_property->po_box != NULL) || ($current_property->po_box != '') )
{
$property_array_data[] = $current_property->po_box;
}
if( ($current_property->street != NULL) || ($current_property->street != '') )
{
$property_array_data[] = $current_property->street;
}
if( ($current_property->street_type_id != NULL) || ($current_property->street_type_id != '') )
{
$get_street_type_data = StreetType::where('id', $current_property->street_type_id)->first();
$property_array_data[] = $get_street_type_data->street_name;
}
if( ($current_property->state_id != NULL) || ($current_property->state_id != '') )
{
$get_state_data = State::where('id', $current_property->state_id)->first();
$property_array_data[] = $get_state_data->state_name;
}
if( ($current_property->suburb_id != NULL) || ($current_property->suburb_id != '') )
{
$get_suburb_data = Suburb::where('id', $current_property->suburb_id)->first();
$property_array_data[] = $get_suburb_data->suburb;
}
if( ($current_property->post_code != NULL) || ($current_property->post_code != '') )
{
$property_array_data[] = $current_property->post_code;
}
$imp_property_data = implode(' ', $property_array_data);
return $imp_property_data;
}
}
当我在我的搜索框中搜索记录时,我只需要一个帮助来搜索上面的地址字段..
有什么想法吗?
谢谢
您可以使用 invisible: true
和 sorteable: true
在 columns.yaml
中添加更多列。所以需要添加lot
、unit
、street_number
等
columns:
lot:
label: lot
type: text
searchable: true
invisible: true
unit:
label: unit
type: text
searchable: true
invisible: true
并在 list_config.yaml
中更改搜索策略
(...)
toolbar:
buttons: list_toolbar
search:
prompt: 'backend::lang.list.search_prompt'
mode: 'any'
好的伙计们,
最终我想出了一些办法来实现这一目标。
来自 plugins\technobrave\properties\models\property\columns.yaml 和 plugins\technobrave\properties\Plugin.php
我只是将下面的代码放入我的 columns.yaml 文件中。
plugins\technobrave\properties\models\property\columns.yaml
columns:
unit:
label: Property Address
type: text
searchable: true
sortable: false
invisible: true
select: CONCAT(COALESCE(`lot`,''),' ',COALESCE(`unit`,''),' ',COALESCE(`street_number`,''),' ',COALESCE(`po_box`,''),' ',COALESCE(`street`,''), ' ', COALESCE( (SELECT technobrave_streets_.street_name FROM technobrave_streets_ WHERE technobrave_streets_.id=street_type_id), ''), ' ', COALESCE( (SELECT technobrave_states_.state_name FROM technobrave_states_ WHERE technobrave_states_.id=state_id), ''), ' ', COALESCE( (SELECT technobrave_suburbs_.suburb FROM technobrave_suburbs_ WHERE technobrave_suburbs_.id=suburb_id), ''), ' ', COALESCE(`post_code`,'') )
正如您在上面的代码中看到的,现在我通过 SELECT
通过使用 CONCAT
查询自身获得 属性 地址,并将 searchable
设为 true
使其可搜索。
希望这对您有所帮助。
我创建了一个名为 "Property" 的插件,在列表中,我将多个地址字段显示在一列中,这将组合多个地址字段,如邮政编码、街道类型、街道号码等。 .
而且我可以在列表中显示它们。下面是我到目前为止为实现它所做的工作。
plugins\technobrave\properties\models\property\columns.yaml
columns:
id:
label: Property Address
type: property_address
searchable: true
sortable: false
plugins\technobrave\properties\Plugin.php
public function registerListColumnTypes()
{
return [
// A local method, i.e $this->evalUppercaseListColumn()
'property_address' => [$this, 'evalPropertydDetailsListColumn'],
];
}
public function evalPropertydDetailsListColumn($value, $column, $record)
{
$property_array_data = array();
$current_property = Property::where('id', $record->id)->first();
if($current_property)
{
if( ($current_property->lot != NULL) || ($current_property->lot != '') )
{
$property_array_data[] = $current_property->lot;
}
if( ($current_property->unit != NULL) || ($current_property->unit != '') )
{
$property_array_data[] = $current_property->unit;
}
if( ($current_property->street_number != NULL) || ($current_property->street_number != '') )
{
$property_array_data[] = $current_property->street_number;
}
if( ($current_property->po_box != NULL) || ($current_property->po_box != '') )
{
$property_array_data[] = $current_property->po_box;
}
if( ($current_property->street != NULL) || ($current_property->street != '') )
{
$property_array_data[] = $current_property->street;
}
if( ($current_property->street_type_id != NULL) || ($current_property->street_type_id != '') )
{
$get_street_type_data = StreetType::where('id', $current_property->street_type_id)->first();
$property_array_data[] = $get_street_type_data->street_name;
}
if( ($current_property->state_id != NULL) || ($current_property->state_id != '') )
{
$get_state_data = State::where('id', $current_property->state_id)->first();
$property_array_data[] = $get_state_data->state_name;
}
if( ($current_property->suburb_id != NULL) || ($current_property->suburb_id != '') )
{
$get_suburb_data = Suburb::where('id', $current_property->suburb_id)->first();
$property_array_data[] = $get_suburb_data->suburb;
}
if( ($current_property->post_code != NULL) || ($current_property->post_code != '') )
{
$property_array_data[] = $current_property->post_code;
}
$imp_property_data = implode(' ', $property_array_data);
return $imp_property_data;
}
}
当我在我的搜索框中搜索记录时,我只需要一个帮助来搜索上面的地址字段..
有什么想法吗?
谢谢
您可以使用 invisible: true
和 sorteable: true
在 columns.yaml
中添加更多列。所以需要添加lot
、unit
、street_number
等
columns:
lot:
label: lot
type: text
searchable: true
invisible: true
unit:
label: unit
type: text
searchable: true
invisible: true
并在 list_config.yaml
(...)
toolbar:
buttons: list_toolbar
search:
prompt: 'backend::lang.list.search_prompt'
mode: 'any'
好的伙计们,
最终我想出了一些办法来实现这一目标。
来自 plugins\technobrave\properties\models\property\columns.yaml 和 plugins\technobrave\properties\Plugin.php
我只是将下面的代码放入我的 columns.yaml 文件中。
plugins\technobrave\properties\models\property\columns.yaml
columns:
unit:
label: Property Address
type: text
searchable: true
sortable: false
invisible: true
select: CONCAT(COALESCE(`lot`,''),' ',COALESCE(`unit`,''),' ',COALESCE(`street_number`,''),' ',COALESCE(`po_box`,''),' ',COALESCE(`street`,''), ' ', COALESCE( (SELECT technobrave_streets_.street_name FROM technobrave_streets_ WHERE technobrave_streets_.id=street_type_id), ''), ' ', COALESCE( (SELECT technobrave_states_.state_name FROM technobrave_states_ WHERE technobrave_states_.id=state_id), ''), ' ', COALESCE( (SELECT technobrave_suburbs_.suburb FROM technobrave_suburbs_ WHERE technobrave_suburbs_.id=suburb_id), ''), ' ', COALESCE(`post_code`,'') )
正如您在上面的代码中看到的,现在我通过 SELECT
通过使用 CONCAT
查询自身获得 属性 地址,并将 searchable
设为 true
使其可搜索。
希望这对您有所帮助。