Aller au contenu

pacci

Membre
  • Compteur de contenus

    8
  • Inscrit(e) le

  • Dernière visite

Messages postés par pacci

  1. Bonjour à tous.

    J'ai recherché une class de Collection en PHP comme un arraylist en JAVA.

    N'ayant pas trouvé j'ai commencé à développer la mienne.

    Celle-ci ne marche pas donc je m'en remet à vous pour savoir si je ne suis pas partie dans la ré-invention de la roue et si il existe une class par défault dans PHP le faisant.

    Je vous propose mon code :


    <?php
    /*
    * Class métier de collection
    * une collection est un tableau d'objets sur lequel on attribut des traitements
    */
    class Collection{
    private $objets; // Tableau qui va être renvoyer
    private $num=0; // Nombre d'occurence
    private $classe;

    // Constructeur, créer un tableau
    public function Collection($class){
    $this->classe = $class;
    $this->objets=array();
    }

    // Retourne le nombre d'éléments de la collection
    public function Cardinal(){
    $i=0;
    foreach($this->objets as $tbl){
    $i++;
    }
    return $i;
    }

    // Vérifie si l'objet existe dans la collection
    public function Existe($Objet){
    $lenght = $this->Cardinal() - 1;
    for($i=0;$i>=$lenght;$i++){
    if($Objet == $this->objets[$i]){
    // On arrête le traitement et on renvoi .vrai.
    return true;
    }
    }
    // Si on sort de la boucle, l'objet n'est pas dans le tableau
    return false;
    }

    // Retourne l'index de l'objet passé en paramètre dans la collection
    // Le premier objet de la collection à pour index 0
    public function Index($Objet){
    $lenght = $this->Cardinal() - 1;
    for($i=0;$i>=$lenght;$i++){
    if($Objet == $this->objets[$i]){
    return $i;
    }
    }
    // Si on sort de la boucle, l'objet n'est pas dans le tableau
    return false;
    }

    // Retourne l'objet qui se trouve à l'index passé en paramètre
    public function DonnerObjet($k){
    $lenght = $this->Cardinal() - 1;
    echo'<script type="text/javascript">window.alert(\''.$lenght.'\');</script>';
    // Si le paramètre est plus grand que la taille du tableau alors routourne .faux.
    if($k > $lenght){return false;}
    else{
    for($i=0;$i>=$lenght;$i++){
    if($i == $k){
    //echo'<script type="text/javascript">window.alert(\''.$i.'\');</script>';
    return $this->objets[$i];
    }
    }
    // Si on sort de la boucle, l'objet n'est pas dans le tableau
    return false;
    }
    }

    // Ajoute un objet à la collection
    public function AjouterObjet($Objet){
    $this->objets[] = $Objet;
    }

    // Remplace dans la collection l'objet figurant à l'index passé en paramètre par l'objet en paramètre
    public function RemplacerObjet($i,$Objet){
    $lenght = $this->Cardinal() - 1;
    // Si $i est inférieur ou supérieur à la taille de la collection alors on retourne .faux.
    // Sinon on remplace et on retourne .vrai.
    if($i < $lenght || $i > $lenght){return false;}
    else{
    $this->objets[$i] = $Objet;
    return true;
    }
    }

    // Supprime l'objet passé en paramètre
    public function SupprimerObjet($Objet){
    $lenght = $this->Cardinal() - 1; // Taille
    for($i=0;$i>=$lenght;$i++){
    if($this->objets[$i]==$Objet){
    // array_splice(tableau, ligne, nb_doccurence_a_supprimer)
    $this->objets = array_splice($this->objets, $i, 1);
    return true;
    }
    }
    return false;
    }
    }
    ?>

    En fonctionnement :


    $Contact1 = new Contact('1', 'Dupond1', 'Ricardo1', '00 00 00 00 00', 'quelqueschose_AT_quelquechose.com', '00 00 00 00 00');
    $Contact2 = new Contact('1', 'Dupond2', 'Ricardo2', '00 00 00 00 00', 'quelqueschose_AT_quelquechose.com', '00 00 00 00 00');
    $Contact3 = new Contact('1', 'Dupond3', 'Ricardo3', '00 00 00 00 00', 'quelqueschose_AT_quelquechose.com', '00 00 00 00 00');

    $CC = new Collection('Contact');

    // Ca marche
    $CC->AjouterObjet($Contact1);
    $CC->AjouterObjet($Contact2);
    $CC->AjouterObjet($Contact3);
    echo $CC->Cardinal(); //Ca marche et m'affiche bien 3

    /*
    echo $CC->Index($Contact2); //marche pas devrais me donner 1
    echo $CC->DonnerObjet(2)->getNom()); //devrai me donner Ricardo3
    */

    Voyant les buggs, j'ai stoppé les tests.

    Merci d'avance pour vos réponses.

  2. Bonjour à tous.

    La pagination peut devenir un vrai casse tête en terme d'implémentation.

    On ne se souvient pas souvent du code, c'est récurent etc...

    Bon je vous propose ma solution.

    J'ai développé une classe de traitement pour le SQL.


    <?php
    /*
    * Class d'utilisation du SQL | CURSEUR
    * Auteur : Maxime Di Meglio
    * Date : Fevrier 2011
    * Commentaire : - Cette classe est écrite pour le SGBDR MySql ;
    * - La classe Exception (Class système) est utilisé dans le script
    *
    * Liste des méthodes :
    * fonction Sql($host, $user, $password, $bdd) | CONSTRUCTEUR
    * fonction Connect() | méthode de connexion
    * fonction GetHost() | Renvoi l'host
    * fonction GetUser() | Renvoi l'utilisateur en cours
    * fonction GetBdd() | Renvoi la bdd utilisé
    * fonction GetPassword() | Renvoi le mot de passe de connexion
    * fonction GetNb() | Renvoi le nombre d'occurence d'une requête
    * fonction Query($requete:ch de char) | Execute la requete
    * fonction Select($requete:ch de char | Méthode pour traiter les requêtes select
    * fonction Call($flag:booléen) | Affiche la liste des méthodes et attribut
    */

    class Sql{
    private $date;
    private $host;
    private $user;
    private $bdd;
    private $password;
    private $connect; // Prend la valeur true si la connexion est établie sinon false
    private $select_bdd; // Prend la valeur de .true. si la BDD existe et que l'on arrive à se connecter sinon .false.
    protected $nb; // Retourne le nombre de résultat de la dernière requete requete
    // Tableau contenant les messages d'erreur
    protected $exception=array(
    0=>'La connexion au serveur est impossible',
    1=>'La connexion à la base de données est impossible',
    2=>'La requête doit contenir une chaine de charactère non vide',
    3=>'L\'intérogation a échoué, vérifiez la requête en paramètre',
    4=>'L\'adresse e-mail n\'est pas valide'
    );

    // Constructeur : initialise les attributs
    public function Sql ($host, $user, $password, $bdd){
    $this->host = $host;
    $this->user = $user;
    $this->password = $password;
    $this->bdd = $bdd;
    $this->connect = false;
    $this->select_bdd = false;
    $this->date = date('Y-m-d-G-i');
    }

    // Méthode de connexion au serveur et à la BDD
    public function Connect(){
    $this->connect = mysql_connect($this->host, $this->user, $this->password) or die('N\'a pas pu se connecter au serveur mysql');
    if(!$this->connect){throw new Exception ($this->exception[0],0);return false;}
    else{
    $this->select_db = mysql_select_db($this->bdd, $this->connect) or die('N\'a pas pu se connecter à la base de données');
    if(!$this->select_db){
    $this->connect=false;
    throw new Exception ($this->exception[1],1);
    return false;
    }
    else{
    return true;
    }
    }
    }

    public function SetDate($timestamp, $flag){
    if($flag){$this->date = date('Y-m-d-G-i', $timestamp);}
    else{$this->date = date('Y-m-d-G-i', time());}
    }

    public function GetDate(){
    return $this->date;
    }

    // Récupérer le nom du serveur
    public function GetHost(){
    return $this->host;
    }

    // Récupérer l'utilisateur
    public function GetUser(){
    return $this->user;
    }

    // Récupérer la bdd
    public function GetBdd(){
    return $this->bdd;
    }

    // Récupérer le mot de passe
    public function GetPassword(){
    return $this->password;
    }

    // Récupère le nombre d'occurences renvoyé par une requete
    public function GetNb(){
    return $this->nb;
    }

    /**********************************************************/

    // Modifier le nom du serveur
    public function SetHost($host){
    $this->host = $host;
    }

    // Modifier l'utilisateur
    public function SetUser(){
    $this->user = $user;
    }

    // Modifier la bdd
    public function SetBdd(){
    $this->bdd = $bdd;
    }

    // Modifier le mot de passe
    public function SetPassword(){
    $this->password = $password;
    }


    // Methode d'intérogation de la bdd
    public function Query($requete){
    if(empty($requete) || $requete == '' || !is_string($requete)){
    throw new Exception ($this->exception[2],2);
    }
    $query = mysql_query($requete);
    if(!$query){
    throw new Exception ($this->exception[3],3);
    return false;
    }
    else{
    return $query;
    }
    }

    // Méthode pour traiter les requêtes select
    public function Select($requete){
    $d = array();
    $query = $this->Query($requete);
    $this->nb = mysql_num_rows($query);

    if($query){
    if($this->nb == 1){
    $r = mysql_fetch_assoc($query);
    $d[] = $r;
    }
    else{
    while($r = mysql_fetch_assoc($query)){
    $d[] = $r;
    }
    }
    return $d;
    }
    else{
    return false;
    }
    }


    //Retourne le nombre d'enregistrement total d'une table
    public function Count($table){
    $query = mysql_query('SELECT COUNT(*) AS total FROM '.$table.';');
    $result = mysql_fetch_assoc($query);

    return $result['total'];
    }

    //retourne le nombre de page (à utiliser avec la methode pagination)
    public function Nbpage($table, $nb){
    $count = $this->Count($table);
    $nombreDePages=ceil($count/$nb);
    return $nombreDePages;
    }

    //fonction de pagination
    public function Pagination($table, $nb, $getpage, $requete){

    $count = $this->Count($table);
    $nombreDePages=ceil($count/$nb);

    if(isset($getpage)){
    $pageActuelle=intval($getpage);
    if($pageActuelle>$nombreDePages){
    $pageActuelle=$nombreDePages;
    }
    }
    else{
    $pageActuelle=1;
    }

    $premiereEntree=($pageActuelle-1)*$nb;
    $requete .= ' LIMIT '.$premiereEntree.', '.$nb.';';
    $result = $this->Select($requete);

    return $result;
    }

    // Affichage des methodes et attributs de la class Sql
    public function Call($flag=true){
    $resultat = '------ Liste des méthodes et des attributs de la class Sql ------\n';
    $resultat .= '\n **Liste des attributs de la class Sql** \n';
    $resultat .= ' protected $host:ch de char | Nom du serveur \n
    protected $user:ch de char | Utilisateur de la bdd \n
    protected $bdd:ch de char | Nom de la bdd \n
    protected $password:ch de char | Mot de passe de connexion \n
    protected $connect:booléen | Renvoie .vrai. si la connexion au serveur marche sinon .faux. \n
    protected $select_bdd | Renvoie .vrai. si on accède à la BDD sinon faux \n
    protected $nb; | Nombre d\'occurence de la dernière requete executé \n
    protected $exception:tbl de ch | Tableau dans lequel les messages d\'exceptions sont enregistrés \n';

    $resultat .= '\n **Liste des méthodes de la class Sql** \n';
    $resultat .= 'public function Sql ($host:ch de char, $user:ch de char, $password:ch de char, $bdd:ch de char) | CONSTRUCTEUR \n';
    $resultat .= 'public function Connect() | Connexion au SGBDR \n';
    $resultat .= 'public function GetHost() | Retourne le nom du serveur \n';
    $resultat .= 'public function GetUser() | Retourne le nom de l\'utilisateur \n';
    $resultat .= 'public function GetBdd() | Retourne le nom de la BDD \n';
    $resultat .= 'public function GetPassword() | Retourne le mot de passe de la BDD \n';
    $resultat .= 'public function GetNb() | Retourne le nombre d\'occurence de la dernière requête \n';
    $resultat .= 'public function SetHost($host) | Modifier l\'host \n';
    $resultat .= 'public function SetUser($user) | Modifier l\'utilisateur \n';
    $resultat .= 'public function SetBdd($bdd) | Modifier la bdd \n';
    $resultat .= 'public function SetPassword($password) | Modifier le mot de passe de la BDD \n';
    $resultat .= 'public function Query($requete:ch de char) | Execute la requête \n';
    $resultat .= 'public function Select($requete:ch de char) | Retourne un tableau pour les requete de type select \n';
    $resultat .= 'public function Pagination($table:chaine de char, $nb:entier, $getpage:entier, $requete:chaine de char) | retourne un tableau pour la pagination';
    $resultat .= 'public function Call($flag:booléen) | Retourne la liste et les méthodes de la class, flag = .vrai.=> saut de ligne en html \n';

    if($flag){return nl2br($resultat);}else{return $resultat;}
    }

    }

    ?>

    Comme vous pouvez voir on a la méthode publique Pagination($table:chaine de char, $nb:entier, $getpage:entier, $requete:chaine de char) : tableau

    et la méthode publique Nbpage($table : chaine de char, $nb : entier) : entier

    Utilisation :


    $db = new Sql($host, $user, $password, $bdd);

    $requete = 'SELECT mes_champs
    FROM mes_tables
    WHERE criteres_de_restriction';

    $page = 1; // Pour la premiere page sinon récupérer un POST ou un GET
    $nb_occurences = 12;
    $result = $db->Pagination('matable',$nb_occurences , $page, $requete); // Pagination des résultat retourne un tableau
    $nb_page = $db->Nbpage('contact', 12); // Nombre de page total

    foreach ($result as $key => $value) { //Parcoure du tableau
    ....
    }

    Si vous voyez des améliorations/erreurs de la class (peut être la passer en static ?), n'hésitez pas à me contacter par MP.

  3. Je fais un récap'

    Pour changer la class de la ligne :


    <td><input type="checkbox" id="select<?php echo $i; ?>" onchange="if(this.checked){this.parentNode.parentNode.className='ligne-hover';}else{this.parentNode.parentNode.className = 'class-courante';}"/></td>

    Pour avoir la checkbox maître qui permet de le check des autres checkbox :


    var checkAll = function() // Fonction de Callback
    {
    var checked = arguments[0].checked; // Pour récupérer les paramètres de fonction de manière dynamique
    var col = document.getElementsByTagName("input"); // Tableau (ou collection) qui récupère les checkbox et les renseigne dans "col"
    for(var i=0;i<col.length;i++) // Pour i=0 à nombre_d_elements_récupérés pas 1 faire ...
    {
    if(col[i].parentNode.nodeName == "TD") // Si l'élément parent est une cellule td (et non th) ...
    {
    col[i].checked = checked; // On check toutes les checkbox
    col[i].onchange(); // On change toutes les checkbox en associant la méthode "onchange" à notre tableau
    }
    }
    };

    Utilisation :

    <th><input type="checkbox" onclick="checkAll(this)"></th> <!-- Checkbox maître -->

    Tout fonctionne chez moi, merci à tous et en particulier à Neroth !

    Sujet résolut une fois pour toute.

  4. Merci Neroth pour ton conseil qui est de taille !

    N'étant pas familier avec la syntaxe Javascript ton post vas m'éviter pas mal de bugg !

    Dans la continuité du post j'ai un nouveau problème lié à la gestion des checkbox (fait ch*er ces checkbox !)

    j'ai le code suivant en entête de tableau :


    <tr id="entete">
    <th><input type="checkbox" onclick="checkAll(this)"></th>
    <th>Id</th>
    <th>Nom</th>
    ...
    </tr>

    Qui se traduit par cette image :

    1121451546.jpg

    J'aimerai avoir :

    1121452406.jpg

    J'ai trouvé sur internet une fonction permettant le checkbox maître :


    function checkAll(master){
    var checked = master.checked;
    var col = document.getElementsByTagName("input");
    for (var i=0;i<col.length;i++) {
    col[i].checked = checked;
    }
    }

    La fonction marche bien et me check toutes mes lignes.

    Code d'une ligne :


    <td>
    <input type="checkbox" id="select<?php echo $i; ?>"
    onchange="if(this.checked){document.getElementById(<?php echo $i; ?>).className='ligne-hover';}else{document.getElementById('<?php echo $i;?>').className = '<?php echo $class ;?>';}"/></td>

    J'ai pensé logiquement que la ligne: col.checked = checked; dans la fonction change l'état de la checkbox donc que le changement de class se fait naturelement.

    Mais il en est autrement...

    J'ai essayé : col.className = "ligne-hover"; dans ma boucle mais ça fait rien de plus.

    Si quelqu'un a une idée je suis preneur :


    var idée : booléen
    Si (idée) alors
    afficher("youpi")
    Sinon
    tant que (!idée) alors
    on réfléchie ...
    afficher("morbleu de saperlipopette")
    fin tant que
    Fin Si

    Les gars faut m'aider j'en ai marre que mon cerveau m'affiche "morbleu de saperlipopette".

    Merci d'avance.

  5. Merci Neroth le problème venait de là.

    Utilise ça plutôt ;)

    document.getElementById("<?= $value['id'] ?>").className = [...]

    Et non

    document.getElementById("<?= $value['id'] ?>").ClassName = [...]

    C'est dans ces moments là qu'on se sent c*n !

    J'ai galéré pendant plus de trois semaines pour un problème de majuscule.

    Edit : Sujet résolu merci à tous pour vos réponses.

  6. Bonjour,

    Merci de vos réponses

    du coup j'ai ré-adapté mon code :

    Code PHP:


    $i = 1;
    foreach ($result as $key => $value) {
    if($i%2==0){$class='paire';}else{$class='impaire';}?>
    <tr class="<?php echo $class;?>" id="<?php echo $value['id'];?>">
    <td><input type="checkbox" name="select[]" onchange="if(this.checked){document.getElementById('<?php echo $value['id'] ?>').ClassName = 'ligne-hover';}else{document.getElementById('<?php echo $value['id'];?>').ClassName = '<?php echo $class ;?>';}"/></td>
    <td><?php echo $value['id'];?></td>
    <td><?php echo $value['nom'];?></td>
    <td><?php echo $value['prenom'];?></td>
    <td><?php echo $value['tel'];?></td>
    <td><?php echo $value['mail'];?></td>
    <td><?php echo $value['portable'];?></td>
    <td><?php echo $value['entreprise'];?></td>
    <td><?php echo $value['nom_type'];?></td>
    <td>
    <span onmouseover="document.edit<?php echo $value['id'];?>.src='icone/edit-hover.png'" onmouseout="document.edit<?php echo $value['id'];?>.src='icone/edit.png'">
    <img class="icone" src="icone/edit.png" name="edit<?php echo $value['id'];?>" onclick="modifier('<?php echo $value['id'];?>')"/>
    </span>
    </td>
    <td>
    <span onmouseover="document.delete<?php echo $value['id'];?>.src='icone/delete-hover.png'" onmouseout="document.delete.<?php echo $value['id'];?>.src='icone/delete.png'">
    <img class="icone" src="icone/delete.png" name="delete<?php echo $value['id'];?>"
    onclick="if(window.confirm('Etes-vous sûr de vouloir supprimer le contact <?php echo $value['nom'];?> <?php echo $value['prenom'];?> ?'))
    {supprimer_contact('<?php echo $value['id'];?>');}else{return false;}"/>
    </span>
    </td>
    </tr>
    <?php $i++;
    }
    echo '</table></form>';

    Donc en clair, ajouter le dynamique dans ton code HTML static et non l'inverse ce qui sera rendra le code comprehensible ... et supprimera de facto le besoin de backslash.

    Je n'avais pas erreurs au niveau de l'interprétation donc je pense qu'ils s'y sont retrouvés :whistling: .

    Ensuite, ton code me semble assez illogique :

    tu met la deco ligne paire/impaire dans le <tr>

    mais tu te dépêches de l'ecraser a la ligne suivante dans le

    1121025389.jpg

    Par ce qu'une image vaut mieux qu'un grand discours....

    La ligne se mets en rouge sur le hover.

    Maintenant je veux qu'il se mette en rouge sur le click de chekbox.

    J'ai essayé avec onChange, ça marche toujours pas.

    J'utilise déjà prototype pour divers application "entreprise" et ce framework est génial, notamment pour l'ajax.

    Cependant ce projet est scolaire je dois être apte à gérer les évènements de manière classique.

    J'aurai change la deco des lignes dans les <tr> et ajouter ou non le "ligne-hover" suivant la valeur de la checkbox (mais, heu, c'est peut etre une API rajoutee par prototypes ou scriptaculos, je n'ai pas verifie ...).

    Il y a une API Prototype pour le faire mais je n'ai pas le droit de l'utiliser c'est un projet scolaire !

    Pis si tout ca ne fonctionne toujours pas, tente d'y mettre un breakpoint dans FireBug.

    Firebug ne détecte aucune erreur.

    Je pense à une erreur de logique mais je n'arrive pas à voir où c'est.

    Merci de votre aide et des futures réponses.

    Cordialement.

  7. Bonjour.

    Merci de ta réponse.

    J'utilise déjà prototype pour divers application "entreprise" et ce framework est génial, notamment pour l'ajax.

    Cependant ce projet est scolaire je dois être apte à gérer les évènements de manière classique.

    J'utilise Firebug (sous FF4), il ne me met aucune erreur.

    Ayant fait 2 jours de recherche et ayant testé plusieurs solutions, ça ne fait toujours pas ce que je veux.

    Je pense à une erreur dans la gestion du checkbox dans

    onclick="if(this.checked)...

    Je suis toujours preneur des solutions proposées.

    Merci d'avance.

  8. Bonjour.

    Pour ma PTI évènementiel que je dois présenter au BTS, j'ai choisi de présenter un programme répertoire codé en AJAX (XHTML/CSS).

    Pour le moment le programme marche, mais je dois rajouter des interactions (conseil de mon prof d'info).

    Je me suis dit que je vais mettre des checkbox devant mes lignes de contact et faire une suppression multiple.

    Le système marche, mais dans l'optique de rajouter de l'intuitivité, lorsque je clique sur le checkbox, je veux changer la class de ma ligne.

    j'ai testé :

    Code PHP :

    <?php ... if($i%2 == 0){$class='paire';}else{$class='impaire';}
    echo ' <tr class="'.$class.'" id="'.$value['id'].'">
    <td><input type="checkbox" name="select[]" onclick="if(this.checked){document.getElementById(\''.$value['id'].'\').ClassName = \'ligne-hover\';}else{document.getElementById(\''.$value['id'].'\').ClassName = \''.$paire.'\'}"/></td> ... ?>

    code CSS :


    #content #tableau .paire{background:-moz-linear-gradient(top, #C9C9C9, #A0A0A0, #C9C9C9);text-align:center;font-size:14px;}
    #content #tableau .ligne-hover{background:-moz-linear-gradient(top, #D14D4D, #770202, #D14D4D);text-align:center;color:#FFFFFF;font-size:14px;}

    Ma ligne devrai se mettre en rouge lorsque je check ma checkbox, mais ce n'est pas le cas

    Je suis preneur de toutes explications.

    Merci d'avance.

×
×
  • Créer...