[BUGFIX] Adding back access to parentMenuArr and menuitem in subMenu 60/49260/11
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:32:00 +0000 (22:32 +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/49260
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/core/Documentation/Changelog/master/Deprecation-77296-DeprecatePublicMemberParentMenuArrInAbstractMenuContentObject.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/ContentObject/Menu/AbstractMenuContentObject.php

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-77296-DeprecatePublicMemberParentMenuArrInAbstractMenuContentObject.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-77296-DeprecatePublicMemberParentMenuArrInAbstractMenuContentObject.rst
new file mode 100644 (file)
index 0000000..951a931
--- /dev/null
@@ -0,0 +1,35 @@
+.. include:: ../../Includes.txt
+
+========================================================================================
+Deprecation: #77296 - Deprecate public member parentMenuArr in AbstractMenuContentObject
+========================================================================================
+
+See :issue:`77296`
+
+Description
+===========
+
+The public member parentMenuArr has been added as public member and marked as deprecated.
+
+
+Impact
+======
+
+The parentMenuArr will be publicly accessible until it is changed to protected in TYPO3 CMS 9.
+
+
+Affected Installations
+======================
+
+Instances that have menues with sublevels and using this member in the itemArrayProcFunc.
+
+
+Migration
+=========
+
+Use the provided api function :php:`getParentMenuArr()` to get the parentMenuArr instead. 
+This method always returns an array.
+
+If you need the direct parent menuitem of the current sublevel use :php:`getParentMenuItem()` method.
+
+.. index:: Frontend
\ No newline at end of file
index 6a929de..a5b552d 100644 (file)
@@ -229,6 +229,22 @@ abstract class AbstractMenuContentObject
      */
     protected $useCacheHash = false;
 
+    /**
+     * Holds the menuArr of the parent menu, if this menu is a subMenu.
+     *
+     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, please use getter and setter methods.
+     *
+     * @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.
      *
@@ -1759,6 +1775,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;
@@ -2219,4 +2236,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;
+    }
 }