Si la checkbox d'un dossier est cochée, alors cocher toutes celles des sous dossiers.

Eléphant du PHP | 161 Messages

18 janv. 2016, 11:02

Bonjour à toutes et à toutes,

En fait tout est dit dans l'objet de ce sujet : mon problème est, que lorsque je coche une case correspondant à un dossier, j'aimerai que celles des sous-dossiers soient cochées automatiquement. Toutefois, si un sous-dossier seulement est coché, alors les autres ne sont pas cochés.

J'avais déjà mis en place un petit système pour que, lorsqu'une checkbox principale est cochée alors toutes les autres le sont, mais je n'arrive pas à l'appliquer dans ma boucle.

Voici mon code, quelqu'un aurait-il une idée ?

Code : Tout sélectionner

<style> <?php include 'css/style.css'; include 'css/jqueryFileTree.css'; ?> </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script> <script> <?php include 'js/checkall.js'; ?> </script> <div id="explorateur"> <header id="header"> <input type="checkbox" name="toutCocher" id="checkall"/> <input type="button" name="valider" id="boutonValider" value="Mettre à jour"/> </header> <div id="container_id"> <?php getDirectory('../'); echo '<table id="tableExplorer">'; function getDirectory( $path = '../', $level = 0 ) { // Répertoires à ignorer $ignore = array( '.', '..' ); // Répertoire à ouvrir $dh = @opendir( $path ); // Boucler dans le répertoire : while( false !== ( $file = readdir( $dh ) ) ) { //Si ce fichier ne doit pas être ignoré alors... if( !in_array( $file, $ignore ) ) { // On effectue un espace pour une meilleure vue... $spaces = str_repeat('&nbsp;', ($level * 5 )); // Et on ne montre que les sous-répertoires ! if(is_dir( "$path/$file" ) ) { //On place dans une variable les droits de chaque répertoires que l'on appelera à chaque fois $perms = substr(sprintf('%o', fileperms($path)), -3); // On appelle à nouveau cette fonction dans les nouveaux répertoires de façon à ce que ce soit récursif. echo"<tr><td><ul><li id=\"arborescence\">$spaces<input type=\"checkbox\" name=\"checkbox\"/><a href=$path/$file><img src=\"/wordpress2/wp-content/plugins/DWPSecurity/icons/directory.png\" height=\"20\"/> $file</a><p>($perms)</p></li>"; getDirectory("$path/$file", ($level+1)); } } echo"</ul></td>"; } // Close the directory handle closedir( $dh ); echo "</tr>"; } echo '</table>'; ?> </div>
Voici mon code Javascript (on sait jamais) :

Code : Tout sélectionner

$(document).ready(function() { $("#checkall").click(function() { $("input:checkbox").each(function(){ var checked = $("#checkall").attr("checked"); if(checked == "checked") { $(this).attr('checked', true); } else { $(this).attr('checked', false); } }); }); });

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 janv. 2016, 11:33

Modération :
Afin d'obtenir plus de réponses, le sujet a été déplacé dans un forum plus approprié (PHP débutant > Javascript).
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 161 Messages

18 janv. 2016, 11:51

J'ai modifié un peu, mais en procédant ainsi, toutes les checkboxs existantes sont cochée, hors moi j'aimerai que lorsque je coche un dossier, seuls les sous-dossiers, sous-sous-dossiers soient cochés, et non pas le reste de tous les dossiers. Aidez-moi s'il vous plaît !

Code : Tout sélectionner

$(document).ready(function() { $("#checkboxDossier").click(function() { $("input:checkbox").each(function(){ var checked = $("#checkboxDossier").attr("checked"); if(checked == "checked") { $(this).attr('checked', true); } else { $(this).attr('checked', false); } }); }); });

Mammouth du PHP | 1967 Messages

18 janv. 2016, 11:58

Je donnerai un id à chaque checkbox lui signifiant sa hiérarchie.

Ensuite ors du parcours de toutes les checkboxs, si le début de son id est egal à l'id de la checkbox cochée, je la coche aussi
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

18 janv. 2016, 12:02

Et bien en fait les checkboxs sont appelées de façons récursives dans une fonction, donc je ne peux pas vraiment spécifier leur ID..

Voici le morceau de code concernant l'input :
[...]

Code : Tout sélectionner

if(is_dir("$path/$file")) { //On place dans une variable les droits de chaque répertoires que l'on appelera à chaque fois $perms = substr(sprintf('%o', fileperms($path)), -3); // On appelle à nouveau cette fonction dans les nouveaux répertoires de façon à ce que ce soit récursif. echo"<li id=\"arborescence\">$spaces<input type=\"checkbox\" name=\"checkboxDossierPath\" id=\"checkboxDossier\" value=\"$path\"/><a href=$path/$file><img src=\"/wordpress2/wp-content/plugins/DWPSecurity/icons/directory.png\" height=\"20\"/> $file</a><p>($perms)</p></li>"; echo $_POST['checkboxDossierPath']; getDirectory("$path/$file", ($level+1)); }
[...]

Mammouth du PHP | 1967 Messages

18 janv. 2016, 12:32

Tu as tous loisir de mettre l'id que tu veux, tu as fait toi même la fonction récursive. De plus il ne faut jamais avoir un id identique pour deux balises distinctes. Or c'est le cas pour tes balises li et maintenant pour ton input.

Si tu met id=\"$path/$file\" tu aura un id spécifique pour chaque checkbox et tu pourras faire ce que je te suggère.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

18 janv. 2016, 12:43

D'accord voici ce que j'ai fais pour le moment :

[...]

Code : Tout sélectionner

$maVar = "$path/$file"; echo"<li id=\"arborescence\">$spaces<input type=\"checkbox\" name=\"checkboxDossierPath\" id=\"$maVar\" value=\"$path\"/><a href=$path/$file><img src=\"/wordpress2/wp-content/plugins/DWPSecurity/icons/directory.png\" height=\"20\"/> $file</a><p>($perms)</p></li>"; getDirectory("$path/$file", ($level+1));
[...]

Et mon JS :

Code : Tout sélectionner

$(document).ready(function() { $("#$maVar").click(function() { $("input:checkbox").each(function(){ var checked = $("#checkall").attr("checked"); if(checked == "checked") { $(this).attr('checked', true); } else { $(this).attr('checked', false); } }); }); });

Eléphant du PHP | 161 Messages

18 janv. 2016, 12:44

Bien entendu, ça ne fonctionne pas...

Eléphant du PHP | 161 Messages

18 janv. 2016, 12:51

Je donnerai un id à chaque checkbox lui signifiant sa hiérarchie.

Ensuite ors du parcours de toutes les checkboxs, si le début de son id est egal à l'id de la checkbox cochée, je la coche aussi
Spols j'essaie de comprendre en vain ce que tu veux dire mais je ne vois pas.. Pourrais-tu être plus clair lorsque tu dis : "si le début de son id est egal à l'id de la checkbox cochée, je la coche aussi" s'il te plaît ?

Mammouth du PHP | 1967 Messages

18 janv. 2016, 15:56

imagine une hierarchie simple de dossier

Code : Tout sélectionner

dossier dossier 1 dossier 1.1 dossier 1.2 dossier 1.2.1 dossier 1.2.2 dossier 1.2.3 dossier 1.3 dossier 2
si leur id est égal à leur nom, si je clique sur dossier 1.2 tout les dossier qui commence par "dossier 1.2" devront être coché.

Si tu utilise le chemin complet, tu aura le même effet
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

18 janv. 2016, 15:59

D'accord, mais comment intégrer ça à ma fonction JS....

Eléphant du PHP | 161 Messages

18 janv. 2016, 16:45

J'ai modifié tout mon code et j'aimerais savoir comment récupérer dossiers ?

Code : Tout sélectionner

<style> <?php include 'css/style.css'; include 'css/jqueryFileTree.css'; ?> </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script> <script> $(document).ready(function() { $("#checkall").click(function() { $("input:checkbox").each(function(){ var checked = $("#checkall").attr("checked"); if(checked == "checked") { $(this).attr('checked', true); } else { $(this).attr('checked', false); } }); }); }); function getElementsById(regex) { var tags = document.getElementsByTagName('*'), tagsLength = tags.length, matches = [], index, tag; for (index = 0; index < tagsLength; index += 1) { tag = tags[index]; if (regex.test(tag.id)) { matches.push(tag); } } return matches; } function selectionner(z){ var dossiers = getElementsById('/^'+z+'-'); alert(dossiers); var nbre = dossiers.length; for (var i = 0; i < nbre; i++) { //dossiers[i].checked=1; alert(dossiers[i]); } } </script> <div id="explorateur"> <header id="header"> <input type="checkbox" name="toutCocher" id="checkall"/> <input type="button" name="valider" id="boutonValider" value="Mettre à jour"/> </header> <div id="container_id"> <?php getDirectory('../', 0, ''); echo '<form name="form" methode="POST"><ul>'; function getDirectory( $path = '../', $level , $levelprec) { $numdossier = 1; // Répertoires à ignorer $ignore = array( '.', '..' ); // Répertoire à ouvrir $dh = @opendir( $path ); // Boucler dans le répertoire : while( false !== ( $file = readdir( $dh ) ) ) { //Si ce fichier ne doit pas être ignoré alors... if( !in_array( $file, $ignore ) ) { // On effectue un espace pour une meilleure vue... $spaces = str_repeat('&nbsp;', ($level * 5)); // Et on ne montre que les sous-répertoires ! if(is_dir("$path/$file")) { //On place dans une variable les droits de chaque répertoires que l'on appelera à chaque fois $perms = substr(sprintf('%o', fileperms($path)), -3); // On appelle à nouveau cette fonction dans les nouveaux répertoires de façon à ce que ce soit récursif. $idcourant = "$levelprec".(strlen($levelprec)?'-' : '')."$numdossier"; echo"<li id=\"arborescence\">$spaces\r\n"."<input type=\"checkbox\" name=\"checkboxDossierPath\" id=\"$idcourant\" onclick =\" selectionner('$idcourant');\" value=\"$path\"/>\r\n"."<a href=$path/$file><img src=\"/wordpress2/wp-content/plugins/DWPSecurity/icons/directory.png\" height=\"20\"/> $file</a>\r\n<div id=\"droit\">($perms)</div></li>"; getDirectory("$path/$file", ($level+1), "$levelprec".(strlen($levelprec)?'-' : '')."$numdossier"); $numdossier++; } } } // Close the directory handle closedir( $dh ); } echo '</ul></form>'; ?> </div>
S'il vous plaît... :(