URL пользовательского поиска Silverstripe, который передает все свои параметры - PullRequest
0 голосов
/ 14 мая 2018

Возвращает отдельные результаты, больше комбинаций не возвращают результат.

Выполняя поиск, я получаю результаты для отдельных полей, вместо того, чтобы установить значение для обоих результатов. Как я могу получить для обоих?

В чем моя ошибка? Спасибо за помощь

В форме поиска я использую 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;
}}

1 Ответ

0 голосов
/ 15 мая 2018

Это потому, что если оба if истинны, ваш запрос будет выглядеть так:

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

Это ничего не даст, потому что Solution не будет одновременно и Visibility и Traffic.

Самым простым решением было бы выполнить два запроса и объединить их вместе:

$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'
    ))
);
...