【问题标题】:Silverstripe custom search URL that passes all of its parameters传递其所有参数的 Silverstripe 自定义搜索 URL
【发布时间】:2018-10-23 21:01:12
【问题描述】:

返回单个结果,更多组合不返回结果。

执行搜索我会得到单个字段的结果,而不是为两个没有结果设置一个值。我怎样才能两者兼得?

我的错误是什么?感谢您的帮助

在我使用的搜索表单中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;
}}

【问题讨论】:

    标签: php search filter orm silverstripe


    【解决方案1】:

    这是因为如果两个 if 都为真,您的查询将如下所示:

    WHERE ("Solutions"."Solution" = 'Visibility')
    AND ("Solutions"."Solution" = 'Traffic')
    

    这不会返回任何内容,因为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'
        ))
    );
    

    【讨论】:

    • 我用 ArrayList 试过你的解决方案非常有用,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2019-11-11
    • 2022-06-10
    • 2016-11-14
    • 2020-10-31
    • 2021-03-30
    相关资源
    最近更新 更多