Thanks Martin.

That gave me a bit of an idea of what I'm going to
do. And yes I want to know the specific details on how
you implemented it. It would also be good if I could see
some snippets of your code (model,controller,view) to further
understand what you're trying to explain.

Btw, I'm actually a mac developer but I'm still new in cakephp. =)

On Oct 30, 8:36 am, "[EMAIL PROTECTED]"
<[EMAIL PROTECTED]> wrote:
> First I'll admit I did not read through all your code. But I think I
> get what you are doing.
>
> I created a filtering system about a year ago. I wanted/needed
> something that worked a bit like the find feature in Mac OS X Finder,
> or in some SQL-GUIs I have used. If you have see this you know what I
> am talking about. I also needed these to be saved and recalled later.
>
> Anyway.
> I ended up with something that is a lot more streamlined in the
> controller but with a bit more work done in the Models.
>
> Filter is the whole search setup for a particular search.
> Rule is a single filtering rule.
> Filter hasMany Rule
>
> One Rule can have:
> - a property to filter
> - an operator
> - a value entered by the user
>
> End result might be "email ends with gmail.com" for a single rule.
> Adding more rules to a Filter would narrow the search using "AND".
> This turned out the be very flexible. A filter can be attached to any
> other model and do filtering on it.
>
> The rule model contained a big data array with different operators
> (sql fragments) for different types of data. Since humans want to
> filter numbers differently from email addresses I created a number of
> these preset custom fragments that could be selected from drop-downs
> in the gui. The rule model also contained a method for converting the
> stored parameters (field, match, value) to an sql fragment for a given
> model.
>
> Some examples of fragments:
> $this->types['Text']['equals'] = '%s LIKE \'%s\'';
> $this->types['Text']['contains'] = '%s LIKE \'%%%s%%\'';
> $this->types['Text']['starts_with'] = '%s LIKE \'%s%%\'';
> $this->types['Text']['ends_with'] = '%s LIKE \'%%%s\'';
> $this->types['Date']['days_ago'] = 'FLOOR(DATEDIFF(CURDATE(),
> DATE(%s))) = \'%s\'';
> $this->types['Date']['weeks_ago'] = 'FLOOR(DATEDIFF(CURDATE(),
> DATE(%s))/7) = \'%s\'';
>
> Each field is mapped to a type. Datetime fields becomes the "Date"
> type. Text fields could be set to email or anything but defaults to
> "Text".
>
> The filter code was nothing special. The only special method there was
> "getFilterFor($model_name)" which gathers the results from each rule.
>
> The reason for this setup was partly flexibility and partly the GUI. I
> really wanted a humane gui. No wildcards or pseudo-sql. Simple selects
> and meaningful words. Looking back it is not a very difficult setup
> but it did take some time to come up with the right way to set it all
> up.
>
> I hope that gives you some ideas.
> Let me know if you want a few more boring details of the
> implementation.
>
> /Martin
>
> On Oct 30, 3:43 pm, mario <[EMAIL PROTECTED]> wrote:
>
> > Hello everyone,
>
> > I'm planning to include filters in my new project wherein it will
> > allow the user to filter or show only the information that he/she
> > wants. Of course there would be a search form
> > (textfield,combobox,checkbox, submit button) for this relative to my
> > tables' fieldnames in the database.
>
> > I've already done this before on my recent project using cakephp. I
> > will post some of my code snippets here for you to make some
> > suggestion and for me to find out if what I'm doing is correct or not.
> > I'm also looking forward on recommendations on how to improve my
> > filtering process (which I'm gonna use on my next project).
>
> > Here is the code snippet of my controller (I've placed the filters in
> > my index view):
> > --------------------------------------------------------------------------- 
> > ----------
> >         function index($title = null, $location = null, $date_from = null,
> > $date_to = null) {
> >                 if (empty($this->data) &&
> >                                 (!$title || ($title == 'allTitle')) &&
> >                                 (!$location || $location == 'allLocation') 
> > &&
> >                                 (!$date_from || !$date_to))
> >                 {
> >                         $this->paginate['Exhibit'] = array(
> >                                                 'limit' => 1,
> >                                                 'page' => 1,
> >                                                 'order' => array 
> > ('Exhibit.title' => 'asc')
> >                                 );
> >                         $this->set('exhibits', $this->paginate());
> >                         $this->set('reportTitle',null);
> >                         $this->set('reportLocation',null);
> >                         $this->set('reportDateFrom',null);
> >                         $this->set('reportDateTo',null);
> >                 }
> >                 else
> >                 {
> >                         if(!$title || $title == 'allTitle')
> >                         {
> >                                 $title = $this->data['Search']['title'];
> >                         }
> >                         else
> >                         {
> >                                 $this->data['Search']['title'] = $title;
> >                         }
> >                         if(!$location || $location == 'allLocation')
> >                         {
> >                                 $location = 
> > $this->data['Search']['location'];
> >                         }
> >                         else
> >                         {
> >                                 $this->data['Search']['location'] = 
> > $location;
> >                         }
> >                         if(!$date_from)
> >                         {
> >                                 $date_from = 
> > $this->data['Search']['date_from'];
> >                         }
> >                         else
> >                         {
> >                                 $this->data['Search']['date_from'] = 
> > $date_from;
> >                         }
> >                         if(!$date_to)
> >                         {
> >                                 $date_to = $this->data['Search']['date_to'];
> >                         }
> >                         else
> >                         {
> >                                 $this->data['Search']['date_to'] = $date_to;
> >                         }
>
> >                         if($title != '')
> >                         {
> >                                 $this->set('reportTitle',$title);
> >                         }
> >                         else
> >                         {
> >                                 $this->set('reportTitle','allTitle');
> >                         }
>
> >                         if($location != '')
> >                         {
> >                                 $this->set('reportLocation',$location);
> >                         }
> >                         else
> >                         {
> >                                 $this->set('reportLocation','allLocation');
> >                         }
>
> >                         if($date_from == '' || $date_to == '')
> >                         {
> >                                 $this->paginate['Exhibit'] = array(
> >                                                         'conditions'=> 
> > array("Exhibit.title LIKE '%$title%'",
> >                                                                             
> >                     "Exhibit.location LIKE '%$location%'"),
> >                                                         'limit' => 1,
> >                                                         'page' => 1,
> >                                                         'order' => array 
> > ('Exhibit.title' => 'asc')
> >                                         );
> >                                 $this->set('exhibits', $this->paginate());
>
> >                                 $this->set('reportDateFrom',null);
> >                                 $this->set('reportDateTo',null);
> >                         }
> >                         else
> >                         {
> >                                 $token_date_from = explode("/", $date_from);
> >                                 if(count($token_date_from) == 3)
> >                                 {
> >                                         $date_from = 
> > $token_date_from[2].'-'.$token_date_from[1].'-'.
> > $token_date_from[0];
> >                                 }
>
> >                                 $token_date_to = explode("/", $date_to);
> >                                 if(count($token_date_to) == 3)
> >                                 {
> >                                         $date_to = 
> > $token_date_to[2].'-'.$token_date_to[1].'-'.
> > $token_date_to[0];
> >                                 }
>
> >                                 $this->paginate['Exhibit'] = array(
> >                                                         'conditions'=> 
> > array("Exhibit.date_accessioned BETWEEN
> > '$date_from' AND '$date_to'",
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to