/** * @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); }
/** * @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 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; }
/** * @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]]; }
/** * Converts the class name to a form that can be safely used in URL * * @param string $className The class name * * @return string The URL-safe representation of a class name */ public function getUrlSafeClassName($className) { return $this->entityClassNameHelper->getUrlSafeClassName($className); }