vendor/theatre/core/src/Traits/TheatreTrait.php line 74

Open in your IDE?
  1. <?php
  2. namespace TheatreCore\Traits;
  3. use Doctrine\DBAL\Exception as DBALException;
  4. use Doctrine\DBAL\FetchMode;
  5. use Doctrine\ORM\Query;
  6. use Michelf\MarkdownExtra;
  7. use Psr\Log\LoggerInterface;
  8. use Symfony\Component\Cache\Adapter\AdapterInterface;
  9. use TheatreCore\Entity\Classifications;
  10. use TheatreCore\Entity\Extranetusers;
  11. use TheatreCore\Entity\Files;
  12. use TheatreCore\Entity\Multimedias;
  13. use TheatreCore\Entity\News;
  14. use TheatreCore\Entity\Playlists;
  15. use TheatreCore\Entity\Podcasts;
  16. use TheatreCore\Entity\Spectacles;
  17. use TheatreCore\Entity\TextAide;
  18. use TheatreCore\Entity\Texts;
  19. use App\Service\Cleantext;
  20. use App\Service\wiki2xhtml\wiki2xhtml;
  21. define('AUTOQUERY_INSERT'1);
  22. define('AUTOQUERY_UPDATE'2);
  23. trait TheatreTrait
  24. {
  25.     private $datas;
  26.     private $rows;
  27.     private $obj;
  28.     private $translator;
  29.     private $func;
  30.     private $count;
  31.     private $doctrine;
  32.     private $stats_base 'statistiques';
  33.     private $countriesLoaded = [];
  34.     private ?LoggerInterface $logger null;
  35.     private array $setFields = [];
  36.     public function setCount($count true)
  37.     {
  38.         $this->count $count;
  39.     }
  40.     public function getCount()
  41.     {
  42.         return $this->count;
  43.     }
  44.     function execute($sql)
  45.     {
  46.         $conn $this->getEntityManager()->getConnection();
  47.         return $conn->exec($sql);
  48.     }
  49.     function queryOne($sql)
  50.     {
  51.         return $this->getEntityManager()->getConnection()->fetchOne($sql);
  52.     }
  53.     function queryCol($sql)
  54.     {
  55.         $conn $this->getEntityManager()->getConnection();
  56.         $query $conn->executeQuery($sql);
  57.         return $query->fetchFirstColumn();
  58.     }
  59.     function queryRow($sql)
  60.     {
  61.         $conn $this->getEntityManager()->getConnection();
  62.         $query $conn->executeQuery($sql);
  63.         return $query->fetch();
  64.     }
  65.     function loadResult($data)
  66.     {
  67.         if (!empty($data)) {
  68.             foreach ($data as $key => $value) {
  69.                 $this->$key $value;
  70.             }
  71.         }
  72.     }
  73.     function query($sql)
  74.     {
  75.         $conn $this->getEntityManager()->getConnection();
  76.         $this->rows 0;
  77.         $this->obj = new $this->__table_object();
  78.         $query $conn->executeQuery($sql);
  79.         $this->datas $datas $query->fetchAll();
  80.         return $datas;
  81.     }
  82.     public function numRows()
  83.     {
  84.         return count($this->datas);
  85.     }
  86.     function fetch()
  87.     {
  88.         $total count($this->datas);
  89.         $this->currentRow $line $this->rows;
  90.         if ($total $line) {
  91.             $this->rows++;
  92.             if (!empty($this->datas[$line])) {
  93.                 foreach ($this->datas[$line] as $key => $value) {
  94.                     $this->$key $value;
  95.                 }
  96.                 return $this->datas[$line];
  97.             }
  98.         }
  99.         return false;
  100.     }
  101.     public function queryAll($sql$params1 null$params2 null$params3 null)
  102.     {
  103.         $this->rows 0;
  104.         $conn $this->getEntityManager()->getConnection();
  105.         $query $conn->executeQuery($sql);
  106.         if ($params3) {
  107.             return $query->fetchAll(FetchMode::ASSOCIATIVE); //|\PDO::FETCH_COLUMN nécessaire pour TypesstructuresRepository->getTypeStructureList
  108.         } else {
  109.             return $query->fetchAll();
  110.         }
  111.     }
  112.     public function fetchRow()
  113.     {
  114.         $total count($this->datas);
  115.         $line $this->rows;
  116.         if ($total $line) {
  117.             $this->rows++;
  118.             return $this->datas[$line];
  119.         }
  120.         return false;
  121.     }
  122.     function free()
  123.     {
  124.     }
  125.     public function escape($value)
  126.     {
  127.         if (is_array($value)) {
  128.             foreach ($value as $key => $item) {
  129.                 $value[$key] = addslashes($item);
  130.             }
  131.             return $value;
  132.         }
  133.         return addslashes($value);
  134.     }
  135.     public function get($value$column null)
  136.     {
  137.         if (is_null($column)) {
  138.             $query $this->createQueryBuilder('u')
  139.                 ->select('u')
  140.                 ->where('u.' $this->__idtable ' =:value')->setParameter('value'$value);
  141.             $this->datas $x $query->getQuery()
  142.                 ->getOneOrNullResult(Query::HYDRATE_ARRAY);
  143.         } else {
  144.             $this->datas $this->createQueryBuilder('u')
  145.                 ->select('u')
  146.                 ->where('u.' $column ' =:value')->setParameter('value'$value)
  147.                 ->getQuery()
  148.                 ->getOneOrNullResult(Query::HYDRATE_ARRAY);
  149.         }
  150.         return $this->datas;
  151.     }
  152.     public function autoExecute($__table$setFields$type$where nullLoggerInterface $logger null)
  153.     {
  154.         $conn $this->getEntityManager()->getConnection();
  155.         if ($type === AUTOQUERY_UPDATE) {
  156.             $sql "UPDATE  `$__table` SET ";
  157.             $params = [];
  158.             $first true;
  159.             foreach ($setFields as $k => $v) {
  160.                 if (!$first) {
  161.                     $sql .= ', ';
  162.                 }
  163.                 if (is_null($v) || (empty($v) && !is_numeric($v))) {
  164.                     $sql .= $k " = :$k";
  165.                     $params[$k] = null;
  166.                 } else {
  167.                     $sql .= $k " = :$k";
  168.                     $params[$k] = strip_tags($v);
  169.                 }
  170.                 $first false;
  171.             }
  172.             if (!is_null($where)) {
  173.                 $sql .= " WHERE $where";
  174.             }
  175.             $stmt $conn->prepare($sql);
  176.             $stmt->executeStatement($params);
  177.             return $conn->lastInsertId();
  178.         }
  179. //        else if($type == AUTOQUERY_INSERT){
  180. //
  181. //            $conn = $this->getEntityManager()->getConnection();
  182. //            $conn->insert($__table, $setFields);
  183. //
  184. //            return $conn;
  185. //        }
  186.     }
  187.     // test si la variable est en entier valide (attention, n'est pas is_int())
  188.     function my_is_int($x)
  189.     {
  190.         return (is_numeric($x) ? intval($x) == $x false);
  191.     }
  192.     function noPunct($array)
  193.     {
  194.         if (is_array($array)) {
  195.             if (!empty($array)) {
  196.                 end($array);
  197.                 $k key($array);
  198.                 $array[$k]['nopunct'] = true;
  199.                 return $array;
  200.             } else {
  201.                 return array();
  202.             }
  203.         } else {
  204.             return $array;
  205.         }
  206.     }
  207.     /*
  208.  *type de requete (mdb2 ou dbdo)
  209.  */
  210.     public $typefind;
  211.     public $queryfind;
  212.     /*
  213.      * verifier les droits ou pas ?
  214.      */
  215.     public $checkRights false;
  216.     /*
  217.      * liste des valeurs d'object acceptées, voir setValidObjects()
  218.      */
  219.     private $object_accept = array();
  220.     /*
  221.      * publié ou pas
  222.      */
  223.     public $publish_status 2;
  224.     /*
  225.      * infos pagination
  226.      */
  227.     public $paged_data = array();
  228.     /*
  229.      * requête courante
  230.      */
  231.     private $currentQuery;
  232.     private $currentRow;
  233.     public $db;
  234.     // constantes pour marquer les différents types d'id
  235.     public $IDNUM 0// identifiant numérique (28)
  236.     public $IDSTR 1// identifiant textuel  ('class_truc')
  237.     public function quote($value)
  238.     {
  239.         return '\'' $value '\'';
  240.     }
  241.     // {{{ objToArray()
  242.     public function getListSearchRelation()
  243.     {
  244.         $query $this->createQueryBuilder('e');
  245.         $query->select('e');
  246.         return $query;
  247.     }
  248.     // }}}
  249.     // {{{ objToArray()
  250.     /** Redéfinition de DataObject::toArray()
  251.      *
  252.      *
  253.      * @access public
  254.      * @return array
  255.      */
  256.     public function objToArray($query null)
  257.     {
  258.         $conn $this->getEntityManager();
  259.         $values = [];
  260.         if (!is_null($query)) {
  261.             $values $query->getSingleResult(Query::HYDRATE_ARRAY);
  262.             $this->loadResult($values);
  263.         }
  264.         return $values;
  265.     }
  266.     // }}}
  267.     //  {{{ setData()
  268.     /** Mettre a jour ou inserer les informations
  269.      *
  270.      * permet de mettre a jour globalement les informations ou de
  271.      * creer un nouvel enregistrement
  272.      *
  273.      * @see setUpdateFields
  274.      * @access private
  275.      */
  276.     public function setData($id null$last false$allRights true$where nullLoggerInterface $logger null)
  277.     {
  278.         $this->logger $logger;
  279.         // ajouter des backquote
  280. //        $this->setOption('quote_identifier', true);
  281.         // desactiver la verification des droits
  282.         if ($allRights) {
  283.             $rights = array('insert' => 1'update' => 1);
  284.         }
  285.         // checker les droits
  286.         if (!$allRights || $this->isCheckRights()) {
  287.             $extranetusers $this->getEntityManager()->getRepository(Extranetusers::class);
  288.             $rights $extranetusers->getRights();
  289.         }
  290.         // si $id existe on update
  291.         if (!empty($id) || $where) {
  292.             // on doit avoir le droit d'update'
  293.             if (isset($rights) && $rights['update'] == 1) {
  294.                 // where simple ou complexe
  295.                 if (!$where) {
  296.                     $where $this->__idtable "='$id'";
  297.                 }
  298.                 $this->$this->autoExecute($this->__table$this->setFieldsAUTOQUERY_UPDATE$where$logger);
  299.             } else {
  300.                 throw new \Exception($GLOBALS['tr']->trans('no_right') . 'setData-update');
  301.             }
  302.             // sinon on insére
  303.         } else {
  304.             if (isset($rights) && $rights['insert'] == 1) {
  305.                 try {
  306.                     $conn $this->getEntityManager()->getConnection();
  307.                     $conn->insert($this->__table$this->setFields);
  308.                 } catch (DBALException $e) {
  309.                     $this->logError($e->getMessage());
  310.                     $this->logError($e->getTraceAsString());
  311.                 }
  312.             } else {
  313.                 $this->logError($GLOBALS['tr']->trans('no_right') . 'setData-insert');
  314.             }
  315.         }
  316.         if (is_null($id) || $id === '') {
  317.             if ((isset($conn))) {
  318.                 if ($conn->lastInsertId()) {
  319.                     return $conn->lastInsertId();
  320.                 }
  321.                 return true;
  322.             }
  323.             return false;
  324.         } else {
  325.             return $id;
  326.         }
  327.     }
  328.     private function logError(string $message)
  329.     {
  330.         if ($this->logger) {
  331.             $this->logger->error($message);
  332.         } else {
  333.             error_log($message);
  334.         }
  335.     }
  336.     // }}}
  337.     //  {{{ getSelectfields()
  338.     /** Passe les champs souhaités sous forme de chaine
  339.      *
  340.      * Récupère sous forme de string les champs qu'on souhaite pour une
  341.      * requête. Si selectfields n'est pas précisé on prendra tous les champs
  342.      * comme pour un SELECT étoile.
  343.      *
  344.      * @access   public
  345.      * @return   string
  346.      */
  347.     public function getSelectfields()
  348.     {
  349.         if (empty($this->selectfields)) {
  350.             $this->selectfields $this->fields;
  351.         }
  352.         $field_string '';
  353.         foreach ($this->selectfields as $field) {
  354.             if ($field_string$field_string .= ', ';
  355.             $field_string .= $this->aliastable '.' $field;
  356.         }
  357.         return $field_string;
  358.     }
  359.     // }}}
  360.     //  {{{ selectFields()
  361.     /** Récupére les champs souhaités
  362.      *
  363.      * Récupére sous forme de array les champs qu'ont souhaite pour une
  364.      * requête. Si selectfields n'est pas précisé, on prendra tous les champs
  365.      * comme pour un SELECT étoile.
  366.      *
  367.      * @param array $fieldsext Les champs précisés dans un tableau
  368.      * @access   public
  369.      * @return   array
  370.      * @see      setUpdatefields()
  371.      * @see      getSelectfields()
  372.      */
  373.     public function selectFields($fieldsext null)
  374.     {
  375.         if (!empty($fieldsext)) {
  376.             $this->selectfields $fieldsext;
  377.         }
  378.     }
  379.     // }}}
  380.     //  {{{ setUpdatefields()
  381.     /** Précise les champs à updater ou insérer
  382.      *
  383.      * Précise dans un tableau les champs à updater ou à insérer. Le nom du champ
  384.      * et sa valeur nécessaire à la classe DB
  385.      *
  386.      * @param array $fieldsext Les champs précisés dans un tableau
  387.      * @access   public
  388.      * @return   array
  389.      */
  390.     public function setUpdatefields($fieldsext$quote_identifier false)
  391.     {
  392.         // ajouter les identifiers
  393.         if ($quote_identifier) {
  394.             foreach ($fieldsext as $k => $v) {
  395.                 $fieldsext['`' $k '`'] = $v;
  396.             }
  397.         }
  398.         $this->setFields $fieldsext;
  399.     }
  400.     // }}}
  401.     //  {{{ setExec()
  402.     /** Executer ou non la requete
  403.      *
  404.      * On peux avoir simplement besoin de retourner la requete
  405.      * Pour une clause LIMIT ou un count
  406.      *
  407.      * Par defaut, on execute
  408.      *
  409.      * @param bool $exec execution
  410.      * @see specialQuery()
  411.      * @access public
  412.      */
  413.     public function setExec($exec true)
  414.     {
  415.         $this->exec $exec;
  416.     }
  417.     // }}}
  418.     //  {{{ specialQuery()
  419.     /** Requete MDB2 ou find de DBDO
  420.      *
  421.      * Permet de savoir si on est dans le cas d'une requete
  422.      * qui passe par MDB2 ou d'une requete qui passe par DB_Dataobject
  423.      * Pour le pager, les clauses limit, les count... c'est important de le savoir
  424.      *
  425.      * Si query est vide, ca signifie que tout est passe par DBDO
  426.      *
  427.      * @param string $query la requete
  428.      * @see find()
  429.      * @see findData()
  430.      * @see setOrderBy()
  431.      * @access public
  432.      * @see setExec()
  433.      */
  434.     public function specialQuery($query null$save_query false)
  435.     {
  436.         if (!empty($query)) {
  437.             // definir au besoin un order de tri
  438.             if (isset($this->setOrder)) {
  439. //                $query .= ' ORDER BY '.$this->setOrder;
  440.                 $query->orderBy($this->setOrder$this->setDirection);
  441.             }
  442.             $this->queryfind $query;
  443.             if ($save_query) {
  444. //                $this->setCurrentQuery($query);
  445.             }
  446.             $this->typefind 'mdb2';
  447.             //if($this->exec) {
  448. //            $query = $this->executeQuery($sql);
  449. //            $subQuery = $query->getQuery();
  450. //            $this->datas = $subQuery->getResult();
  451. //            $this->query($query);
  452.             //error_log('DEBUG - EXECUTE DANS THEATRE MDB2 : '.$query);
  453.             //}
  454.         } else {
  455.             //if(isset($this->exec)) {
  456.             // definir au besoin un order de tri
  457.             if (isset($this->setOrder)) {
  458.                 $this->orderBy($this->setOrder);
  459.             }
  460. //            $x = $this->findAll();
  461.             //error_log('DEBUG - EXECUTE DANS THEATRE DBDO');
  462.             //}
  463.             $this->typefind 'dbdo';
  464.         }
  465.         return $this->datas;
  466.     }
  467.     // }}}
  468.     //  {{{ setOrderBy()
  469.     /** Definir un ordre de tri en dehors du pager
  470.      *
  471.      * @param string $order le tri
  472.      * @see specialQuery()
  473.      * @access public
  474.      */
  475.     public function setOrderBy($order null$direction null)
  476.     {
  477.         if (!empty($order)) {
  478.             $this->setOrder $order;
  479.         }
  480.         if (!empty($direction)) {
  481.             $this->setDirection $direction;
  482.         }
  483.     }
  484.     // }}}
  485.     //  {{{ setCurrentQuery()
  486.     /** Enregistrer la requête proposée via specialQuery
  487.      *
  488.      * @param string $query la requête
  489.      * @see specialQuery()
  490.      * @access public
  491.      */
  492.     public function setCurrentQuery($query)
  493.     {
  494.         $this->currentQuery $query;
  495.     }
  496.     // }}}
  497.     //  {{{ getCurrentQuery()
  498.     /** récupèrer la requête courante
  499.      *
  500.      * @see specialQuery()
  501.      * @access public
  502.      */
  503.     public function getCurrentQuery()
  504.     {
  505.         return $this->currentQuery;
  506.     }
  507.     // }}}
  508.     //  {{{ dbLimit()
  509.     /** Limitation du nombre de resultat
  510.      *
  511.      *
  512.      * @access public
  513.      */
  514.     public function dbLimit($limit$offset 0)
  515.     {
  516.         if (empty($offset)) {
  517.             $offset 0;
  518.         }
  519.         return ' LIMIT ' $offset ',' $limit;
  520.     }
  521.     // }}}
  522.     //  {{{ getPagination()
  523.     /** Récupère les élèments de navigation
  524.      *
  525.      *
  526.      * @access public
  527.      */
  528.     public function getPagination($replace_pattern null)
  529.     {
  530.         if ($replace_pattern) {
  531.             //$pat = 'href="\/index\.php\?pageID\=([0-9]+)"';
  532.             $pat 'href="([a-z,0-9,\.,\/]+)\?pageID\=([0-9]+)"';
  533.             //$this->paged_data['links'] = preg_replace('/'.$pat.'/','href="'.$replace_pattern.'?pageID=$2"',$this->paged_data['links']);
  534.             $this->paged_data['links'] = str_replace('evenements/view/index.php'''$this->paged_data['links']);
  535.         }
  536.         return $this->paged_data;
  537.     }
  538.     // }}}
  539.     //  {{{ setCheckRights()
  540.     /** preciser si il faut verifier les droits ou pas
  541.      *
  542.      * Précise si il faudra checker les droits dans les methodes
  543.      *
  544.      * @param bool $right
  545.      * @access   public
  546.      * @return   bool
  547.      */
  548.     public function setCheckRights($right false)
  549.     {
  550.         return $this->checkRights $right;
  551.     }
  552.     // }}}
  553.     //  {{{ isCheckRights()
  554.     /** verifier si on doit utiliser les droits ou pas
  555.      *
  556.      * @access   public
  557.      * @return   bool
  558.      */
  559.     public function isCheckRights()
  560.     {
  561.         return $this->checkRights;
  562.     }
  563.     // }}}
  564.     //  {{{ setToArray()
  565.     /** Liste des enregistrements dans un tableau associatif
  566.      *
  567.      * Tableau associatif notament utilisé pour lister les informations sur les enregistrements
  568.      * Utile pour générer les tableaux HTML de listes des enregistrements
  569.      *
  570.      * @access  public
  571.      * @return  array
  572.      * @see     findData()
  573.      */
  574.     public function setToArray($spec true)
  575.     {
  576.         // desactive si pager
  577.         if ($spec == true) {
  578.             $this->findData();
  579.         }
  580.         // declaration
  581.         $values = array();
  582.         $color null;
  583.         $nb 0;
  584.         while ($this->fetch()) {
  585.             // infos sur l'enregistrement
  586.             $values[$nb] = $this->getInfosObject();
  587.             // couleur de ligne alternative
  588.             $color $this->colorAlternate($color);
  589.             $values[$nb]['colorline'] = $color;
  590.             $nb++;
  591.         }
  592.         return $values;
  593.     }
  594.     // }}}
  595.     //  {{{ deleteData()
  596.     /** Suppression
  597.      *
  598.      * Permet de supprimer l'enregistrement
  599.      *
  600.      * @access   public
  601.      * @param int $id Id de l'enregistrement principal
  602.      * @param string $table Nom de la table de relation
  603.      * @param bool $allRights Checker les droits
  604.      * @param bool $delete_relationa Faut-il supprimer également les relations (non FK) ?
  605.      * @param bool $log_deletion Loguer les suppressions
  606.      * @return   bool
  607.      */
  608.     public function deleteData($id$table null$key null$allRights true$delete_relation null$log_deletion null)
  609.     {
  610.         // ne pas checker les droits
  611.         if ($allRights) {
  612.             $rights = array('delete' => 1);
  613.         }
  614.         if ($this->setCheckRights() || !$allRights) {
  615.             $extranetusers Theatre_Extranetusers::factory('extranetusers');
  616.             $rights $extranetusers->getRights();
  617.         }
  618.         if (isset($rights) && $rights['delete'] == 1) {
  619.             if (!empty($table) && !empty($key)) {
  620.                 $req 'DELETE FROM ' $table ' WHERE ' $key '=\'' $id '\'';
  621.             } else {
  622.                 $req 'DELETE FROM ' $this->__table ' WHERE ' $this->__idtable '=\'' $id '\'';
  623.             }
  624.             $del $this->execute($req);
  625.             // logguer les delete
  626.             $this->logDeletion($req);
  627.             if ($del) {
  628.                 // supprimer également les relations qui ne sont pas supprimées automatiquement via des foreigh keys
  629.                 if (!empty($delete_relation)) {
  630.                     // ont récup le tableau des relations
  631.                     $infos_links $this->getRelationsArray('all');
  632.                     foreach ($infos_links as $k => $v) {
  633.                         // si marqué comme silent_delete_relation à true et use_constraint à false
  634.                         // on va construire la requête de suppression avec getLinkedObject
  635.                         if (!empty($v['silent_delete_relation']) && !empty($v['do_constraint'])) {
  636.                             // trouver les items liés
  637.                             $items $this->getLinkedObject($v$id$k$this->__table);
  638.                             if (!empty($items)) {
  639.                                 // si il s'agit d'une table 'by_object' ont doit supprimer dans join table mais pas des la table des destination
  640.                                 if (!empty($v['join_table']) &&
  641.                                     (strpos($v['join_table'], 'object_') !== false
  642.                                         || strrpos($v['join_table'], '_by_object') !== false)) {
  643.                                     // contient _by_object
  644.                                     if (strrpos($v['join_table'], '_by_object') !== false) {
  645.                                         $v['join_table'] = str_replace('_by_object'''$v['join_table']);
  646.                                         $dest_table $v['join_table'];
  647.                                     }
  648.                                     //echo 'supprimer '.$id.' '.$this->__table.' de la table '.$dest_table.' <br />';
  649.                                     // sinon, effacement classique dans la table de destination
  650.                                 } else {
  651.                                     // table ou l'on doit supprimer
  652.                                     $dest_table $v['dest_table'];
  653.                                     $delete_items = array();
  654.                                     foreach ($items as $kb => $vb) {
  655.                                         $delete_items[] = $kb;
  656.                                     }
  657.                                     //echo 'supprimer '.join(',', $delete_items).' de la table '.$dest_table.' <br />';
  658.                                 }
  659.                             }
  660.                         }
  661.                     }
  662.                 }
  663.                 return true;
  664.             }
  665.         } else {
  666.             throw new Exception($GLOBALS['tr']->get('no_rights') . ' deleteData');
  667.         }
  668.     }
  669.     // }}}
  670.     //  {{{ getLinkedObject()
  671.     /** Liste des items liés
  672.      *
  673.      * Retourne un tableau associatif contenant la liste des items liés
  674.      *
  675.      * @access  public
  676.      * @param array $infos_link Tableau de description de la relation
  677.      * @param int $idobject Id de l'objet source
  678.      * @params  string $type nom de la relation
  679.      * @params  string $src nom de la table source pour laquelle on cherche une relation
  680.      * @params  array $params paramètres en plus
  681.      * @return  array
  682.      * @see     getRelationsArray()
  683.      */
  684.     public function getLinkedObject($infos_link$idobject$type$src$params = array())
  685.     {
  686.         // type => soit un champ (field), soit une table (object)
  687.         // si on veux utiliser une methode type_join=method
  688.         $dbjoin $_ENV['TH_BDD'];
  689.         $dbsource $_ENV['TH_BDD'];
  690.         $itemslist = array();
  691.         // via une méthode
  692.         if (!empty($infos_link['type_join']) && $infos_link['type_join'] == 'method') {
  693.             if (!empty($infos_link['method_params'])) {
  694.                 return $this->{$infos_link['method']}($idobject$type$infos_link['method_params']);
  695.             } else {
  696.                 return $this->{$infos_link['method']}($idobject$type);
  697.             }
  698.         }
  699.         if (!empty($infos_link['type_join']) && ($infos_link['type_join'] == 'multiple' || $infos_link['type_join'] == 'simple')) {
  700.             // objet source (exemple : on veux les adaptation liées a un texte, l'objet source est 'texts')
  701.             $src $dbdo str_replace('_'''ucwords($src'_'));
  702.             $src_obj $this->getEntityManager()->getRepository('TheatreCore\Entity\\' ucfirst($src));
  703.             // table source si précisée
  704.             if (!empty($infos_link['src_table'])) {
  705.                 $src_table $infos_link['src_table'];
  706.             } else {
  707.                 $src_table $src_obj->__table;
  708.             }
  709.             // si on precise un champ index différent pour la source
  710.             if (!empty($infos_link['src_table_field'])) {
  711.                 $src_table_field $infos_link['src_table_field'];
  712.             } else {
  713.                 $src_table_field $src_obj->__idtable;
  714.             }
  715.             // => objet lié (pour l'exemple : texts de l'adaptation)
  716.             // table de destination si précisée
  717.             if (!empty($infos_link['dest_table'])) {
  718.                 $dest_obj $this->getEntityManager()->getRepository('TheatreCore\Entity\\' implode(''array_map(function ($m) {
  719.                         return ucfirst($m);
  720.                     }, explode('_'$infos_link['dest_table']))));
  721.                 $dest_table $dest_obj->__table;
  722.             }
  723.             // si on precise un champ index différent pour la destination
  724.             if (!empty($infos_link['dest_table_field'])) {
  725.                 $dest_table_field $infos_link['dest_table_field'];
  726.                 // si le champ de destination est idobject alors il faut object
  727.                 if ($dest_table_field == 'idobject') {
  728.                     $join_object_table_constraint 'j1.object=\'' $src_table '\' ';
  729.                 }
  730.             } else {
  731.                 $dest_table_field $dest_obj->__idtable;
  732.             }
  733.             // table de jointure
  734.             if (!empty($infos_link['join_table'])) {
  735.                 $join_table $infos_link['join_table'];
  736.             }
  737.             // si on precise un champ de jointure différent
  738.             if (!empty($infos_link['join_field_src'])) {
  739.                 $join_field_src $infos_link['join_field_src'];
  740.             } else {
  741.                 // sinon le même que celui de la table source
  742.                 $join_field_src $src_table_field;
  743.             }
  744.             // si on precise un champ de jointure différent
  745.             if (!empty($infos_link['join_field_dest'])) {
  746.                 $join_field_dest $infos_link['join_field_dest'];
  747.             } else {
  748.                 // sinon le même que celui de la table source
  749.                 $join_field_dest $dest_table_field;
  750.             }
  751.             // contrainte sur la table de jointure (par exemple object_xxx)
  752.             /*if(!empty($infos_link['join_table_constraint'])) {
  753.                 $join_table_constraint = $infos_link['join_table_constraint'];
  754.             }*/
  755.             // si la table de jointure commence par object_ ou contient by_object, alors la contrainte du
  756.             // du champ object correspond au nom de la table source et idobject à l'identifiant
  757.             if (!empty($infos_link['join_table']) &&
  758.                 (strpos($infos_link['join_table'], 'object_') !== false || strrpos($infos_link['join_table'], '_by_object') !== false)) {
  759.                 // contient _by_object
  760.                 if (strrpos($infos_link['join_table'], '_by_object') !== false) {
  761.                     $infos_link['join_table'] = str_replace('_by_object'''$infos_link['join_table']);
  762.                     $join_table $infos_link['join_table'];
  763.                 }
  764.                 // si object a un nom différent de la table source
  765.                 if (!empty($infos_link['join_table_object'])) {
  766.                     $join_table_object $infos_link['join_table_object'];
  767.                 } else {
  768.                     $join_table_object $src_table;
  769.                 }
  770.                 // contrainte
  771.                 $join_object_table_constraint 'j2.object=\'' $join_table_object '\' AND j2.idobject=' . (int)$idobject;
  772.                 $join_field_src 'idobject';
  773.             }
  774.             // select invers (exemple : trouver les personnes lié à un multimedia depuis le multimédia, en passant par object_multimedia)
  775.             if (!empty($infos_link['join_from_object'])) {
  776.                 $join_field_src $src_table_field// idmultimedia
  777.                 $join_field_dest 'idobject'// sur object_multimedia => idobject
  778.                 $join_object_table_constraint ' j2.object=\'' $infos_link['dest_table'] . '\' ';
  779.             }
  780.             // ajouter l'alias sur les champs de 'destination'
  781.             foreach ($infos_link['fields'] as $f) {
  782.                 $fields_alias[] = 'j1.' $f;
  783.             }
  784.             // ajouter l'alias sur les champs de la table de jointure
  785.             if (!empty($infos_link['fields_join_table'])) {
  786.                 foreach ($infos_link['fields_join_table'] as $f) {
  787.                     $fields_alias[] = 'j2.' $f;
  788.                 }
  789.             }
  790.             // compter uniquement
  791.             if (!empty($params['count_only'])) {
  792.                 $select 'COUNT(*)';
  793.             } else {
  794.                 $select implode(','$fields_alias);
  795.             }
  796.             // début de la requête
  797.             $sql 'SELECT ' $select ' ';
  798.             // ajouter la clé de la table source dans le select si diff de la table dest
  799.             if (property_exists($src_obj'__idtable') && !in_array($src_obj->__idtable$infos_link['fields'])) {
  800.                 if (!empty($infos_link['fields_dest_table'])) {
  801.                     foreach ($infos_link['fields_dest_table'] as $f) {
  802.                         $fields_alias[] = 'j3.' $f;
  803.                     }
  804.                 } else {
  805.                     $sql .= ',j3.' $src_obj->__idtable ' ';
  806.                 }
  807.             }
  808.             // dans la cas d'une jointure avec 3 tables
  809.             if ($infos_link['type_join'] == 'multiple') {
  810.                 $sql .= 'FROM ' $dbsource '.' $dest_table ' j1, ' $dbjoin '.' $join_table ' j2, ' $dbsource '.' $src_table ' j3
  811.                         WHERE j3.' $src_table_field '=j2.' $join_field_src '
  812.                         AND j1.' $dest_table_field '=j2.' $join_field_dest '
  813.                         AND j3.' $src_table_field '=' . (int)$idobject;
  814.                 // requete avec jointure sur 3 tables
  815.                 if (!empty($join_object_table_constraint)) {
  816.                     $sql .= ' AND ' $join_object_table_constraint;
  817.                 }
  818.             }
  819.             // une jointure avec une table
  820.             if ($infos_link['type_join'] == 'simple') {
  821.                 // requete avec jointure sur 1 table
  822.                 $sql .= 'FROM ' $dbsource '.' $dest_table ' j1, ' $dbjoin '.' $src_table ' j3
  823.                         WHERE j1.' $dest_table_field '=j3.' $join_field_src '
  824.                         AND j3.' $src_table_field '=' . (int)$idobject;
  825.                 // requete avec jointure sur 3 tables
  826.                 if (!empty($join_object_table_constraint)) {
  827.                     $sql .= ' AND ' $join_object_table_constraint;
  828.                 }
  829.             }
  830.             // ajouter une contrainte sur la table de destination
  831.             if (!empty($infos_link['constraint_dest'])) {
  832.                 $sql .= ' AND j1.' $infos_link['constraint_dest'];
  833.             }
  834.             // contrainte ou autre en plus
  835.             if (!empty($infos_link['where'])) {
  836.                 $sql .= ' ' $infos_link['where'];
  837.             }
  838.             // contrainte ou autre en plus
  839.             if (!empty($infos_link['sql_more'])) {
  840.                 $sql .= ' ' $infos_link['sql_more'];
  841.             }
  842.             // ajouter une contrainte sur la table du miliue par exemple idrole précis
  843.             if (!empty($params['count_only'])) {
  844.                 $nb_items $this->queryOne($sql);
  845.                 return $nb_items;
  846.             }
  847.             $itemslist $this->getEntityManager()->getConnection()->fetchAllAssociativeIndexed($sql);
  848.             // paramètres pour getObjecTtitle
  849.             if (!empty($infos_link['title_params'])) {
  850.                 $params $infos_link['title_params'];
  851.             } else {
  852.                 $params = array();
  853.             }
  854.             if (!empty($itemslist)) {
  855.                 $color null;
  856.                 // index principal
  857.                 $idfield $infos_link['fields'][0];
  858.                 foreach ($itemslist as $key => $value) {
  859.                     // remettre le idtruc dans le tableau
  860.                     $value[$idfield] = $key;
  861.                     $itemslist[$key][$idfield] = $key;
  862.                     // noms pour des listes standard
  863.                     $itemslist[$key]['id'] = $key;
  864.                     if (method_exists($dest_obj'getObjectTitle')) {
  865.                         $itemslist[$key]['view_name'] = $dest_obj->getObjectTitle($key$value$params);
  866.                     }
  867.                     // couleur alternative
  868.                     $color $this->colorAlternate($color);
  869.                     $itemslist[$key]['colorline'] = $color;
  870.                 }
  871.             }
  872.         }
  873.         return $itemslist;
  874.     }
  875.     // }}}
  876.     //  {{{ setRelationSelect()
  877.     /** Enregistrement dans les table relationnelle
  878.      *
  879.      * Permet l'enregistrement multiple de valeur dans les tables
  880.      * de relation
  881.      *
  882.      * @access   public
  883.      * @param string $table Nom de la table de relation
  884.      * @param string $key Clé dans le tableau
  885.      * @param string $col Colonne
  886.      * @param array $array_values Valeur à enregistrer
  887.      * @param int $id Id de l'enregistrement principal
  888.      * @return   bool
  889.      */
  890.     public function setRelationSelect($table$key$col$array_values$id$allRights true$sup_key = array(), $save_order = array())
  891.     {
  892.         $dbco $this->getEntityManager()->getConnection();
  893.         if ($allRights) {
  894.             $rights = array('update' => 1);
  895.         }
  896.         if ($this->isCheckRights() || !$allRights) {
  897.             $extranetusers $this->getEntityManager()->getRepository(Extranetusers::class);
  898.             $rights $extranetusers->getRights();
  899.         }
  900.         if (isset($rights) && $rights['update'] == 1) {
  901.             // on supprime puis on insère (replace ne marche pas)
  902.             $sql_del 'DELETE FROM ' $table ' WHERE ' $col '=\'' $id '\'';
  903.             // aussi le role
  904.             if (!empty($sup_key)) {
  905.                 foreach ($sup_key as $k => $v) {
  906.                     $sql_del .= ' AND ' htmlspecialchars($k) . '=' $this->escape($v);
  907.                 }
  908.             }
  909.             $del $dbco->exec($sql_del);
  910.             // si array_values est vide, c'est qu'on veux supprimer ?
  911.             if (empty($array_values)) {
  912.                 return true;
  913.             }
  914.             if (!is_array($array_values)) {
  915.                 $array_values_stack $array_values;
  916.                 $array_values = array();
  917.                 $array_values[] = $array_values_stack;
  918.             }
  919.             // on prepare l'insertion
  920.             $sql 'INSERT INTO ' $table ' (' $key ', ' $col;
  921.             // le role NON UTILISE ???
  922.             if (!empty($sup_key)) {
  923.                 foreach ($sup_key as $k => $v) {
  924.                     $sql_keys[] = $k;
  925.                     $sql_values[] = strip_tags($v);
  926.                 }
  927.             }
  928.             // le classement
  929.             if (!empty($save_order)) {
  930.                 $sql_keys[] = $save_order['order_field'];
  931.                 $sql_values[] = '?';
  932.             }
  933.             // ajout des clés en plus
  934.             if (!empty($sql_keys)) {
  935.                 $sql .= ', ' join(','$sql_keys);
  936.             }
  937.             $sql .= ') VALUES ( ?, ?';
  938.             // ajout des valeurs en plus
  939.             if (!empty($sql_values)) {
  940.                 $sql .= ', ' join(','$sql_values);
  941.             }
  942.             $sql .= ')';
  943.             $i 1;
  944.             foreach ($array_values as $key => $value) {
  945.                 if ($save_order) {
  946.                     $prep_values = array($value$id$i);
  947.                     $res $dbco->executeQuery($sql$prep_values);
  948.                 } else {
  949.                     $prep_values = array($value$id);
  950.                     $res $dbco->executeQuery($sql$prep_values);
  951.                 }
  952.                 $i++;
  953.             }
  954.             if (!empty($res)) {
  955.                 return $res;
  956.             } else {
  957.                 return false;
  958.             }
  959.         }
  960.     }
  961.     // }}}
  962.     //  {{{ deleteDataRelation()
  963.     /** Suppression
  964.      *
  965.      * Permet de supprimer l'enregistrement dans une relation
  966.      *
  967.      * @access   public
  968.      * @param int $id Id de l'enregistrement principal
  969.      * @param string $table Nom de la table de relation
  970.      * @param string $key Clé dans la tableau
  971.      * @return   bool
  972.      */
  973.     public function deleteDataRelation($table$key$id$key_relation null$id_relation null$object null$objectvalue null$allRights true)
  974.     {
  975.         if ($allRights) {
  976.             $rights = array('delete' => 1);
  977.         }
  978.         if ($this->isCheckRights() || !$allRights) {
  979.             $extranetusers Theatre_Extranetusers::factory('extranetusers');
  980.             $rights $extranetusers->getRights();
  981.         }
  982.         if (isset($rights) && $rights['delete'] == 1) {
  983.             $req 'DELETE FROM ' $table '
  984.                     WHERE ' $key '=\'' $this->escape($id) . '\'';
  985.             if (!empty($object)) {
  986.                 $req .= ' AND ' $object '=\'' $this->escape($objectvalue) . '\'';
  987.                 if (!empty($key_relation)) {
  988.                     $req .= ' AND ' $key_relation '=\'' $this->escape($id_relation) . '\'';
  989.                 }
  990.             }
  991.             $conn $this->getEntityManager()->getConnection();
  992.             //echo 'query : $req<br/>';
  993.             //executer la requete
  994.             $del $conn->prepare($req);
  995.             $del->execute();
  996.             // logguer les delete
  997.             $this->logDeletion($req);
  998.             return true;
  999.         } else {
  1000.             throw new \Exception($GLOBALS['tr']->get('no_right') . 'deleteDataRelation');
  1001.         }
  1002.     }
  1003.     // }}}
  1004.     //  {{{ getInforelation()
  1005.     /** Permet de récupérer les relations qui sont liées lors d'une suppression
  1006.      *
  1007.      * FIXME: à revoir totalement
  1008.      *
  1009.      * @access   public
  1010.      * @param string $table Relation a vérifier
  1011.      * @param string $id Clé dans la tableau
  1012.      * @return   array   $datadelete       Tableau des données
  1013.      */
  1014.     public function getInfoRelation($relation$id$retour null)
  1015.     {
  1016.         //traductions
  1017.         $tr $this->translator;
  1018.         //nombre d'enregistrements trouvés
  1019.         $nbdata 0;
  1020.         $compteur 0;
  1021.         //parcourir chaque requete
  1022.         foreach ($relation as $key => $value) {
  1023.             //compteur
  1024.             $compteur++;
  1025.             $lien $value[3];
  1026.             //selection simple
  1027.             $req 'SELECT DISTINCT(' $value[2] . ') AS clevue,' $value[0] . ' FROM ' $key ' WHERE ' $value[1] . '=\'' $id '\'';
  1028.             if (!empty($value[6])) {
  1029.                 $req .= ' ' $value[6];
  1030.             }
  1031.             $tab $this->queryAll($req);
  1032.             if ($retour) {
  1033.                 return $tab;
  1034.             }
  1035.             if ($tab) {
  1036.                 //créer un tableau vide
  1037.                 $tabdata = array();
  1038.                 //mise en forme de la réponse
  1039.                 foreach ($tab as $cle => $valeur) {
  1040.                     //enregistrement trouvés
  1041.                     foreach ($valeur as $clevaleur => $valeurvaleur) {
  1042.                         //conserver la clé
  1043.                         if ('clevue' == $clevaleur) {
  1044.                             //stocker les valeurs dans le tableau
  1045.                             $cle $valeurvaleur;
  1046.                         }
  1047.                         //conserver l'attribut à afficher
  1048.                         if ($value[0] == $clevaleur) {
  1049.                             //vérifier si on a une fonction liée pour l'affichage
  1050.                             if (!empty($value[5])) {
  1051.                                 $fonctionliee $value[5];
  1052.                             }
  1053.                             //on veut utiliser une autre fonction pour récupérer le champ de l'objet à afficher
  1054.                             if (!empty($fonctionliee)) {
  1055.                                 //instancier un objet correspondant
  1056.                                 $object $this->getEntityManager()->getRepository('TheatreCore\Entity\\' ucfirst($value[4]));
  1057.                                 //déclencher la fonction souhaitée
  1058.                                 $affichage $object->$fonctionliee($cle);
  1059.                                 //mettre notre nouvelle valeur
  1060.                                 $valeurvaleur $affichage;
  1061.                                 //clé pour déclencher la bonne action dans le lien
  1062.                                 $key $value[4];
  1063.                             }
  1064.                             //stocker les valeurs dans le tableau sous forme de lien ou pas
  1065.                             if ($lien) {
  1066.                                 $tabdata[] = array('link' => $key '/edit/id/' $cle'field' => $valeurvaleur);
  1067.                             } else {
  1068.                                 $tabdata[] = array('link' => '''field' => $valeurvaleur);
  1069.                             }
  1070.                             $nbdata++;
  1071.                             break;
  1072.                         }
  1073.                     }
  1074.                 }
  1075.                 //stocker le nouveau tableau (avec un nom unique donc utilisation du compteur)
  1076.                 $datadelete[$key '_' $compteur] = $tabdata;
  1077.                 $compteur++;
  1078.             }
  1079.         }
  1080.         //si on a des enregistrements, retourner le tableau, sinon retourner le tableau vidé
  1081.         if ($nbdata 0) {
  1082.             $compteur 0;
  1083.             //mettre en forme les donnees
  1084.             foreach ($datadelete as $key => $value) {
  1085.                 //enlever le _ et le chiffre ex : texts_3 devient texts et on recupere la traduction
  1086.                 $type substr($key0strrpos($key'_'));
  1087.                 //echo 'key $key<br/>';
  1088.                 //mettre en forme les données si elles sont présentes
  1089.                 if (!empty($value)) {
  1090.                     $tabtraduction[$tr->trans('text_title_' $type) . $compteur] = array($key => $value);
  1091.                 }
  1092.                 $compteur++;
  1093.             }
  1094.             return $tabtraduction;
  1095.         } else {
  1096.             return array();
  1097.         }
  1098.     }
  1099.     // }}}
  1100.     //  {{{ getRelationsArray()
  1101.     /** Tableau des relations
  1102.      *
  1103.      * Relations communes, sinon, redéfini dans la classe fille
  1104.      *
  1105.      * @access   public
  1106.      * @param string $type all/autre info sur une relation précise
  1107.      * @return   array   $array_types       Tableau des relations / de la relation
  1108.      */
  1109.     public function getRelationsArray($type)
  1110.     {
  1111.         $array_types = array(
  1112.             // bookmark_extranetuser idobject/object
  1113.             'bookmark_extranetuser' => array(// enregistrement bookmarké
  1114.                 'type_join' => 'multiple',
  1115.                 'dest_table' => 'extranetusers',
  1116.                 'join_table' => 'bookmark_extranetuser_by_object',
  1117.                 'fields' => array('idextranetuser''lastname''login''email'),
  1118.                 'description' => 'Utilisateur(s) ayant bookmarké cet enregistrement',
  1119.                 'silent_delete_relation' => true,
  1120.                 'do_constraint' => 'bookmark_extranetuser',
  1121.             ),
  1122.             // comments idobject/object
  1123.             'comments' => array(// commentaires sur l'enregistrement
  1124.                 'type_join' => 'simple',
  1125.                 'dest_table' => 'comments',
  1126.                 'dest_table_field' => 'idobject'// link également avec object
  1127.                 'fields' => array('idcomment''lastnamefirstname''comment''module'),
  1128.                 'description' => 'Commentaire(s) lié(s) à cet enregistrement',
  1129.                 'silent_delete_relation' => true,
  1130.                 'do_constraint' => true,
  1131.             ),
  1132.             // faqgroups idobject/object
  1133.             'faqgroups' => array(// faq sur cet enregistrement
  1134.                 'type_join' => 'simple',
  1135.                 'dest_table' => 'faqgroups',
  1136.                 'dest_table_field' => 'idobject'// link également avec object
  1137.                 'fields' => array('idfaqgroup''module''title'),
  1138.                 'description' => 'Faq(s) liée(s) à cet enregistrement',
  1139.                 'do_constraint' => true,
  1140.             ),
  1141.             // object_content idobject/object
  1142.             'object_content' => array(// contenus associé à cet enregistrement
  1143.                 'type_join' => 'multiple',
  1144.                 'dest_table' => 'contents',
  1145.                 'join_table' => 'object_content',
  1146.                 'fields' => array('idcontent''title''text'),
  1147.                 'description' => 'Contenu(s) associé(s) à l\'enregistrement (méthode 2)',
  1148.                 'do_constraint' => true,
  1149.             ),
  1150.             // object_file idobject/object
  1151.             'object_file' => array(// fichiers associés à cet enregistrement
  1152.                 'type_join' => 'multiple',
  1153.                 'dest_table' => 'files',
  1154.                 'join_table' => 'object_file',
  1155.                 'fields' => array('idfile''title''file'),
  1156.                 'description' => 'Fichier(s) associé(s) à l\'enregistrement',
  1157.                 'do_constraint' => true,
  1158.             ),
  1159.             // object_multimedia idobject/object
  1160.             'object_multimedia' => array(// multimedias associés à cet enregistrement
  1161.                 'type_join' => 'multiple',
  1162.                 'dest_table' => 'multimedias',
  1163.                 'join_table' => 'object_multimedia',
  1164.                 'fields' => array('idmultimedia''sujet_titre''description'),
  1165.                 'description' => 'Document(s) multimedia(s) associé(s) à cet enregistrement',
  1166.                 'do_constraint' => true,
  1167.             ),
  1168.             // quizgroups idobject/object
  1169.             'quizgroups' => array(// commentaires sur des contacts
  1170.                 'type_join' => 'simple',
  1171.                 'dest_table' => 'quizgroups',
  1172.                 'dest_table_field' => 'idobject'// link également avec object
  1173.                 'fields' => array('idquizgroup''module''description'),
  1174.                 'description' => 'Quiz(s) lié(s) à ce contact',
  1175.                 'do_constraint' => true,
  1176.             ),
  1177.             // user_action idobject/object (obligatoire)
  1178.             'user_action' => array(// action sur cette fiche
  1179.                 'type_join' => 'multiple',
  1180.                 'dest_table' => 'extranetusers',
  1181.                 'join_table' => 'user_action_by_object',
  1182.                 'fields' => array('idextranetuser''login''email'),
  1183.                 'description' => 'Utilisateur(s) ayant travaillé(s) ce contact',
  1184.                 'silent_delete_relation' => true,
  1185.                 'hide_relation' => true,
  1186.                 'do_constraint' => 'user_action',
  1187.             ),
  1188.             // stats idobject/object (obligatoire)
  1189.             /*'stats' => array(// statistiques sur cette fiche
  1190.                  'type_join' => 'multiple',
  1191.                  'dest_table' => 'stats',
  1192.                  'join_table' => 'stats_by_object',
  1193.                  'fields' => array('idstat','object','idobject'),
  1194.                  'description' => 'Statistique(s) sur cet objet',
  1195.                  'silent_delete_relation' => true,
  1196.                  'hide_relation' => true,
  1197.                  'do_constraint' => 'stats',
  1198.              ),
  1199.              // stats idobject/object (obligatoire)
  1200.             'statscumul' => array(// statistiques sur cette fiche
  1201.                  'type_join' => 'multiple',
  1202.                  'dest_table' => 'statscumul',
  1203.                  'join_table' => 'statscumul_by_object',
  1204.                  'fields' => array('idstat','object','idobject'),
  1205.                  'description' => 'Statistique(s) sur cet objet (cumul)',
  1206.                  'silent_delete_relation' => true,
  1207.                  'hide_relation' => true,
  1208.                  'do_constraint' => 'statscumul',
  1209.              ),*/
  1210.         );
  1211.         if ($type == 'all') {
  1212.             return $array_types;
  1213.         } else {
  1214.             return null;
  1215.         }
  1216.     }
  1217.     // }}}
  1218.     /** checker toutes les relations d'un objet
  1219.      *
  1220.      * @param int $idobject Id de l'objet
  1221.      * @param string $object Type d'objet
  1222.      * @param stringa $filtre Filtrer les éléments à ne pas afficher
  1223.      * @return      array
  1224.      * @access      public
  1225.      */
  1226.     public function checkAllRelations($idobject$object$filtre null)
  1227.     {
  1228.         $linked_items = array();
  1229.         // on boucle sur le tableau des relations
  1230.         $infos_links $this->getRelationsArray('all');
  1231.         foreach ($infos_links as $k => $v) {
  1232.             if (empty($v['hide_relation'])) {
  1233.                 // les items liés
  1234.                 $items $this->getLinkedObject($v$idobject$k$object);
  1235.                 if (!empty($items) and !empty($v['dest_table'])) {
  1236.                     $infos_linked = array(
  1237.                         'description' => $v['description'],
  1238.                         'object' => $v['dest_table'],
  1239.                     );
  1240.                     // pour le calendrier, on affiche seulement un message
  1241.                     if (!empty($v['only_message'])) {
  1242.                         $infos_linked['message'] = count($items);
  1243.                     } else {
  1244.                         $infos_linked['values'] = $items;
  1245.                     }
  1246.                     // ne pas afficher les liens d'é"ditions"'
  1247.                     if (!empty($v['no_edit_links'])) {
  1248.                         $infos_linked['no_edit_links'] = true;
  1249.                     }
  1250.                     // afficher les liens de destinationation
  1251.                     if (!empty($v['dest_table_field'])) {
  1252.                         $infos_linked['dest_table_field'] = $v['dest_table_field'];
  1253.                     }
  1254.                     // filtrer par silent_delete_relation
  1255.                     if (!empty($filtre)) {
  1256.                         // sépare ceux qui sont effacé sans préavis et les autres
  1257.                         if (!empty($v['silent_delete_relation'])) {
  1258.                             $linked_items['silent'][$k] = $infos_linked;
  1259.                         } else {
  1260.                             $linked_items['check'][$k] = $infos_linked;
  1261.                         }
  1262.                     } else {
  1263.                         $linked_items[$k] = $infos_linked;
  1264.                     }
  1265.                 }
  1266.             }
  1267.         }
  1268.         return $linked_items;
  1269.     }
  1270.     // }}}
  1271.     //  {{{ isOnline()
  1272.     /** En ligne ou hors ligne
  1273.      *
  1274.      * Permet de vérifier si un enregistrement est en ligne ou pas
  1275.      *
  1276.      * @param int $id Valeur du champ index pour l'enregistrement
  1277.      * @return      boolean
  1278.      * @access      public
  1279.      */
  1280.     public function isOnline($id)
  1281.     {
  1282.         return $this->publish != 0;
  1283.     }
  1284.     // }}}
  1285.     //  {{{ setStatus()
  1286.     /** Change le statut en ligne ou hors ligne
  1287.      *
  1288.      * La pluspart du temps, mets à yes ou no le champ 'publish'
  1289.      *
  1290.      * @param int $id Valeur du champ index pour l'enregistrement
  1291.      * @return      boolean
  1292.      * @access      public
  1293.      */
  1294.     public function setStatus($id null$status 1$field null$allRights true)
  1295.     {
  1296.         // on a les droits de changer le status ?
  1297.         if ($allRights) {
  1298.             $rights = array('isadmin' => 1);
  1299.         }
  1300.         if ($this->setCheckRights() || !$allRights) {
  1301.             $extranetusers Theatre_Extranetusers::factory('extranetusers');
  1302.             $rights $extranetusers->getRights();
  1303.         }
  1304.         if (isset($rights) && $rights['isadmin'] == 1) {
  1305.             if (empty($id)) {
  1306.                 $id $this->id;
  1307.             }
  1308.             if (empty($field)) {
  1309.                 $field 'publish';
  1310.             }
  1311.             // champ à mettre à jour
  1312.             $this->selectAdd();
  1313.             $this->selectAdd($field);
  1314.             $this->get($id);
  1315.             $this->$field $status;
  1316.             return $this->update();
  1317.         } else {
  1318.             throw new \Exception($GLOBALS['tr']->get('no_rights') . ' setStatus');
  1319.         }
  1320.     }
  1321.     // }}}
  1322.     //  {{{ setPublishStatus()
  1323.     /** Définir si on veut les contenus publiés ou pas
  1324.      *
  1325.      * Par défaut => tous
  1326.      *
  1327.      * @access   public
  1328.      * @param int $publish 1 = publie, 0 = non publie, 2 = tous
  1329.      */
  1330.     public function setPublishStatus($publish_status 2)
  1331.     {
  1332.         $this->publish_status $publish_status;
  1333.     }
  1334.     // }}}
  1335.     //  {{{ getCountry()
  1336.     /** Récupére le nom d'un pays
  1337.      *
  1338.      *
  1339.      * @access   public
  1340.      * @param string $code Le code du pays
  1341.      * @return   string
  1342.      */
  1343.     public function getNameCountry($code null)
  1344.     {
  1345.         if ($code) {
  1346.             if (!empty($this->countriesLoaded[$code])) {
  1347.                 return $this->countriesLoaded[$code];
  1348.             }
  1349.             $country $this->queryOne('SELECT fr FROM countries WHERE id=\'' $code '\'');
  1350.             $this->countriesLoaded[$code] = $country;
  1351.             return $country;
  1352.         }
  1353.     }
  1354.     // }}}
  1355.     // {{{ getCachedList()
  1356.     /** Méthode générique pour les listes, avec mise en cache
  1357.      *
  1358.      *
  1359.      * @param string $name nom de la liste
  1360.      * @param string $req la requête pour obtenir la liste
  1361.      * @param boolean $order utilisé form_def
  1362.      * @param string $form_def clé langterms pour la valeur par défaut (tête de liste)
  1363.      * @access protected
  1364.      * @return array    la liste
  1365.      */
  1366.     protected function getCachedList($name$req$order true$form_def null$clear true)
  1367.     {
  1368.         // cache
  1369. //        require_once PATH_LIBS.'Cache/Theatre_cache.php';
  1370. //        $optCache = array(
  1371. //            'cacheDir' => PATH_TMP.'other/',
  1372. //            'lifeTime' => 3600*24,
  1373. //            'fileNameProtection' => false,
  1374. //        );
  1375. //        $c = new Theatre_cache($optCache);
  1376.         $id $name '_fr' . ((int)$order);
  1377.         // vider le cache si on le demande ou si cache désacvtiver avec USE_CACHE
  1378. //        if($this->canUpdateCache($name) || !USE_CACHE) {
  1379. //            $c->remove($id);
  1380. //        }
  1381.         // il y a le cache
  1382. //        if ($data = $c->get($id)) {
  1383. //            return unserialize($data);
  1384. //        }
  1385.         // pas en cache, on execute la requête
  1386.         $list $this->queryAll($req, array(), nulltrue);
  1387.         //Placeolder obselète.
  1388. //        if($order && $form_def) {
  1389. //            array_unshift($list, $this->translator->trans($form_def));
  1390. //        }
  1391.         if ($clear) {
  1392.             foreach ($list as $key => $value) {
  1393.                 if (is_array($value)) {
  1394.                     $list[$key] = reset($value);
  1395.                 } else {
  1396.                     $list[$key] = $value;
  1397.                 }
  1398.             }
  1399.         }
  1400.         $list array_flip($list);
  1401.         // sauvegarde la liste dans le cache
  1402. //        $c->save(serialize($list));
  1403.         return $list;
  1404.     }
  1405.     // }}}
  1406.     // {{{ getCachedListForCountries()
  1407.     /** Méthode générique pour les listes, avec mise en cache
  1408.      * Modifiée car ne fonctionnait comme souhaité pas pour la liste des pays
  1409.      *
  1410.      *
  1411.      * @param string $name nom de la liste
  1412.      * @param string $req la requête pour obtenir la liste
  1413.      * @param boolean $order utilisé form_def
  1414.      * @param string $form_def clé langterms pour la valeur par défaut (tête de liste)
  1415.      * @access protected
  1416.      * @return array    la liste
  1417.      */
  1418.     protected function getCachedListForCountries($name$req$order true$form_def null$clear true)
  1419.     {
  1420.         $id $name '_fr' . ((int)$order);
  1421.         // pas en cache, on execute la requête
  1422.         $list $this->queryAll($req, array(), nulltrue);
  1423.         $listToReturn = [];
  1424.         if ($clear) {
  1425.             foreach ($list as $key => $value) {
  1426.                 if (is_array($value)) {
  1427.                     $listToReturn[reset($value)] = $value['id'];
  1428.                 }
  1429.             }
  1430.         }
  1431.         return $listToReturn;
  1432.     }
  1433.     // }}}
  1434.     //  {{{ getCountryList()
  1435.     /** Récupére la liste des pays
  1436.      *
  1437.      * Récupére tous les pays pour les listes
  1438.      * déroulantes par exemple (mis en cache)
  1439.      *
  1440.      * @access   public
  1441.      * @return   array
  1442.      * @see      getCountry()
  1443.      */
  1444.     public function getCountryList($order true)
  1445.     {
  1446.         $name 'country_list';
  1447. //        $req = 'SELECT id,' . $GLOBALS['lng'] . ' FROM countries ORDER BY orderby,' . $GLOBALS['lng'];
  1448.         $req 'SELECT ' $GLOBALS['lng'] . ', id FROM countries ORDER BY orderby,' $GLOBALS['lng'];
  1449.         $form_def 'form_def_country';
  1450.         return $this->getCachedListForCountries($name$req$order$form_def);
  1451.     }
  1452.     // }}}
  1453.     //  {{{ getContinentList()
  1454.     /** Récupére la liste des continents
  1455.      *
  1456.      * Récupére tous les continents pour les listes
  1457.      * déroulantes par exemple
  1458.      *
  1459.      * @access   public
  1460.      * @return   array
  1461.      * @see      getCountry()
  1462.      */
  1463.     public function getContinentList($order false)
  1464.     {
  1465.         $name 'continent_list';
  1466.         $req 'SELECT id,fr FROM continents';
  1467.         $form_def null;
  1468.         return $this->getCachedList($name$req$order$form_def);
  1469.     }
  1470.     // }}}
  1471.     //  {{{ getLanguageList()
  1472.     /** Récupére toutes les langues
  1473.      *
  1474.      * Récupére toutes les langues pour les listes
  1475.      * déroulantes par exemple
  1476.      *
  1477.      * @access   public
  1478.      * @return   array
  1479.      * @see      getLanguage()
  1480.      */
  1481.     public function getLanguageList($order true)
  1482.     {
  1483.         $name 'language_list';
  1484.         $req 'SELECT id,fr FROM languages ORDER BY orderby,fr';
  1485.         $form_def 'form_def_language';
  1486.         return $this->getCachedList($name$req$order$form_def);
  1487.     }
  1488.     // }}}
  1489.     //  {{{ getItemsList()
  1490.     /** Récupération des items dans les champs relation_select
  1491.      *
  1492.      * @access public
  1493.      * @param  $idobject Identifiant de l'objet
  1494.      * @param  $type Type de données à récupérer
  1495.      * @return string
  1496.      */
  1497.     public function getItemsList($idobject null$type$src null)
  1498.     {
  1499.         $infos_link $this->getRelationsArray($type);
  1500.         // retourne le tableau des items liés
  1501.         if (!empty($infos_link)) {
  1502.             $itemslist $this->getLinkedObject($infos_link$idobject$infos_link['type'], $this->__table);
  1503.             return $itemslist;
  1504.         }
  1505.         return 'Aucune fonction de recherche pour le type <strong>' $type '</strong> dans la méthode !';
  1506.     }
  1507.     // }}}
  1508.     //  {{{ getLanguage()
  1509.     /** Récupére le nom d'une langue
  1510.      *
  1511.      *
  1512.      * @access   public
  1513.      * @param string $code Le code de la langue
  1514.      * @return   string
  1515.      */
  1516.     public function getNameLanguage($code null$lng null)
  1517.     {
  1518.         // renvoyer dans la langue
  1519.         if ($lng) {
  1520.             $field $lng;
  1521.         } else {
  1522.             $field $GLOBALS['lng'];
  1523.         }
  1524.         if ($code) {
  1525.             return $this->queryOne('SELECT ' $field ' FROM languages WHERE id=\'' $code '\'');
  1526.         }
  1527.     }
  1528.     // }}}
  1529.     //  {{{ colorAlternate()
  1530.     /** Alternance des couleurs
  1531.      *
  1532.      * permet d'alterner les couleurs dans les les tableaux de données
  1533.      *
  1534.      * @access   public
  1535.      * @param    $color  La couleur en cours
  1536.      * @return   string
  1537.      */
  1538.     public function colorAlternate($color)
  1539.     {
  1540.         if (!isset($color) || $color == 'two') {
  1541.             return 'one';
  1542.         } else {
  1543.             return 'two';
  1544.         }
  1545.     }
  1546.     // }}}
  1547.     //  {{{ cutSentence()
  1548.     /** Coupe une phrase
  1549.      *
  1550.      * coupe un phrase et colle les petits points
  1551.      *
  1552.      * @access   public
  1553.      * @param string $texte le texte a couper
  1554.      * @param int $nbcar le nombre de cacractère
  1555.      * @return   string
  1556.      */
  1557.     public function cutSentence($texte$nbcar null$simple null)
  1558.     {
  1559.         // taille
  1560.         $taille_texte strlen($texte);
  1561.         if ($simple) {
  1562.             $new_texte mb_substr($texte0$nbcar);
  1563.             if ($taille_texte strlen($new_texte)) {
  1564.                 return $new_texte '...';
  1565.             } else {
  1566.                 return $new_texte;
  1567.             }
  1568.         }
  1569.         if ($taille_texte $nbcar && (!= $nbcar)) {
  1570.             $Tmp_Tb explode(' '$texte);
  1571.             $Tmp_Count 0;
  1572.             $Tmp_O '';;
  1573.             foreach ($Tmp_Tb as $key) {
  1574.                 if (strlen($Tmp_O) >= $nbcar) break;
  1575.                 $Tmp_O .= $key ' ';
  1576.             }
  1577.             $Tmp_O substr($Tmp_O0strlen($Tmp_O) - 1);
  1578.             if (count($Tmp_Tb) > 1)
  1579.                 $Tmp_O .= '...';
  1580.         } else {
  1581.             $Tmp_O $texte;
  1582.         }
  1583.         return $Tmp_O;
  1584.     }
  1585.     // }}}
  1586.     //  {{{ getFormeDate()
  1587.     /** Mise en forme de la date pour entree ou sortie
  1588.      *
  1589.      *
  1590.      * @access   public
  1591.      * @param string $dateentree date en entree
  1592.      * @param string $sortie format de sortie
  1593.      * @return   string
  1594.      */
  1595.     public function getFormeDate($dateentree$sortie 'Y-m-d'$st false)
  1596.     {
  1597.         // si il y a des / = format FR
  1598.         if (gettype($dateentree) == 'string') {
  1599.             $exp explode('/'$dateentree);
  1600.             if (count($exp) > 1) {
  1601.                 $dateentree $exp[2] . '-' $exp[1] . '-' $exp[0];
  1602.             }
  1603.             if ($st) {
  1604.                 setLocale(LC_TIME"fr_FR.utf8");
  1605.                 /* @Deprecated in php 8.1 */
  1606.                 return strftime($sortiestrtotime($dateentree));
  1607.             } else {
  1608.                 return date($sortiestrtotime($dateentree));
  1609.             }
  1610.         } else if (!empty($dateentree)) {
  1611.             $fmt datefmt_create(
  1612.                 'fr_FR',
  1613.                 \IntlDateFormatter::FULL,
  1614.                 \IntlDateFormatter::FULL,
  1615.                 'Europe/Paris',
  1616.                 \IntlDateFormatter::GREGORIAN,
  1617.                 "EEEE d MMMM y"
  1618.             );
  1619.             return $fmt->format($dateentree);
  1620.         }
  1621.     }
  1622.     // }}}
  1623.     //  {{{ getYear()
  1624.     /** Retourne l'année pour une date donnée
  1625.      *
  1626.      * @access   public
  1627.      * @param string $date date
  1628.      * @param string $fmt format (date()) 'Y' par défaut
  1629.      * @return   string|boolean  false si erreur, l'annee sinon
  1630.      */
  1631.     public function getYear($date null$fmt 'Y')
  1632.     {
  1633.         if (!empty($date)) {
  1634.             $timestamp strtotime($date);
  1635.             if ($timestamp !== false) {
  1636.                 $year date($fmt$timestamp);
  1637.                 if ((int)$year !== 0) return $year;
  1638.             }
  1639.         }
  1640.         return false;
  1641.     }
  1642.     // }}}
  1643.     //  {{{ getThumbnail()
  1644.     /** Crée les images redimensionnee
  1645.      *
  1646.      * Cree des images a la taille voulue et les mets dans le reprertoire de la taille en question
  1647.      * cree le rep si il n'existe pas, renvoi l'image simplement si elle exsiste
  1648.      *
  1649.      * @access   public
  1650.      * @param imgfile string Image originale
  1651.      * @return   array
  1652.      * @see      Theatre_Images::getThumbnail
  1653.      *
  1654.      */
  1655.     public function getThumbnail($imgfile$thumb_size 100$direction 'normal'$params = array())
  1656.     {
  1657.         return $this->images->getThumbnail($imgfile$thumb_size$direction$params);
  1658.     }
  1659.     // }}}
  1660.     //  {{{ checkAccess()
  1661.     /** Verifier l'acces pour la partie public
  1662.      *
  1663.      * @access   public
  1664.      * @return   string
  1665.      */
  1666.     public function checkAccess($sql$tabdroits)
  1667.     {
  1668.         // verifier la langue
  1669.         if ((IS_LANGUAGE || !empty($this->checkLanguage))
  1670.             && !empty($tabdroits['language'])) {
  1671.             $sql .= ' AND ' $tabdroits['language'] . '=\'' $GLOBALS['lng'] . '\'';
  1672.         }
  1673.         // verifier la presence en ligne
  1674.         if ($_ENV['CHECK_IF_ONLINE'] && !empty($tabdroits['publish'])) {
  1675.             $sql .= ' AND ' $tabdroits['publish'] . '=1';
  1676.         }
  1677.         return $sql;
  1678.     }
  1679.     // }}}
  1680.     //  {{{ checkLanguage()
  1681.     /** Verifier la langue
  1682.      *
  1683.      * @access   public
  1684.      * @return   string
  1685.      */
  1686.     public function setCheckLanguage($val true)
  1687.     {
  1688.         // verifier la langue
  1689.         $this->checkLanguage $val;
  1690.     }
  1691.     // }}}
  1692.     //  {{{ wikiTransform()
  1693.     /** Transformer les champs wiki en html
  1694.      *
  1695.      * @access   public
  1696.      * @param string $str chaine au format wiki
  1697.      * @return   string
  1698.      */
  1699.     public function wikiTransform($str$markdown false)
  1700.     {
  1701.         if ($markdown) {
  1702.             $parser = new MarkdownExtra();
  1703.             return $parser->transform($str);
  1704.         }
  1705.         $wiki = new wiki2xhtml();
  1706.         return $wiki->transform($str);
  1707.     }
  1708.     // }}}
  1709.     //  {{{ getUrlClean()
  1710.     /** Retourne l"url clean d'un objet
  1711.      *
  1712.      * @access   public
  1713.      * @return bool
  1714.      */
  1715.     public function getUrlClean($idobject$object)
  1716.     {
  1717.         $idx 'id' substr($object0, -1);
  1718.         return $this->queryOne('SELECT url_clean FROM ' $object ' WHERE ' $idx '=\'' $idobject '\'');
  1719.     }
  1720.     // }}}
  1721.     //  {{{ getIdByUrl()
  1722.     /** Retourne l'id d'un objet à partir de son url
  1723.      *
  1724.      * @access   public
  1725.      * @param string $url_clean L'URL
  1726.      * @return false|int
  1727.      */
  1728.     public function getIdByUrl($url_clean$strict true$return_array false$operator '=')
  1729.     {
  1730.         // recherche strict = pâs de résultat aprochant = un seul résultat ou rien
  1731.         if ($strict) {
  1732.             // multimedias
  1733.             if ($this->__table == 'multimedias') {
  1734.                 $sql_id 'SELECT DISTINCT(`' $this->__idtable '`)  as id, url_clean
  1735.                            FROM ' $this->__table '
  1736.                            WHERE url_clean' $operator '\'' $this->escape($url_clean) . '\'
  1737.                            OR code=\'' $this->escape($url_clean) . '\' ';
  1738.             } else {
  1739.                 $sql_id 'SELECT DISTINCT(`' $this->__idtable '`)  as id, url_clean
  1740.                            FROM ' $this->__table '
  1741.                            WHERE url_clean' $operator '\'' $this->escape($url_clean) . '\' ';
  1742.             }
  1743.             if ($return_array) {
  1744.                 $id $this->queryAll($sql_id);
  1745.                 return $id;
  1746.             } else {
  1747.                 $id $this->queryOne($sql_id);
  1748.                 if ($id && $id 0) {
  1749.                     return $id;
  1750.                 }
  1751.                 return false;
  1752.             }
  1753.             // recherche pouvant renvoyer plusieurs résultats
  1754.         } else {
  1755.             // convertit l'URL dans un bon format comme dans la base
  1756.             if (!isset($this->ct)) {
  1757.                 $ct = new Cleantext($this->getEntityManager());
  1758.                 $this->ct $ct;
  1759.             }
  1760.             // recherche prénom/nom ou nom/prénom
  1761.             if ($this->__table == 'persons') {
  1762.                 $urls explode(' '$url_clean);
  1763.                 if (count($urls) == 2) {
  1764.                     $sql_ids 'SELECT DISTINCT(`' $this->__idtable '`) as id, url_clean
  1765.                                FROM ' $this->__table '
  1766.                                WHERE
  1767.                                url_clean LIKE \'%' $this->escape($ct->str2URL($urls[0] . '-' $urls[1])) . '%\'
  1768.                                OR url_clean LIKE \'%' $this->escape($ct->str2URL($urls[1] . '-' $urls[0])) . '%\' ';
  1769.                 } else {
  1770.                     $sql_ids 'SELECT DISTINCT(`' $this->__idtable '`) as id, url_clean
  1771.                                FROM ' $this->__table '
  1772.                                WHERE url_clean LIKE \'%' $this->escape($ct->str2URL($url_clean)) . '%\' ';
  1773.                 }
  1774.             } else {
  1775.                 $sql_ids 'SELECT DISTINCT(`' $this->__idtable '`) as id, url_clean
  1776.                            FROM ' $this->__table '
  1777.                            WHERE url_clean LIKE \'%' $this->escape($ct->str2URL($url_clean)) . '%\' ';
  1778.             }
  1779.             $ids $this->queryAll($sql_ids);
  1780.             if (!empty($ids)) {
  1781.                 return $ids;
  1782.             }
  1783.             return array();
  1784.         }
  1785.     }
  1786.     // }}}
  1787.     //  {{{ canUpdateCache()
  1788.     /** Peux t'on vider le cache ?
  1789.      *
  1790.      * @access   public
  1791.      * @return bool
  1792.      */
  1793.     public function canUpdateCache($type_cache 'all')
  1794.     {
  1795.         if (isset($_GET['calcul'])
  1796.             && (isset($_COOKIE['delcache']) || isset($_SESSION['extranet']))
  1797.             && (isset($_GET['type_cache']) &&
  1798.                 ($_GET['type_cache'] == 'all' || $_GET['type_cache'] == $type_cache))
  1799.         ) {
  1800.             // A FAIRE : ecrire les caches qui sont vide dans un logs ?
  1801.             return true;
  1802.         }
  1803.         return false;
  1804.     }
  1805.     // }}}
  1806.     //  {{{ setDebugView()
  1807.     /** Enregistrer des informatons des debugages
  1808.      *
  1809.      * @access protected
  1810.      * @return bool
  1811.      */
  1812.     protected function setDebugView($debug$methode)
  1813.     {
  1814.         $this->debug_view[] = $debug;
  1815.     }
  1816.     // }}}
  1817.     //  {{{ getDebugView()
  1818.     /** Consulter les informations de debugage
  1819.      *
  1820.      * @access public
  1821.      * @return bool
  1822.      */
  1823.     public function getDebugView($active true)
  1824.     {
  1825.         if (isset($this->debug_view)) {
  1826.             return $this->debug_view;
  1827.         }
  1828.     }
  1829.     // }}}
  1830.     //  {{{ getObjectsList()
  1831.     /** Liste des valeurs acceptables du champ object
  1832.      *
  1833.      *
  1834.      * @access public
  1835.      * @param array $list liste optionnelle des valeurs acceptées
  1836.      * @return array
  1837.      * @see setValidObjects()
  1838.      */
  1839.     public function getObjectsList($list null)
  1840.     {
  1841.         if (!empty($list)) {
  1842.             $this->setValidObjects($list);
  1843.         }
  1844.         $sql 'SHOW COLUMNS FROM ' $this->__table ' WHERE Field = \'object\'';
  1845.         $res $this->queryAll($sql);
  1846.         $tmp_object_values = array();
  1847.         if (isset($res[0]['Type'])) {
  1848.             $tmp_object_values explode(','substr($res[0]['Type'], 5, -1));
  1849.         }
  1850.         $possible_object_values = array();
  1851.         foreach ($tmp_object_values as $v) {
  1852.             $v trim($v'\''); // suppression des '' autour des valeurs
  1853.             if (empty($this->object_accept) || in_array($v$this->object_accept)) {
  1854.                 $possible_object_values[$v] = ucfirst($v);
  1855.             }
  1856.         }
  1857.         return $possible_object_values;
  1858.     }
  1859.     // }}}
  1860.     //  {{{ setValidObjects()
  1861.     /** Définie les valeurs acceptables pour le champ object
  1862.      *
  1863.      *
  1864.      * @access public
  1865.      * @param array $list tableau des valeurs
  1866.      * @return array
  1867.      * @see getObjectsList()
  1868.      */
  1869.     public function setValidObjects($list null)
  1870.     {
  1871.         if (empty($list) || !is_array($list)) {
  1872.             $this->object_accept = array();
  1873.             return;
  1874.         }
  1875.         $this->object_accept $list;
  1876.     }
  1877.     // }}}
  1878.     // {{{ splitKeywords()
  1879.     /** Sépare les mots clés en deux listes: une contenant les nombres, et une autre contenant tout
  1880.      *
  1881.      *
  1882.      * @param string $keywords la chaine contenant les mots clés
  1883.      * @param string $separator le séparateur à utiliser (par défaut l'espace)
  1884.      * @access public
  1885.      * @return array|bool retourne un tableau contenant un ou deux sous-tableaux indexés par $this->IDNUM et $this->IDSTR
  1886.      */
  1887.     public function splitKeywords($keywords$separator ' ')
  1888.     {
  1889.         $list = array();
  1890.         if (!empty($keywords)) {
  1891.             $keywords_list explode($separatortrim($keywords));
  1892.             if (!empty($keywords_list)) {
  1893.                 foreach ($keywords_list as $kw) {
  1894.                     if ($this->my_is_int($kw)) {
  1895.                         $list[$this->IDNUM][] = (int)$kw;
  1896.                     }
  1897.                     $kw trim($kw);
  1898.                     if ($kw) {
  1899.                         $list[$this->IDSTR][] = $this->escape($kw);
  1900.                     }
  1901.                 }
  1902.             }
  1903.         }
  1904.         return $list;
  1905.     }
  1906.     // }}}
  1907.     //  {{{ getMultimediaList()
  1908.     /** Liste des multimedias associés à l'objet, pour les boites ajax_relation
  1909.      *
  1910.      *
  1911.      * @access  public
  1912.      * @param int $idobject identifiant de l'objet
  1913.      * @param string $type type recherché
  1914.      * @param boolean $only_published seulement les multimédias publiés (par défaut: false)
  1915.      * @return  array
  1916.      */
  1917.     public function getMultimediaList($idobject$type$only_published false)
  1918.     {
  1919.         $infos = array();
  1920.         $query 'SELECT m.idmultimedia, m.sujet_titre, m.publish FROM multimedias m, object_multimedia om
  1921.                   WHERE m.idmultimedia=om.idmultimedia';
  1922.         switch ($type) {
  1923.             case 'multimedia_content':
  1924.                 // on a deja l'id ?
  1925.                 if (empty($idobject)) {
  1926.                     $idobject $this->idcontent;
  1927.                 }
  1928.                 $query .= ' AND om.object=\'contents\'';
  1929.                 break;
  1930.             case 'spectacle_trailer':
  1931.                 // on a deja l'id ?
  1932.                 if (empty($idobject)) {
  1933.                     $idobject $this->idspectacle;
  1934.                 }
  1935.                 $query .= ' AND om.object=\'spectacles\'
  1936.                             AND om.idrole=24';
  1937.                 break;
  1938.             case 'text_trailer':
  1939.                 // on a deja l'id ?
  1940.                 if (empty($idobject)) {
  1941.                     $idobject $this->idtext;
  1942.                 }
  1943.                 $query .= ' AND om.object=\'texts\'
  1944.                             AND om.idrole=24';
  1945.                 break;
  1946.             default:
  1947.                 error_log(__FUNCTION__ ': Type inconnu:' $type);
  1948.                 return false;
  1949.         }
  1950.         $query .= ' AND om.idobject=' . ((int)$idobject);
  1951.         if ($only_published) {
  1952.             $query .= ' AND m.publish=1';
  1953.         }
  1954.         $p $this->query($query);
  1955.         foreach ($p as $r) {
  1956.             $key $r['idmultimedia'];
  1957.             $infos[$key] = array('sujet_titre' => $r['sujet_titre']);
  1958.             $infos[$key]['view_name'] = &$infos[$key]['sujet_titre'];
  1959.             $infos[$key]['title'] = $infos[$key]['sujet_titre'] . ' (' $key ')';
  1960.             if (empty($r['publish'])) {
  1961.                 $infos[$key]['class'] = 'unpublished';
  1962.                 $infos[$key]['title'] .= ' - non publié';
  1963.             }
  1964.         }
  1965. //        $p->free();
  1966.         // retourner les infos
  1967.         return $infos;
  1968.     }
  1969.     // }}}
  1970.     //  {{{ getObjectsCarrerDetails()
  1971.     /** Message permettant de récupérer tous les détails des spectacles etc.
  1972.      *
  1973.      * @access   public
  1974.      * @param int $idobject Identifiant de l'item
  1975.      * @param string $object Type de contenu
  1976.      * @return   string
  1977.      */
  1978.     public function getObjectsCarrerDetails($idobject null$object 'spectacles', ?AdapterInterface $cache null)
  1979.     {
  1980. //        101 CRITIQUES
  1981. //        125 EDUC
  1982.         $totalVideos $this->getEntityManager()->getRepository(Multimedias::class)->getMultimediasBy($object$idobjectnull'count');
  1983.         $totalAudios $this->getEntityManager()->getRepository(Podcasts::class)->countPodcasts($object$idobject'franceinter');
  1984.         $telechargements $this->getEntityManager()->getRepository(Files::class)->countObjectFiles(
  1985.             $idobject$object,
  1986.             $this->getEntityManager()->getRepository(Classifications::class)->getClassificationList('files'$objectnull, array(1), 'get_value'),
  1987.             array(
  1988.                 'valid' => 1,
  1989.                 'publish' => 1,
  1990.                 'force_mode' => 'file',
  1991.             )
  1992.         );
  1993. //        $infos['ensavoirplus'] = 0;
  1994.         if ($object == 'persons') {
  1995.             // les objets
  1996.             $spectacles $this->getEntityManager()->getRepository(Spectacles::class);
  1997.             $texts $this->getEntityManager()->getRepository(Texts::class);
  1998.             $idpectacles $texts->getTextsPersons($idobject);
  1999.             $sql_all_spectacles 'SELECT DISTINCT s.`idspectacle`
  2000.                                FROM spectacles s
  2001.                                LEFT JOIN spectacle_person sp ON sp.`idspectacle`=s.`idspectacle`
  2002.                                LEFT JOIN text_spectacle ts ON ts.`idspectacle`=s.`idspectacle`
  2003.                                WHERE s.`publish`=1 AND s.`valid`=1
  2004.                                AND (sp.`idperson`=' $idobject;
  2005.             // les textes de la personne
  2006.             if (!empty($idpectacles)) {
  2007.                 $sql_all_spectacles .= ' OR ts.`idtext` IN (' implode(','$idpectacles) . ' ) ';
  2008.             }
  2009.             // spectacles publiés
  2010.             $sql_all_spectacles .= ')';
  2011.             if ($cache) {
  2012.                 $cacheItem $cache->getItem("theatreTrait_getObjectsCarrerDetails_{$idobject}_" implode('-'$idpectacles));
  2013.                 if (!$cacheItem->isHit()) {
  2014.                     $res $texts->queryAll($sql_all_spectacles);
  2015.                     $cacheItem->set($res)
  2016.                         ->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
  2017.                     $cache->save($cacheItem);
  2018.                 }
  2019.                 $ids_spectacles $cacheItem->get();
  2020.             } else {
  2021.                 $ids_spectacles $texts->queryAll($sql_all_spectacles);
  2022.             }
  2023.             $ids_spectacles array_map('current'$ids_spectacles);
  2024.             $nb_educ null;
  2025.             $idtexts_person $this->getEntityManager()->getRepository(Texts::class)->getTextsPersons($idobject'all''all'true);
  2026.             // les textes de la personne avec un contenu éduc
  2027.             if (!empty($idtexts_person)) {
  2028.                 $list_texts $texts->getListTexts(array(
  2029.                     'special' => array(
  2030.                         'idclassification' => array(125), // classification educ
  2031.                         'idtext' => $idtexts_person// textes de la personne
  2032.                         'join' => true// texte pas forcément publié
  2033.                     ),
  2034.                     'dbg' => array('list_texts''Liste des textes à contenus pédagogiques')
  2035.                 ));
  2036.                 if (!empty($list_texts)) {
  2037.                     foreach ($list_texts as $k => $v) {
  2038.                         $list_texts[$k]['url_clean_more'] = 'contenus-pedagogiques/';
  2039.                     }
  2040.                 }
  2041.                 $nb_educ += count($list_texts);
  2042.             }
  2043.             // les spectacles de la personne avec un contenu éduc
  2044.             if (!empty($ids_spectacle_all)) {
  2045.                 $list_spectacles $spectacles->getListSpectacles(array(
  2046.                         'special' => array(
  2047.                             'idspectacles' => array('IN'$ids_spectacles), // les spectacles associés à la personne
  2048.                             'idclassification' => array(125), // avec un contenu pédagogique 125
  2049.                             'tri_plus_proches' => true,
  2050.                         ),
  2051.                         'dbg' => array('list_spectacles''Liste des spectacles avec contenus pédagogiques')
  2052.                     )
  2053.                 );
  2054.                 $nb_educ += count($list_spectacles);
  2055.             }
  2056.             // les spectacles de la personne avec des pièces démontées
  2057.             if (!empty($ids_spectacle_all)) {
  2058.                 $pieces_demontes $spectacles->getListSpectacles(array(
  2059.                     'special' => array(
  2060.                         'idspectacles' => array('IN'$ids_spectacles), // les spectacles associés à la personne
  2061.                         'idclassification' => array(82), // avec un contenu pièce démontée (82)
  2062.                         'tri_plus_proches' => true,
  2063.                     ),
  2064.                     'dbg' => array('list_spectacles''Liste des spectacles avec une pièce démontée')
  2065.                 ));
  2066.                 $nb_educ += count($pieces_demontes);
  2067.             }
  2068.             // minutes pédagogiques => recherche directe sur la personne ou via les spectacles
  2069.             if (!empty($this->ids_spectacle_all)) {
  2070.                 $multimedias $this->getEntityManager()->getRepository(Multimedias::class);
  2071.                 // recherche de base
  2072.                 $params_query_minutes = array(
  2073.                     'affiche' => array(
  2074.                         'datestart' => '1999-01-01',
  2075.                         'dateend' => '2030-01-01',
  2076.                     ),
  2077.                     'object' => array(array('spectacles'$ids_spectacles)),
  2078.                     'idclassification' => 145,
  2079.                     'limit' => array(0100),
  2080.                     'dbg' => array('minutes''Vidéos de minutes pédagogiques'),
  2081.                 );
  2082.                 $nb_educ += count($this->context['view']->list_minutes);
  2083.             }
  2084.             // texte par l'auteur => recherche des textes de l'auteur qui ont une playlist de ce type
  2085.             // recherche des playlists qui ont la classification par l'auteur et qui ont le texte de l'auteur
  2086.             if (!empty($ids_spectacles)) {
  2087.                 $playlists $this->getEntityManager()->getRepository(Playlists::class);
  2088.                 $nb_educ += $playlists->countListPlaylists(array(
  2089.                     'special' => array(
  2090.                         'idclassifications' => 144// class_texte_parauteur //
  2091.                         'idtext' => $ids_spectacles// les texts de la personne
  2092.                     ),
  2093.                     'dbg' => array('list_playlists''Playlist texte par l\'auteur'),
  2094.                 ));
  2095.             }
  2096.             $news $this->getEntityManager()->getRepository(News::class);
  2097.             $params_prochains_evenements = [
  2098.                 'special' => array(
  2099.                     'publish_valid' => true,
  2100.                     'prochains' => true,
  2101.                     'by_object' => array('idperson' => $idobject),
  2102.                 ),
  2103.             ];
  2104.             $prochains_evenements $news->countNews($params_prochains_evenements);
  2105.             if (!empty($ids_spectacles)) {
  2106.                 $sql_count_critique 'SELECT COUNT(DISTINCT(ct.`idcontent`))
  2107.                     FROM spectacles s
  2108.                     JOIN object_content oc ON s.`idspectacle`=oc.`idobject`
  2109.                     JOIN contents ct ON oc.`idcontent`=ct.`idcontent`
  2110.                     JOIN content_classification cc ON ct.`idcontent`=cc.`idcontent`
  2111.                     WHERE s.`publish`=1 AND s.`valid`=1
  2112.                     AND ct.`publish`=1 AND ct.`valid`=1
  2113.                     AND cc.`idclassification`=101
  2114.                     AND s.`idspectacle` IN (' join(','$ids_spectacles) . ') ';
  2115.                 $nb_critiques $texts->queryOne($sql_count_critique);
  2116.             } else {
  2117.                 $nb_critiques 0;
  2118.             }
  2119.             //Prix et distinctions - Aides et soutiens - Sélections
  2120.             $totalAides 0;
  2121.             $params_aides = array(
  2122.                 'special' => array(
  2123.                     'aides' => array(
  2124.                         'type_aides' => [2314],
  2125.                     ),
  2126.                 ),
  2127.                 'idtext' => explode(','$idtexts_person),
  2128.                 'get_texts_with_aides' => true,
  2129.                 'group_by_aide_type_aide_text' => true,
  2130.             );
  2131.             $totalAides $this->getEntityManager()->getRepository(TextAide::class)->countListTextAide($params_aides);
  2132.             $arrays['biographies'] = ['idclassification' => 15];
  2133.             $arrays['ensavoirplus'] = ['idclassification' => 6];
  2134.             $arrays['textes'] = count($idpectacles);
  2135.             $arrays['spectacles'] = count($ids_spectacles);
  2136.             $arrays['videos'] = $totalVideos;
  2137.             $arrays['audios'] = $totalAudios;
  2138.             $arrays['critiques'] = $nb_critiques;
  2139.             $arrays['educ'] = $nb_educ;
  2140.             $arrays['evenements'] = $prochains_evenements;
  2141.         } else {
  2142.             $arrays = array(
  2143.                 'ensavoirplus' => ['idclassification' => 6],
  2144.                 'videos' => $totalVideos,
  2145.                 'audios' => $totalAudios,
  2146.                 'educ' => ['idclassification' => 125], //class_contenu_educ
  2147.                 'critiques' => ['idclassification' => 101],
  2148.                 'telechargements' => $telechargements
  2149.             );
  2150.         }
  2151.         $sql 'SELECT COUNT(oc.idcontent)
  2152.                             FROM object_content oc, contents c, content_classification cc
  2153.                             WHERE oc.idcontent=c.idcontent
  2154.                             AND cc.idcontent=c.idcontent
  2155.                             AND c.publish=1
  2156.                             AND oc.object=\'' $object '\'
  2157.                             AND oc.idobject=' $idobject;
  2158.         foreach ($arrays as $key => $value) {
  2159.             if (is_array($value) && !empty($value['idclassification'])) {
  2160.                 $sql_copy $sql;
  2161.                 $sql_copy .= ' AND cc.idclassification=' $value['idclassification'] . ' LIMIT 1';
  2162.                 $infos[$key] = $this->queryOne($sql_copy);
  2163.             } else {
  2164.                 $infos[$key] = $value;
  2165.             }
  2166.         }
  2167.         if ($infos['ensavoirplus'] < 2) {
  2168.             $infos['ensavoirplus'] = false;
  2169.         }
  2170.         if (isset($totalAides)) {
  2171.             $infos['ensavoirplus'] += $totalAides;
  2172.         }
  2173.         return $infos;
  2174.     }
  2175.     // }}}
  2176.     //  {{{ getObjectTitleSimple()
  2177.     /** Infos de l'un item recherché
  2178.      *
  2179.      * Affichage standard du titre de l'objet ou retourne des infos "simple"
  2180.      *
  2181.      * Deux grand type de cas :
  2182.      *      - on n'a les infos et on veux juste formater le titre = infos passée dans infos_object
  2183.      *      - on n'a pas les infos alors on exécute une requête pour les obtenir
  2184.      *
  2185.      * Au final on renvoi un titre formaté
  2186.      *
  2187.      * @access public
  2188.      * @param int $idobject Identifiant de l'item
  2189.      * @param array $infos_object Informations pour construire le titre
  2190.      * @param array $params Paramétres supplémentaires
  2191.      * @return string
  2192.      */
  2193.     public function getObjectTitleSimple($idobject null$infos_object = array(), $params = array())
  2194.     {
  2195.         // les champs à sélectionner
  2196.         if (empty($params['fields'])) {
  2197.             $fields = array($this->__idtable);
  2198.         } else {
  2199.             $fields $params['fields'];
  2200.         }
  2201.         // le champ "d'affichage" si rien = le premier de la liste fields
  2202.         if (empty($params['required_field'])) {
  2203.             $required_field $fields[0];
  2204.         } else {
  2205.             $required_field $params['required_field'];
  2206.         }
  2207.         // si on n'a pas les infos
  2208.         if (empty($infos_object)) {
  2209.             //charger les infos que si necessaire
  2210.             if (empty($this->$required_field)) {
  2211.                 if (empty($params['sql'])) {
  2212.                     $sql 'SELECT ' implode(','$fields) . '
  2213.                             FROM ' $this->__table '
  2214.                             WHERE ' $this->__idtable '=' . (int)$idobject;
  2215.                 } else {
  2216.                     $sql $params['sql'];
  2217.                 }
  2218.                 $data $this->queryRow($sql);
  2219.             }
  2220.             // mettre dans le tableau soir les données en cours (this) soir le résultat
  2221.             foreach ($fields as $k => $v) {
  2222.                 if (empty($data[$v]) && empty($this->$v)) {
  2223.                     $infos_object[$v] = '';
  2224.                 } else {
  2225.                     if (!empty($data[$v])) {
  2226.                         $infos_object[$v] = trim($data[$v]);
  2227.                     }
  2228.                     if (!empty($this->$v)) {
  2229.                         if (!is_array($this->$v)) {
  2230.                             $infos_object[$v] = trim($this->$v);
  2231.                         } else {
  2232.                             $infos_object[$v] = $this->$v;
  2233.                         }
  2234.                     }
  2235.                 }
  2236.             }
  2237.         } else { // on a les infos, c'est plus simple
  2238.             foreach ($fields as $k => $v) {
  2239.                 if (empty($infos_object[$v])) {
  2240.                     $infos_object[$v] = '';
  2241.                 } else {
  2242.                     $infos_object[$v] = trim($infos_object[$v]);
  2243.                 }
  2244.             }
  2245.         }
  2246.         //retour
  2247.         return $infos_object;
  2248.     }
  2249.     // }}}
  2250.     //  {{{ query()
  2251.     /** Redéfinir query pour le debug
  2252.      *
  2253.      *
  2254.      * @access   public
  2255.      * @param string $sql La requete SQL
  2256.      * @param array $dbg Les infos pour le debugage
  2257.      */
  2258. //    public function query($sql,$dbg=array())
  2259. //    {
  2260. //        $start_dbg_time = microtime(true);
  2261. //        parent::query($sql);
  2262. //        $exec_dbg_time = microtime(true) - $start_dbg_time;
  2263. //
  2264. //        // afficher directement le debug
  2265. //        if(!empty($_REQUEST['dbg_sql_object'])) {
  2266. //            if(!empty($_REQUEST['sql']) && !empty($dbg)
  2267. //                && ($dbg[0]==$_REQUEST['sql'] || $_REQUEST['sql']=='all')) {
  2268. //                // infos dans la globale
  2269. //                $GLOBALS['dbg_infos'][$dbg[0]] = array(
  2270. //                    'execution_time_query' => $exec_dbg_time,
  2271. //                    'sql_query' => $sql,
  2272. //                    'dbg' => $dbg,
  2273. //                );
  2274. //            }
  2275. //        }
  2276. //    }
  2277.     // }}}
  2278.     //  {{{ queryOne()
  2279. //    /** Redéfinir queryOne pour le debug
  2280. //     *
  2281. //     *
  2282. //     * @access   public
  2283. //     * @param    string  $sql La requete SQL
  2284. //     * @param    array  $dbg Les infos pour le debugage
  2285. //     */
  2286. //    public function queryOne($sql,$dbg=array())
  2287. //    {
  2288. //        $start_dbg_time = microtime(true);
  2289. //        $res = $this->queryOne($sql);
  2290. //        $exec_dbg_time = microtime(true) - $start_dbg_time;
  2291. //
  2292. //        // afficher directement le debug
  2293. //        if(!empty($_REQUEST['dbg_sql_object'])) {
  2294. //            if(!empty($_REQUEST['sql']) && !empty($dbg)
  2295. //                && ($dbg[0]==$_REQUEST['sql'] || $_REQUEST['sql']=='all')) {
  2296. //                // infos dans la globale
  2297. //                $GLOBALS['dbg_infos'][$dbg[0]] = array(
  2298. //                    'execution_time_query' => $exec_dbg_time,
  2299. //                    'sql_query' => $sql,
  2300. //                    'dbg' => $dbg,
  2301. //                );
  2302. //            }
  2303. //        }
  2304. //
  2305. //        return $res;
  2306. //
  2307. //    }
  2308. //
  2309. //    // }}}
  2310.     //  {{{ isTraceMode()
  2311.     /** Tracer ou pas ?
  2312.      *
  2313.      *
  2314.      * @access   public
  2315.      * @param string  Faut-il tracer des executions ?
  2316.      */
  2317.     public function isTraceMode($trace_mode)
  2318.     {
  2319.         if (!empty($_REQUEST[$trace_mode])) {
  2320.             return true;
  2321.         } else {
  2322.             return false;
  2323.         }
  2324.     }
  2325.     // }}}
  2326.     //  {{{ setTraceInfos()
  2327.     /** Enregistrer les paramètres de trace
  2328.      *
  2329.      *
  2330.      * @access   public
  2331.      * @param array $trace_infos Les paramètres
  2332.      */
  2333.     public function setTraceInfos($trace_infos)
  2334.     {
  2335.         $GLOBALS['dbg_infos'][] = $trace_infos;
  2336.     }
  2337.     // }}}
  2338.     //  {{{ getSQLObject()
  2339.     /** Construire une requete SQL
  2340.      *
  2341.      *
  2342.      * @access   public
  2343.      * @param array $query Paramètres de la requête
  2344.      * @return   string
  2345.      */
  2346.     public function getSQLObject($query)
  2347.     {
  2348.         // sans cache sql
  2349.         if (!empty($_REQUEST['sql_no_cache'])) {
  2350.             $sql_no_cache 'SQL_NO_CACHE';
  2351.         } else {
  2352.             $sql_no_cache null;
  2353.         }
  2354.         $empty_select ', ';
  2355.         // select
  2356.         if (empty($query['count_only'])) {
  2357.             if (!empty($query['distinct'])) {
  2358.                 if ($query['distinct'] == 'no') {
  2359.                     $sql['select'] = 'SELECT ' $sql_no_cache ' ' $this->__table '.' $this->__idtable;
  2360.                 } elseif ($query['distinct'] == 'no_primary') {
  2361.                     $sql['select'] = 'SELECT ' $sql_no_cache ' ';
  2362.                     $empty_select '';
  2363.                 }
  2364.             } else {
  2365.                 $sql['select'] = 'SELECT ' $sql_no_cache ' DISTINCT(' $this->__table '.' $this->__idtable ')';
  2366.             }
  2367.         } else {
  2368.             if (!empty($query['count_disctint_by'])) {
  2369.                 foreach ($query['count_disctint_by'] as $k => $v) {
  2370.                     $sql['select'] = 'SELECT ' $sql_no_cache ' COUNT(DISTINCT(`' $k '`.`' $v '`)) as total ';
  2371.                 }
  2372.             } else {
  2373.                 if (property_exists($this'__idtable')) {
  2374.                     $sql['select'] = 'SELECT ' $sql_no_cache ' COUNT(DISTINCT(' $this->__table '.' $this->__idtable ')) as total ';
  2375.                 } else {
  2376.                     $sql['select'] = 'SELECT ' $sql_no_cache ' COUNT(*) as total ';
  2377.                 }
  2378.             }
  2379.         }
  2380.         // la partie select
  2381.         if (!empty($query['select'])) {
  2382.             foreach ($query['select'] as $s) {
  2383.                 // la valeur est un tableau array('test' => 'essai')
  2384.                 if (is_array($s)) {
  2385.                     foreach ($s as $t => $f) {
  2386.                         $fields explode(','$f);
  2387.                         if (count($fields) > 1) {
  2388.                             foreach ($fields as $fb) {
  2389.                                 if ($fb == '*') {
  2390.                                     $select[] = $t '.' $fb;
  2391.                                 } else {
  2392.                                     $select[] = $t '.`' $fb '`';
  2393.                                 }
  2394.                             }
  2395.                         } else {
  2396.                             if ($f == '*') {
  2397.                                 $select[] = $t '.' $f;
  2398.                             } else {
  2399.                                 $select[] = $t '.`' $f '`';
  2400.                             }
  2401.                         }
  2402.                         // si la table n'est pas dans les 'from', on l'ajoute
  2403.                         if (!in_array($t$query['from'])) {
  2404.                             $query['from'][$t] = $t;
  2405.                         }
  2406.                     }
  2407.                 } else {
  2408.                     $select[] = $s;
  2409.                 }
  2410.             }
  2411.             $sql['select'] .= $empty_select join(','$select);
  2412.         }
  2413.         if (!empty($query['select_more'])) {
  2414.             $sql['select'] .= $query['select_more'];
  2415.         }
  2416.         if (!empty($query['sum'])) {
  2417.             $sql['select'] = 'SELECT ' $sql_no_cache ' SUM(`' $query['sum'][0] . '`.`' $query['sum'][1] . '`) ';
  2418.         }
  2419.         if (!empty($query['left_join'])) {
  2420.             foreach ($query['left_join'] as $k => $v) {
  2421.                 $join ' `' $k '` ';
  2422.                 if (in_array($k$query['from'])) {
  2423.                     unset($query['from'][$k]);
  2424.                 }
  2425.                 foreach ($v as $kb => $vb) {
  2426.                     $join .= ' LEFT JOIN `' $kb '` ON ' key($vb) . '=' $vb[key($vb)] . ' ';
  2427.                     foreach ($query['from'] as $kq => $vq) {
  2428.                         if ($vq == $kb) {
  2429.                             unset($query['from'][$kq]);
  2430.                         }
  2431.                     }
  2432.                 }
  2433.                 $joins[] = $join;
  2434.             }
  2435.             $froms[] = join("\n"$joins);
  2436.         }
  2437.         // la partie from
  2438.         if (!empty($query['from'])) {
  2439.             foreach ($query['from'] as $k => $v) {
  2440.                 $froms[] = ' `' $v '` ';
  2441.             }
  2442.         }
  2443.         // les joins
  2444.         $sql['from'] = 'FROM ' join(",\n"$froms);
  2445.         // where standard
  2446.         if (!empty($query['where'])) {
  2447.             foreach ($query['where'] as $w) {
  2448.                 // c'est un array
  2449.                 if (is_array($w)) {
  2450.                     // AND par défaut
  2451.                     if (empty($w[3])) {
  2452.                         $where_string ' AND ';
  2453.                     } else {
  2454.                         $where_string $w[3] . ' '// précision sur la condition
  2455.                     }
  2456.                     $where_string .= $w[0] . '.`' $w[1] . '`';
  2457.                     // c'est un tableau
  2458.                     if (is_array($w[2])) {
  2459.                         if (!empty($w[4])) { // précise si IN / NOT IN ou BETWEEN
  2460.                             $where_string .= ' ' $w[4] . ' ';
  2461.                         } else {
  2462.                             $where_string .= ' IN ';
  2463.                         }
  2464.                         // si BETWEEN différent de IN
  2465.                         if (!empty($w[4]) && $w[4] == 'BETWEEN') {
  2466.                             $where_string .= '\'' $this->escape($w[2][0]) . '\' AND \'' $this->escape($w[2][1]) . '\'';
  2467.                         } else {
  2468.                             if (!empty($w[2]) && is_array($w[2])) {
  2469.                                 $ww = array();
  2470.                                 foreach ($w[2] as $s) {
  2471.                                     if ($this->my_is_int($s)) {
  2472.                                         $ww[] = $s;
  2473.                                     } else {
  2474.                                         if (is_array($s)) {
  2475.                                             $ww[] = '\'' implode(','$this->escape($s)) . '\'';
  2476.                                         } else {
  2477.                                             $ww[] = '\'' $this->escape($s) . '\'';
  2478.                                         }
  2479.                                     }
  2480.                                 }
  2481.                                 $where_string .= '(' join(','$ww) . ')';
  2482.                             }
  2483.                         }
  2484.                     } else {
  2485.                         if (!empty($w[4])) {
  2486.                             $condition $w[4];
  2487.                         } else {
  2488.                             $condition '=';
  2489.                         }
  2490.                         if ($this->my_is_int($w[2])) {
  2491.                             $where_string .= $condition $w[2];
  2492.                         } else {
  2493.                             if ($w[2] == 'ISNULL') {
  2494.                                 $where_string .= ' IS NULL';
  2495.                             } elseif ($w[2] == 'ISNOTNULL') {
  2496.                                 $where_string .= ' IS NOT NULL';
  2497.                             } else {
  2498.                                 $where_string .= $condition '\'' $w[2] . '\'';
  2499.                             }
  2500.                         }
  2501.                     }
  2502.                     $where_suite[] = $where_string;
  2503.                 } else {
  2504.                     $where_suite[] = $w;
  2505.                 }
  2506.             }
  2507.             $sql['where'] = ' WHERE 1 ' join(' '$where_suite);
  2508.             if (!empty($query['where_more'])) {
  2509.                 $sql['where'] .= $query['where_more'];
  2510.             }
  2511.             // jointure
  2512.             if (!empty($query['join'])) {
  2513.                 foreach ($query['join'] as $k => $v) {
  2514.                     $join[] = $v[0] . '=' $v[1];
  2515.                 }
  2516.                 $sql['where'] .= ' AND ' join(' AND '$join);
  2517.             }
  2518.         }
  2519.         if (empty($query['count_only']) && empty($query['sum'])) {
  2520.             // la partie groupby
  2521.             if (empty($query['group'])) {
  2522.                 $sql['group'] = 'GROUP BY ' $this->__table '.' $this->__idtable;
  2523.             } elseif ($query['group'] == 'no') {
  2524.                 $sql['group'] = ' ';
  2525.             } else {
  2526.                 foreach ($query['group'] as $k => $v) {
  2527.                     if (is_array($v)) {
  2528.                         $group[] = $k '.`' $v '`';
  2529.                     } else {
  2530.                         $group[] = $k '.`' $v '`';
  2531.                     }
  2532.                 }
  2533.                 $sql['group'] = ' GROUP BY ' join(','$group);
  2534.             }
  2535.         }
  2536.         if (!empty($query['having'])) {
  2537.             foreach ($query['having'] as $w) {
  2538.                 // c'est un array
  2539.                 if (is_array($w)) {
  2540.                     // AND par défaut
  2541.                     if (empty($w[3])) {
  2542.                         $having_string 'AND ';
  2543.                     } else {
  2544.                         $having_string $w[3] . ' '// précision sur la condition
  2545.                     }
  2546.                     $having_string .= $w[0] . '.`' $w[1] . '`';
  2547.                     // c'est un tableau
  2548.                     if (is_array($w[2])) {
  2549.                         if (!empty($w[4])) { // précise si IN / NOT IN ou BETWEEN
  2550.                             $having_string .= ' ' $w[4] . ' ';
  2551.                         } else {
  2552.                             $having_string .= ' IN ';
  2553.                         }
  2554.                         // si BETWEEN différent de IN
  2555.                         if (!empty($w[4]) && $w[4] == 'BETWEEN') {
  2556.                             $having_string .= '\'' $this->escape($w[2][0]) . '\' AND \'' $this->escape($w[2][1]) . '\'';
  2557.                         } else {
  2558.                             if (!empty($w[2]) && is_array($w[2])) {
  2559.                                 $ww = array();
  2560.                                 foreach ($w[2] as $s) {
  2561.                                     if ($this->my_is_int($s)) {
  2562.                                         $ww[] = $s;
  2563.                                     } else {
  2564.                                         $ww[] = '\'' $this->escape($s) . '\'';
  2565.                                     }
  2566.                                 }
  2567.                                 $having_string .= '(' join(','$ww) . ')';
  2568.                             }
  2569.                         }
  2570.                     } else {
  2571.                         if (!empty($w[4])) {
  2572.                             $condition $w[4];
  2573.                         } else {
  2574.                             $condition '=';
  2575.                         }
  2576.                         if ($this->my_is_int($w[2])) {
  2577.                             $having_string .= $condition $w[2];
  2578.                         } else {
  2579.                             if ($w[2] == 'ISNULL') {
  2580.                                 $having_string .= ' IS NULL';
  2581.                             } elseif ($w[2] == 'ISNOTNULL') {
  2582.                                 $having_string .= ' IS NOT NULL';
  2583.                             } else {
  2584.                                 $having_string .= $condition '\'' $this->escape($w[2]) . '\'';
  2585.                             }
  2586.                         }
  2587.                     }
  2588.                     $having_suite[] = $having_string;
  2589.                 } else {
  2590.                     $having_suite[] = $w;
  2591.                 }
  2592.             }
  2593.             $sql['having'] = ' HAVING 1 ' join(' '$having_suite);
  2594.         }
  2595.         if (empty($query['count_only']) && empty($query['sum'])) {
  2596.             // classement par défaut
  2597.             if (empty($query['order'])) {
  2598.                 //$sql['order'] = 'ORDER BY '.$this->__table'.'.$this->__idtable;
  2599.                 $default_order 'dateinsert';
  2600.                 $sql['order'] = 'ORDER BY ' $this->__table '.' $default_order;
  2601.             } else {
  2602.                 foreach ($query['order'] as $k => $v) {
  2603.                     if (is_array($v)) {
  2604.                         // si le troisème élément de $v est un tableau => classement par FIELD
  2605.                         if (!empty($v[2]) && is_array($v[2])) {
  2606.                             $order[] = 'FIELD(' $v[0] . '.`' $v[1] . '`,' join(','$v[2]) . ')';
  2607.                             $is_field_order true;
  2608.                         } else {
  2609.                             foreach ($v as $t => $f) {
  2610.                                 $order[] = $t '.`' $f '`';
  2611.                             }
  2612.                         }
  2613.                     } else {
  2614.                         $order[] = $v;
  2615.                     }
  2616.                 }
  2617.                 $sql['order'] = 'ORDER BY ' join(','$order);
  2618.             }
  2619.             // si anciens, direction DESC
  2620.             if (!empty($query['anciens'])) {
  2621.                 $sql['direction'] = 'DESC';
  2622.             } else {
  2623.                 // direction définie
  2624.                 if (!empty($query['direction'])) {
  2625.                     // pas de direction
  2626.                     if ($query['direction'] != 'no') {
  2627.                         $sql['direction'] = $query['direction'];
  2628.                     } else {
  2629.                         $sql['direction'] = ' ';
  2630.                     }
  2631.                 } else {
  2632.                     if (empty($is_field_order)) {
  2633.                         $sql['direction'] = 'DESC';
  2634.                     } else {
  2635.                         $sql['direction'] = ' ';
  2636.                     }
  2637.                 }
  2638.             }
  2639.             // classement aléatoire
  2640.             if (!empty($query['random'])) {
  2641.                 $sql['order'] = 'ORDER BY RAND() ' $query['random'];
  2642.             }
  2643.             // pas de classement
  2644.             if (!empty($query['no_order'])) {
  2645.                 $sql['order'] = '';
  2646.             }
  2647.         }
  2648.         // limite des résultats
  2649.         if (empty($query['limit'])) {
  2650.             $sql['limit'] = 'LIMIT 0,10';
  2651.         } else {
  2652.             if ($query['limit'][0] !== 'all') {
  2653.                 $sql['limit'] = 'LIMIT ' join(','$query['limit']);
  2654.             } else {
  2655.                 $sql['limit'] = null;
  2656.             }
  2657.         }
  2658.         // requête forcée sans le groupement, le tri et les limites
  2659.         if (!empty($query['force_query'])) {
  2660.             $sql = array();
  2661.             $sql['query'] = $query['force_query'];
  2662.         }
  2663.         // afficher directement le debug
  2664.         if ($this->isTraceMode('get_sql_object')) {
  2665.             if (!empty($_REQUEST['sql']) && !empty($query['dbg'])
  2666.                 && ($query['dbg'][0] == $_REQUEST['sql'] || $_REQUEST['sql'] == 'all')) {
  2667.                 // infos dans la globale
  2668.                 $GLOBALS['dbg_infos'][$query['dbg'][0]] = array(
  2669.                     'sql_query' => join(" \n"$sql),
  2670.                     'dbg' => $query['dbg'],
  2671.                 );
  2672.             }
  2673.         }
  2674.         return join(" \n"$sql);
  2675.     }
  2676.     // }}}
  2677.     // {{{ addSQLParams()
  2678.     /** Ajouter des paramètres à la requete
  2679.      *
  2680.      *
  2681.      * @param mixed $vignette_format format pour les vignettes (true pour défaut, tableau sinon)
  2682.      * @param string $language langue des vidéos (par défaut fr)
  2683.      * @param int|array $type limite au type spécifié (entier ou tableau d'entiers)
  2684.      * @access public
  2685.      * @return array
  2686.      */
  2687.     public function addSQLParams($param, &$query$query_more)
  2688.     {
  2689.         // juste une string
  2690.         if (!is_array($query_more)) {
  2691.             $query[$param] = $query_more;
  2692.         } else {
  2693.             $use_merge false;
  2694.             if ($use_merge) {
  2695.                 $query[$param] = array_merge($query[$param], $query_more);
  2696.             } else {
  2697.                 foreach ($query_more as $k => $v) {
  2698.                     if ($param == 'from' && in_array($v$query['from'])) {
  2699.                         continue;
  2700.                     }
  2701.                     if (!$this->my_is_int($k)) {
  2702.                         if ($param == 'join') {
  2703.                             $query[$param][] = array($k$v);
  2704.                         } else {
  2705.                             $query[$param][$k] = $v;
  2706.                         }
  2707.                     } else {
  2708.                         $query[$param][] = $v;
  2709.                     }
  2710.                 }
  2711.             }
  2712.         }
  2713.     }
  2714.     // }}}
  2715.     // {{{ mergeSQLParams()
  2716.     /**  Ajouter/supprimer des paramètres pour getListSpectacles
  2717.      *
  2718.      * @param array $params_sql tableau orginal
  2719.      * @param array $params_sql tableau complété
  2720.      * @return array
  2721.      */
  2722.     public function mergeSQLParams($params_sql$params_sql_more)
  2723.     {
  2724.         // ajouter des paramètres
  2725.         unset($params_sql['params']['limit']);
  2726.         unset($params_sql['special']['plus_proche']);
  2727.         $params_sql array_merge_recursive($params_sql$params_sql_more);
  2728.         return $params_sql;
  2729.     }
  2730.     // }}}
  2731.     //  {{{ transformFieldsData()
  2732.     /** génére la version pour la diffusion API
  2733.      *
  2734.      * @access  public
  2735.      * @param array $fields tableau des champs
  2736.      * @param array $data tableau de données
  2737.      * @return array
  2738.      */
  2739.     public function transformFieldsData($fields$data$url)
  2740.     {
  2741.         // si les champs sont un tableau et les données un tableau supérieur à 1
  2742.         // alors on doit parcourir les données et mettre en relation les champs
  2743.         //$m = array();
  2744.         if (is_array($fields) && count($data) > 1) {
  2745.             foreach ($data as $k => $v) {
  2746.                 // dans le cas ou $data n'est pas un tableau
  2747.                 foreach ($fields as $f => $w) {
  2748.                     // pour convertir les clés exemple alldirectors->directors
  2749.                     if (strpos($f'->') !== false) {
  2750.                         $t explode('->'$f);
  2751.                         $f $t[0];
  2752.                         $kk $t[1];
  2753.                     } else {
  2754.                         $kk $f;
  2755.                     }
  2756.                     if (!empty($data[$f])) {
  2757.                         // si l'occurence de data est un tableau => plusieurs données (exemple : directors)
  2758.                         if (is_array($data[$f])) {
  2759.                             foreach ($data[$f] as $kb => $vb) {
  2760.                                 $m[$kk][$kb] = $this->transformFieldsData($w$vb$url);
  2761.                             }
  2762.                         } else { // sinon, la valeur
  2763.                             // la valeur
  2764.                             $value $data[$f];
  2765.                             $key $w;
  2766.                             // si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
  2767.                             $dieses explode('#'$w);
  2768.                             if (is_array($dieses) && count($dieses) == 3) {
  2769.                                 $pattern '/' $dieses[1] . '/i';
  2770.                                 $remplacement $dieses[2];
  2771.                                 $key $dieses[0];
  2772.                                 $value preg_replace($pattern$remplacement$value1);
  2773.                             }
  2774.                             // si c'est une URL, on doit ajouter l'URL
  2775.                             if (strpos($f'url_') !== false || strpos($w'_url') !== false) {
  2776.                                 $value $url $value;
  2777.                             }
  2778.                             $m[$key] = $value;
  2779.                         }
  2780.                     }
  2781.                 }
  2782.             }
  2783.         }
  2784.         return $m;
  2785.     }
  2786.     // }}}
  2787.     //  {{{ getApiTab()
  2788.     /** génére la version pour la diffusion API
  2789.      *
  2790.      * @access  public
  2791.      * @param array $data tableau de données
  2792.      * @return array
  2793.      */
  2794.     public function getApiTab($data$url 'URL_THNET'$params_options = array())
  2795.     {
  2796.         //return $this->transformFieldsData($this->getApiFields(),$data,$url);
  2797.         //return $data;
  2798.         // on parcours les champs
  2799.         foreach ($this->getApiFields() as $field_key => $field_value) {
  2800.             // on doit convertir field_key
  2801.             if (strpos($field_key'->') !== false) {
  2802.                 $t explode('->'$field_key);
  2803.                 $field_key $t[0];
  2804.                 $final_field_key $t[1];
  2805.             } else {
  2806.                 $final_field_key $field_key;
  2807.             }
  2808.             if (array_key_exists($field_key$data)) {
  2809.                 if (is_array($field_value)) {
  2810.                     // niveau alldirectors => on parcours alldirectors dans fields
  2811.                     foreach ($field_value as $field_key_b => $field_value_b) {
  2812.                         // on doit convertir field_key
  2813.                         if (strpos($field_key_b'->') !== false) {
  2814.                             $t explode('->'$field_key_b);
  2815.                             $field_key_b $t[0];
  2816.                             $final_field_key_b $t[1];
  2817.                         } else {
  2818.                             $final_field_key_b $field_key_b;
  2819.                         }
  2820.                         // on parcours alldirectors dans data
  2821.                         if(is_array($data[$field_key])){
  2822.                             foreach ($data[$field_key] as $data_key => $data_value) {
  2823.                                 // on doit convertir field_key
  2824.                                 if (strpos($data_key'->') !== false) {
  2825.                                     $t explode('->'$data_key);
  2826.                                     $data_key $t[0];
  2827.                                     $final_data_key $t[1];
  2828.                                 } else {
  2829.                                     $final_data_key $data_key;
  2830.                                 }
  2831.                                 // on parcours chaque enregistremebt de alldirectors dans data
  2832.                                 foreach ($data_value as $data_key_b => $data_value_b) {
  2833.                                     // on doit convertir field_key
  2834.                                     if (strpos($data_key_b'->') !== false) {
  2835.                                         $t explode('->'$data_key_b);
  2836.                                         $data_key_b $t[0];
  2837.                                         $final_data_key_b $t[1];
  2838.                                     } else {
  2839.                                         $final_data_key_b $data_key_b;
  2840.                                     }
  2841.                                     if ($data_key_b == $field_key_b) {
  2842.                                         // niveau ecoles
  2843.                                         if (is_array($data_value_b)) {
  2844.                                             if ($field_key_b == 'roles') {
  2845.                                                 $data_api[$final_field_key][$final_data_key][$field_key_b] = $data_value_b;
  2846.                                             } else {
  2847.                                                 // parcours du tableau ecoles de fields
  2848.                                                 foreach ($field_value_b as $field_key_c => $field_value_c) {
  2849.                                                     // on doit convertir field_key
  2850.                                                     if (strpos($field_key_c'->') !== false) {
  2851.                                                         $t explode('->'$field_key_c);
  2852.                                                         $field_key_c $t[0];
  2853.                                                         $final_field_key_c $t[1];
  2854.                                                     } else {
  2855.                                                         $final_field_key_c $field_key_c;
  2856.                                                     }
  2857.                                                     // parcours du tableau ecoles de data
  2858.                                                     foreach ($data_value_b as $data_key_c => $data_value_c) {
  2859.                                                         // on doit convertir field_key
  2860.                                                         if (strpos($data_key_c'->') !== false) {
  2861.                                                             $t explode('->'$data_key_c);
  2862.                                                             $data_key_c $t[0];
  2863.                                                             $final_data_key_c $t[1];
  2864.                                                         } else {
  2865.                                                             $final_data_key_c $data_key_c;
  2866.                                                         }
  2867.                                                         // parcours de chaque champ du tableau ecoles de data
  2868.                                                         foreach ($data_value_c as $data_key_d => $data_value_d) {
  2869.                                                             if ($data_key_d == $field_key_c) {
  2870.                                                                 //echo $final_field_key." ".$final_data_key." ".$final_field_key_b." ".$final_data_key_c." ".$final_field_key_c."\n";
  2871.                                                                 // la valeur
  2872.                                                                 $value $data_value_d;
  2873.                                                                 $key $field_value_c;
  2874.                                                                 // si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
  2875.                                                                 $dieses explode('#'$field_value_c);
  2876.                                                                 if (is_array($dieses) && count($dieses) == 3) {
  2877.                                                                     $pattern '/' $dieses[1] . '/i';
  2878.                                                                     $remplacement $dieses[2];
  2879.                                                                     $key $dieses[0];
  2880.                                                                     $value preg_replace($pattern$remplacement$value1);
  2881.                                                                 }
  2882.                                                                 // si c'est une URL, on doit ajouter l'URL
  2883.                                                                 if (strpos($key'url') !== false) {
  2884.                                                                     //$value = $url.$value;
  2885.                                                                     // si permanent_url, ajouter aussi object
  2886.                                                                     $data_api[$final_field_key][$final_data_key][$final_field_key_b][$final_data_key_c]['object'] = $data_value_d;
  2887.                                                                 }
  2888.                                                                 $data_api[$final_field_key][$final_data_key][$final_field_key_b][$final_data_key_c][$key] = $value;
  2889.                                                             }
  2890.                                                         }
  2891.                                                     }
  2892.                                                 } // fin test si roles
  2893.                                             }
  2894.                                             // fin du niveau ecole
  2895.                                             // niveau personnes
  2896.                                         } else {
  2897.                                             // la valeur
  2898.                                             $value $data_value_b;
  2899.                                             $key $field_value_b;
  2900.                                             // si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
  2901.                                             $dieses explode('#'$field_value_b);
  2902.                                             if (is_array($dieses) && count($dieses) == 3) {
  2903.                                                 $pattern '/' $dieses[1] . '/i';
  2904.                                                 $remplacement $dieses[2];
  2905.                                                 $key $dieses[0];
  2906.                                                 $value preg_replace($pattern$remplacement$value1);
  2907.                                             }
  2908.                                             // si c'est une URL, on doit ajouter l'URL
  2909.                                             if (strpos($key'url') !== false) {
  2910.                                                 //$value = $url.$value;
  2911.                                                 // si permanent_url, ajouter aussi object
  2912.                                                 $data_api[$final_field_key][$final_data_key]['object'] = $data_value_b;
  2913.                                             }
  2914.                                             $data_api[$final_field_key][$final_data_key][$key] = $value;
  2915.                                         }
  2916.                                     }
  2917.                                 }
  2918.                             }
  2919.                             //if(array_key_exists($field_key_b,$data)) {
  2920.                         }
  2921.                     }
  2922.                 } else {
  2923.                     // la valeur
  2924.                     $value $data[$final_field_key];
  2925.                     $key $field_value;
  2926.                     if ($key == "published") {
  2927.                         if ($value == true) {
  2928.                             $value "1";
  2929.                         } else if ($value == false) {
  2930.                             $value "0";
  2931.                         }
  2932.                     }
  2933.                     if ($key == "insert_date") {
  2934.                         if ($value instanceof \DateTime) {
  2935.                             $value$value->format('Y-m-d H:i:s');
  2936.                         }
  2937.                     }
  2938.                     // si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
  2939.                     $dieses explode('#'$field_value);
  2940.                     if (is_array($dieses) && count($dieses) == 3) {
  2941.                         $pattern '/' $dieses[1] . '/i';
  2942.                         $remplacement $dieses[2];
  2943.                         $key $dieses[0];
  2944.                         $value preg_replace($pattern$remplacement$value1);
  2945.                     }
  2946.                     // si c'est une URL, on doit ajouter l'URL
  2947.                     if (strpos($key'url') !== false) {
  2948.                         //$value = $url.$value;
  2949.                         // si permanent_url, ajouter aussi object
  2950.                         $data_api['object'] = $data[$final_field_key];
  2951.                     }
  2952.                     // niveau premier
  2953.                     $data_api[$key] = $value;
  2954.                 }
  2955.             }
  2956.         }
  2957.         return $data_api;
  2958.     }
  2959.     // }}}
  2960.     //  {{{ logDeletion()
  2961.     /** Loguer les supressions
  2962.      *
  2963.      * @access  public
  2964.      * @param array $info Le log
  2965.      * @return array
  2966.      */
  2967.     public function logDeletion($info)
  2968.     {
  2969.         /**
  2970.          * @TODO Ajouter un logger
  2971.          */
  2972.         // utilisateur connu ?
  2973. //        if($GLOBALS['sessionTheatre']->is_set('idextranetuser')) {
  2974. //            $login = Theatre::factory('extranetusers')->getValue('login',$GLOBALS['sessionTheatre']->getValue('idextranetuser'));
  2975. //        } else {
  2976. //            $login = 'Unknown';
  2977. //        }
  2978. //
  2979. //        // on connait le contexte
  2980. //        if(!empty($_SERVER['REQUEST_URI'])) {
  2981. //            $request_uri = $_SERVER['REQUEST_URI'];
  2982. //        } else {
  2983. //            $request_uri = 'url inconnue';
  2984. //        }
  2985. //
  2986. //        // PEAR::Log
  2987. //        require_once PATH_PEAR.'/Log.php';
  2988.         // dans un fichier
  2989. //        if(LOG_DELETE) {
  2990. //            dump('log dans un fichier à revoir');
  2991. //            @touch(LOG_DELETE);
  2992. //            $loggerFile = &Log::singleton('file', LOG_DELETE, 'DELETE');
  2993. //            $err = $login.'['.$request_uri.'] => '.$info;
  2994. //            $loggerFile->log($err);
  2995. //        }
  2996.     }
  2997.     // }}}
  2998.     //  {{{ arrayToIn()
  2999.     /** Transformer les entrées en contenu pour IN sql
  3000.      *
  3001.      * @access  public
  3002.      * @param array $params L'entrée
  3003.      * @return array
  3004.      */
  3005.     public function arrayToIn($params)
  3006.     {
  3007.         if (!is_array($params)) {
  3008.             $params = (array)$params;
  3009.         }
  3010.         foreach ($params as $k => $v) {
  3011.             if (is_string($v)) {
  3012.                 $out[$k] = '\'' $this->escape($v) . '\'';
  3013.             } else {
  3014.                 $out[$k] = $v;
  3015.             }
  3016.         }
  3017.         return join(','$out);
  3018.     }
  3019.     // }}}
  3020.     // generer un code aleatoire
  3021.     function codeAlea($taille 30$uniqid false)
  3022.     {
  3023.         if ($uniqid) {
  3024.             return md5(uniqid(mt_rand(), true));
  3025.         }
  3026.         static $cars 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRQSTUVWXYZ0123456789';
  3027.         $mdp '';
  3028.         for ($i 0$i $taille$i++) {
  3029.             $mdp .= $cars[rand(061)];
  3030.         }
  3031.         return $mdp;
  3032.     }
  3033.     // retourne la date courante au format timestamp
  3034.     function now()
  3035.     {
  3036.         return date('Y-m-d H:i:s');
  3037.     }
  3038. }