传递所有参数的 Silverstripe 自定义搜索 URL
Silverstripe custom search URL that passes all of its parameters
它是return单独的结果,更多的组合不是return的结果。
执行搜索时,我得到了各个字段的结果,而不是为两个都没有结果设置了值。我怎样才能同时获得两者?
我的错误是什么?感谢帮助
在我使用的搜索表单中 SliderField
class HomePage_Controller extends Page_Controller {
//...
public function index(SS_HTTPRequest $request)
{
$properties = Solutions::get();
if($visibility = $request->getVar('Visibility'))
{
$properties = $properties->filter(array(
'Solution:ExactMatch' => array('Visibility'),
'Score:LessThanOrEqual' => $visibility
));
}
if($traffic = $request->getVar('Traffic'))
{
$properties = $properties->filter(array(
'Solution:ExactMatch' => array('Traffic'),
'Score:LessThanOrEqual' => $traffic
));
}
return array
(
'Results' => $properties->sort(array('Score' => 'DESC', 'Solution' => 'ASC'))
);
}
public function SolutionForm()
{
$form = Form::create(
$this,
__FUNCTION__,
FieldList::create(
SliderField::create('Visibility','', 0, 100)
->addExtraClass('range-slider__range')
->setAttribute('type', 'range')
->setAttribute('min', '0')
->setAttribute('max', '100')
->setAttribute('step', '25')
->setValue('25'),
SliderField::create('Traffic','', 0, 100)
->addExtraClass('range-slider__range')
->setAttribute('type', 'range')
->setAttribute('min', '0')
->setAttribute('max', '100')
->setAttribute('step', '25')
->setValue('0')
),
FieldList::create(
FormAction::create('doSolutionsSearch','')
->setUseButtonTag(true)
->setTitle('YOUR SOLUTION')
->addExtraClass('button-solution')
)
);
$form->setFormMethod('GET')
->setFormAction($this->Link('#home'))
->disableSecurityToken()
->loadDataFrom($this->request->getVars());
return $form;
}}
那是因为如果两个 if 都为真,您的查询将如下所示:
WHERE ("Solutions"."Solution" = 'Visibility')
AND ("Solutions"."Solution" = 'Traffic')
那不会 return 任何东西,因为 Solution
不会同时是可见性 和 流量。
最简单的解决方案是执行两个查询并将它们合并在一起:
$properties = Solutions::get();
$arrayList = ArrayList::create();
if($visibilityScore = $request->getVar('Visibility')) {
$arrayList->merge(
$properties->filter(array(
'Solution:ExactMatch' => 'Visibility',
'Score:LessThanOrEqual' => $visibilityScore
))->toArray()
);
}
if($trafficScore = $request->getVar('Traffic')) {
$arrayList->merge(
$properties->filter(array(
'Solution:ExactMatch' => 'Traffic',
'Score:LessThanOrEqual' => $trafficScore
))->toArray()
);
}
return array(
'Results' => $arrayList->sort(array(
'Score' => 'DESC',
'Solution' => 'ASC'
))
);
它是return单独的结果,更多的组合不是return的结果。
执行搜索时,我得到了各个字段的结果,而不是为两个都没有结果设置了值。我怎样才能同时获得两者?
我的错误是什么?感谢帮助
在我使用的搜索表单中 SliderField
class HomePage_Controller extends Page_Controller {
//...
public function index(SS_HTTPRequest $request)
{
$properties = Solutions::get();
if($visibility = $request->getVar('Visibility'))
{
$properties = $properties->filter(array(
'Solution:ExactMatch' => array('Visibility'),
'Score:LessThanOrEqual' => $visibility
));
}
if($traffic = $request->getVar('Traffic'))
{
$properties = $properties->filter(array(
'Solution:ExactMatch' => array('Traffic'),
'Score:LessThanOrEqual' => $traffic
));
}
return array
(
'Results' => $properties->sort(array('Score' => 'DESC', 'Solution' => 'ASC'))
);
}
public function SolutionForm()
{
$form = Form::create(
$this,
__FUNCTION__,
FieldList::create(
SliderField::create('Visibility','', 0, 100)
->addExtraClass('range-slider__range')
->setAttribute('type', 'range')
->setAttribute('min', '0')
->setAttribute('max', '100')
->setAttribute('step', '25')
->setValue('25'),
SliderField::create('Traffic','', 0, 100)
->addExtraClass('range-slider__range')
->setAttribute('type', 'range')
->setAttribute('min', '0')
->setAttribute('max', '100')
->setAttribute('step', '25')
->setValue('0')
),
FieldList::create(
FormAction::create('doSolutionsSearch','')
->setUseButtonTag(true)
->setTitle('YOUR SOLUTION')
->addExtraClass('button-solution')
)
);
$form->setFormMethod('GET')
->setFormAction($this->Link('#home'))
->disableSecurityToken()
->loadDataFrom($this->request->getVars());
return $form;
}}
那是因为如果两个 if 都为真,您的查询将如下所示:
WHERE ("Solutions"."Solution" = 'Visibility')
AND ("Solutions"."Solution" = 'Traffic')
那不会 return 任何东西,因为 Solution
不会同时是可见性 和 流量。
最简单的解决方案是执行两个查询并将它们合并在一起:
$properties = Solutions::get();
$arrayList = ArrayList::create();
if($visibilityScore = $request->getVar('Visibility')) {
$arrayList->merge(
$properties->filter(array(
'Solution:ExactMatch' => 'Visibility',
'Score:LessThanOrEqual' => $visibilityScore
))->toArray()
);
}
if($trafficScore = $request->getVar('Traffic')) {
$arrayList->merge(
$properties->filter(array(
'Solution:ExactMatch' => 'Traffic',
'Score:LessThanOrEqual' => $trafficScore
))->toArray()
);
}
return array(
'Results' => $arrayList->sort(array(
'Score' => 'DESC',
'Solution' => 'ASC'
))
);