Jump to content

GET search with filter


jds43
 Share

Recommended Posts

Hello,

I have a search page loosely based on Skyscrapers where I'm parsing a selector with options 'beds', 'bathrooms', 'size' fields. It is working well until I select 'Any' after I've run a search. This is where no results are returned (/?beds=&bathrooms=&size=&submit=). I want it to reset and show all results.

I hope this isn't too vague.

 

Link to comment
Share on other sites

Is "any" an actual form item (checkbox, radio button...) ? If it was, then you would see it in the query parameters as well (e.g. /?beds=&bathrooms=&size=&any=1&submit=), and could easily add it to your selector query logic.

If "any" just means that neither beds, bathrooms nor size was selected by the user (which your posted GET example suggests), you would have to account for that scenario, and check for the absence of parameters, and thus send another search selector to PW.

11 minutes ago, jds43 said:

I hope this isn't too vague.

If you could post the relevant code, it would sure help.

Link to comment
Share on other sites

Thanks @dragan

'Any' has no value at this point. I just need it as a default selection that would allow all to display.

<form class="uk-form uk-padding-large" method="get" action="<?= $page->url; ?>">

        <h4 class="uk-h3">Filter Results:</h4>
        <a class='uk-text-uppercase' href='<?= $page->url; ?>'>Reset Filter</a>
        		
		<div class="uk-grid uk-grid-small uk-flex-bottom uk-margin-top uk-child-width-1-1 uk-child-width-1-2@s uk-child-width-1-4@m">

			<div class="">
				<label class="uk-form-label" for="search-bedrooms">Bedrooms</label>
				<div class="uk-form-controls">
					<select id="search-bedrooms" name="beds" class="uk-select uk-form-width-large" tabindex="1">
						<option value="">Any</option>
                        <?php
							// generate a range of bedrooms, checking our whitelist to see if any are already selected
							foreach(array('2', '3', '4') as $range) {
								$selected = $range == $input->beds ? " selected='selected'" : '';
								echo "<option$selected value='$range'>$range</option>";
							}    
                        ?>						
                    </select>
				</div>	
			</div>	
			<div class="">
				<label class="uk-form-label" for="search-baths">Bathrooms</label>
				<div class="uk-form-controls">
					<select id="search-baths" name="bathrooms" class="uk-select uk-form-width-large" tabindex="2">
						<option value="">Any</option>
                        <?php
							// generate a range of bathrooms, checking our whitelist to see if any are already selected
							foreach(array('1.5', '2.0', '2.5', '3.0') as $amount) {
								$selected = $amount == $input->bathrooms ? " selected='selected'" : '';
								echo "<option$selected value='$amount'>$amount</option>";
							}    
                        ?>					
			        </select>
				</div>	
			</div>	
			<div class="">
				<label class="uk-form-label" for="search-size">Square Footage</label>
				<div class="uk-form-controls">
					<select id="search-size" name="size" class="uk-select uk-form-width-large" tabindex="3">
						<option value="">Any</option>
                        <?php
							// generate a range of sq ft, checking our whitelist to see if any are already selected
							foreach(array('1,000-1,250', '1,251-1,500', '1,501-1,750', '1,751-2,000', '2,000+') as $range) {
								$selected = str_replace(',', '', $range) == str_replace(',', '', $input->size) ? " selected='selected'" : '';
								echo "<option$selected value='".str_replace(',', '', $range)."'>$range</option>";
							}    
                        ?>						
			        </select>
				</div>
			</div>
			<div id="view-sibling" class="uk-visible@s">
			<?php
    			$not_this = $page->siblings("limit=1", false);
    			foreach($not_this as $not) {
                    echo "<a href='$not->url' class='uk-button grey-button uk-width-expand'>View $not->title Collection&nbsp;<i class='fa fa-chevron-right'></i></a>";
                }
            ?>
			</div>
		</div>
		
		<div class="uk-grid uk-grid-small uk-flex-bottom uk-margin-top uk-child-width-1-1 uk-child-width-1-2@s uk-child-width-1-4@m">	
    		<div class="">
    			<button type="submit" id="search-submit" class="uk-button gold-button uk-width-expand" name="submit" tabindex="4">Search</button>
    		</div>
		</div>

	</form>
                foreach(array('beds', 'bathrooms', 'size') as $key) {
                
                	if(!$value = $input->get($key)) continue; 
                	
                	// see if the value is given as a range (i.e. two numbers separated by a dash)
                	if(strpos($value, '-') !== false) {
                		list($min, $max) = explode('-', $value); 
                		$min = (int) $min;	
                		$max = (int) $max; 
                		$selector .= "$key>=$min, $key<=$max, ";
                		//$summary[$key] = (substr($max, 0, 3) == '999') ? "$min and above" : "$min to $max";
                		$input->whitelist($key, "$min-$max"); 

                	// see if the value is given as a float (i.e. decimal, this is specific to bathrooms)
                    } else if(strpos($value, '.') !== false) {
                        $value = $sanitizer->selectorValue($input->get->bathrooms);
                        $selector .= "bathrooms%=$value, "; 
                        $input->whitelist($selector, $value); 
    				
                	// see if the value ends with a +, which we used to indicate 'greater than or equal to'
                	} else if(substr($value, -1) == '+') { 
                		$value = (int) $value; 
                		$selector .= "$key>=$value, ";
                		//$summary[$key] = "$value and above";
                		$input->whitelist($key, "$value+"); 
	
                	} else {	
                		$value = (int) $value; 
                		$selector .= "$key=$value, ";
                		//$summary[$key] = $value;
                		$input->whitelist($key, $value); 
                	}
                }

 

Link to comment
Share on other sites

Well, the first thing you should do is change

<option value="">Any</option>

to something like

<option value="any">Any</option>

Then you would at least get a parameter in PW that you could act upon.

Before you run your
foreach(array('beds', 'bathrooms', 'size') as $key) {
routine, I would check if all of those three parameters are set to "any" (or whatever you choose to use), and if that's the case, skip the entire foreach() and go straight to the "full search".

  • Like 1
Link to comment
Share on other sites

Okay, I'm also using the code below that comes after the foreach:

				// did we find any matches?
				if(count($input->get)) {										
	    			// Find pages that match the selector
    				$results = $pages->find($selector);
    				if(count($results) > 0) {
                        $message .= "<h3 class='uk-h5'>There are <strong>".count($results)."</strong> House Plans</h3>";
                    } else {
                        $message .= "<h3 class='uk-h5'>Sorry, no results</h3>";   
                    }
                } else {
                    $results = $page->children();
                }

I tried checking the three parameters in a conditional like: if($input->get('beds') == 0 || ($input->get('bathrooms') == 0 || ($input->get('size') == 0 || ). But couldn't really make it work. I ended up modifying the code above to:

				// did we find any matches?
				if(count($input->get)) {										
	    			// Find pages that match the selector
    				$results = $pages->find($selector);
    				if(count($results) === 0) {
                        $results = $pages->find('template=house-plan');
                    }
                } else {
                    $results = $page->children();
                }
                
                echo "<h3 class='uk-h5'>There are <strong>".count($results)."</strong> House Plans</h3>";

So, the result is a query string (/?beds=0&bathrooms=0&size=0&submit=1) with all select options set to 'Any' directly after a search has been performed. I suppose this is acceptable, but wish I could remove it. Thank you @dragan for the help.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...