/fzDoctrinePagedRoutePlugin

Provides route and route collection classes which makes it easy to create routes for paged lists and their elements. Additionally it only passes pages that will have elements on, giving 404 HTTP response for the others

Primary LanguagePHPMIT LicenseMIT

#fzDoctrinePagedRoutePlugin#

Plugin created to ease creation and management and creating of frontend routes that usually need only list (index) and show pages to the user.

Biggest advantage is that you actually **can't** visit page that will show no items on a list *(higher list-page number than elemts/elements_per_page or lower than 1)*, and you'll get 404 HTTP response instead.

##Requirements##

*Doctrine

Plugin is working with symfony 1.4 and should be working with 1.3 as well. It needs doctrine, as it utilises Doctrine Pager.

##Installation##

To install fzDoctrinePagedRoutePlugin simply execute plugin:install commend:

    ./symfony plugin:install fzDoctrinePagedRoutePlugin

you can install downloaded package as well:

    ./symfony plugin:install fzDoctrinePagedRoutePlugin.tgz

just place downloaded package in your project's root first.

You can also install it manually, unpacking archiwe, placing it's content in your
project's plugin/ directory, and enabling it in your ProjectConfiguration.class.php file:

config/ProjectConfiguration.class.php

    class ProjectConfiguration extends sfProjectConfiguration
    {
        //....//
        public function setup()
        {
            //....//
            $this->enablePlugins('fzDoctrinePagedRoutePlugin');
            //....//
        }
    }



##Usage##

Plugin contains one route class: **fzDoctrinePagedRoute** and one route collection class: **fzDoctrineLisPagedRouteCollection**.

You **can** set two settings in your "app.yml" page:

    all:
      #...
      fzDoctrinePagedRoutePlugin:
        page_indicator: page_name_for_url
        per_page: 5

* page_indicator setting is a word that will be used in list (index) url, like that: /url/to/your/list/**page_name_for_url**/page_number
* per_page is number (or your own setting name from app.yml tha contains number) of elements shown on a list per page.

###Single route definition###

The **fzDoctrinePagedRoute** one servers to create one route for paged list in **routing.yml** file.

    route_name:
      class: fzDoctrinePagedRoute
      url:   /url/to/your/list/:page
      param: { module: blog, action: index }
      options:
        model: Model
        browse_method: getElements
        per_page: app_max_per_page

There are three mandatory options:

* model, that tells route class which model should it use for pager,
* browse_method, which tells which method should it use to create list and pages
* per_page which tells how many items should be used per page, it overrides setting from **app.yml** if set, and can be omitted if set.

###Routes collection definition###

The **fzDoctrineLisPagedRouteCollection** is a collection route class that creates three routes:

* clean, without page indicator (default for 1st page of list, index action, fzDoctrinePagedRoute type).
* _paged, which uses page_indicator and page number word at the end (index action, fzDoctrinePagedRoute type)
* _show which is used to show one element and directs to the module (show action, sfDoctrineRoute type).

Should be set like that:

    route_collection_name:
      class: fzDoctrineListRouteCollection
      options:
        module: module_name
        model: Model
        type: object
        browse_method: getElements
        per_page: app_max_per_page
        page_indicator: page_name_for_url
        show_pattern: :id/:slug

Three new options are mandatory:

* module - passes module_name which will be used as a parameter for the route
* page_indicator - overrides page_indicator setting from app.yml. It isn't mandatorym and falls back just to the word page which gets append before page number.
* show_pattern - defines pattern that should be used for _show route, just as you'd set a route for sfDoctrineRoute (since it creates sfDoctrineRoute).

The model, browse_method and per_page options are used the same way as in **fzDoctrinePagedRoute**.


###Action usage###

fzDoctrinePagedRoute provides *getPager()* method that returns **DoctrinePager** defined and ready to use in your template.

    class moduleActions extends sfActions
    {

        public function executeIndex(sfWebRequest $request)
        {
            $this->pager = $this->getRoute()->getPager();
        }
        //....//
    }