content_workflow_bynder-1.0.0/src/Import/MenuCreator.php

src/Import/MenuCreator.php
<?php

namespace Drupal\content_workflow_bynder\Import;

use Drupal\menu_link_content\Entity\MenuLinkContent;
use Drupal\node\NodeInterface;

/**
 * Class for creating menus after import.
 */
class MenuCreator {

  /**
   * Create a menu link to the imported node.
   */
  public static function createMenu(NodeInterface $entity, $parentMenuItem) {
    $isContentTypeTranslatable = static::isContentTypeTranslatable($entity->bundle());
    $isMenuTranslatable = static::isMenuTranslatable();
    $menuLinkDefaults = menu_ui_get_menu_link_defaults($entity);
    if (!(bool) $menuLinkDefaults['id']) {
      if ($isContentTypeTranslatable && $isMenuTranslatable) {
        $languages = $entity->getTranslationLanguages();
        $originalLinkId = NULL;
        foreach ($languages as $langcode => $language) {
          $localized_entity = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : NULL;
          if (!is_null($localized_entity)) {
            static::createMenuLink($entity->id(), $localized_entity->getTitle(), $parentMenuItem, $langcode, $originalLinkId);
          }
        }
      }
      else {
        static::createMenuLink($entity->id(), $entity->getTitle(), $parentMenuItem);
      }
    }
  }

  /**
   * Create menu link if requested.
   *
   * @param int $nid
   *   ID of \Drupal\node\NodeInterface object.
   * @param string $title
   *   Title for menu link.
   * @param string $plid
   *   Parent menu link ID, null if we don't want to create menu link.
   * @param null|string $lang
   *   Langcode for menu link.
   * @param null|int $original_link_id
   *   ID of menu link item in default language.
   */
  protected static function createMenuLink($nid, $title, $plid, $lang = NULL, &$original_link_id = NULL) {
    $weight = 1;
    if (!empty($plid)) {
      if (is_null($lang)) {
        // Single language node.
        list($menu_name, $mlid) = explode(':', $plid, 2);
        // Get parent menu link ID.
        if ($menu_name === 'node') {
          static::getMenuByCwbId($mlid, $menu_name);
        }
        $link = [
          'link' => ['uri' => 'entity:node/' . $nid],
          'title' => $title,
          'menu_name' => $menu_name,
          'parent' => $mlid,
        ];
        MenuLinkContent::create($link)->set('weight', $weight)->save();
      }
      elseif (static::isMenuTranslatable()) {
        if (!is_null($lang) && is_null($original_link_id)) {
          // Multi language node - first language.
          list($menu_name, $mlid) = explode(':', $plid, 2);
          // Get parent menu link ID.
          if ($menu_name === 'node') {
            static::getMenuByCwbId($mlid, $menu_name, $lang);
          }
          $link = [
            'link' => ['uri' => 'entity:node/' . $nid],
            'title' => $title,
            'menu_name' => $menu_name,
            'parent' => $mlid,
            'langcode' => $lang,
          ];
          $menu_link = MenuLinkContent::create($link);
          $menu_link->set('weight', $weight);
          $menu_link->save();

          $original_link_id = $menu_link->id();
        }
        elseif (!is_null($lang) && !is_null($original_link_id)) {
          // Multi language node - other language.
          list($menu_name, $mlid) = explode(':', $plid, 2);
          if ($menu_name === 'node') {
            static::getMenuByCwbId($mlid, $menu_name, $lang);
          }
          $link = [
            'link' => ['uri' => 'entity:node/' . $nid],
            'title' => $title,
            'menu_name' => $menu_name,
            'parent' => $mlid,
            'langcode' => $lang,
          ];

          // Load parent item.
          $original_item = MenuLinkContent::load($original_link_id);
          $original_item->addTranslation($lang, $link);
          $original_item->save();
        }
      }
    }
  }

  /**
   * Load menu name and menu link id for other languages by node ID.
   *
   * @param int $mlid
   *   Menu link ID.
   * @param string $menu_name
   *   Name of the menu.
   * @param string|null $language
   *   Langcode if menu link item will be translatable.
   */
  protected static function getMenuByCwbId(&$mlid, &$menu_name, $language = NULL) {
    // Load node by cwb_id.
    $node_ids = \Drupal::entityQuery('node')
      ->accessCheck(FALSE)
      ->condition('cwb_id', $mlid)
      ->execute();
    if (!empty($node_ids)) {
      // Load menu_link by node_id.
      $node = reset($node_ids);
      $ml_result = \Drupal::entityQuery('menu_link_content')
        ->accessCheck(FALSE)
        ->condition('link.uri', 'entity:node/' . $node);
      if (!is_null($language)) {
        $ml_result->condition('langcode', $language);
      }
      $mls = $ml_result->execute();
      if (!empty($mls)) {
        $ml = reset($mls);
        $ml_object = MenuLinkContent::load($ml);
        $menu_name = $ml_object->getMenuName();
        $mlid = 'menu_link_content:' . $ml_object->uuid();
      }
    }
  }

  /**
   * Decide whether a menu is translatable.
   */
  public static function isMenuTranslatable() {
    return \Drupal::moduleHandler()
      ->moduleExists('content_translation')
      && \Drupal::service('content_translation.manager')
        ->isEnabled('menu_link_content');
  }

  /**
   * Decide whether a content type is translatable.
   */
  public static function isContentTypeTranslatable($contentType) {
    return \Drupal::moduleHandler()
      ->moduleExists('content_translation')
      && \Drupal::service('content_translation.manager')
        ->isEnabled('node', $contentType);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc