Example #1
0
File: Mapper.php Project: arhe/pwak
 /**
  * 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;
 }
Example #2
0
 /**
  * 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;
 }