/**
  * @param BuildAfter $event
  */
 public function onBuildAfter(BuildAfter $event)
 {
     /** @var OrmDatasource $dataSource */
     $datagrid = $event->getDatagrid();
     $config = $datagrid->getConfig();
     $configParameters = $config->toArray();
     if (!array_key_exists('extended_entity_name', $configParameters) || !$configParameters['extended_entity_name']) {
         return;
     }
     $targetClass = $configParameters['extended_entity_name'];
     $parameters = $datagrid->getParameters();
     $dataSource = $datagrid->getDatasource();
     $queryBuilder = $dataSource->getQueryBuilder();
     $alias = current($queryBuilder->getDQLPart('from'))->getAlias();
     if ($dataSource instanceof OrmDatasource && $parameters->has('activityId') && $parameters->has('activityClass')) {
         $id = $parameters->get('activityId');
         $class = $parameters->get('activityClass');
         $entityClass = $this->entityClassNameHelper->resolveEntityClass($class, true);
         $entity = $this->doctrineHelper->getEntity($entityClass, $id);
         if ($entity && $entity instanceof ActivityInterface) {
             $targetsArray = $entity->getActivityTargets($targetClass);
             $targetIds = [];
             foreach ($targetsArray as $target) {
                 $targetIds[] = $target->getId();
             }
             if ($targetIds) {
                 $queryBuilder->andWhere($queryBuilder->expr()->notIn(sprintf('%s.id', $alias), $targetIds));
             }
         }
     }
 }
 /**
  * @param Route                   $route
  * @param RouteCollectionAccessor $routes
  * @param string[]                $entities
  *
  * @return string[] Entity requirements for the default controller
  */
 protected function adjustRoutes(Route $route, RouteCollectionAccessor $routes, $entities)
 {
     $result = [];
     $routeName = $routes->getName($route);
     foreach ($entities as $className) {
         $entity = $this->entityAliasResolver->getPluralAlias($className);
         $result[] = $entity;
         $result[] = $this->entityClassNameHelper->getUrlSafeClassName($className);
         $existingRoute = $routes->getByPath(str_replace(self::ENTITY_PLACEHOLDER, $entity, $route->getPath()), $route->getMethods());
         if ($existingRoute) {
             // move existing route before the current route
             $existingRouteName = $routes->getName($existingRoute);
             $routes->remove($existingRouteName);
             $routes->insert($existingRouteName, $existingRoute, $routeName, true);
             //additional route for entities which has api, but it not recognize urls like
             // /api/rest/latest/Oro_Bundle_AddressBundle_Entity_Country
             //TODO: This should be removed in scope of https://magecore.atlassian.net/browse/BAP-8650
             $dictionaryRoute = $routes->cloneRoute($existingRoute);
             $dictionaryRoute->setPath(str_replace(self::ENTITY_PLACEHOLDER, $this->entityClassNameHelper->getUrlSafeClassName($className), $route->getPath()));
             $routes->insert($routes->generateRouteName($existingRouteName), $dictionaryRoute, $existingRouteName, true);
         } else {
             // add an additional strict route based on the base route and current entity
             $strictRoute = $routes->cloneRoute($route);
             $strictRoute->setPath(str_replace(self::ENTITY_PLACEHOLDER, $entity, $strictRoute->getPath()));
             $strictRoute->setDefault(self::ENTITY_ATTRIBUTE, $entity);
             $routes->insert($routes->generateRouteName($routeName), $strictRoute, $routeName, true);
         }
     }
     return $result;
 }
 /**
  * Validate configs nad fill default values
  *
  * @param DatagridConfiguration $config
  */
 public function processConfigs(DatagridConfiguration $config)
 {
     $configItems = $config->offsetGetOr(Configuration::BASE_CONFIG_KEY, []);
     $configuration = new Configuration(Configuration::BASE_CONFIG_KEY);
     $normalizedConfigItems = $this->validateConfiguration($configuration, [Configuration::BASE_CONFIG_KEY => $configItems]);
     $isGranted = $this->securityFacade->isGranted('EDIT', 'entity:' . $configItems['entity_name']);
     //according to ACL disable inline editing for the whole grid
     if (!$isGranted) {
         $normalizedConfigItems[Configuration::CONFIG_KEY_ENABLE] = false;
     }
     // replace config values by normalized, extra keys passed directly
     $resultConfigItems = array_replace_recursive($configItems, $normalizedConfigItems);
     if (is_null($resultConfigItems['save_api_accessor']['default_route_parameters']['className'])) {
         $resultConfigItems['save_api_accessor']['default_route_parameters']['className'] = $this->entityClassNameHelper->getUrlSafeClassName($configItems['entity_name']);
     }
     $config->offsetSet(Configuration::BASE_CONFIG_KEY, $resultConfigItems);
     //add inline editing where it is possible, do not use ACL, because additional parameters for columns needed
     $columns = $config->offsetGetOr(FormatterConfiguration::COLUMNS_KEY, []);
     $blackList = $configuration->getBlackList();
     foreach ($columns as $columnName => &$column) {
         if (!in_array($columnName, $blackList)) {
             $newColumn = $this->guesser->getColumnOptions($columnName, $configItems['entity_name'], $column);
             //frontend type key must not be replaced with default value
             $typeKey = PropertyInterface::FRONTEND_TYPE_KEY;
             if (!empty($newColumn[$typeKey])) {
                 $column[$typeKey] = $newColumn[$typeKey];
             }
             $column = array_replace_recursive($newColumn, $column);
         }
     }
     $config->offsetSet(FormatterConfiguration::COLUMNS_KEY, $columns);
 }
 /**
  * @param $className
  *
  * @return null|string
  */
 public function getGridName($className)
 {
     $className = $this->entityClassNameHelper->resolveEntityClass($className);
     if (!$this->configManager->hasConfig($className)) {
         return null;
     }
     return $this->configManager->getProvider('security')->getConfig($className)->get('share_grid');
 }
 /**
  * @param string $entityName
  *
  * @return bool
  */
 protected function isValidEntityClass($entityName)
 {
     try {
         $entityName = $this->entityClassNameHelper->resolveEntityClass($entityName);
     } catch (EntityAliasNotFoundException $e) {
         return false;
     }
     return $this->doctrineHelper->isManageableEntity($entityName);
 }
 /**
  * {@inheritdoc}
  */
 public function filter($rawValue, $operator)
 {
     if (is_array($rawValue)) {
         return array_map(function ($val) {
             return $this->helper->resolveEntityClass($val);
         }, $rawValue);
     } else {
         return $this->helper->resolveEntityClass($rawValue);
     }
 }
 /**
  * @return array [[entity plural alias, url safe class name], ...]
  */
 protected function getSupportedEntities()
 {
     if (null === $this->supportedEntities) {
         $entities = $this->dictionaryProvider->getSupportedEntityClasses();
         $this->supportedEntities = [];
         foreach ($entities as $className) {
             $this->supportedEntities[] = [$this->entityAliasResolver->getPluralAlias($className), $this->entityClassNameHelper->getUrlSafeClassName($className)];
         }
     }
     return $this->supportedEntities;
 }
 /**
  * @param array $configValues
  * @param string $entityName
  * @dataProvider setParametersDataProvider
  */
 public function testProcessConfigs(array $configValues, $entityName)
 {
     $config = DatagridConfiguration::create($configValues);
     $callback = $this->getProcessConfigsCallBack();
     $this->guesser->expects($this->any())->method('getColumnOptions')->will($this->returnCallback($callback));
     $this->entityClassNameHelper->expects($this->any())->method('getUrlSafeClassName')->willReturn('Oro_Bundle_EntityBundle_Tests_Unit_Fixtures_Stub_SomeEntity');
     $this->extension->processConfigs($config);
     $expectedValues = $this->getProcessConfigsExpectedValues($entityName);
     $expectedResult = DatagridConfiguration::create($expectedValues);
     $key = Configuration::BASE_CONFIG_KEY;
     $this->assertEquals($config->offsetGet($key), $expectedResult->offsetGet($key));
     $key = FormatterConfiguration::COLUMNS_KEY;
     $this->assertEquals($config->offsetGet($key), $expectedResult->offsetGet($key));
 }
 public function testProcessConfigs()
 {
     $entityName = 'Oro\\Bundle\\EntityBundle\\Tests\\Unit\\Fixtures\\Stub\\SomeEntity';
     $configValues = [Configuration::BASE_CONFIG_KEY => ['enable' => true, 'entity_name' => $entityName], FormatterConfiguration::COLUMNS_KEY => ['testText' => ['label' => 'test_text'], 'testSelect' => ['label' => 'test_select', PropertyInterface::FRONTEND_TYPE_KEY => 'string'], 'testAnotherText' => ['label' => 'test_config_overwrite', 'inline_editing' => ['enable' => false]], 'id' => ['label' => 'test_black_list'], 'updatedAt' => ['label' => 'test_black_list'], 'createdAt' => ['label' => 'test_black_list']]];
     $config = DatagridConfiguration::create($configValues);
     $callback = $this->getProcessConfigsCallBack();
     $this->guesser->expects($this->any())->method('getColumnOptions')->will($this->returnCallback($callback));
     $this->entityClassNameHelper->expects($this->any())->method('getUrlSafeClassName')->willReturn('Oro_Bundle_EntityBundle_Tests_Unit_Fixtures_Stub_SomeEntity');
     $this->extension->processConfigs($config);
     $expectedValues = $this->getProcessConfigsExpectedValues($entityName);
     $expectedResult = DatagridConfiguration::create($expectedValues);
     $key = Configuration::BASE_CONFIG_KEY;
     $this->assertEquals($config->offsetGet($key), $expectedResult->offsetGet($key));
     $key = FormatterConfiguration::COLUMNS_KEY;
     $this->assertEquals($config->offsetGet($key), $expectedResult->offsetGet($key));
 }
 /**
  * Get search aliases for all entities which can be associated with specified activity.
  *
  * @return string[]
  */
 protected function getSearchAliases()
 {
     $class = $this->entityClassNameHelper->resolveEntityClass($this->class, true);
     $aliases = [];
     foreach ($this->activityManager->getActivityTargets($class) as $targetEntityClass => $fieldName) {
         $alias = $this->indexer->getEntityAlias($targetEntityClass);
         if (null !== $alias) {
             $aliases[] = $alias;
         }
     }
     return $aliases;
 }
Exemple #11
0
 /**
  * @param string $className The entity class name
  * @param int    $id        The entity id
  *
  * @return string|null
  */
 public function getViewLink($className, $id)
 {
     $route = $this->getClassRoute($className, 'view');
     if ($route) {
         return $this->router->generate($route, ['id' => $id]);
     }
     // Generate view link for the custom entity
     if (ExtendHelper::isCustomEntity($className)) {
         return $this->router->generate('oro_entity_view', ['id' => $id, 'entityName' => $this->entityClassNameHelper->getUrlSafeClassName($className)]);
     }
     return null;
 }
 /**
  * @param Route                   $route
  * @param RouteCollectionAccessor $routes
  * @param string[]                $entities
  *
  * @return string[] The list of entities handled by the default controller
  */
 protected function adjustRoutes(Route $route, RouteCollectionAccessor $routes, $entities)
 {
     $result = [];
     $routeName = $routes->getName($route);
     foreach ($entities as $className) {
         $entity = $this->entityAliasResolver->getPluralAlias($className);
         $existingRoute = $routes->getByPath(str_replace(self::ENTITY_PLACEHOLDER, $entity, $route->getPath()), $route->getMethods());
         if ($existingRoute) {
             // move existing route before the current route
             $existingRouteName = $routes->getName($existingRoute);
             $routes->remove($existingRouteName);
             $routes->insert($existingRouteName, $existingRoute, $routeName, true);
         } else {
             // add an additional strict route based on the base route and current entity
             $strictRoute = $routes->cloneRoute($route);
             $strictRoute->setPath(str_replace(self::ENTITY_PLACEHOLDER, $entity, $strictRoute->getPath()));
             $strictRoute->setDefault(self::ENTITY_ATTRIBUTE, $entity);
             $routes->insert($routes->generateRouteName($routeName), $strictRoute, $routeName, true);
             $result[] = $entity;
             $result[] = $this->entityClassNameHelper->getUrlSafeClassName($className);
         }
     }
     return $result;
 }
 /**
  * Get search aliases for all entities which can be associated with specified activity.
  *
  * @return string[]
  */
 protected function getSearchAliases()
 {
     $class = $this->entityClassNameHelper->resolveEntityClass($this->class, true);
     $aliases = [];
     $targetEntityClasses = array_keys($this->activityManager->getActivityTargets($class));
     foreach ($targetEntityClasses as $targetEntityClass) {
         $alias = $this->indexer->getEntityAlias($targetEntityClass);
         if (null !== $alias) {
             $aliases[] = $alias;
         }
     }
     /** dispatch oro_activity.search_aliases event */
     $event = new SearchAliasesEvent($aliases, $targetEntityClasses);
     $this->dispatcher->dispatch(SearchAliasesEvent::EVENT_NAME, $event);
     $aliases = $event->getAliases();
     return $aliases;
 }
 /**
  * @dataProvider getUrlSafeClassNameProvider
  */
 public function testGetUrlSafeClassName($className, $expected)
 {
     $this->assertEquals($expected, $this->entityClassNameHelper->getUrlSafeClassName($className));
 }
 /**
  * @param string   $entityClassName
  * @param mixed    $id
  *
  * @return array
  */
 protected function getCustomEntityViewRouteOptions($entityClassName, $id = null)
 {
     return ['route' => self::ENTITY_VIEW_ROUTE, 'route_params' => ['entityName' => $this->entityClassNameHelper->getUrlSafeClassName($entityClassName), 'id' => $id]];
 }
 /**
  * Resolves the entity class name
  *
  * @param string $entityName    The class name, url-safe class name, alias or plural alias of the entity
  * @param bool   $isPluralAlias Determines whether the entity name may be a singular of plural alias
  *
  * @return string The FQCN of an entity
  */
 public function resolveEntityClass($entityName, $isPluralAlias = false)
 {
     return $this->entityClassNameHelper->resolveEntityClass($entityName, $isPluralAlias);
 }