<?php
/**
 * Ce script définit la classe 'om_table'.
 *
 * @package openads
 * @version SVN : $Id$
 */

require_once PATH_OPENMAIRIE."om_table.class.php";

/**
 * Définition de la classe 'om_table' (om_table).
 *
 * Cette classe est destinée à permettre la surcharge de certaines méthodes de
 * la classe 'om_table' du framework pour des besoins spécifiques de
 * l'application.
 */
class om_table extends table {

    /**
     * Méthode de composition du tri
     *
     * @return string
     */
    function composeTri() {
        $tri = $this->tri;
        if ((string) $this->getParam("tricol") !== ""
            and isset($this->champAffiche[abs((int) $this->getParam("tricol"))])) {

            // Tricol est la cle du tableau de champ, il faut recuperer le
            // champ pour l'integrer dans la requete on verifie si un 'as' est
            // present pour s'en servir
            $tricol = $this->champAffiche[abs((int) $this->getParam("tricol"))];
            $tab = preg_split("/[ )]as|AS /", $tricol);

            if (count($tab) > 1) {

                /* Permet de determiner si la colonne a trier est une date.
                   Si $tab[0] contient DD/MM/YYYY, c'est une date.
                   Fonctionne actuellement qu'avec PostgresSQL. */

                if (strpos($tab[0], "'DD/MM/YYYY'")) {
                    // si c'est une date, on recupere le premier parametre
                    // de la fonction to_char
                    $tricol = str_replace("to_char(", "", $tab[0]);
                    $tricol = trim(str_replace(",'DD/MM/YYYY')", "", $tricol));
                    $tricol = trim(str_replace(", 'DD/MM/YYYY')", "", $tricol));
                } else {
                    // dans le cas d'un champ non-date, on recupere table.colonne
                    $tricol = $tab[0];
                }

                // seul un signe "-" en début de paramètre de tri effectue un tri
                // par ordre décroissant
                if (substr((string) $this->getParam("tricol"), 0, 1) !== "-") {

                    // tri croissant, nulls en dernier
                    if (OM_DB_PHPTYPE == 'pgsql') {
                        $tricol .= " ASC NULLS LAST";
                    } else {
                        $tricol = ' ISNULL('.$tricol.') ASC, '.$tricol.' ASC';
                    }
                } else {

                    // tri decroissant, nulls en dernier
                    if (OM_DB_PHPTYPE == 'pgsql') {
                        $tricol .= " DESC NULLS LAST";
                    } else {
                        $tricol = ' ISNULL('.$tricol.') ASC, '.$tricol.' DESC';
                    }
                }
            }

            // Si $tri n'est pas vide alors il faut inserer le nouveau champ
            // de tri en premier dans le ORDER BY
            if ($tri) {
                $tri = str_replace("order by ", "ORDER BY ".$tricol.",",
                                   strtolower($tri));
            } else {
                $tri = " order by ".$tricol."";
            }

        }
        return $tri;
    }

}
