vvg / filterlist-bundle
Bundle to generate dynamic filtered (client-side) lists using jQuery.
Installs: 85
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 2
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=5.3.2
- doctrine/doctrine-bundle: *
- symfony/framework-bundle: >=2.1,<2.4-dev
This package is not auto-updated.
Last update: 2024-10-07 14:12:51 UTC
README
Symfony2 bundle generating dynamic filtered (client-side) lists using jQuery.
Your filtered list are builded using a behavior class binded in controllers.
Installation
To install this bundle please follow the next steps:
First add the dependencies to your composer.json
file:
"require": { ... "vvg/filterlist-bundle": "dev-master" },
Then install the bundle with the command:
php composer update
Enable the bundle in your application kernel:
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new VVG\Bundle\FilterListBundle\VVGFilterListBundle(), ); }
Then install the assets using the command:
php app/console assets:install web
Declare the behavior class
<?php //src/App/StoreBundle/FilterList/FancyList.php namespace App\StoreBundle\FilterList; use VVG\Bundle\FilterListBundle\FilterList\FilterListBase; use VVG\Bundle\FilterListBundle\Field\FilterListField; class FancyList extends FilterListBase { public function configureFields() { $field = new FilterListField(); $field->setName('ean_code'); $field->setIsFiltrable(true); $field->setIsSortable(true); $field->setDisplayName('Ean code'); $this->addField($field); $field = new FilterListField(); $field->setName('product_name'); $field->setIsFiltrable(true); $field->setIsSortable(true); $field->setDisplayName('Product name'); $this->addField($field); $field = new FilterListField(); $field->setName('store_name'); $field->setIsFiltrable(true); $field->setIsSortable(true); $field->setDisplayName('Store name'); $this->addField($field); ... } public function configureRepository() { $repo = $this->getDoctrine()->getManager()->getRepository('CommerceBundle:Product'); $this->setRepository($repo); } public function configureQuery() { $queryBuilder = $this->getRepository()->createQueryBuilder('p'); $queryBuilder->innerjoin('p.store', 's'); $this->setQueryBuilder($queryBuilder); } public function configureFieldQuery($fieldName, $fieldValue) { if($fieldName == 'ean_code') { $this->getQueryBuilder()->andWhere("p.ean = '". $fieldValue . "'"); } if($fieldName == 'product_name') { $this->getQueryBuilder()->andWhere("p.name LIKE '%". $fieldValue ."%'"); } if($fieldName == 'store_name') { $this->getQueryBuilder()->andWhere("s.name LIKE '%". $fieldValue ."%'"); } } public function configureOrderByQuery($fieldName, $sort) { if($fieldName == 'ean_code') { $this->getQueryBuilder()->orderBy("t.id", $sort); } ... //same way } public function getFieldResult($fieldName, $result) { if($fieldName == 'ean_code') { return $result->getEan(); } ... //same way if($fieldName == 'store_name') { return $result->getStore()->getName(); } } public function getTotalCountResult() { return 'COUNT(p)'; } public function hrefLink($result) { return $this->getRouter()->generate('Admin_product_detail', array('idproduct' => $result->getId())); } public function getPrimary($result) { return $result->getId(); } //Events on selected data public function getEvents() { return array( 'onDelete' => 'Delete task', 'onSomething' => 'Do something' ); } //Selected data manipulation method protected function onDelete($entity) { $this->getDoctrine()->getManager()->remove($entity); $this->getDoctrine()->getManager()->flush(); } //Selected data manipulation method protected function onSomething($entity) { $entity->setSomething('foo'); $this->getDoctrine()->getManager()->persist($entity); $this->getDoctrine()->getManager()->flush(); } }
Usage in controllers:
//src/App/StoreBundle/Controller/DefaultController.php /** * @Route("/admin/fancy_list", name="Admin_fancy_list") * @Template() */ public function mainAction() { $fancyList = $this->get('filterlist') ->setList(new FancyList()) ->getClientList($this->generateUrl('Admin_fancy_list_ajax')); return array( 'foo' => 'bar', 'fancyList' => $fancyList ); } /** * @Route("/admin/fancy_list/ajax", name="Admin_fancy_list_ajax") * @Template() */ public function fancyListAjaxAction() { return $this->get('filterlist') ->setList(new FancyList()) ->bindAjaxRequest($this->get('request')); }
Usage in views:
<!-- Put this in your layout or view --> <link rel="stylesheet" href="{{ asset('bundles/vvgfilterlist/css/VVGFilterList.css') }}" /> <script src="{{ asset('bundles/vvgfilterlist/js/VVGFilterList.js') }}"></script> <!-- Put this in your views --> {% include 'VVGFilterListBundle::list.html.twig' with {'data': fancyList, 'listName' : 'myFancyList'} %}