/** * Load a graph of related objects to the current object. * * @param boolean|string|array|integer $graph An option to tell how to deal with related objects. If integer, will * traverse related objects up to a $graph level of depth and load them to the object. * If an array, will traverse required related object and load them to the object. * If true, will traverse the entire graph and append all related objects to the object (default behavior). * @param xPDOCriteria|array|string|integer $criteria A valid xPDO criteria representation. * @param boolean|integer $cacheFlag Indicates if the objects should be cached and optionally, by specifying an * integer value, for how many seconds. * @return array|boolean The graph that was loaded or false if nothing was loaded. */ public function getGraph($graph = true, $criteria = null, $cacheFlag = true) { /* graph is true, get all relations to max depth */ if ($graph === true) { $graph = $this->xpdo->getGraph($this->_class); } /* graph is an int, get relations to depth of graph */ if (is_int($graph)) { $graph = $this->xpdo->getGraph($this->_class, $graph); } /* graph defined as JSON, convert to array */ if (is_string($graph)) { $graph = $this->xpdo->fromJSON($graph); } /* graph as an array */ if (is_array($graph)) { foreach ($graph as $alias => $branch) { $fkMeta = $this->getFKDefinition($alias); if ($fkMeta) { $fkCriteria = isset($fkMeta['criteria']) && isset($fkMeta['criteria']['foreign']) ? $fkMeta['criteria']['foreign'] : null; if ($criteria === null) { $query = array($fkMeta['foreign'] => $this->get($fkMeta['local'])); if ($fkCriteria !== null) { $query = array($fkCriteria, $query); } } else { $query = $this->xpdo->newQuery($fkMeta['class'], $criteria); $addCriteria = array("{$query->getAlias()}.{$fkMeta['foreign']}" => $this->get($fkMeta['local'])); if ($fkCriteria !== null) { $fkAddCriteria = array(); foreach ($fkCriteria as $fkCritKey => $fkCritVal) { if (is_numeric($fkCritKey)) { continue; } $fkAddCriteria["{$criteria->getAlias()}.{$fkCritKey}"] = $fkCritVal; } if (!empty($fkAddCriteria)) { $addCriteria = array($fkAddCriteria, $addCriteria); } } $query->andCondition($addCriteria); } $collection = $this->xpdo->call($fkMeta['class'], 'loadCollectionGraph', array(&$this->xpdo, $fkMeta['class'], $branch, $query, $cacheFlag)); if (!empty($collection)) { if ($fkMeta['cardinality'] == 'many') { $this->_relatedObjects[$alias] = $collection; } else { $this->_relatedObjects[$alias] = reset($collection); } } } } } else { $graph = false; } return $graph; }
/** * Loads the principal attributes that define a modUser security profile. * * {@inheritdoc} */ public function loadAttributes($target, $context = '', $reload = false) { $context = !empty($context) ? $context : $this->xpdo->context->get('key'); $id = $this->get('id') ? (string) $this->get('id') : '0'; if ($this->get('id') && !$reload) { $staleContexts = $this->get('session_stale'); $staleContexts = !empty($staleContexts) ? $staleContexts : array(); $stale = array_search($context, $staleContexts); if ($stale !== false) { $reload = true; $staleContexts = array_diff($staleContexts, array($context)); $this->set('session_stale', $staleContexts); $this->save(); } } if ($this->_attributes === null || $reload) { $this->_attributes = array(); if (isset($_SESSION["modx.user.{$id}.attributes"])) { if ($reload) { unset($_SESSION["modx.user.{$id}.attributes"]); } else { $this->_attributes = $_SESSION["modx.user.{$id}.attributes"]; } } } if (!isset($this->_attributes[$context])) { $this->_attributes[$context] = array(); } $target = (array) $target; foreach ($target as $t) { if (!isset($this->_attributes[$context][$t])) { $this->_attributes[$context][$t] = $this->xpdo->call($t, 'loadAttributes', array(&$this->xpdo, $context, $this->get('id'))); if (!isset($this->_attributes[$context][$t]) || !is_array($this->_attributes[$context][$t])) { $this->_attributes[$context][$t] = array(); } } } $_SESSION["modx.user.{$id}.attributes"] = $this->_attributes; }