/** * @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; }
/** * @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); }