[BUGFIX] Adding back access to parentMenuArr and menuitem in subMenu 76/50376/3
authorStefan Bürk <stefan.buerk@impactmedia.de>
Fri, 29 Jul 2016 07:52:00 +0000 (09:52 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Tue, 25 Oct 2016 20:43:24 +0000 (22:43 +0200)
Adding the possibility to access the menuArr and direct menuItem from
the parent menu in subMenu instances to provide the ability to check
for parent item information or parent sibling item informations.

Providing two getters and a combined setter, called in the subMenu
method to readd this data access instead of simple using the old
unsafe and undeclared property set.

Leaving the parentMenuArr member public for now, even it is not
nice.

Resolves: #77296
Releases: master, 7.6
Change-Id: I3cfce3c67e840e6e97fa9c55ffaf997a509ee0e8
Reviewed-on: https://review.typo3.org/50376
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/frontend/Classes/ContentObject/Menu/AbstractMenuContentObject.php

index d0460bb..8935a0a 100644 (file)
@@ -230,6 +230,20 @@ abstract class AbstractMenuContentObject
     protected $useCacheHash = false;
 
     /**
+     * Holds the menuArr of the parent menu, if this menu is a subMenu.
+     *
+     * @var array
+     */
+    public $parentMenuArr = [];
+
+    /**
+     * Array key of the parentMenuItem in the parentMenuArr, if this menu is a subMenu.
+     *
+     * @var null|int
+     */
+    protected $parentMenuArrItemKey;
+
+    /**
      * The initialization of the object. This just sets some internal variables.
      *
      * @param TemplateService $tmpl The $this->getTypoScriptFrontendController()->tmpl object
@@ -1760,6 +1774,7 @@ abstract class AbstractMenuContentObject
                 }
                 // Especially scripts that build the submenu needs the parent data
                 $submenu->parent_cObj = $this->parent_cObj;
+                $submenu->setParentMenu($this->menuArr, $this->I['key']);
                 // Setting alternativeMenuTempArray (will be effective only if an array)
                 if (is_array($altArray)) {
                     $submenu->alternativeMenuTempArray = $altArray;
@@ -2228,4 +2243,85 @@ abstract class AbstractMenuContentObject
     {
         return GeneralUtility::makeInstance(CacheManager::class)->getCache('cache_hash');
     }
+
+    /**
+     * Set the parentMenuArr and key to provide the parentMenu informations to the
+     * subMenu, special fur IProcFunc and itemArrayProcFunc user functions.
+     *
+     * @internal
+     *
+     * @param array $menuArr
+     * @param int $menuItemKey
+     */
+    public function setParentMenu(array $menuArr = [], $menuItemKey)
+    {
+        // check if menuArr is a valid array and that menuItemKey matches an existing menuItem in menuArr
+        if (is_array($menuArr)
+            && (is_int($menuItemKey) && $menuItemKey >= 0 && isset($menuArr[$menuItemKey]))
+        ) {
+            $this->parentMenuArr = $menuArr;
+            $this->parentMenuArrItemKey = $menuItemKey;
+        }
+    }
+
+    /**
+     * Check if there is an valid parentMenuArr.
+     *
+     * @return bool
+     */
+    protected function hasParentMenuArr()
+    {
+        return
+            $this->menuNumber > 1
+            && is_array($this->parentMenuArr)
+            && !empty($this->parentMenuArr)
+        ;
+    }
+
+    /**
+     * Check if we have an parentMenutArrItemKey
+     */
+    protected function hasParentMenuItemKey()
+    {
+        return null !== $this->parentMenuArrItemKey;
+    }
+
+    /**
+     * Check if the the parentMenuItem exists
+     */
+    protected function hasParentMenuItem()
+    {
+        return
+            $this->hasParentMenuArr()
+            && $this->hasParentMenuItemKey()
+            && isset($this->getParentMenuArr()[$this->parentMenuArrItemKey])
+        ;
+    }
+
+    /**
+     * Get the parentMenuArr, if this is subMenu.
+     *
+     * @return array
+     */
+    public function getParentMenuArr()
+    {
+        return $this->hasParentMenuArr() ? $this->parentMenuArr : [];
+    }
+
+    /**
+     * Get the parentMenuItem from the parentMenuArr, if this is a subMenu
+     *
+     * @return null|array
+     */
+    public function getParentMenuItem()
+    {
+        // check if we have an parentMenuItem and if it is an array
+        if ($this->hasParentMenuItem()
+            && is_array($this->getParentMenuArr()[$this->parentMenuArrItemKey])
+        ) {
+            return $this->getParentMenuArr()[$this->parentMenuArrItemKey];
+        }
+
+        return null;
+    }
 }