From abf9620b9444deff7658d93c7c115a9b76c4799d Mon Sep 17 00:00:00 2001
From: ebremner <ebremner@uwaterloo.ca>
Date: Tue, 2 Mar 2021 10:50:53 -0500
Subject: [PATCH] ISTWCMS-4653: checking children of menu items to ensure that
 they are published

---
 src/Service/UWService.php          | 42 ++++++++++++++++++++----------
 src/Service/UWServiceInterface.php |  8 ++++++
 2 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/src/Service/UWService.php b/src/Service/UWService.php
index cb0d6fcf..c6be1b05 100644
--- a/src/Service/UWService.php
+++ b/src/Service/UWService.php
@@ -293,20 +293,43 @@ class UWService implements UWServiceInterface {
    */
   public function uwGetMenu(string $menu_name = 'main', bool $count_menu_items = FALSE, bool $include_parent_in_count = FALSE): array {
 
-    // The base path, need this for removing when on subfoldered sites,
-    // for example d8/fdsu5/, we need to remove the fdsu5 from the path
-    // alias.
-    global $base_path;
-
     // Get the main menu from the simplify menu module.
     $menu = $this->simplifyMenu->getMenuTree($menu_name);
 
     // Set it to the menu_tree which is done by simplify menu.
     $menu = $menu['menu_tree'];
 
+    // Ensure that we only get the published menu items.
+    $this->uwCheckPublishedMenuItems($menu);
+
+    // If we want to have the count of menu items, then count them.
+    if ($count_menu_items) {
+
+      // Add the count of the menu items.
+      $menu = $this->uwSetMenuItems($menu, $include_parent_in_count);
+    }
+
+    return $menu;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public function uwCheckPublishedMenuItems(&$menu): void {
+
+    // The base path, need this for removing when on subfoldered sites,
+    // for example d8/fdsu5/, we need to remove the fdsu5 from the path
+    // alias.
+    global $base_path;
+
     // Step through each menu and ensure that it is published.
     foreach ($menu as $key => $m) {
 
+      // If there is a submenu (i.e. children), process it first.
+      if (isset($m['submenu'])) {
+        $this->uwCheckPublishedMenuItems($menu[$key]['submenu']);
+      }
+
       // Remove the base path from the url so that we can get
       // the actual content from the path alias.
       $alias = str_replace($base_path, '', $m['url']);
@@ -326,15 +349,6 @@ class UWService implements UWServiceInterface {
         }
       }
     }
-
-    // If we want to have the count of menu items, then count them.
-    if ($count_menu_items) {
-
-      // Add the count of the menu items.
-      $menu = $this->uwSetMenuItems($menu, $include_parent_in_count);
-    }
-
-    return $menu;
   }
 
   /**
diff --git a/src/Service/UWServiceInterface.php b/src/Service/UWServiceInterface.php
index 93714b1b..c837c74d 100644
--- a/src/Service/UWServiceInterface.php
+++ b/src/Service/UWServiceInterface.php
@@ -98,6 +98,14 @@ interface UWServiceInterface {
    */
   public function uwGetMenu(string $menu_name = 'main', bool $count_menu_items = FALSE, bool $include_parent_in_count = FALSE): array;
 
+  /**
+   * Function to check that all menu links are published.
+   *
+   * @param $menu
+   *   The array of menus.
+   */
+  public function uwCheckPublishedMenuItems(&$menu): void;
+
   /**
    * A function to setup the menu for UW display.
    *
-- 
GitLab