class GroupContentMenuController in Group Content Menu 8
Returns responses for 'group_content_menu' GroupContent routes.
Hierarchy
- class \Drupal\Core\Controller\ControllerBase implements ContainerInjectionInterface uses LoggerChannelTrait, MessengerTrait, LinkGeneratorTrait, RedirectDestinationTrait, UrlGeneratorTrait, StringTranslationTrait
- class \Drupal\group\Entity\Controller\GroupContentController
- class \Drupal\group_content_menu\Controller\GroupContentMenuController
- class \Drupal\group\Entity\Controller\GroupContentController
Expanded class hierarchy of GroupContentMenuController
1 file declares its use of GroupContentMenuController
File
- src/
Controller/ GroupContentMenuController.php, line 17
Namespace
Drupal\group_content_menu\ControllerView source
class GroupContentMenuController extends GroupContentController {
/**
* The group content plugin manager.
*
* @var \Drupal\group\Plugin\GroupContentEnablerManagerInterface
*/
protected $pluginManager;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
$instance = parent::create($container);
$instance->privateTempStoreFactory = $container
->get('tempstore.private');
$instance->pluginManager = $container
->get('plugin.manager.group_content_enabler');
return $instance;
}
/**
* {@inheritdoc}
*/
public function addPage(GroupInterface $group, $create_mode = TRUE) {
$bundle_names = $this
->addPageBundles($group, $create_mode);
// Filter out the bundles the user doesn't have access to. Duplicated from
// parent class so as to avoid information disclosure.
foreach ($bundle_names as $plugin_id => $bundle_name) {
if ($create_mode) {
$plugin = $group
->getGroupType()
->getContentPlugin($plugin_id);
$access = $plugin
->createEntityAccess($group, $this
->currentUser());
}
else {
$access_control_handler = $this->entityTypeManager
->getAccessControlHandler('group_content');
$access = $access_control_handler
->createAccess($bundle_name, NULL, [
'group' => $group,
], TRUE);
}
if (!$access
->isAllowed()) {
unset($bundle_names[$plugin_id]);
}
}
// Disallow creating multiple menus of the same type.
if (count($bundle_names) === 1) {
reset($bundle_names);
$plugin_id = key($bundle_names);
if ($limitation = $this
->handleOneMenuLimitation($group, $plugin_id)) {
return $limitation;
}
}
$build = parent::addPage($group, $create_mode);
// Do not interfere with redirects.
if (!is_array($build)) {
return $build;
}
// Overwrite the label and description for all of the displayed bundles.
$storage_handler = $this->entityTypeManager
->getStorage('group_content_menu_type');
foreach ($this
->addPageBundles($group, $create_mode) as $plugin_id => $bundle_name) {
if (!empty($build['#bundles'][$bundle_name])) {
$plugin = $group
->getGroupType()
->getContentPlugin($plugin_id);
$label = $plugin
->getLabel();
$bundle_label = $storage_handler
->load($plugin
->getEntityBundle())
->label();
$description = $this
->t('Add new menu of type %bundle_label to the group.', [
'%bundle_label' => $bundle_label,
]);
$build['#bundles'][$bundle_name]['label'] = $bundle_label;
$build['#bundles'][$bundle_name]['description'] = $description;
$build['#bundles'][$bundle_name]['add_link'] = Link::createFromRoute($label, 'entity.group_content_menu.add_form', [
'group' => $group
->id(),
'plugin_id' => $plugin_id,
]);
}
}
return $build;
}
/**
* Handle one menu per group limitation.
*
* @param \Drupal\group\Entity\GroupInterface $group
* The group.
* @param string $plugin_id
* The group content plugin ID.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse|bool
* The redirect response or FALSE if no need to handle..
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
protected function handleOneMenuLimitation(GroupInterface $group, $plugin_id) {
if ($group_contents = $this->entityTypeManager
->getStorage('group_content')
->loadByGroup($group, $plugin_id)) {
$group_content = reset($group_contents);
if ($menu_type = $this->entityTypeManager
->getStorage('group_content_menu_type')
->load($group_content
->getEntity()
->bundle())) {
$this
->messenger()
->addError($this
->t('This group already has a menu "%menu" of type "%type". Only one menu per type per group is allowed.', [
'%menu' => $group_content
->getEntity()
->label(),
'%type' => $menu_type
->label(),
]));
$route_params = [
'group' => $group_content
->getGroup()
->id(),
];
$url = Url::fromRoute('entity.group_content_menu.collection', $route_params, [
'absolute' => TRUE,
]);
return new RedirectResponse($url
->toString());
}
}
}
/**
* {@inheritdoc}
*/
public function createForm(GroupInterface $group, $plugin_id) {
if ($limitation = $this
->handleOneMenuLimitation($group, $plugin_id)) {
return $limitation;
}
return parent::createForm($group, $plugin_id);
}
/**
* {@inheritdoc}
*/
protected function addPageBundles(GroupInterface $group, $create_mode) {
$bundles = [];
// Retrieve all group_content_menu plugins for the group's type.
$plugin_ids = $this->pluginManager
->getInstalledIds($group
->getGroupType());
foreach ($plugin_ids as $key => $plugin_id) {
if (strpos($plugin_id, 'group_content_menu:') !== 0) {
unset($plugin_ids[$key]);
}
}
// Retrieve all of the responsible group content types, keyed by plugin ID.
$storage = $this->entityTypeManager
->getStorage('group_content_type');
$properties = [
'group_type' => $group
->bundle(),
'content_plugin' => $plugin_ids,
];
foreach ($storage
->loadByProperties($properties) as $bundle => $group_content_type) {
/** @var \Drupal\group\Entity\GroupContentTypeInterface $group_content_type */
$bundles[$group_content_type
->getContentPluginId()] = $bundle;
}
return $bundles;
}
/**
* Provides the menu link creation form.
*
* @param \Drupal\group_content_menu\GroupContentMenuInterface $group_content_menu
* An entity representing a custom menu.
*
* @return array
* Returns the menu link creation form.
*/
public function addLink(GroupContentMenuInterface $group_content_menu) {
$menu_name = GroupContentMenuInterface::MENU_PREFIX . $group_content_menu
->id();
$menu_link = $this
->entityTypeManager()
->getStorage('menu_link_content')
->create([
'menu_name' => $menu_name,
'bundle' => 'menu_link_content',
]);
return $this
->entityFormBuilder()
->getForm($menu_link);
}
/**
* Provides the menu link edit form.
*
* @param \Drupal\menu_link_content\MenuLinkContentInterface $menu_link_content
* The menu link content.
*
* @return array
* Returns the menu link edit form.
*/
public function editLink(MenuLinkContentInterface $menu_link_content) {
return $this
->entityFormBuilder()
->getForm($menu_link_content);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ControllerBase:: |
protected | property | The configuration factory. | |
ControllerBase:: |
protected | property | The current user service. | 1 |
ControllerBase:: |
protected | property | The entity manager. | |
ControllerBase:: |
protected | property | The form builder. | 2 |
ControllerBase:: |
protected | property | The key-value storage. | 1 |
ControllerBase:: |
protected | property | The language manager. | 1 |
ControllerBase:: |
protected | property | The module handler. | 2 |
ControllerBase:: |
protected | property | The state service. | |
ControllerBase:: |
protected | function | Returns the requested cache bin. | |
ControllerBase:: |
protected | function | Retrieves a configuration object. | |
ControllerBase:: |
private | function | Returns the service container. | |
ControllerBase:: |
protected | function | Returns the current user. | 1 |
ControllerBase:: |
protected | function | Retrieves the entity form builder. | |
ControllerBase:: |
protected | function | Retrieves the entity manager service. | |
ControllerBase:: |
protected | function | Retrieves the entity type manager. | |
ControllerBase:: |
protected | function | Returns the form builder service. | 2 |
ControllerBase:: |
protected | function | Returns a key/value storage collection. | 1 |
ControllerBase:: |
protected | function | Returns the language manager service. | 1 |
ControllerBase:: |
protected | function | Returns the module handler. | 2 |
ControllerBase:: |
protected | function |
Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait:: |
|
ControllerBase:: |
protected | function | Returns the state storage service. | |
GroupContentController:: |
protected | property |
The entity form builder. Overrides ControllerBase:: |
|
GroupContentController:: |
protected | property |
The entity type manager. Overrides ControllerBase:: |
|
GroupContentController:: |
protected | property | The private store factory. | |
GroupContentController:: |
protected | property | The renderer. | |
GroupContentController:: |
public | function | Provides the group content submission form. | |
GroupContentController:: |
public | function | The _title_callback for the entity.group_content.add_form route. | |
GroupContentController:: |
protected | function | Returns the 'add_bundle_message' string for the add page. | |
GroupContentController:: |
protected | function | Returns the route name of the form the add page should link to. | |
GroupContentController:: |
public | function | The _title_callback for the entity.group_content.collection route. | |
GroupContentController:: |
public | function | The _title_callback for the entity.group_content.create_form route. | |
GroupContentController:: |
public | function | The _title_callback for the entity.group_content.edit_form route. | |
GroupContentController:: |
public | function | Constructs a new GroupContentController. | 1 |
GroupContentMenuController:: |
protected | property | The group content plugin manager. | |
GroupContentMenuController:: |
public | function | Provides the menu link creation form. | |
GroupContentMenuController:: |
public | function |
Provides the group content creation overview page. Overrides GroupContentController:: |
|
GroupContentMenuController:: |
protected | function |
Retrieves a list of available bundles for the add page. Overrides GroupContentController:: |
|
GroupContentMenuController:: |
public static | function |
Instantiates a new instance of this class. Overrides GroupContentController:: |
|
GroupContentMenuController:: |
public | function |
Provides the group content creation form. Overrides GroupContentController:: |
|
GroupContentMenuController:: |
public | function | Provides the menu link edit form. | |
GroupContentMenuController:: |
protected | function | Handle one menu per group limitation. | |
LinkGeneratorTrait:: |
protected | property | The link generator. | 1 |
LinkGeneratorTrait:: |
protected | function | Returns the link generator. | |
LinkGeneratorTrait:: |
protected | function | Renders a link to a route given a route name and its parameters. | |
LinkGeneratorTrait:: |
public | function | Sets the link generator service. | |
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
RedirectDestinationTrait:: |
protected | property | The redirect destination service. | 1 |
RedirectDestinationTrait:: |
protected | function | Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url. | |
RedirectDestinationTrait:: |
protected | function | Returns the redirect destination service. | |
RedirectDestinationTrait:: |
public | function | Sets the redirect destination service. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
UrlGeneratorTrait:: |
protected | property | The url generator. | |
UrlGeneratorTrait:: |
protected | function | Returns the URL generator service. | |
UrlGeneratorTrait:: |
public | function | Sets the URL generator service. | |
UrlGeneratorTrait:: |
protected | function | Generates a URL or path for a specific route based on the given parameters. |