Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 18 |
CRAP | |
0.00% |
0 / 210 |
| MenuLinkContent | |
0.00% |
0 / 1 |
|
0.00% |
0 / 18 |
702 | |
0.00% |
0 / 210 |
| setInsidePlugin | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getTitle | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getUrlObject | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getMenuName | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getDescription | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getPluginId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| isEnabled | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| isExpanded | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getParentId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getWeight | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getPluginDefinition | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 29 |
|||
| preCreate | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| preSave | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
| postSave | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 12 |
|||
| preDelete | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
| baseFieldDefinitions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 128 |
|||
| requiresRediscovery | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| setRequiresRediscovery | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\menu_link_content\Entity\MenuLinkContent. | |
| */ | |
| namespace Drupal\menu_link_content\Entity; | |
| use Drupal\Core\Entity\ContentEntityBase; | |
| use Drupal\Core\Entity\EntityChangedTrait; | |
| use Drupal\Core\Entity\EntityStorageInterface; | |
| use Drupal\Core\Entity\EntityTypeInterface; | |
| use Drupal\Core\Field\BaseFieldDefinition; | |
| use Drupal\link\LinkItemInterface; | |
| use Drupal\menu_link_content\MenuLinkContentInterface; | |
| /** | |
| * Defines the menu link content entity class. | |
| * | |
| * @property \Drupal\link\LinkItemInterface link | |
| * @property \Drupal\Core\Field\FieldItemList rediscover | |
| * | |
| * @ContentEntityType( | |
| * id = "menu_link_content", | |
| * label = @Translation("Custom menu link"), | |
| * handlers = { | |
| * "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage", | |
| * "storage_schema" = "Drupal\menu_link_content\MenuLinkContentStorageSchema", | |
| * "access" = "Drupal\menu_link_content\MenuLinkContentAccessControlHandler", | |
| * "form" = { | |
| * "default" = "Drupal\menu_link_content\Form\MenuLinkContentForm", | |
| * "delete" = "Drupal\menu_link_content\Form\MenuLinkContentDeleteForm" | |
| * } | |
| * }, | |
| * admin_permission = "administer menu", | |
| * base_table = "menu_link_content", | |
| * data_table = "menu_link_content_data", | |
| * translatable = TRUE, | |
| * entity_keys = { | |
| * "id" = "id", | |
| * "label" = "title", | |
| * "langcode" = "langcode", | |
| * "uuid" = "uuid", | |
| * "bundle" = "bundle" | |
| * }, | |
| * links = { | |
| * "canonical" = "/admin/structure/menu/item/{menu_link_content}/edit", | |
| * "edit-form" = "/admin/structure/menu/item/{menu_link_content}/edit", | |
| * "delete-form" = "/admin/structure/menu/item/{menu_link_content}/delete", | |
| * } | |
| * ) | |
| */ | |
| class MenuLinkContent extends ContentEntityBase implements MenuLinkContentInterface { | |
| use EntityChangedTrait; | |
| /** | |
| * A flag for whether this entity is wrapped in a plugin instance. | |
| * | |
| * @var bool | |
| */ | |
| protected $insidePlugin = FALSE; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function setInsidePlugin() { | |
| $this->insidePlugin = TRUE; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getTitle() { | |
| return $this->get('title')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getUrlObject() { | |
| return $this->link->first()->getUrl(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getMenuName() { | |
| return $this->get('menu_name')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getDescription() { | |
| return $this->get('description')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getPluginId() { | |
| return 'menu_link_content:' . $this->uuid(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function isEnabled() { | |
| return (bool) $this->get('enabled')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function isExpanded() { | |
| return (bool) $this->get('expanded')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getParentId() { | |
| return $this->get('parent')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getWeight() { | |
| return (int) $this->get('weight')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getPluginDefinition() { | |
| $definition = array(); | |
| $definition['class'] = 'Drupal\menu_link_content\Plugin\Menu\MenuLinkContent'; | |
| $definition['menu_name'] = $this->getMenuName(); | |
| if ($url_object = $this->getUrlObject()) { | |
| $definition['url'] = NULL; | |
| $definition['route_name'] = NULL; | |
| $definition['route_parameters'] = []; | |
| if (!$url_object->isRouted()) { | |
| $definition['url'] = $url_object->getUri(); | |
| } | |
| else { | |
| $definition['route_name'] = $url_object->getRouteName(); | |
| $definition['route_parameters'] = $url_object->getRouteParameters(); | |
| } | |
| $definition['options'] = $url_object->getOptions(); | |
| } | |
| $definition['title'] = $this->getTitle(); | |
| $definition['description'] = $this->getDescription(); | |
| $definition['weight'] = $this->getWeight(); | |
| $definition['id'] = $this->getPluginId(); | |
| $definition['metadata'] = array('entity_id' => $this->id()); | |
| $definition['form_class'] = '\Drupal\menu_link_content\Form\MenuLinkContentForm'; | |
| $definition['enabled'] = $this->isEnabled() ? 1 : 0; | |
| $definition['expanded'] = $this->isExpanded() ? 1 : 0; | |
| $definition['provider'] = 'menu_link_content'; | |
| $definition['discovered'] = 0; | |
| $definition['parent'] = $this->getParentId(); | |
| return $definition; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function preCreate(EntityStorageInterface $storage, array &$values) { | |
| $values += ['bundle' => 'menu_link_content']; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function preSave(EntityStorageInterface $storage) { | |
| parent::preSave($storage); | |
| if (parse_url($this->link->uri, PHP_URL_SCHEME) === 'internal') { | |
| $this->setRequiresRediscovery(TRUE); | |
| } | |
| else { | |
| $this->setRequiresRediscovery(FALSE); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function postSave(EntityStorageInterface $storage, $update = TRUE) { | |
| parent::postSave($storage, $update); | |
| /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */ | |
| $menu_link_manager = \Drupal::service('plugin.manager.menu.link'); | |
| // The menu link can just be updated if there is already an menu link entry | |
| // on both entity and menu link plugin level. | |
| $definition = $this->getPluginDefinition(); | |
| // Even when $update is FALSE, for top level links it is possible the link | |
| // already is in the storage because of the getPluginDefinition() call | |
| // above, see https://www.drupal.org/node/2605684#comment-10515450 for the | |
| // call chain. Because of this the $update flag is ignored and only the | |
| // existence of the definition (equals to being in the tree storage) is | |
| // checked. | |
| if ($menu_link_manager->getDefinition($this->getPluginId(), FALSE)) { | |
| // When the entity is saved via a plugin instance, we should not call | |
| // the menu tree manager to update the definition a second time. | |
| if (!$this->insidePlugin) { | |
| $menu_link_manager->updateDefinition($this->getPluginId(), $definition, FALSE); | |
| } | |
| } | |
| else { | |
| $menu_link_manager->addDefinition($this->getPluginId(), $definition); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function preDelete(EntityStorageInterface $storage, array $entities) { | |
| parent::preDelete($storage, $entities); | |
| /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */ | |
| $menu_link_manager = \Drupal::service('plugin.manager.menu.link'); | |
| foreach ($entities as $menu_link) { | |
| /** @var \Drupal\menu_link_content\Entity\MenuLinkContent $menu_link */ | |
| $menu_link_manager->removeDefinition($menu_link->getPluginId(), FALSE); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { | |
| $fields['id'] = BaseFieldDefinition::create('integer') | |
| ->setLabel(t('Entity ID')) | |
| ->setDescription(t('The entity ID for this menu link content entity.')) | |
| ->setReadOnly(TRUE) | |
| ->setSetting('unsigned', TRUE); | |
| $fields['uuid'] = BaseFieldDefinition::create('uuid') | |
| ->setLabel(t('UUID')) | |
| ->setDescription(t('The content menu link UUID.')) | |
| ->setReadOnly(TRUE); | |
| $fields['bundle'] = BaseFieldDefinition::create('string') | |
| ->setLabel(t('Bundle')) | |
| ->setDescription(t('The content menu link bundle.')) | |
| ->setSetting('max_length', EntityTypeInterface::BUNDLE_MAX_LENGTH) | |
| ->setSetting('is_ascii', TRUE) | |
| ->setReadOnly(TRUE); | |
| $fields['title'] = BaseFieldDefinition::create('string') | |
| ->setLabel(t('Menu link title')) | |
| ->setDescription(t('The text to be used for this link in the menu.')) | |
| ->setRequired(TRUE) | |
| ->setTranslatable(TRUE) | |
| ->setSetting('max_length', 255) | |
| ->setDisplayOptions('view', array( | |
| 'label' => 'hidden', | |
| 'type' => 'string', | |
| 'weight' => -5, | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'type' => 'string_textfield', | |
| 'weight' => -5, | |
| )) | |
| ->setDisplayConfigurable('form', TRUE); | |
| $fields['description'] = BaseFieldDefinition::create('string') | |
| ->setLabel(t('Description')) | |
| ->setDescription(t('Shown when hovering over the menu link.')) | |
| ->setTranslatable(TRUE) | |
| ->setSetting('max_length', 255) | |
| ->setDisplayOptions('view', array( | |
| 'label' => 'hidden', | |
| 'type' => 'string', | |
| 'weight' => 0, | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'type' => 'string_textfield', | |
| 'weight' => 0, | |
| )); | |
| $fields['menu_name'] = BaseFieldDefinition::create('string') | |
| ->setLabel(t('Menu name')) | |
| ->setDescription(t('The menu name. All links with the same menu name (such as "tools") are part of the same menu.')) | |
| ->setDefaultValue('tools') | |
| ->setSetting('is_ascii', TRUE); | |
| $fields['link'] = BaseFieldDefinition::create('link') | |
| ->setLabel(t('Link')) | |
| ->setDescription(t('The location this menu link points to.')) | |
| ->setRequired(TRUE) | |
| ->setSettings(array( | |
| 'link_type' => LinkItemInterface::LINK_GENERIC, | |
| 'title' => DRUPAL_DISABLED, | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'type' => 'link_default', | |
| 'weight' => -2, | |
| )); | |
| $fields['external'] = BaseFieldDefinition::create('boolean') | |
| ->setLabel(t('External')) | |
| ->setDescription(t('A flag to indicate if the link points to a full URL starting with a protocol, like http:// (1 = external, 0 = internal).')) | |
| ->setDefaultValue(FALSE); | |
| $fields['rediscover'] = BaseFieldDefinition::create('boolean') | |
| ->setLabel(t('Indicates whether the menu link should be rediscovered')) | |
| ->setDefaultValue(FALSE); | |
| $fields['weight'] = BaseFieldDefinition::create('integer') | |
| ->setLabel(t('Weight')) | |
| ->setDescription(t('Link weight among links in the same menu at the same depth. In the menu, the links with high weight will sink and links with a low weight will be positioned nearer the top.')) | |
| ->setDefaultValue(0) | |
| ->setDisplayOptions('view', array( | |
| 'label' => 'hidden', | |
| 'type' => 'integer', | |
| 'weight' => 0, | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'type' => 'number', | |
| 'weight' => 20, | |
| )); | |
| $fields['expanded'] = BaseFieldDefinition::create('boolean') | |
| ->setLabel(t('Show as expanded')) | |
| ->setDescription(t('If selected and this menu link has children, the menu will always appear expanded.')) | |
| ->setDefaultValue(FALSE) | |
| ->setDisplayOptions('view', array( | |
| 'label' => 'hidden', | |
| 'type' => 'boolean', | |
| 'weight' => 0, | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'settings' => array('display_label' => TRUE), | |
| 'weight' => 0, | |
| )); | |
| $fields['enabled'] = BaseFieldDefinition::create('boolean') | |
| ->setLabel(t('Enabled')) | |
| ->setDescription(t('A flag for whether the link should be enabled in menus or hidden.')) | |
| ->setDefaultValue(TRUE) | |
| ->setDisplayOptions('view', array( | |
| 'label' => 'hidden', | |
| 'type' => 'boolean', | |
| 'weight' => 0, | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'settings' => array('display_label' => TRUE), | |
| 'weight' => -1, | |
| )); | |
| $fields['langcode'] = BaseFieldDefinition::create('language') | |
| ->setLabel(t('Language')) | |
| ->setDescription(t('The menu link language code.')) | |
| ->setTranslatable(TRUE) | |
| ->setDisplayOptions('view', array( | |
| 'type' => 'hidden', | |
| )) | |
| ->setDisplayOptions('form', array( | |
| 'type' => 'language_select', | |
| 'weight' => 2, | |
| )); | |
| $fields['parent'] = BaseFieldDefinition::create('string') | |
| ->setLabel(t('Parent plugin ID')) | |
| ->setDescription(t('The ID of the parent menu link plugin, or empty string when at the top level of the hierarchy.')); | |
| $fields['changed'] = BaseFieldDefinition::create('changed') | |
| ->setLabel(t('Changed')) | |
| ->setDescription(t('The time that the menu link was last edited.')) | |
| ->setTranslatable(TRUE); | |
| return $fields; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function requiresRediscovery() { | |
| return $this->get('rediscover')->value; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function setRequiresRediscovery($rediscovery) { | |
| $this->set('rediscover', $rediscovery); | |
| return $this; | |
| } | |
| } |