From 724e9076cb5af62990b7171bca21a4f6239408ff Mon Sep 17 00:00:00 2001
From: Alex Davyskiba <zviryatko@html-and-cms.com>
Date: Mon, 7 Sep 2015 22:23:57 +0300
Subject: [PATCH] Add menu_views support.

---
 includes/features.menu.inc | 57 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)

diff --git a/includes/features.menu.inc b/includes/features.menu.inc
index be310e4..b748f7b 100644
--- a/includes/features.menu.inc
+++ b/includes/features.menu.inc
@@ -142,6 +142,10 @@ function menu_links_features_export_options() {
     list($menu_name, $mlid) = explode(':', $key, 2);
     if ($mlid != 0) {
       $link = menu_link_load($mlid);
+      $menu_views_name = _menu_links_features_get_menu_views_title($link);
+      if ($menu_views_name) {
+        $name = "Views -- {$menu_views_name}";
+      }
       $identifier = menu_links_features_identifier($link, TRUE);
       $options[$identifier] = "{$menu_name}: {$name}";
     }
@@ -157,6 +161,10 @@ function menu_links_features_identifier($link, $old = FALSE) {
   // Add some uniqueness to these identifiers, allowing multiple links with the same path, but different titles.
   $clean_title = features_clean_title(isset($link['title']) ? $link['title'] : $link['link_title']);
 
+  if (($identifier = _menu_links_features_get_menu_views_identifier($link)) !== FALSE) {
+    return $identifier;
+  }
+
   // The old identifier is requested.
   if ($old) {
     // if identifier already exists
@@ -359,6 +367,11 @@ function features_menu_link_load($identifier) {
     $link_path = substr($identifier, strpos($identifier, ":") + 1);
     list($menu_name) = explode('_', $identifier, 2);
     $clean_title = substr($identifier, strpos($identifier, "_")  + 1, strpos($identifier, ":") - strpos($identifier, "_") - 1);
+    // Check if identifier from menu_views.
+    if (strpos($link_path, 'views') === 0) {
+      //list($empty, $view_name, $view_display, $view_arguments) = explode('-', $link_path);
+      $link_path = '<view>';
+    }
   }
   // This gets variables for traditional identifier format.
   else {
@@ -378,7 +391,8 @@ function features_menu_link_load($identifier) {
 
     // Title or previous identifier matches.
     if ((isset($link->options['identifier']) && strcmp($link->options['identifier'], $identifier) == 0)
-        || (isset($clean_title) && strcmp(features_clean_title($link->link_title), $clean_title) == 0)) {
+        || (isset($clean_title) && strcmp(features_clean_title($link->link_title), $clean_title) == 0)
+        || $identifier === _menu_links_features_get_menu_views_identifier($link)) {
 
       return (array)$link;
     }
@@ -426,3 +440,44 @@ function features_clean_title($str) {
           'return $matches[1]?"-":"";'
       ), $str));
 }
+
+function _menu_links_features_get_menu_views_identifier($link) {
+  $link = (array) $link;
+  if (isset($link['options']['menu_views']['view']) && $link['options']['menu_views']['view']['name']) {
+    $menu_view = $link['options']['menu_views']['view'];
+    $title = _menu_links_features_get_menu_views_title($link);
+    if ($title) {
+      $title = features_clean_title($title);
+      $id_array = array(
+        'views',
+        $menu_view['name'],
+        $menu_view['display'],
+        $menu_view['arguments'],
+      );
+      $id_array = array_filter($id_array);
+      $id = implode('-', $id_array);
+
+      return "{$link['menu_name']}_{$title}:$id";
+    }
+  }
+  return FALSE;
+}
+
+function _menu_links_features_get_menu_views_title($link) {
+  $link = (array) $link;
+  if (isset($link['options']['menu_views']['view']['name']) && $link['options']['menu_views']['view']['name']) {
+    $menu_view = $link['options']['menu_views']['view'];
+    $title = $menu_view['settings']['breadcrumb_title'];
+    if (empty($title)) {
+      $view = views_get_view($menu_view['name']);
+      if ($view && $view->access($menu_view['display']) && $view->set_display($menu_view['display'])) {
+        $title = $view->get_title();
+        $view->destroy();
+      }
+    }
+
+    return $title;
+  }
+
+  return FALSE;
+}
-- 
1.9.1

