Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MkFramework Discussion :

Filtre dans le module dataTable


Sujet :

MkFramework

  1. #1
    Membre éprouvé
    Filtre dans le module dataTable
    Bonjour,
    J'ai encore une question sur ce module qui marche très bien dorénavant (c'était juste un pb de compatibilité avec le layout bootstrap).
    Je vois dans le constructeur de la classe module_datablesJson qu'on peut rajouter des filtres dans la requête AJAX en passant en paramètre GET une chaîne de type filters=''
    Seulement je n'y arrive pas.. J'ai pourtant essayé pas mal de choses comme par exemple mettre dans ma fonction _list() de mon module :
    Code PHP :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $filter= json_encode(array(
      "rules"=>array(0=>array("field"=>"monCHamp1","data"=>$maValeur),
    		      1=>array("field"=>"monCHamp2","data"=>$maValeur)
        )
      )
    );
    $paramUser = "&filters=" . $filter;
    $oTable->setJsonLink('transactions::listJson'. $paramUser);
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  2. #2
    Membre éprouvé
    Bon bah je crois que je peux aller me cacher
    On sait jamais si ça peut aider qqu'un :
    Code PHP :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $filter= addslashes(json_encode(array(
      "rules"=>array(0=>array("field"=>"monChamp1","data"=>$val1),
                           1=>array("field"=>"monChamp2","data"=>$val2)
          )
        )
      )
    );
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  3. #3
    Rédacteur

    Le filtre n'est pas encore géré dans ce module, c'est pour cela que je l'ai désactivé.

    Il faut que je regarde sur la doc comment l'implementer dans la méthode ajax retournant le json

    car dans ce cas la, il faut aussi modifier le code de la méthode _listJson qui interprete l'appel pour retourner sous forme json le contenu du tableau
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  4. #4
    Membre éprouvé
    Bah je viens de poster la solution qui marche bien juste en même temps

    Au final, voilà ce que j'ai fait :
    1. Ajout d'une méthode addFilter dans la classe module_datablesJson :
    Code PHP :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    	public function addFilter($sField,$uValue){
    		$this->tFilter[$sField]=$uValue;
    	}


    2. Dans la fonction _listJson du module concerné on peut alors faire :
    Code PHP :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $oJson=module_datatables::getJson();
    $oJson->addFilter("monChamp1",$val1);
    $oJson->addFilter("monChamp2",$val2);
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  5. #5
    Membre éprouvé
    Bonjour,

    Je pense qu'on ne parlait pas de la même chose. En effet, j'allais poser la question mais je pense que vous y avez répondu en fait.
    J'essaie d'implémenter la fonction de recherche intégrée à DataTable depuis 1 ou 2h et je crois que c'est de ça dont vous parliez
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  6. #6
    Rédacteur

    Oui en effet c'est de ça que je parlais: la prise en compte de la saisie utilisateur pour filtrer le resultat json injecté dans le tableau datatables
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  7. #7
    Membre éprouvé
    Apparemment une requête AJAX est envoyée au serveur à chaque fois qu'on appuie sur une touche dans le INPUT de recherche. Dans cette requête, il y a un paramètre "search[value]" qui est envoyé au serveur. (voir doc)

    Je tente de récupérer ce paramètre "search[value]" dans la méthode _listJson pour filtrer mes résultats.
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (_root::getParam('search[value]','')!=''){  
    	$tData= model_transactions::getInstance()->uneRequeteSQL();
    }else{
    	$tData=model_transactions::getInstance()->uneAutreRequeteSQL();
    }
    $oJson->setData($tData);
    $oJson->show();


    Mais ça me renvoie toujours le mm jeu de données

    Je n'utilise peut-être pas la bonne méthode pour récupérer ce paramètre...

    EDIT :

    Ah, je crois avoir trouvé, je finirai demain :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (_root::getParam('search')['value']!=''){  
    	$tData= model_transactions::getInstance()->uneRequeteSQL();
    }else{
    	$tData=model_transactions::getInstance()->uneAutreRequeteSQL();
    }
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  8. #8
    Rédacteur

    Voici une version à tester:

    note: vous devez modifier votre méthodes de filtre dans votre classe modèle par celle-ci
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    //methode listant le nombre total d'enregistrements filtre
    public function findTotalFiltered($tFilter){
      foreach($tFilter as $sField => $sValue){
        $tWhere[]=$sField.' like ? ';
        $tValue[]='%'.$sValue.'%';
      }
      $oRow=$this->findOneSimple('SELECT count(*) as total FROM '.$this->sTable.' WHERE  '.implode(' AND ',$tWhere).'',$tValue);
      return $oRow->total;
    }
    //methode retournant les enregistrements trie et pagine et filtre
    public function findListFilteredAndLimitOrderBy($tFilter,$start,$limit,$sField,$side){
      foreach($tFilter as $sField => $sValue){
        $tWhere[]=$sField.' like ? ';
        $tValue[]='%'.$sValue.'%';
      }
      return $this->findManySimple('SELECT * FROM '.$this->sTable.' WHERE  '.implode(' AND ',$tWhere).' ORDER BY '.$sField.' '.$side.' LIMIT '.$start.','.$limit,$tValue);
    }


    pour l'instant le filtre par colonne, en bas de chaque titre fonctionne bien

    Il faut également activer dans votre module où vous instanciez le module datatables le filtre via l'appel à sa méthode
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    $oTable->enableSearchEachColumn();
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  9. #9
    Membre éprouvé
    Super ! Merci ça m'aide beaucoup. Non seulement à avancer sur mon petit projet mais aussi à comprendre le fonctionnement de DataTable.

    Une petite correction sur cette fonction. Il faut juste changer le nom de $sField en paramètre d'entrée (perso j'ai mis $sOrder) pour conserver le tri
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //methode retournant les enregistrements trie et pagine et filtre
    public function findListFilteredAndLimitOrderBy($tFilter,$start,$limit,$sOrder,$side){
      foreach($tFilter as $sField => $sValue){
        $tWhere[]=$sField.' like ? ';
        $tValue[]='%'.$sValue.'%';
      }
      return $this->findManySimple('SELECT * FROM '.$this->sTable.' WHERE  '.implode(' AND ',$tWhere).' ORDER BY '.$sOrder.' '.$side.' LIMIT '.$start.','.$limit,$tValue);
    }
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

###raw>template_hook.ano_emploi###