Exclude record(s) from viewer results?

4 posts by 2 authors in: Forums > CMS Builder
Last Post: October 6, 2009   (RSS)

Re: [jghoward] Exclude record(s) from viewer results?

By Chris - September 1, 2009 - edited: September 1, 2009

Hi John,

Is there a way to exclude some records in the foreach loop in only some viewers?


Absolutely! You have complete control over which records are filtered and which are displayed. If you can explain exactly how you want to decide which records to show, we can show you how to do so.

For example, here's some code that would build a list of records from a section called "rentalunit", but filter any which have duplicate entries in their "address" field:

$rentalunitRecords = array();
$query = "SELECT * FROM cms_rentalunit GROUP BY address";
$result = mysql_query($query) or die("MySQL Error: ". htmlspecialchars(mysql_error()) . "\n");
while ($record = mysql_fetch_assoc($result)) {
array_push($rentalunitRecords, $record);
}


Also, are there any issues to be aware of when I'm using multiple viewers on the same page? My maps, slideshows, navigation should be on the same page as search. I don't quite understand what the "searchable" option means when generating code, and why it should be disabled sometimes. I could not find it in the docs.


"By default automatic searching is enabled. If you have multiple viewers on one page you may want some viewers to always show all results and ignore search keywords."

Basically, your List Viewer pages can double as search results pages, but that might stop making sense when you have multiple List Viewers on a single page. For example, you probably wouldn't want your navigation to be "searchable" by a visitor.

Please provide more details on how you want to filter your results (and maybe a sample List page, so we can see what your fields are called) and we'll see what we can do to help.
All the best,
Chris

Re: [chris] Exclude record(s) from viewer results?

By jghoward - October 6, 2009 - edited: October 6, 2009

The code snippet you mentioned looks useful, but how do I implement it in my page?

I'm using the code generator, so I have this at the top of my page:
<?php header('Content-type: text/html; charset=utf-8'); ?>
<?php
require_once "/home/content/12/4805312/html/cmsAdmin/lib/viewer_functions.php";

list($listingsRecords, $listingsMetaData) = getRecords(array(
'tableName' => 'listings',
'allowSearch' => '0',
));


I'm using Google Maps and I want to show only one marker for each address. Some adresses have several unit types, so I just want to show one.

The code I'm using shows all of them:
<?php foreach ($listingsRecords as $record): ?>

var point = new GLatLng(<?php echo $record['latitude'] ?>,<?php echo $record['longitude'] ?>);
var marker = createMarker(point,'<?php echo htmlspecialchars($record['street_address'], ENT_QUOTES) ?>, <?php echo htmlspecialchars($record['city'], ENT_QUOTES) ?> <br /><a href="<?php echo $record['_link'] ?>" target="_blank">View Property Details</a>')
map.addOverlay(marker);

<?php endforeach; ?>

}


Can you tell me how to use the code you suggested? This will be helpful to me, as there are other situations on the site (slideshows) where I will need to know how to exclude listings.

Re: [jghoward] Exclude record(s) from viewer results?

By Chris - October 6, 2009

Hi John,

How about this approach instead?

<?php $latlngsAlreadySeen = array(); ?>
<?php foreach ($listingsRecords as $record): ?>

<?php
// don't create two markers for the same latlng
$latlng = $record['latitude'] . ',' . $record['longitude'];
if (array_key_exists($latlng, $latlngsAlreadySeen)) { continue; } // skip latlngs we've already seen
$latlngsAlreadySeen[$latlng] = true; // mark latlng as seen
?>

var point = new GLatLng(<?php echo $record['latitude'] ?>,<?php echo $record['longitude'] ?>);
var marker = createMarker(point,'<?php echo htmlspecialchars($record['street_address'], ENT_QUOTES) ?>, <?php echo htmlspecialchars($record['city'], ENT_QUOTES) ?> <br /><a href="<?php echo $record['_link'] ?>" target="_blank">View Property Details</a>')
map.addOverlay(marker);

<?php endforeach; ?>


That will avoid creating extra markers for the same Latitude & Longitude pair.

I hope this helps. Please let me know if you have any questions.
All the best,
Chris