diff --git a/core/modules/menu_link/menu_link.info.yml b/core/modules/menu_link/menu_link.info.yml new file mode 100644 index 0000000..2c90e90 --- /dev/null +++ b/core/modules/menu_link/menu_link.info.yml @@ -0,0 +1,8 @@ +name: Menu link +type: module +description: 'Defines a menu link field type' +package: Field types +version: VERSION +core: 8.x +dependencies: + - field diff --git a/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php b/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php new file mode 100644 index 0000000..b77b530 --- /dev/null +++ b/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php @@ -0,0 +1,142 @@ +menuPluginManager = \Drupal::service('plugin.manager.menu.link'); + } + + /** + * {@inheritdoc} + */ + public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { + $definitions = array(); + + $definitions['menu_name'] = DataDefinition::create('string') + ->setLabel(t('Menu')); + $definitions['parent'] = DataDefinition::create('string') + ->setLabel(t('Parent menu link')); + $definitions['title'] = DataDefinition::create('string') + ->setLabel(t('Menu link title')); + $definitions['description'] = DataDefinition::create('string') + ->setLabel(t('Menu link description')); + $definitions['weight'] = DataDefinition::create('integer') + ->setLabel(t('Menu link weight')); + + return $definitions; + } + + /** + * {@inheritdoc} + */ + public static function schema(FieldStorageDefinitionInterface $field_definition) { + $schema = array(); + + $schema['columns']['title'] = array( + 'description' => 'The link text.', + 'type' => 'varchar', + 'length' => 255, + 'not null' => FALSE, + ); + + $schema['columns']['menu_name'] = array( + 'description' => 'The menu of the link', + 'type' => 'varchar', + 'length' => 255, + 'not null' => FALSE, + ); + $schema['columns']['parent'] = array( + 'description' => 'The parent of the menu link', + 'type' => 'varchar', + 'length' => 255, + 'not null' => FALSE, + ); + + $schema['columns']['weight'] = array( + 'description' => 'The weight of the menu link', + 'type' => 'int', + ); + + $schema['columns']['description'] = array( + 'description' => 'The link description.', + 'type' => 'blob', + 'size' => 'big', + 'not null' => FALSE, + ); + + return $schema; + } + + /** + * {@inheritdoc} + */ + public function preSave() { + parent::preSave(); + + $plugin_id = $this->getPluginId(); + if (!$this->menuPluginManager->hasDefinition($plugin_id)) { + $this->menuPluginManager->addDefinition($plugin_id, $this->getPluginDefinition()); + } + else { + $this->menuPluginManager->updateDefinition($plugin_id, $this->getPluginDefinition()); + } + } + + protected function getMenuPluginId() { + return 'menu_link_field:' . $this->definition->getDataDefinition()->id() . '_' . $this->getEntity()->uuid(); + } + + protected function getMenuPluginDefinition() { + $menu_definition = array(); + $menu_definition['id'] = $this->getPluginId(); + $menu_definition['title'] = $this->values['title']; + $menu_definition['menu_name'] = $this->values['menu_name']; + $menu_definition['parent'] = $this->values['parent']; + $menu_definition['weight'] = $this->values['weight']; + $menu_definition['class'] = '\Drupal\menu_link\Plugin\Menu\MenuLinkField'; + $menu_definition['metadata']['entity_id'] = $this->getEntity()->id(); + $menu_definition['metadata']['entity_type_id'] = $this->getEntity()->getEntityTypeId(); + + $url = $this->getEntity()->urlInfo(); + $menu_definition['route_name'] = $url->getRouteName(); + $menu_definition['route_parameters'] = $url->getRouteParameters(); + + return $menu_definition; + } + +} diff --git a/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php b/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php new file mode 100644 index 0000000..368add9 --- /dev/null +++ b/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php @@ -0,0 +1,110 @@ +menuParentSelector = $menu_parent_selector; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $plugin_id, + $plugin_definition, + $configuration['field_definition'], + $configuration['settings'], + $configuration['third_party_settings'], + $container->get('menu.parent_form_selector') + ); + } + + /** + * {@inheritdoc} + */ + public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { + $element['title'] = array( + '#type' => 'textfield', + '#title' => t('Menu link title'), + '#default_value' => isset($items[$delta]->title) ? $items[$delta]->title : NULL, + ); + + $element['description'] = array( + '#type' => 'textarea', + '#title' => t('Description'), + '#default_value' => isset($items[$delta]->description) ? $items[$delta]->description: NULL, + '#rows' => 1, + '#description' => t('Shown when hovering over the menu link.'), + ); + + $menu = isset($items[$delta]->menu) ? $items[$delta]->menu : $this->getFieldSetting('default_menu'); + $parent = isset($items[$delta]->parent) ? $items[$delta]->parent : ""; + $parent_element = $this->menuParentSelector->parentSelectElement("$menu:$parent"); + + $element['menu_parent'] = $parent_element; + $element['menu_parent']['#title'] = t('Parent item'); + $element['menu_parent']['#attributes']['class'][] = 'menu-parent-select'; + + $element['weight'] = array( + '#type' => 'number', + '#title' => t('Weight'), + '#default_value' => isset($items[$delta]->weight) ? $items[$delta]->weight: 0, + '#description' => t('Menu links with lower weights are displayed before links with higher weights.'), + ); + + return $element; + } + + /** + * {@inheritdoc} + */ + public function extractFormValues(FieldItemListInterface $items, array $form, FormStateInterface $form_state) { + parent::extractFormValues($items, $form, $form_state); + + // Extract menu/parent from single select element. + foreach ($items as $delta => $item) { + list($item->menu_name, $item->parent) = explode(':', $item->menu_parent, 2); + unset($item->menu_parent); + } + } + +} diff --git a/core/modules/menu_link/src/Plugin/Field/MenuLinkField.php b/core/modules/menu_link/src/Plugin/Field/MenuLinkField.php new file mode 100644 index 0000000..7adb252 --- /dev/null +++ b/core/modules/menu_link/src/Plugin/Field/MenuLinkField.php @@ -0,0 +1,44 @@ +pluginDefinition['title']; + } + + /** + * {@inheritdoc} + */ + public function getDescription() { + return $this->pluginDefinition['description']; + } + + /** + * {@inheritdoc} + */ + public function updateLink(array $new_definition_values, $persist) { + } + + protected function getEntity() { + $entity_type_id = $this->pluginDefinition['metadata']['entity_type_id']; + $entity_id = $this->pluginDefinition['metadata']['entity_id']; + $entity = \Drupal::entityManager()->getStorage($entity_type_id)->load($entity_id); + return $entity; + } + +}