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

Dale Bengston dbengston at preservationstudio.com
Mon Aug 21 08:13:32 MDT 2006


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



More information about the FX.php_List mailing list