* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Sonata\AdminBundle\Admin; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; /** * @author Thomas Rabaix */ class Pool { /** * @var ContainerInterface */ protected $container; /** * @var string[] */ protected $adminServiceIds = array(); /** * @var array */ protected $adminGroups = array(); /** * @var array */ protected $adminClasses = array(); /** * @var string[] */ protected $templates = array(); /** * @var array */ protected $assets = array(); /** * @var string */ protected $title; /** * @var string */ protected $titleLogo; /** * @var array */ protected $options; /** * @var PropertyAccessorInterface */ protected $propertyAccessor; /** * @param ContainerInterface $container * @param string $title * @param string $logoTitle * @param array $options */ public function __construct(ContainerInterface $container, $title, $logoTitle, $options = array(), PropertyAccessorInterface $propertyAccessor = null) { $this->container = $container; $this->title = $title; $this->titleLogo = $logoTitle; $this->options = $options; $this->propertyAccessor = $propertyAccessor; } /** * @return array */ public function getGroups() { $groups = $this->adminGroups; foreach ($this->adminGroups as $name => $adminGroup) { foreach ($adminGroup as $id => $options) { $groups[$name][$id] = $this->getInstance($id); } } return $groups; } /** * Returns whether an admin group exists or not. * * @param string $group * * @return bool */ public function hasGroup($group) { return isset($this->adminGroups[$group]); } /** * @return array */ public function getDashboardGroups() { $groups = $this->adminGroups; foreach ($this->adminGroups as $name => $adminGroup) { if (isset($adminGroup['items'])) { foreach ($adminGroup['items'] as $key => $item) { // Only Admin Group should be returned if ('' != $item['admin']) { $admin = $this->getInstance($item['admin']); if ($admin->showIn(AbstractAdmin::CONTEXT_DASHBOARD)) { $groups[$name]['items'][$key] = $admin; } else { unset($groups[$name]['items'][$key]); } } else { unset($groups[$name]['items'][$key]); } } } if (empty($groups[$name]['items'])) { unset($groups[$name]); } } return $groups; } /** * Returns all admins related to the given $group. * * @param string $group * * @return array * * @throws \InvalidArgumentException */ public function getAdminsByGroup($group) { if (!isset($this->adminGroups[$group])) { throw new \InvalidArgumentException(sprintf('Group "%s" not found in admin pool.', $group)); } $admins = array(); if (!isset($this->adminGroups[$group]['items'])) { return $admins; } foreach ($this->adminGroups[$group]['items'] as $item) { $admins[] = $this->getInstance($item['admin']); } return $admins; } /** * Return the admin related to the given $class. * * @param string $class * * @return \Sonata\AdminBundle\Admin\AdminInterface|null */ public function getAdminByClass($class) { if (!$this->hasAdminByClass($class)) { return; } if (!is_array($this->adminClasses[$class])) { throw new \RuntimeException('Invalid format for the Pool::adminClass property'); } if (count($this->adminClasses[$class]) > 1) { throw new \RuntimeException(sprintf( 'Unable to find a valid admin for the class: %s, there are too many registered: %s', $class, implode(', ', $this->adminClasses[$class]) )); } return $this->getInstance($this->adminClasses[$class][0]); } /** * @param string $class * * @return bool */ public function hasAdminByClass($class) { return isset($this->adminClasses[$class]); } /** * Returns an admin class by its Admin code * ie : sonata.news.admin.post|sonata.news.admin.comment => return the child class of post. * * @param string $adminCode * * @return \Sonata\AdminBundle\Admin\AdminInterface|false|null */ public function getAdminByAdminCode($adminCode) { $codes = explode('|', $adminCode); $admin = false; foreach ($codes as $code) { if ($admin == false) { $admin = $this->getInstance($code); } elseif ($admin->hasChild($code)) { $admin = $admin->getChild($code); } } return $admin; } /** * Returns a new admin instance depends on the given code. * * @param string $id * * @return AdminInterface * * @throws \InvalidArgumentException */ public function getInstance($id) { if (!in_array($id, $this->adminServiceIds)) { throw new \InvalidArgumentException(sprintf('Admin service "%s" not found in admin pool.', $id)); } return $this->container->get($id); } /** * @return ContainerInterface|null */ public function getContainer() { return $this->container; } /** * @param array $adminGroups */ public function setAdminGroups(array $adminGroups) { $this->adminGroups = $adminGroups; } /** * @return array */ public function getAdminGroups() { return $this->adminGroups; } /** * @param array $adminServiceIds */ public function setAdminServiceIds(array $adminServiceIds) { $this->adminServiceIds = $adminServiceIds; } /** * @return array */ public function getAdminServiceIds() { return $this->adminServiceIds; } /** * @param array $adminClasses */ public function setAdminClasses(array $adminClasses) { $this->adminClasses = $adminClasses; } /** * @return array */ public function getAdminClasses() { return $this->adminClasses; } /** * @param array $templates */ public function setTemplates(array $templates) { $this->templates = $templates; } /** * @return array */ public function getTemplates() { return $this->templates; } /** * @param string $name * * @return null|string */ public function getTemplate($name) { if (isset($this->templates[$name])) { return $this->templates[$name]; } } /** * @return string */ public function getTitleLogo() { return $this->titleLogo; } /** * @return string */ public function getTitle() { return $this->title; } /** * @param string $name * @param mixed $default * * @return mixed */ public function getOption($name, $default = null) { if (isset($this->options[$name])) { return $this->options[$name]; } return $default; } public function getPropertyAccessor() { if (null === $this->propertyAccessor) { $this->propertyAccessor = PropertyAccess::createPropertyAccessor(); } return $this->propertyAccessor; } }