[FX.php List] Browsing a set of found records

Jonathan Schwartz jonathan at eschwartz.com
Mon Aug 21 08:31:32 MDT 2006


Yes. Thank you.

Now on the learning about creating and manipulating arrays...

I needed to learn this anyway. ;-)

J

At 9:13 AM -0500 8/21/06, Dale Bengston wrote:
>I will share the concept I'm using, and leave the coding to you.
>
>I'm allowing people to page through records in 
>"detail view" by first presenting a "list view." 
>As I write the list of records to the page, I 
>add each one's record key to a session array. If 
>the user clicks on a record in "list view" to go 
>to "detail view," I retrieve the single record's 
>detailed field data, and as I write the "detail 
>view," I find the record's position in the 
>session array and write Previous and Next links 
>to the records adjacent to the selected record 
>(with some smarts for wrapping around the 
>beginning and end of the found set). Loading the 
>record keys as the list is written to the page 
>preserves the sort order and found count, since 
>it was generated by the sort/find of the last 
>list of records displayed.
>
>The next time you retrieve a list of records, 
>and/or sort them by clicking on the field titles 
>in the header row (I allow most of my lists to 
>be re-sorted this way no the fly), the session 
>array is re-built with the new find/sort.
>
>Make sense?
>
>Dale
>
>On Aug 21, 2006, at 12:24 AM, Jonathan Schwartz wrote:
>
>>Care to share the scripts lines that create the 
>>array from the initial query and then the steps 
>>to pull walk the array to pull them out again?
>>
>>Thanks
>>
>>Jonathan
>>
>>At 12:19 AM -0500 8/21/06, Dale Bengston wrote:
>>>This is exactly how I do it.
>>>
>>>Dale
>>>
>>>On Aug 20, 2006, at 3:18 PM, Gjermund Gusland Thorsen wrote:
>>>
>>>>I think you should do you first search, put all the recids from the
>>>>selection in an array of $_SESSION and from there do a search by an
>>>>offset in the $_SESSION['selectionRecid']
>>>>
>>>>ggt667
>>>>
>>>>On 8/20/06, Jonathan Schwartz <jonathan at eschwartz.com> wrote:
>>>>>Whoa!   *That's* what I'm talking about!
>>>>>
>>>>>It's going to take me a bit to work thru this.  I
>>>>>did try to adapt it for use and couldn't quite
>>>>>make it work...yet. I am getting a blank table as
>>>>>a  result.  Will advise if I can't figure it out.
>>>>>
>>>>>Jonathan
>>>>>
>>>>>
>>>>>At 3:58 PM +0200 8/20/06, Erik Andreas Cayré wrote:
>>>>>>Content-Type: multipart/signed; micalg=sha1;
>>>>>>boundary=Apple-Mail-13--466018973;
>>>>>>        protocol="application/pkcs7-signature"
>>>>>>
>>>>>>
>>>>>>Den 20/08/2006 kl. 8.16 skrev Jonathan Schwartz:
>>>>>>
>>>>>>>This next enhancement has been on my wish list for a long time....
>>>>>>>
>>>>>>>After performing a search, I would like to
>>>>>>>allow users to browse the resulting records,
>>>>>>>one by one.  To me, this is much more efficient
>>>>>>>then: search/view list/display detail/return to
>>>>>>>list/view next.
>>>>>>>
>>>>>>>I know that this means saving the resulting set
>>>>>>>in an array and then walking the array.  I just
>>>>>>>don't know how.
>>>>>>>
>>>>>>>I imagine it must look a lot like the standard
>>>>>>>for each code, along with explode.  From the
>>>>>>>current script which lists the found set:
>>>>>>>
>>>>>>>   php foreach($searchResult['data'] as $key => $value) {
>>>>>>>
>>>>>>>               echo "<td><a href=\"detail.php?recid=";
>>>>>>>               $recordDetails=explode('.',$key);
>>>>>>>               $currentRecord=$recordDetails[0];
>>>>>>>               echo $currentRecord."\">".$value['myfield'][0];
>>>>>>>               echo "</a></td>";
>>>>>>>
>>>>>>>In addition to echoing to screen, I'm guessing
>>>>>>>that I need to create and populate an array.
>>>>>>>
>>>>>>>Or.....is this just a variation on PREV NEXT
>>>>>>>links, where the groupsize is set to 1?
>>>>>>>
>>>>>>>Anyone want to steer me in the right direction?
>>>>>>
>>>>>>I took the challenge, since I'll need a similar
>>>>>>feature on one of my sites soon.
>>>>>>
>>>>>>My test code is below. I hope it's readable, I
>>>>>>put a few comments in to help...
>>>>>>The code is not ready for production: check for
>>>>>>valid user input are missing and there may be
>>>>>>other stuff missing...
>>>>>>
>>>>>>All comments are welcome!
>>>>>>
>>>>>>Code:
>>>>>><?php
>>>>>>        session_start(); // Let's us remember stuff accross page loads
>>>>>>        require_once ('FX/FX.php');
>>>>>>        require_once ('inc/system.php'); // DB connection constants etc.
>>>>>>
>>>>>>// Functions
>>>>>>        // Find products by name, without 'InnerArray'
>>>>>>        function findProducts($search)
>>>>>>        {
>>>>>>                global $fmshost;
>>>>>>                global $dataport;
>>>>>>                global $dbname;
>>>>>>                global $user;
>>>>>>                global $pass;
>>>>>>                $layout = 'products';
>>>>>>                $fx = new FX($fmshost, $dataport);
>>>>>>                $fx->SetDBData($dbname, $layout);
>>>>>>                $fx->SetDBUserPass($user, $pass);
>>>>>>                $fx->AddDBParam('webtexts_productname::da', $search);
>>>>>>                $return_data = $fx->FMFind(TRUE, 'object', FALSE);
>>>>>>
>>>>>>                // Transform FM data into more useful array
>>>>>>                if (count($return_data) > 0) {
>>>>>>                        $i = 1;
>>>>>>                        foreach ($return_data AS $fmkey => $fmrecord) {
>>>>>>                                list(
>>>>>>$products[$i]['recid'], $test[$i]['modid'] ) =
>>>>>>explode( '.', $fmkey );
>>>>>>                                foreach ($fmrecord as $field => $value) {
>>>>>>                                        if (isset($value)) {
>>>>>>$products[$i][$field] = $value;
>>>>>>                                        }
>>>>>>                                }
>>>>>>                                $i++;
>>>>>  >                       }
>>>>>>                        return ($products);
>>>>>>                }
>>>>>>                return (NULL);
>>>>>>        }
>>>>>>
>>>>>>        // Add link to string
>>>>>>        function addLink ($string, $URI = '')
>>>>>>        {
>>>>>>                $start = ($URI != '' ? '<a href="' . $URI . '">' : '');
>>>>>>                $end = ($URI != '' ? '</a>' : '');
>>>>>>                $html = $start . $string . $end;
>>>>>>                return ($html);
>>>>>>        }
>>>>>>
>>>>>>        // Show navigation widget. Links using GET
>>>>>>        function showNavigationWidget 
>>>>>>($count, $listRelativeURI, $current = 1)
>>>>>>        {
>>>>>>                $previous = '&lt;&lt;';
>>>>>>                $next = '&gt;&gt;';
>>>>>>                $list = 'List';
>>>>>>
>>>>>>                $html = addlink ($previous,
>>>>>>($current > 1 ? $_SERVER['PHP_SELF'] . '?id=' .
>>>>>>($current - 1) : '')); // Link to previous record
>>>>>>                $html .= ' ' . addLink ($next,
>>>>>>($current < $count ? $_SERVER['PHP_SELF'] .
>>>>>>'?id=' . ($current + 1) : '')); // Add link to
>>>>>>next record
>>>>>>                $html .= ' &middot; ' . addLink
>>>>>>($list, $_SERVER['PHP_SELF'] .
>>>>>>$listRelativeURI); // Add link back to list
>>>>>>                return ($html);
>>>>>>        }
>>>>>>
>>>>>>// The page
>>>>>>        $head = '<!DOCTYPE html PUBLIC
>>>>>>"-//W3C//DTD XHTML 1.0 Transitional//EN"
>>>>>>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
>>>>>><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
>>>>>><head>
>>>>>>        <meta http-equiv="content-type" 
>>>>>>content="text/html; charset=utf-8" />
>>>>>>        <title>Test</title>
>>>>>>        <meta name="generator" content="BBEdit 8.2" />
>>>>>></head>
>>>>>>';
>>>>>>        $body = '
>>>>>><body><div style="margin-left: auto; margin-right: auto; width: 500px;">
>>>>>><form method="get" id="showproducts" name="showproducts">
>>>>>><label for="search">Search product name: </label>
>>>>>><input name="search" id="search" type="text"
>>>>>>size="20"  value="' . $_SESSION['search'] . '"/>
>>>>>><button type="submit">Search</button>
>>>>>></form>
>>>>>>';
>>>>>>
>>>>>>        if (isset($_GET['search'])) // Find and/or show list of products
>>>>>>        {
>>>>>>                if ($_GET['search'] != $_SESSION['search']) // New search
>>>>>>                {
>>>>>> 
>>>>>>$_SESSION['products'] = findProducts 
>>>>>>($_GET['search']);
>>>>>>                        $_SESSION['foundCount'] =
>>>>>>count ($_SESSION['products']);
>>>>>>                        $_SESSION['search'] = $_GET['search'];
>>>>>>                }
>>>>>>
>>>>>>                if ($_SESSION['products'] == NULL) // Didn't find anything
>>>>>>                {
>>>>>>                        $body .= '<p>No matches
>>>>>>found for search term "' . $_SESSION['search'] .
>>>>>>'"<br>
>>>>>>Please try another search term.</p>
>>>>>>';
>>>>>>                } else { // Show the list
>>>>>>
>>>>>>                        $body .= '<table border="1">
>>>>>><caption>List of ' . $_SESSION['foundCount'] . '
>>>>>>products matching "' . $_SESSION['search'] .
>>>>>>'"</caption>
>>>>>>';
>>>>>>
>>>>>>                        foreach ($_SESSION['products'] AS $id => $product)
>>>>>>                        {
>>>>>>                                $body .=
>>>>>>'<tr><td><a href="' . $_SERVER['PHP_SELF'] .
>>>>>>'?id=' . $id . '">' . $product['id'] . ' ' .
>>>>>>$product['webtexts_productname::da'] .
>>>>>>(array_key_exists('webtexts_suppdata1::da',
>>>>>>$product) ? ', ' .
>>>>>>$product['webtexts_suppdata1::da'] : '') . '</a>
>>>>>>';
>>>>>>                        }
>>>>>>                        $body .= '</table>
>>>>>>';
>>>>>>                }
>>>>>>        }
>>>>>>
>>>>>>        elseif (isset($_GET['id'])) // Show
>>>>>>product details, with links for browsing
>>>>>>
>>>>>>        {
>>>>>>                $body .= '<table border="1"
>>>>>>width="450px"><caption>Details for product ' .
>>>>>>$_GET['id'] . ' of ' . $_SESSION['foundCount'];
>>>>>>                $body .= ' &middot; ' .
>>>>>>showNavigationWidget($_SESSION['foundCount'],
>>>>>>'?search=' . $_SESSION['search'], $_GET['id']) .
>>>>>>'</caption>
>>>>>><tr><th>Association<td>' .
>>>>>>$_SESSION['products'][$_GET['id']]['associations::name']
>>>>>>. '
>>>>>><tr><th>Product name<td>' .
>>>>>>$_SESSION['products'][$_GET['id']]['webtexts_productname::da']
>>>>>>. (array_key_exists('webtexts_suppdata1::da',
>>>>>>$_SESSION['products'][$_GET['id']]) ? ', ' .
>>>>>>$_SESSION['products'][$_GET['id']]['webtexts_suppdata1::da']
>>>>>>: '') . '
>>>>>><tr><th>Product price<td>' . 
>>>>>>$_SESSION['products'][$_GET['id']]['price'] 
>>>>>>. '
>>>>>>';
>>>>>>
>>>>>  >               $body .= '</table>
>>>>>>';
>>>>>>        }
>>>>>>
>>>>>>        $body .='</div>
>>>>>></body>
>>>>>></html>';
>>>>>>
>>>>>>print $head;
>>>>>>print $body;
>>>>>>?>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>---
>>>>>>Erik Andreas Cayré
>>>>>>Spangsbjerg Møllevej 169
>>>>>>DK-6705 Esbjerg Ø
>>>>>>
>>>>>>Home Tel: +45 75150512
>>>>>>Mobile: +45 40161183
>>>>>>
>>>>>>»If you can't explain it simply, you don't understand it well enough.«
>>>>>>-- Albert Einstein
>>>>>>
>>>>>>»If you don't have time to do it right, when
>>>>>>will you have time to do it over?«
>>>>>>-- John Wooden, basketball coach
>>>>>>
>>>>>>
>>>>>>
>>>>>>Attachment converted: PowerBookG4 HD:smime.p7s (    /    ) (0016C0F8)
>>>>>>_______________________________________________
>>>>>>FX.php_List mailing list
>>>>>>FX.php_List at mail.iviking.org
>>>>>>http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>
>>>>>
>>>>>--
>>>>>
>>>>>Jonathan Schwartz
>>>>>FileMaker 8 Certified  Developer
>>>>>Associate Member, FileMaker Solutions Alliance
>>>>>Schwartz & Company
>>>>>jonathan at eschwartz.com
>>>>>http://www.eschwartz.com
>>>>>http://www.exit445.com
>>>>>
>>>>>_______________________________________________
>>>>>FX.php_List mailing list
>>>>>FX.php_List at mail.iviking.org
>>>>>http://www.iviking.org/mailman/listinfo/fx.php_list
>>>>>
>>>>_______________________________________________
>>>>FX.php_List mailing list
>>>>FX.php_List at mail.iviking.org
>>>>http://www.iviking.org/mailman/listinfo/fx.php_list
>>>
>>>_______________________________________________
>>>FX.php_List mailing list
>>>FX.php_List at mail.iviking.org
>>>http://www.iviking.org/mailman/listinfo/fx.php_list
>>
>>
>>--
>>
>>Jonathan Schwartz
>>FileMaker 8 Certified  Developer
>>Associate Member, FileMaker Solutions Alliance
>>Schwartz & Company
>>jonathan at eschwartz.com
>>http://www.eschwartz.com
>>http://www.exit445.com
>>
>>_______________________________________________
>>FX.php_List mailing list
>>FX.php_List at mail.iviking.org
>>http://www.iviking.org/mailman/listinfo/fx.php_list
>
>_______________________________________________
>FX.php_List mailing list
>FX.php_List at mail.iviking.org
>http://www.iviking.org/mailman/listinfo/fx.php_list


-- 

Jonathan Schwartz
FileMaker 8 Certified  Developer
Associate Member, FileMaker Solutions Alliance
Schwartz & Company
jonathan at eschwartz.com
http://www.eschwartz.com
http://www.exit445.com



More information about the FX.php_List mailing list