Forums › Forums › OroPlatform › OroPlatform – How do I? Questions › How do i make a datagridfilter for contexts
This topic contains 4 replies, has 2 voices, and was last updated by SkaiBoa 5 years, 9 months ago.
Starting from March 1, 2020 the forum has been switched to the read-only mode. Please head to StackOverflow for support.
- CreatorTopic
- April 26, 2018 at 8:12 am #36574
Hi,
I want to make a filter for contexts in the call datagrid, but i dont know how to start.
Can give me someone a hint ?
Thanx in advance.
- CreatorTopic
- AuthorReplies
- April 26, 2018 at 8:42 am #36575
Hi SkaiBoa,
You can start from this guide https://oroinc.com/orocrm/doc/2.0/cookbook/entities/datagrids
April 27, 2018 at 12:55 pm #36576Thank you for you reply. But I guess its not so easy.
I want to extends the call-grid:
https://github.com/oroinc/OroCRMCallBundle/blob/master/Resources/config/oro/datagrids.ymlAnd the context column is added by this extension:
https://github.com/oroinc/platform/blob/master/src/Oro/Bundle/ActivityBundle/Grid/Extension/ContextsExtension.phpAnd for this column i need a filter.
I guess I need the right event. I found the OrmResultAfter. Is this the right one ?
April 29, 2018 at 10:14 pm #36577Most of the time to add grid filter for existent field you should subscribe to
\Oro\Bundle\DataGridBundle\Event\BuildBefore
or\Oro\Bundle\DataGridBundle\Event\BuildAfter
event, as it’s easier to update grid configuration and optionally map query.Modification on next steps should be more complex and not always possible, like filtering should be done before processing results, so I’m not sure you can work with OrmResultAfter.
Here is example of adding simple filter to datagrid
https://github.com/oroinc/orocommerce/blob/1.6.1/src/Oro/Bundle/TaxBundle/EventListener/TaxCodeGridListener.php#L138And here more complex listener that adds filtering as well
https://github.com/oroinc/crm/blob/2.6.1/src/Oro/Bundle/ReportCRMBundle/EventListener/Datagrid/OpportunitiesByStatusReportListener.php#L92June 8, 2018 at 1:02 pm #36578If anyone need a filter for contexts. This is how I solved the problem:
PHP123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116<?phpnamespace NLXCRM\BasicsBundle\EventListener\Datagrid;use Oro\Bundle\ActivityBundle\Grid\Extension\ContextsExtension;use Oro\Bundle\ActivityBundle\Manager\ActivityManager;use Oro\Bundle\ActivityListBundle\Entity\ActivityList;use Oro\Bundle\ConfigBundle\Config\ConfigManager;use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration;use Oro\Bundle\DataGridBundle\Datasource\Orm\OrmDatasource;use Oro\Bundle\DataGridBundle\Event\BuildAfter;use Oro\Bundle\DataGridBundle\Event\BuildBefore;use Oro\Bundle\FilterBundle\Filter\FilterUtility;class ContextGridListener{/** @var ConfigManager */protected $configManager;/** @var ActivityManager */protected $activityManager;/*** @param ConfigManager $configManager* @param ActivityManager $activityManager*/public function __construct(ConfigManager $configManager,ActivityManager $activityManager){$this->configManager = $configManager;$this->activityManager = $activityManager;}public function onBuildBefore(BuildBefore $event){$config = $event->getConfig();$this->addFilter($config);}public function onBuildAfter(BuildAfter $event){$dataGrid = $event->getDatagrid();$datagridConfig = $dataGrid->getConfig();$dataSource = $dataGrid->getDatasource();if (!$dataSource instanceof OrmDatasource) {return;}$queryBuilder = $dataSource->getQueryBuilder();$filters = $dataGrid->getParameters()->get('_filter');if (!$filters) {return;}$filtersConfig = $dataGrid->getConfig()->offsetGetByPath('[filters][columns]');$contexts = [];// Filter nach der Benutzung des Contextfilter durchsuchenforeach ($filtersConfig as $key => $config) {$fieldName = $config[FilterUtility::DATA_NAME_KEY];$filterType = $config['type'];if ($fieldName == 'contexts' && $filterType == 'string' && isset($filters['contexts'])) {$searchText = $filters['contexts']['value'];$entityClassName = $datagridConfig->offsetGetByPath(ContextsExtension::CONTEXTS_ENTITY_PATH);// Alle Contexts für die ensprechende Entity holen$items = $this->activityManager->getActivityTargetsQueryBuilder($entityClassName, [])->addOrderBy('entity', 'ASC')->addOrderBy('title', 'ASC')->getQuery()->getArrayResult();// Überprüfen ob der Filtertext in einer der Contexts zu finden istforeach ($items as $item) {if ( stripos($item['title'],$searchText) !== false) {$contexts[$item['entity']][] = $item['id'];}}// Filter aus der Query entfernenunset($filters[$key]);$dataGrid->getParameters()->set('_filter', $filters);// Wenn der Contextfilter benutzt wurde, es aber keinen Treffer gab, dafür sorgen, das auch nichts// angezeigt wirdif (!count($contexts)) {$queryBuilder->where('1 = 0');return;}}}// Activites an die Query hängen$queryBuilder->join(ActivityList::class,'act','WITH',sprintf('act.relatedActivityId = %s.id', $queryBuilder->getAllAliases()[0]));foreach ($contexts as $key => $value) {$uniqueIds = array_unique($value);$ids = implode(',', $uniqueIds);// Contexts herausfiltern lassen$this->activityManager->addFilterByTargetEntity($queryBuilder, $key, $ids);}}protected function addFilter(DatagridConfiguration $config){$config->offsetSetByPath('[filters][columns][contexts]',['type' => 'string','data_name' => 'contexts',]);}} - AuthorReplies
The forum ‘OroPlatform – How do I? Questions’ is closed to new topics and replies.