/libraries/src/Categories/CategoryNode.php
https://github.com/joomla/joomla-cms · PHP · 496 lines · 150 code · 66 blank · 280 comment · 16 complexity · c6620e63172fab4333082a6935c5514e MD5 · raw file
- <?php
- /**
- * Joomla! Content Management System
- *
- * @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
- * @license GNU General Public License version 2 or later; see LICENSE.txt
- */
- namespace Joomla\CMS\Categories;
- use Joomla\CMS\Factory;
- use Joomla\CMS\Object\CMSObject;
- use Joomla\CMS\Tree\NodeInterface;
- use Joomla\CMS\Tree\NodeTrait;
- use Joomla\Registry\Registry;
- /**
- * Helper class to load Categorytree
- *
- * @since 1.6
- */
- class CategoryNode extends CMSObject implements NodeInterface
- {
- use NodeTrait;
- /**
- * Primary key
- *
- * @var integer
- * @since 1.6
- */
- public $id = null;
- /**
- * The id of the category in the asset table
- *
- * @var integer
- * @since 1.6
- */
- public $asset_id = null;
- /**
- * The id of the parent of category in the asset table, 0 for category root
- *
- * @var integer
- * @since 1.6
- */
- public $parent_id = null;
- /**
- * The lft value for this category in the category tree
- *
- * @var integer
- * @since 1.6
- */
- public $lft = null;
- /**
- * The rgt value for this category in the category tree
- *
- * @var integer
- * @since 1.6
- */
- public $rgt = null;
- /**
- * The depth of this category's position in the category tree
- *
- * @var integer
- * @since 1.6
- */
- public $level = null;
- /**
- * The extension this category is associated with
- *
- * @var integer
- * @since 1.6
- */
- public $extension = null;
- /**
- * The menu title for the category (a short name)
- *
- * @var string
- * @since 1.6
- */
- public $title = null;
- /**
- * The the alias for the category
- *
- * @var string
- * @since 1.6
- */
- public $alias = null;
- /**
- * Description of the category.
- *
- * @var string
- * @since 1.6
- */
- public $description = null;
- /**
- * The publication status of the category
- *
- * @var boolean
- * @since 1.6
- */
- public $published = null;
- /**
- * Whether the category is or is not checked out
- *
- * @var boolean
- * @since 1.6
- */
- public $checked_out = null;
- /**
- * The time at which the category was checked out
- *
- * @var string
- * @since 1.6
- */
- public $checked_out_time = null;
- /**
- * Access level for the category
- *
- * @var integer
- * @since 1.6
- */
- public $access = null;
- /**
- * JSON string of parameters
- *
- * @var string
- * @since 1.6
- */
- public $params = null;
- /**
- * Metadata description
- *
- * @var string
- * @since 1.6
- */
- public $metadesc = null;
- /**
- * Key words for metadata
- *
- * @var string
- * @since 1.6
- */
- public $metakey = null;
- /**
- * JSON string of other metadata
- *
- * @var string
- * @since 1.6
- */
- public $metadata = null;
- /**
- * The ID of the user who created the category
- *
- * @var integer
- * @since 1.6
- */
- public $created_user_id = null;
- /**
- * The time at which the category was created
- *
- * @var string
- * @since 1.6
- */
- public $created_time = null;
- /**
- * The ID of the user who last modified the category
- *
- * @var integer
- * @since 1.6
- */
- public $modified_user_id = null;
- /**
- * The time at which the category was modified
- *
- * @var string
- * @since 1.6
- */
- public $modified_time = null;
- /**
- * Number of times the category has been viewed
- *
- * @var integer
- * @since 1.6
- */
- public $hits = null;
- /**
- * The language for the category in xx-XX format
- *
- * @var string
- * @since 1.6
- */
- public $language = null;
- /**
- * Number of items in this category or descendants of this category
- *
- * @var integer
- * @since 1.6
- */
- public $numitems = null;
- /**
- * Number of children items
- *
- * @var integer
- * @since 1.6
- */
- public $childrennumitems = null;
- /**
- * Slug for the category (used in URL)
- *
- * @var string
- * @since 1.6
- */
- public $slug = null;
- /**
- * Array of assets
- *
- * @var array
- * @since 1.6
- */
- public $assets = null;
- /**
- * Path from root to this category
- *
- * @var array
- * @since 1.6
- */
- protected $_path = array();
- /**
- * Flag if all children have been loaded
- *
- * @var boolean
- * @since 1.6
- */
- protected $_allChildrenloaded = false;
- /**
- * Constructor of this tree
- *
- * @var Categories
- * @since 1.6
- */
- protected $_constructor = null;
- /**
- * Class constructor
- *
- * @param array $category The category data.
- * @param Categories $constructor The tree constructor.
- *
- * @since 1.6
- */
- public function __construct($category = null, $constructor = null)
- {
- if ($category) {
- $this->setProperties($category);
- if ($constructor) {
- $this->_constructor = $constructor;
- }
- return true;
- }
- return false;
- }
- /**
- * Set the parent of this category
- *
- * If the category already has a parent, the link is unset
- *
- * @param CategoryNode|null $parent CategoryNode for the parent to be set or null
- *
- * @return void
- *
- * @since 1.6
- */
- public function setParent(NodeInterface $parent)
- {
- if (!\is_null($this->_parent)) {
- $key = array_search($this, $this->_parent->_children);
- unset($this->_parent->_children[$key]);
- }
- $this->_parent = $parent;
- $this->_parent->_children[] = & $this;
- if (\count($this->_parent->_children) > 1) {
- end($this->_parent->_children);
- $this->_leftSibling = prev($this->_parent->_children);
- $this->_leftSibling->_rightsibling = & $this;
- }
- if ($this->parent_id != 1) {
- $this->_path = $parent->getPath();
- }
- $this->_path[$this->id] = $this->id . ':' . $this->alias;
- }
- /**
- * Get the children of this node
- *
- * @param boolean $recursive False by default
- *
- * @return CategoryNode[] The children
- *
- * @since 1.6
- */
- public function &getChildren($recursive = false)
- {
- if (!$this->_allChildrenloaded) {
- $temp = $this->_constructor->get($this->id, true);
- if ($temp) {
- $this->_children = $temp->getChildren();
- $this->_leftSibling = $temp->getSibling(false);
- $this->_rightSibling = $temp->getSibling(true);
- $this->setAllLoaded();
- }
- }
- if ($recursive) {
- $items = array();
- foreach ($this->_children as $child) {
- $items[] = $child;
- $items = array_merge($items, $child->getChildren(true));
- }
- return $items;
- }
- return $this->_children;
- }
- /**
- * Returns the right or left sibling of a category
- *
- * @param boolean $right If set to false, returns the left sibling
- *
- * @return CategoryNode|null CategoryNode object with the sibling information or null if there is no sibling on that side.
- *
- * @since 1.6
- */
- public function getSibling($right = true)
- {
- if (!$this->_allChildrenloaded) {
- $temp = $this->_constructor->get($this->id, true);
- $this->_children = $temp->getChildren();
- $this->_leftSibling = $temp->getSibling(false);
- $this->_rightSibling = $temp->getSibling(true);
- $this->setAllLoaded();
- }
- if ($right) {
- return $this->_rightSibling;
- } else {
- return $this->_leftSibling;
- }
- }
- /**
- * Returns the category parameters
- *
- * @return Registry
- *
- * @since 1.6
- */
- public function getParams()
- {
- if (!($this->params instanceof Registry)) {
- $this->params = new Registry($this->params);
- }
- return $this->params;
- }
- /**
- * Returns the category metadata
- *
- * @return Registry A Registry object containing the metadata
- *
- * @since 1.6
- */
- public function getMetadata()
- {
- if (!($this->metadata instanceof Registry)) {
- $this->metadata = new Registry($this->metadata);
- }
- return $this->metadata;
- }
- /**
- * Returns the category path to the root category
- *
- * @return array
- *
- * @since 1.6
- */
- public function getPath()
- {
- return $this->_path;
- }
- /**
- * Returns the user that created the category
- *
- * @param boolean $modifiedUser Returns the modified_user when set to true
- *
- * @return \Joomla\CMS\User\User A User object containing a userid
- *
- * @since 1.6
- */
- public function getAuthor($modifiedUser = false)
- {
- if ($modifiedUser) {
- return Factory::getUser($this->modified_user_id);
- }
- return Factory::getUser($this->created_user_id);
- }
- /**
- * Set to load all children
- *
- * @return void
- *
- * @since 1.6
- */
- public function setAllLoaded()
- {
- $this->_allChildrenloaded = true;
- foreach ($this->_children as $child) {
- $child->setAllLoaded();
- }
- }
- /**
- * Returns the number of items.
- *
- * @param boolean $recursive If false number of children, if true number of descendants
- *
- * @return integer Number of children or descendants
- *
- * @since 1.6
- */
- public function getNumItems($recursive = false)
- {
- if ($recursive) {
- $count = $this->numitems;
- foreach ($this->getChildren() as $child) {
- $count = $count + $child->getNumItems(true);
- }
- return $count;
- }
- return $this->numitems;
- }
- }