[RESOLU] Modifier droit dossier FTP -> modifier droits de tout ce qu'il y a à l'intérieur

Avatar du membre
Eléphant du PHP | 88 Messages

13 avr. 2016, 12:09

Bonjour, j'ai besoin d'aide SVP.

Je suis en train de mettre en place un script pour que les utilisateurs puissent modifier via un admin les droits d'accès de leurs fichiers et dossiers de leur FTP.

Si l'utilisateur modifie les droits d'accès de juste un fichier, ça fonctionne.
Si l'utilisateur modifie les droits d'accès de juste un dossier, ça fonctionne aussi.

Ce que je souhaite aussi (et que je n'arrive pas à mettre en place), c'est que si un utilisateur modifie les droits d'accès d'un dossier, qu'il puisse aussi avoir la possibilité (via une checkbox par exemple…) de modifier aussi les droits d'accès de tout ce qu'il y a à l’intérieur (fichiers, dossiers…) .

Code : Tout sélectionner

<?php $np = '0'.$droits; $filesPath = $this->user->dir_current.'/'.$nameFileOrFolder; // si checkbox cochée - si on modifie droits d'un dossier et qu'on veut aussi que ça modifie droits de tout ce qu'il y a à l'intérieur if ($isFolder && $editPermissionsOfFilesInFolder) { // - c est ici que je je ne sais pas trop quoi faire } // si on modifie droit d'un fichier, ou juste d'un dossier else { // - marche return (ftp_chmod($conn_id, eval("return({$np});"), $filesPath) !== false); }
Quelqu’un aurai une idée SVP ?
Merci beaucoup.
Modifié en dernier par stephweb le 13 avr. 2016, 13:14, modifié 1 fois.

Eléphant du PHP | 385 Messages

13 avr. 2016, 12:51

Salut, moi j'aurai essayé un script reccursif ou à chaque fichier et dossier on affiche le fichier avec les checkbox lecture écriture ... Après j'aurai stocké les informations emplacement et nom du fichier dans un array.

Avatar du membre
Eléphant du PHP | 88 Messages

13 avr. 2016, 13:20

Merci, mais je comprend pas trop. la checkbox je l'ai déjà mise dans la vue. Ce que je veut, c'est que si il coche la checkox, que en + de modifier les droits du dossier, que ça modifie les droits de tout ce qu'il y a à l'intérieur (que ce soit fichiers et (ou) dossiers).
Le script récursif, je ne sais pas trop comment le coder en fait.
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

13 avr. 2016, 14:02

Bonjour,

Une piste ici : http://stackoverflow.com/a/22456142
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 88 Messages

13 avr. 2016, 15:47

Merci, mais je ne comprend pas trop, et j'ai l impression qu'il n'existe pas de fonction is_dir pour le FTP.

Voici mon code:

Code : Tout sélectionner

// si checkbox cochée - si on modifie droits d'un dossier et qu'on veut aussi modifier droits de ce qu'il y a à l'intérieur... if ($isFolder && $editPermissionsOfFilesInFolder) { // _c'est ici que je galère // ...on récup le dossier + les fichiers qui sont à l'interieur... function save($conn_id, $filesPath) { static $inFolder = array(); $buff = ftp_nlist($conn_id, $filesPath); foreach ($buff as $oneBuff) { if ($oneBuff != '..'){ $inFolder[] = $filesPath.'/'.$oneBuff; si $filesPath.'/'.$oneBuff est un dossier { $inFolder[] = save($conn_id, $filesPath.'/'.$oneBuff); } } } return $inFolder; } $inFolder = save($conn_id, $filesPath); //var_dump($inFolder); // ...on modifie dossiers et fichiers qui sont à l'interieur foreach ($inFolder as $oneInFolder) { ftp_chmod($conn_id, eval("return({$np});"), $oneInFolder); } } // si on modifie droit d'un fichier, ou juste d'un dossier else { // _ça marche return (ftp_chmod($conn_id, eval("return({$np});"), $filesPath) !== false); }
Bref, je n'arrive pas à finir ma function récursive.
merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

13 avr. 2016, 23:52

Ah pardon, j'ai lu le message trop vite, j'avais pas vu que c'était sur un FTP distant.

Tu peux utiliser ftp_rawlist() pour extraire un tableau qui contient les caractéristiques de chaque élément d'un répertoire, et tu pourra déterminer que c'est un répertoire si sa taille est à 0 à priori
http://php.net/manual/fr/function.ftp-rawlist.php
Regarde le 1er commentaire de la doc aussi qui a une fonction qui extraie proprement chaque partie de la réponse de ftp_rawlist()
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 88 Messages

14 avr. 2016, 10:58

ok, merci beaucoup.

Voici le code qui marche :

Code : Tout sélectionner

private function savePermissionsFilessaverecusive($conn_id, $filesPath) { function save($conn_id, $filesPath) { static $inFolder = array(); $buff = ftp_rawlist($conn_id, $filesPath); foreach ($buff as $oneBuff) { $chunks = preg_split("/\s+/", $oneBuff); list($item['rights'], $item['number'], $item['user'], $item['group'], $item['size'], $item['month'], $item['day'], $item['time'], $item['name']) = $chunks; $item['type'] = $chunks[0]{0} === 'd' ? 'directory' : 'file'; if ($item['name'] != '..' && $item['name'] != '.') { if ($item['type'] === 'directory') { $inFolder += save($conn_id, $filesPath.'/'.$item['name']); } else { $inFolder[] = $filesPath.'/'.$item['name']; } } } $inFolder[] = $filesPath; return $inFolder; } return save($conn_id, $filesPath); }
Ensuite, j"'ai juste à faire:

Code : Tout sélectionner

$inFolder = $this->savePermissionsFilessaverecusive($conn_id, $filesPath); //var_dump($inFolder); // je récupère tout les dossier et fichiers... // ... on modifie le dossier et dossiers et fichiers qui sont à l'interieur foreach ($inFolder as $oneInFolder) { if (ftp_chmod($conn_id, eval("return({$np});"), $oneInFolder) === false) { $error = true; } }