Git Product home page Git Product logo

cakephp-filter-plugin's Introduction

CakePHP Filter Plugin

Paginates Filtered Records

Background

This plugin is a fork of Jose Diaz-Gonzalez's Filter component, which is something of a fork of James Fairhurst's Filter Component, which is in turn a fork by Maciej Grajcarek, which is ITSELF a fork from Nik Chankov's code. Chad Jablonski then added RANGE support with a few bug fixes. jmroth pointed out a pretty bad redirect issue and "fixed it". Then Jose Diaz-Gonzalez took everyone's changes, merged them together, and updated the Component to be a bit more 1.3 compliant.

That's a lot of forks...

This also contains a view helper made by Matt Curry.

This also uses a behavior adapted from work by Brenton to allow for HasAndBelongsToMany and HasMany relationships.

This works for all relationships.

Installation

  • Clone from github : in your plugin directory type

    git clone git://github.com/josegonzalez/cakephp-filter-plugin.git filter

  • Add as a git submodule : from your app/ directory type

    git submodule add git://github.com/josegonzalez/cakephp-filter-plugin.git plugins/filter

  • Download an archive from github and extract the contents into /plugins/filter

Usage

  • Include the component in your controller (AppController or otherwise)

    var $components = array('Filter.Filter');

  • Use something like the following in your index

function index() {
	$this->paginate = $this->Filter->paginate;
	$posts = $this->paginate();
	$this->set(compact('posts'));
}
  • Finished example:
paginate = $this->Filter->paginate;
		$posts = $this->paginate();
		$this->set(compact('posts'));
	}
}
?>

Advanced Usage

Overriding the Filter pagination

Option 1: Controller-wide

By setting the $paginate variable for your controller, the Filter component merges those into it's own rules before processing incoming information.

 array('Comment'), 'limit' => 5);

	function index() {
		$this->paginate = $this->Filter->paginate;
		$posts = $this->paginate();
		$this->set(compact('posts'));
	}
}
?>

Option 2: Action-specific

You can merge in things to the paginate array before any pagination happens if necessary.

paginate = array_merge($this->Filter->paginate,
			array('contain' => array('Comment'), 'limit' => 5)
		);
		$posts = $this->paginate();
		$this->set(compact('posts'));
	}
}
?>

Setting up search forms

Option 1: Helper

Use the helper In between the row with all the column headers and the first row of data add:

<?php echo $this->Filter->form('Post', array('name')) ?>

The first parameter is the model name. The second parameter is an array of fields. If you don't want to filter a particular field pass null in that spot.

Option 2: Manually

Create your own form however you want. Below is such an example.

Form->create('Post', array('action' => 'index', 'id' => 'filters')); ?>
	<table cellpadding="0" cellspacing="0">
		<thead>
			<tr>
				<th>Paginator->sort('Post.name'); ?></th>
				<th class="actions">Actions</th>
			</tr>
			<tr>
				<th>Form->input('Post.name'); ?></th>
				<th>
					<button type="submit" name="data[filter]" value="filter">Filter</button>
					<button type="submit" name="data[reset]" value="reset">Reset</button>
				</th>
			</tr>
		</thead>
		<tbody>
			// loop through and display your data
		</tbody>
	</table>
Form->end(); ?>
<div class="paging">
	Paginator->prev('<< '.__('previous', true), array(), null, array('class' => 'disabled')); ?>
	Paginator->numbers(); ?>
	Paginator->next(__('next', true).' >>', array(), null, array('class' =>' disabled')); ?>
</div>

Filtering hasMany and hasAndBelongsToMany relationships

Add Behavior to model (only necessary for HABTM and HasMany):

Initialization Tips

These different initialization options are combined in the setup array. Defaults are shown below.

 array(
		'actions' => array('index'),
		'defaults' => array(),
		'fieldFormatting' => array(
			'string'	=> "LIKE '%%%s%%'",
			'text'		=> "LIKE '%%%s%%'",
			'datetime'	=> "LIKE '%%%s%%'"
		),
		'formOptionsDatetime' => array(),
		'paginatorParams' => array(
			'page',
			'sort',
			'direction',
			'limit'
		),
		'parsed' => false,
		'redirect' => false,
		'useTime' => false,
		'separator' => '/',
		'rangeSeparator' => '-',
		'url' => array(),
		'whitelist' => array()
	));
}
?>
  • actions: Array of actions upon which this component will act upon.
  • defaults: Holds pagination defaults for controller actions. (syntax is array('Model' => array('key' => 'value'))
  • fieldFormatting: Fields which will replace the regular syntax in where i.e. field = 'value'
  • formOptionsDatetime: Formatting for datetime fields (unused)
  • paginatorParams: Paginator params sent in the URL
  • parsed: Used to tell whether the data options have been parsed
  • redirect: Used to tell whether to redirect so the url includes filter data
  • useTime: Used to tell whether time should be used in the filtering
  • separator: Separator to use between fields in a date input
  • rangeSeparator: Separator to use between dates in a date range
  • url: Url variable used in paginate helper (syntax is array('url'=>$url));
  • whitelist: Array of fields and models for which this component may filter

Todo

  1. Better code commenting - Done, left to help enforce the habit
  2. Support Datetime Done
  3. Support URL redirects and parsing Done
  4. Refactor datetime filtering for ranges Done
  5. Allow the action to be configurable Done
  6. Support jQuery Datepicker Outside scope
  7. Support Router prefixes, plugins, and named parameters in a "scope" instead of "actions" key.
  8. Expand hasMany and hasAndBelongsToMany support. Refactor behavior to conform with established practices.

cakephp-filter-plugin's People

Contributors

dsturm avatar josegonzalez avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.