/** * Charge une collection d'objets * * Exemples: * <code> * // charge la collection des acteurs qui ont 18 ans * $mapper = Mapper::singleton('Actor'); * $actor = $mapper->loadCollection(array('Age'=>18)); * // charge la collection de produits actifs en utilisant le lazy-loading, * // seuls le nom et le prix des produits sont chargés * $mapper = Mapper::singleton('Product'); * $product = $mapper->loadCollection(array('Active'=>1), * array('Name', 'Price')); * </code> * * @access public * @param mixed $attributeFilters un tableau ou un objet filtre * @param array $sortOrder un tableau pour les tris * @param array $fields un tableau de chaines pour les champs à charger * @param integer $rows le nombre de lignes à charger (pagination) * @param integer $page l'index de la page en cours (pagination) * @param integer $limit le nombre d'enregistrements à charger (LIMIT) * @return object Collection */ public function loadCollection($filter = array(), $sortOrder = array(), $fields = array(), $rows = 0, $page = 1, $limit = false, $noCache = false) { if (defined('MAPPER_CACHE_DISABLED') && MAPPER_CACHE_DISABLED) { $noCache = true; } // si l'objet est chargé en lazy loading, on la taggue readonly if (!empty($fields)) { $readonly = $noCache = true; $attrs = $fields; } else { $readonly = false; $attrs = array_keys($this->_attrs); } $sql = $this->_getSQLRequest($filter, $sortOrder, $fields); if ($rows == 0) { if ($limit) { $result = Database::connection()->SelectLimit($sql, $limit); } else { $result = Database::connection()->Execute($sql); } } else { $result = Database::connection()->PageExecute($sql, $rows, $page); } // si erreur sql if (false === $result) { if (DEV_VERSION) { echo $sql . '<br />'; } trigger_error(Database::connection()->ErrorMsg(), E_USER_ERROR); } // on instancie une collection $collection = new Collection(); // propriétés utilisées par la pagination $collection->currentPage = $result->_currentPage; $collection->lastPageNo = $result->_lastPageNo; $collection->entityName = $this->_cls; // on remplit l'objet while (!$result->EOF) { // gestion de l'héritage, le class name est récupéré en bdd, il faut // donc instancier la bonne classe (cad celle retournée par adodb) if (isset($result->fields['_ClassName']) && !empty($result->fields['_ClassName']) && $result->fields['_ClassName'] != $this->_cls) { unset($instance); require_once MODELS_DIR . '/' . $result->fields['_ClassName'] . '.php'; if ($noCache) { $instance = new $result->fields['_ClassName'](); } else { $instance = Tools::singleton($result->fields['_ClassName'], $result->fields['_Id']); } if (!$readonly) { $new_attrs = array_merge($attrs, array_keys($instance->getProperties())); } else { $new_attrs = $attrs; } } else { if ($noCache) { $instance = new $this->_cls(); } else { $instance = Tools::singleton($this->_cls, $result->fields['_Id']); } $new_attrs = $attrs; } // on rempli l'instance uniquement s'il est pas déjà en mémoire $instance->setId($result->fields['_Id']); if (defined('DATABASE_ID')) { $instance->dbID = $result->fields['_DBId'] === null ? null : (int) $result->fields['_DBId']; } if (!$instance->hasBeenInitialized) { foreach ($new_attrs as $attr) { // on ne traite que les attributs simples et les fkeys $setter = 'set' . $attr; $instance->{$setter}($result->fields['_' . $attr]); } // on la marque comme initialisée et on affecte readonly $instance->hasBeenInitialized = true; $instance->readonly = $readonly; if (property_exists($instance, 'lastModified')) { $instance->lastModified = $result->fields['_LastModified']; } } // on l'ajoute à la collection $collection->setItem($instance); unset($instance); $result->moveNext(); } // After setItem() calls, sinon, ecrase... $collection->totalCount = $result->MaxRecordCount(); $result->close(); return $collection; }
/** * Retourne une collection d'objets qui se trouvent dans la collection * en cours et dans la collection passée en paramètre (intersection) * * @access public * @param object $col * @return object Collection */ public function getIntersection($col) { $result = new Collection(); $result->entityName = $this->entityName; if ($this->entityName == $col->entityName) { $ids = array_intersect($this->_itemIds, $col->_itemIds); $ids = array_values($ids); foreach ($ids as $i => $currentID) { $item = $this->getItem($i); if (!$item || $item->getId() != $currentID) { $item = $col->getItem($i); } $result->setItem($item); } } return $result; }