View source
<?php
namespace Drupal\group_content_menu\Controller;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\group\Entity\Controller\GroupContentController;
use Drupal\group\Entity\GroupInterface;
use Drupal\group_content_menu\GroupContentMenuInterface;
use Drupal\menu_link_content\MenuLinkContentInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
class GroupContentMenuController extends GroupContentController {
protected $pluginManager;
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;
}
public function addPage(GroupInterface $group, $create_mode = TRUE) {
$bundle_names = $this
->addPageBundles($group, $create_mode);
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]);
}
}
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);
if (!is_array($build)) {
return $build;
}
$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;
}
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());
}
}
}
public function createForm(GroupInterface $group, $plugin_id) {
if ($limitation = $this
->handleOneMenuLimitation($group, $plugin_id)) {
return $limitation;
}
return parent::createForm($group, $plugin_id);
}
protected function addPageBundles(GroupInterface $group, $create_mode) {
$bundles = [];
$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]);
}
}
$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) {
$bundles[$group_content_type
->getContentPluginId()] = $bundle;
}
return $bundles;
}
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);
}
public function editLink(MenuLinkContentInterface $menu_link_content) {
return $this
->entityFormBuilder()
->getForm($menu_link_content);
}
}