Esempio n. 1
0
 /**
  * Affecte/charge les enregistrements fils dans le membre $member de $instance.
  * Si $array est null, les fils sont chargés depuis la base de données
  * @param Classe $instance
  * @param string $member Membre sur lequel doit être présent une annotation OneToMany
  * @param array $array paramètre facultatif contenant la liste des fils possibles
  */
 public static function getManyToMany($instance, $member, $array = null)
 {
     $ret = array();
     $class = get_class($instance);
     $parser = new ManyToManyParser($instance, $member);
     if ($parser->init()) {
         $joinTableCursor = DAO::getSQLForJoinTable($instance, $parser);
         if (is_null($array)) {
             foreach ($joinTableCursor as $row) {
                 $fkv = $row[$parser->getFkField()];
                 $tmp = DAO::getOne($parser->getTargetEntity(), "`" . $parser->getPk() . "`='" . $fkv . "'");
                 array_push($ret, $tmp);
             }
         } else {
             $continue = true;
             $accessorToMember = "get" . ucfirst($parser->getInversedBy());
             $myPkAccessor = "get" . ucfirst($parser->getMyPk());
             if (!method_exists($instance, $myPkAccessor)) {
                 \Logger::warn("ManyToMany", "L'accesseur au membre clé primaire " . $myPkAccessor . " est manquant pour " . $class);
             }
             if (count($array) > 0) {
                 $continue = method_exists($array[0], $accessorToMember);
             }
             if ($continue) {
                 foreach ($joinTableCursor as $row) {
                     $fkv = $row[$parser->getFkField()];
                     foreach ($array as $targetEntityInstance) {
                         $instances = $targetEntityInstance->{$accessorToMember}();
                         if (is_array($instances)) {
                             foreach ($instances as $inst) {
                                 if ($inst->{$myPkAccessor} == $instance->{$myPkAccessor}) {
                                     array_push($array, $targetEntityInstance);
                                 }
                             }
                         }
                     }
                 }
             } else {
                 \Logger::warn("ManyToMany", "L'accesseur au membre " . $parser->getInversedBy() . " est manquant pour " . $parser->getTargetEntity());
             }
         }
         $accessor = "set" . ucfirst($member);
         if (method_exists($instance, $accessor)) {
             \Logger::log("getManyToMany", "Chargement de " . $member . " pour l'objet " . $class);
             $instance->{$accessor}($ret);
         } else {
             \Logger::warn("getManyToMany", "L'accesseur " . $accessor . " est manquant pour " . $class);
         }
     }
     return $ret;
 }