Skip to content
This repository has been archived by the owner on Nov 5, 2020. It is now read-only.

Commit

Permalink
Merge pull request #13 from rdohms/v1.1
Browse files Browse the repository at this point in the history
V1.1
  • Loading branch information
rdohms committed Apr 25, 2012
2 parents b9ae9f0 + 58bfb63 commit 171bed9
Show file tree
Hide file tree
Showing 26 changed files with 911 additions and 108 deletions.
7 changes: 6 additions & 1 deletion composer.json
Expand Up @@ -15,7 +15,12 @@

"require": {
"php": ">=5.3.2",
"doctrine/common": ">=2.1"
"doctrine/common": "2.*"
},

"require-dev": {
"symfony/symfony": ">=2.1-dev",
"doctrine/orm": "dev-master"
},

"autoload": {
Expand Down
4 changes: 2 additions & 2 deletions phpunit.xml
Expand Up @@ -7,17 +7,17 @@
</testsuite>
<testsuite name="Filter">
<directory>tests/DMS/Filter</directory>
<directory>src/DMS/Bundles/FilterBundle/Tests</directory>
</testsuite>
</testsuites>

<filter>
<whitelist>
<directory suffix=".php">src/DMS/Filter</directory>
<directory suffix=".php">src/DMS</directory>
</whitelist>
<blacklist>
<directory>tests</directory>
<directory>vendor</directory>
<directory>src/DMS/Bundles</directory>
</blacklist>
</filter>

Expand Down
12 changes: 6 additions & 6 deletions src/DMS/Bundles/FilterBundle/DMSFilterBundle.php
Expand Up @@ -6,15 +6,15 @@

/**
* DMS Filter Bundle
*
* This Bundle makes DMS/Filter available to Symfony
* Applications in a very easy way.
*
* @author Rafael Dohms <code@doh.ms>
*
* This Bundle makes DMS/Filter available to Symfony 2 Applications in a very
* easy way.
*
* @author Rafael Dohms <code@doh.ms>
* @package DMS
* @subpackage Bundles
*/
class DMSFilterBundle extends Bundle
{

}
Expand Up @@ -20,6 +20,8 @@ public function getConfigTreeBuilder()
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('dms_filter');

$rootNode->children()->booleanNode('auto_filter_forms')->defaultValue(true);

// Here you should define the parameters that are allowed to
// configure your bundle. See the documentation linked above for
// more information on that topic.
Expand Down
Expand Up @@ -24,5 +24,7 @@ public function load(array $configs, ContainerBuilder $container)

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');

$container->setParameter('dms_filter.auto_filter_forms', $config['auto_filter_forms']);
}
}
@@ -0,0 +1,59 @@
<?php
namespace DMS\Bundles\FilterBundle\Form\EventListener;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Event\FilterDataEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use DMS\Bundles\FilterBundle\Service\Filter;

/**
* Delegating Filter Listener
*
* This subscriber listens to form events to automatically run filtering
* on the attached entity, like Validation is done.
*/
class DelegatingFilterListener implements EventSubscriberInterface
{
/**
* @var \DMS\Bundles\FilterBundle\Service\Filter
*/
protected $filterService;

/**
* @param \DMS\Bundles\FilterBundle\Service\Filter $filterService
*/
public function __construct(Filter $filterService)
{
$this->filterService = $filterService;
}

/**
* {@inheritdoc}
*/
static public function getSubscribedEvents()
{
return array(
FormEvents::POST_BIND => array("onPostBind", 1024),
FormEvents::BIND_NORM_DATA => array("onPostBind", 1024),
);
}

/**
* Listens to the Post Bind event and triggers filtering if adequate.
*
* @param FilterDataEvent $event
*/
public function onPostBind($event)
{
$form = $event->getForm();

if ( ! $form->isRoot()) return;

$clientData = $event->getForm()->getClientData();

if ( ! is_object($clientData)) return;

$this->filterService->filterEntity($clientData);

}
}
48 changes: 48 additions & 0 deletions src/DMS/Bundles/FilterBundle/Form/FilterExtension.php
@@ -0,0 +1,48 @@
<?php

namespace DMS\Bundles\FilterBundle\Form;

use Symfony\Component\Form\Extension\Validator\Type;
use Symfony\Component\Form\AbstractExtension;
use DMS\Bundles\FilterBundle\Service\Filter;
use DMS\Bundles\FilterBundle\Form\Type\FormTypeFilterExtension;

/**
* Filter Extension
*
* Enabled filtering in forms
*/
class FilterExtension extends AbstractExtension
{
/**
* @var Filter
*/
private $filter;

/**
* @var boolean
*/
protected $autoFilter;

/**
* {@inheritdoc}
*
* @param \DMS\Bundles\FilterBundle\Service\Filter $filterService
* @param boolean $autoFilter
*/
public function __construct(Filter $filterService, $autoFilter)
{
$this->filter = $filterService;
$this->autoFilter = $autoFilter;
}

/**
* {@inheritdoc}
*/
protected function loadTypeExtensions()
{
return array(
new FormTypeFilterExtension($this->filter, true),
);
}
}
55 changes: 55 additions & 0 deletions src/DMS/Bundles/FilterBundle/Form/Type/FormTypeFilterExtension.php
@@ -0,0 +1,55 @@
<?php
namespace DMS\Bundles\FilterBundle\Form\Type;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use DMS\Bundles\FilterBundle\Service\Filter;
use DMS\Bundles\FilterBundle\Form\EventListener\DelegatingFilterListener;

/**
* Form Type Filter Extension
*
* Extends the Form Type and adds auto filtering to it.
* It checks the dms_filter.auto_filter_forms parameter to see if it should or
* not enable auto filtering.
*/
class FormTypeFilterExtension extends AbstractTypeExtension
{
/**
* @var \DMS\Bundles\FilterBundle\Service\Filter
*/
protected $filterService;

/**
* @var boolean
*/
protected $autoFilter;

/**
* @param \DMS\Bundles\FilterBundle\Service\Filter $filterService
* @param boolean $autoFilter
*/
public function __construct(Filter $filterService, $autoFilter)
{
$this->filterService = $filterService;
$this->autoFilter = $autoFilter;
}

/**
* {@inheritdoc}
*/
public function buildForm(FormBuilder $builder, array $options)
{
if ( ! $this->autoFilter) return;

$builder->addEventSubscriber(new DelegatingFilterListener($this->filterService));
}

/**
* {@inheritdoc}
*/
public function getExtendedType()
{
return 'form';
}
}
10 changes: 9 additions & 1 deletion src/DMS/Bundles/FilterBundle/Resources/config/services.yml
@@ -1,3 +1,11 @@
services:
dms.filter:
class: DMS\Bundles\FilterBundle\Service\Filter
class: DMS\Bundles\FilterBundle\Service\Filter

dms.filter.type_extension:
class: DMS\Bundles\FilterBundle\Form\Type\FormTypeFilterExtension
arguments:
filter: @dms.filter
auto_filter: %dms_filter.auto_filter_forms%
tags:
- { name: form.type_extension, alias: form }
48 changes: 36 additions & 12 deletions src/DMS/Bundles/FilterBundle/Service/Filter.php
Expand Up @@ -4,28 +4,27 @@

/**
* Filter Service
*
*
* Provides filtering result based on annotation in the class.
*
*
* @package DMS
* @subpackage Bundles
*/
class Filter
{

/**
* @var DMS\Filter\Filter
* @var \DMS\Filter\Filter
*/
private $filterExecutor;

/**
* Instantiates the Filter Service
*/
public function __construct()
{
//Get Doctrine Reader
$reader = new \Doctrine\Common\Annotations\AnnotationReader();
//$reader->setEnableParsePhpImports(true);

//Load AnnotationLoader
$loader = new \DMS\Filter\Mapping\Loader\AnnotationLoader($reader);
Expand All @@ -37,21 +36,46 @@ public function __construct()
//Get a Filter
$this->filterExecutor = new \DMS\Filter\Filter($metadataFactory);
}

/**
* Filter an object based on its annotations
*
* @param object $object
*
* @param object $object
*/
public function filterEntity($object)
{
$this->filterExecutor->filterEntity($object);
}


/**
* Filters only a selected property of an entity
*
* @param object $object
* @param string $property
*/
public function filterProperty($object, $property)
{
$this->filterExecutor->filterProperty($object, $property);
}

/**
* Runs a given value through one or more filter rules returning the
* filtered value
*
* @param mixed $value
* @param \DMS\Filter\Rules\Rule[]|\DMS\Filter\Rules\Rule $filter
*
* @return mixed
*/
public function filterValue($value, $filter)
{
return $this->filterExecutor->filterValue($value, $filter);
}

/**
* Retrieve the actual filter executor instance
*
* @return DMS\Filter\Filter
*
* @return \DMS\Filter\Filter
*/
public function getFilterExecutor()
{
Expand Down
30 changes: 30 additions & 0 deletions src/DMS/Bundles/FilterBundle/Tests/Dummy/AnnotatedClass.php
@@ -0,0 +1,30 @@
<?php

namespace DMS\Bundles\FilterBundle\Tests\Dummy;

use DMS\Filter\Rules as Filter;

class AnnotatedClass
{
/**
* @Filter\StripTags()
*
* @var string
*/
public $name;

/**
* @Filter\StripTags()
*
* @var string
*/
public $nickname;

/**
* @Filter\StripTags("<b><i>")
*
* @var string
*/
public $description;

}

0 comments on commit 171bed9

Please sign in to comment.