J'ai donc ce message dans les logs d'apache2 (error.log) suite à l'enregistrement de la page bienvenue.
[Tue Aug 08 18:16:21.592192 2023] [proxy_fcgi:error] [pid 637963] [client 127.0.0.1:40864] AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc() in /var/www/html/sosalloquoi/zplus/outils.php:22\nStack trace:\n#0 /var/www/html/sosalloquoi/zplus/outils.php(23): no_mq_gpc()\n#1 /var/www/html/sosalloquoi/zplus/outils.php(24): zp_secure()\n#2 /var/www/html/sosalloquoi/zplus/module/page_admin.php(92): zp_secure_POST()\n#3 /var/www/html/sosalloquoi/zplus/tmodule.php(96): Tpage_admin->dojob()\n#4 /var/www/html/sosalloquoi/zplus/ziteplus.php(451): Tmodule::execute_module()\n#5 /var/www/html/sosalloquoi/zplus/ziteplus.php(408): zite->page_module()\n#6 /var/www/html/sosalloquoi/zplus/ziteplus.php(208): zite->page_page_editor()\n#7 /var/www/html/sosalloquoi/index.php(6): zite->builder()\n#8 {main}\n thrown in /var/www/html/sosalloquoi/zplus/outils.php on line 22', referer: http://localhost:800/index.php?z=page_editor|1:accueil
Merci d'avance
]]>J'ai donc ce message dans les logs d'apache2 (error.log)
[Tue Aug 08 18:16:05.014952 2023] [proxy_fcgi:error] [pid 637962] [client 127.0.0.1:41916] AH01071: Got error 'PHP message: PHP Warning: Undefined array key "truepage" in /var/www/html/sosalloquoi/zplus/module/login.php on line 36', referer: http://localhost:800/index.php?z=login
Merci d'avance
]]>Il y a un bug Tinymce lors de l'édition d'une page contenant du code PHP (voir https://ziteplus.giausserand.fr/forum/v … p?id=1282)
Pour corriger cela, ZitePlus insère ce code lors de l'édition par tinymce de chaque page contenant du code PHP depuis la version 0.9.2 ou 0.9.3 (il faut que je vérifie).
Je n'ai pas re-tester en 0.9.5 ou 0.9.6 pour voir si le bug tinymce a disparu.
En principe c'est transparent pour l'utilisateur: lors de l'enregistrement de la page le code html (qui ne fait rien ) est supprimé.
As tu pu voir dans quel contexte tu gardes ce code ?
a+
Jean-Paul
Pour les besoins particulier d'un site, dans lequel on peut suivant le cas voir ou ne pas voir une page, j'avais besoin d'une gestion dynamique des droits sur les pages... valable uniquement pour la session, et donc non persistante...
L'idée est de permettre à ces utilisateurs appartenant tous au même groupe d'avoir une page personnelle qu'ils sont seuls à pouvoir modifier, et que les utilisateurs abonnés à cette page puisse la voir. Mais je ne voulais pas multiplier les groupes.
Après avoir galéré, j'ai trouvé la solution, et pour minimiser l'impact sur le code, j'ai utilisé un module pour le faire.
La solution trouvée se présente comme suit :
- Les pages sont crées avec comme nom de fichier un moyen d'identifier le propriétaire (exemple le pseudo)
- Elles sont créées en lecture ET écriture réservées à l'administrateur
- Après lecture des pages (structure.dta) on modifie dynamiquement les droits
- si une page a été modifiée par celui qui a le droit en écriture, on efface les droits ajoutés avant d'enregistrer la structure.
Pour la mise en oeuvre, j'ai ajouté 4 lignes au code de ZITEPLUS (V0.9.4)
Dans le fichier tmodule.php, j'ajoute 2 constantes de type d'évènement
/////////////////////////
define('eBuild',12); // AJOUT PYDou
define('eEdit',13); // AJOUT PYDou
/////////////////////////
Dans le fichier ziteplus.php j'appelle un évènement au tout début de la fonction builder
function builder() {
////////////////////////////////////////////
$this->doevent(eBuild,eBefore,$out); // Ajout PYDou
////////////////////////////////////////////
Dans le fichier pageadmin.php, j'appelle un évènement juste avant d'écrire la structure (du côté de la ligne 100)
if ($nbphp && ($pagedesc[cPageType]%2!=0)) {
$pagedesc[cPageType] = ($pagedesc[cPageType]&~pgbitType)|(int)2;
}
///////////////////////////////////////////////////////////
self::$cms->doevent(eEdit,eAfter,$out); // Ajout PYDou
///////////////////////////////////////////////////////////
$rslt = $cms->pages->WriteStruct() && $cms->writefile($file, $source);
$out .= $rslt ? $cms->get_message('done_ok') : $cms->get_message('done_failed');
Le module qui permet le traitement dépend du besoin qu'on peut en avoir (logiqie de modification dynamique, mais il contient aussi des actions constantes :
Enregistrement des évènements :
protected function Register() {
self::$cms->register_event(eBuild,eBefore,$this->modulename);
self::$cms->register_event(eEdit,eAfter,$this->modulename);
}
La partie commune du code pour eBuild , eBefore dans laqelle permax représente le nom de la page (pour moi celle dont le fichier porte le nom de l'utilisateur connecté)
$i=1;
while (isset(self::$cms->struct[$i])) {
if (self::$cms->struct[$i][0]==$permax) {
$nb=count(self::$cms->struct[$i][cPageRead]);
if (($nb>0) and (self::$cms->struct[$i][cPageRead][$nb-1]!="logon")) self::$cms->struct[$i][cPageRead][$nb]="logon";
}
if (self::$cms->struct[$i][0]==$permay) {
$nb=count(self::$cms->struct[$i][cPageRead]);
if (($nb>0) and (self::$cms->struct[$i][cPageRead][$nb-1]!="logon")) self::$cms->struct[$i][cPageRead][$nb]="logon";
$nb=count(self::$cms->struct[$i][cPageWrite]);
if (($nb>0) and (self::$cms->struct[$i][cPageWrite][$nb-1]!="logon")) self::$cms->struct[$i][cPageWrite][$nb]="logon";
}
$i++;
}
La partie commune du code qui efface les droits ajoutés avant enregistrement
$i=1;
while (isset(self::$cms->struct[$i])) {
if (self::$cms->struct[$i][0]==$permax) {
$nb=count(self::$cms->struct[$i][cPageRead]);
unset(self::$cms->struct[$i][cPageRead][$nb-1]);
}
if (self::$cms->struct[$i][0]==$permay) {
$nb=count(self::$cms->struct[$i][cPageRead]);
unset(self::$cms->struct[$i][cPageRead][$nb-1]);
$nb=count(self::$cms->struct[$i][cPageWrite]);
unset(self::$cms->struct[$i][cPageWrite][$nb-1]);
}
$i++;
}
Toute idée qui me permettrait de ne pas toucher au code de ZITEPLUS sera la bienvenue.
A défaut, l'intégration de ces modifications (mineures) dans les versions future me conviendrait tout aussi bien
ZitePlusment vôtre
PYDou
donc cette ligne "Disallow: /z..." n'a plus lieu d’être ? on peu la virer !
Tout à fait.
Sauf si tu es joueur: ça permet de voir les robots malveillants qui cherchent a accéder quand même à zfiles
]]>C'est bien en dessous de la réalité: je suis résolument contre.
Il y a certainement des raisons pour cela, mais je ne les comprends pas .
L'usage d'Internet a évolué en partant de sites statiques en pur HTML chargés par FTP vers des sites interactifs très complexes.
ZITE+ est un outil qui se situe à mi-chemin de cette évolution. D'un côté, il gère formidablement bien les aspects suivants :
- IAM (gestion des droits)
- arborescence des pages
- la création de pages (Tinymce)
- la possibilité d'y ajouter des modules, et d'en créer de nouveaux pour l'enrichir
De l'autre côté, sauf depuis l'apparition du module "comment" qui lui donne un début d'interactivité, il reste réservé à l'usage des (semi)geeks pour ce qui est de la création du contenu.
Je l'ai choisi pour cette raison face à des Joomla et autres WordPress dont la lourdeur rendait l'adaptation au besoin un peu fastidieuse.
Pour les usages complexes comme le club de voile ou de bridge, il fallait une base de donnée et écrire du code, j'ai donc enrichi par du code php , sans penser à le packager, l'usage étant trop spécifique.
En proposant les modules DOSSIERS, ATTACH, DEBAT, MEETING, VOTE, j'offre la possibilité de "dé-geeker" l'usage du CMS en lui apportant des fonctions interactives utilisables par tous, ce qui, je pense, va dans le sens de l'histoire. Dans la mesure ou les seuls modules utilisés sont dans le repository de ZITE+, et mis à jour par la procédure normale, pourquoi obliger le créateur du site à recréer tout son modèle de pages, groupes d'utilisateurs et autre paramétrage ?
Avoir des offres packagées, c'est aussi étendre l'usage du produit à ceux qui n'ont pas le temps ou la compétence pour le personnaliser, ou qui en ont un usage standard et s'en servent comme en mode SaaS.
J'entends donc bien le "résolument contre", et pour l'adopter, j'aimerai en comprendre le pourquoi, le but et l'intérêt.
Amitiés
PYDou
Le module est en ligne.
Pour l'installer: option module et installer depuis le site officiel
a+
Jean-Paul
Je reprends contact avec zite+ après une longue éclipse (j'attendais les modules prévus... ).
Donc je suis de nouveau un néophyte et je refais le parcours avec un œil neuf sur 0.9.4.
Donc deux remarques (c'est peut-être déjà corrigées sur les versions ultérieures) :
CONFIGURER
Impossible de mettre des accentuées dans site_title et site_subtitle, il faut passer par le fichier .ini
INSERTION SWF
On perd la couleur de fond de l'animation à chaque mise à jour de la page, je recopie le code en source
Je dis merci à toute l'équipe pour le travail accompli. Bonne continuation
]]>J'essaye d'intégrer sur mon site, un script pour afficher des photos, et les photos sont dans des dossiers par thème, comme dossier1, dossier2, dossier3. Le script est en php. Etant débutant en php, je bute sur un bout de code : <a href="<?php echo $_SERVER['PHP_SELF']; ?>"
voici le code en entier :
<!--
folioGallery v1.2 - 2014-02-01
(c) 2014 Harry Ghazanian - foliopages.com/php-jquery-ajax-photo-gallery-no-database
This content is released under the http://www.opensource.org/licenses/mit-license.php MIT License.
-->
<?php
/***** gallery settings *****/
$mainFolder = 'albums'; // main folder that holds subfolders - this folder resides on root directory of your domain
$no_thumb = 'foliogallery/noimg.png'; // show this when no thumbnail exists
$extensions = array(".jpg",".png",".gif",".JPG",".PNG",".GIF"); // allowed extensions in photo gallery
$itemsPerPage = '12'; // number of images per page if not already specified in ajax mode
$thumb_width = '150'; // width of thumbnails
$sort_by = 'date'; // 'date' will sort albums by upload date - change 'date' to anything else to sort by album name
$show_caption = 'yes'; // 'yes' will display file names as captions on each thumb inside albums
/***** end gallery settings *****/
$numPerPage = (!empty($_REQUEST['numperpage']) ? (int)$_REQUEST['numperpage'] : $itemsPerPage);
$fullAlbum = (!empty($_REQUEST['fullalbum']) ? 1 : 0);
// function to create thumbnails from images
function make_thumb($folder,$src,$dest,$thumb_width) {
$ext = strrchr($src, '.');
$ext = strtolower($ext);
switch($ext)
{
case ".jpeg":
$source_image = imagecreatefromjpeg($folder.'/'.$src);
break;
case ".jpg":
$source_image = imagecreatefromjpeg($folder.'/'.$src);
break;
case ".png":
$source_image = imagecreatefrompng($folder.'/'.$src);
break;
case ".gif":
$source_image = imagecreatefromgif($folder.'/'.$src);
break;
}
$width = imagesx($source_image);
$height = imagesy($source_image);
$thumb_height = floor($height*($thumb_width/$width));
$virtual_image = imagecreatetruecolor($thumb_width,$thumb_height);
imagecopyresampled($virtual_image,$source_image,0,0,0,0,$thumb_width,$thumb_height,$width,$height);
imagejpeg($virtual_image,$dest,100);
imagedestroy($virtual_image);
imagedestroy($source_image);
}
// display pagination
function paginateAlbum($numPages,$urlVars,$alb,$currentPage) {
$html = '';
if ($numPages > 1)
{
$html .= 'Page '.$currentPage.' of '.$numPages;
$html .= ' ';
if ($currentPage > 1)
{
$prevPage = $currentPage - 1;
$html .= '<a class="pag" rel="'.$alb.'" rev="'.$prevPage.'" href="?'.$urlVars.'p='.$prevPage.'">««</a> ';
}
for( $i=0; $i < $numPages; $i++ )
{
$p = $i + 1;
if ($p == $currentPage)
{
$class = 'current-paginate';
}
else
{
$class = 'paginate';
}
$html .= '<a rel="'.$alb.'" rev="'.$p.'" class="'.$class.' pag" href="?'.$urlVars.'p='.$p.'">'.$p.'</a>';
}
if ($currentPage != $numPages)
{
$nextPage = $currentPage + 1;
$html .= ' <a class="pag" rel="'.$alb.'" rev="'.$nextPage.'" href="?'.$urlVars.'p='.$nextPage.'">»»</a>';
}
}
return $html;
}
?>
<div class="fg">
<?php
// if no album is selected show all albums
if (empty($_REQUEST['album']))
{
$ignore = array('.', '..', 'thumbs');
$albums = array();
$captions = array();
$random_pics = array();
if($sort_by == 'date')
{
$folders = array_diff(scandir($mainFolder), array('..', '.'));
$sort_folders = array();
foreach ($folders as $key=>$folder)
{
$stat_folders = stat($mainFolder .'/'. $folder);
$folder_time[$key] = $stat_folders['ctime'];
}
array_multisort($folder_time, SORT_DESC, $folders);
}
else
{
$folders = scandir($mainFolder, 0);
}
foreach ($folders as $album)
{
if(!in_array($album, $ignore))
{
array_push($albums, $album);
$caption = $album;
//$caption = substr($album,0,20); // show only the 1st 20 characters
array_push($captions, $caption);
$rand_dirs = glob($mainFolder.'/'.$album.'/thumbs/*.*', GLOB_NOSORT);
if (count($rand_dirs) > 0)
{
$rand_pic = $rand_dirs[array_rand($rand_dirs)]; // display random thumb for each album
//$rand_pic = $rand_dirs[0]; // display the first thumb of each album
}
else
{
$rand_pic = $no_thumb;
}
array_push($random_pics, $rand_pic);
}
}
$numAlbums = count($albums); // number of albums
if( $numAlbums == 0 )
{
echo 'There are currently no albums.';
}
else
{
$numPages = ceil( $numAlbums / $numPerPage );
if(isset($_REQUEST['p']))
{
$currentPage = (int)$_REQUEST['p'];
if($currentPage > $numPages)
{
$currentPage = $numPages;
}
}
else
{
$currentPage=1;
}
$start = ($currentPage * $numPerPage) - $numPerPage;
?>
<div class="titlebar">
<span class="title">Photo Gallery</span> - <?php echo $numAlbums; ?> albums
</div>
<div class="clear"></div>
<?php
for( $i=$start; $i<$start + $numPerPage; $i++ )
{
if( isset($albums[$i]) )
{ ?>
<div class="thumb-wrapper">
<div class="thumb">
<a class="showAlb" rel="<?php echo $albums[$i]; ?>" href="<?php echo $_SERVER['PHP_SELF']; ?>?album=<?php echo urlencode($albums[$i]); ?>">
<img src="<?php echo $random_pics[$i]; ?>" width="<?php echo $thumb_width; ?>" alt="<?php echo $albums[$i]; ?>" />
</a>
</div>
<div class="caption"><?php echo $captions[$i]; ?></div>
</div>
<?php
}
}
?>
<div class="clear"></div>
<div align="center" class="paginate-wrapper">
<?php
$urlVars = "";
$alb = "";
echo paginateAlbum($numPages,$urlVars,$alb,$currentPage);
?>
</div>
<?php
}
}
else
{
// display photos in album
$src_folder = $mainFolder.'/'.$_REQUEST['album'];
$src_files = array_diff(scandir($src_folder ), array('..', '.'));
$files = array();
/*** sort by most recent uploaded file ***/
foreach ($src_files as $key=>$img)
{
$stat_folders = stat($src_folder .'/'. $img);
$file_time[$key] = $stat_folders['ctime'];
}
array_multisort($file_time, SORT_DESC, $src_files);
/*** end sort ***/
foreach ($src_files as $file)
{
$ext = strrchr($file, '.');
if(in_array($ext, $extensions))
{
array_push( $files, $file );
if (!is_dir($src_folder.'/thumbs'))
{
mkdir($src_folder.'/thumbs');
chmod($src_folder.'/thumbs', 0777);
//chown($src_folder.'/thumbs', 'apache');
}
$thumb = $src_folder.'/thumbs/'.$file;
if (!file_exists($thumb))
{
make_thumb($src_folder,$file,$thumb,$thumb_width);
}
}
}
$numFiles = count($files); // number of images
if ( $numFiles == 0 )
{
echo 'There are no photos in this album!';
}
else
{
$numPages = ceil( $numFiles / $numPerPage );
if(isset($_REQUEST['p']))
{
$currentPage = (int)$_REQUEST['p'];
if($currentPage > $numPages)
{
$currentPage = $numPages;
}
}
else
{
$currentPage=1;
}
$start = ($currentPage * $numPerPage) - $numPerPage;
?>
<div class="titlebar">
<?php if($fullAlbum==1) { ?>
<span class="title"><a href="<?php echo $_SERVER['PHP_SELF']; ?>" class="refresh">Albums</a></span>
<span class="title">»</span>
<?php } ?>
<span class="title"><?php echo $_REQUEST['album']; ?></span> - <?php echo $numFiles; ?> images
</div>
<div class="clear"></div>
<?php
for( $i=0; $i <= $numFiles; $i++ )
{
if(isset($files[$i]) && is_file( $src_folder .'/'. $files[$i]))
{
$ext = strrchr($files[$i], '.');
$caption = substr($files[$i], 0, -strlen($ext)); ?>
<?php if($i<$start || $i>=$start + $numPerPage) { ?><div style="display:none;"><?php } ?>
<div class="thumb-wrapper">
<div class="thumb">
<a href="<?php echo $src_folder; ?>/<?php echo $files[$i]; ?>" title="<?php echo $caption; ?>" class="albumpix">
<img src="<?php echo $src_folder; ?>/thumbs/<?php echo $files[$i]; ?>" width="<?php echo $thumb_width; ?>" alt="<?php echo $files[$i]; ?>" />
</a>
</div>
<?php if($show_caption=='yes') { ?><div class="caption"><?php echo $caption; ?></div><?php } ?>
</div>
<?php if($i<$start || $i>=$start + $numPerPage) { ?></div><?php }
}
} ?>
<div class="clear"></div>
<div align="center" class="paginate-wrapper">
<?php
$urlVars = "album=".urlencode($_REQUEST['album'])."&";
$alb = $_REQUEST['album'];
echo paginateAlbum($numPages,$urlVars,$alb,$currentPage);
?>
</div>
<?php
} // end else
}
?>
</div>
En affichant le code de la page, j'ai comme ceci :
<div id="pg_6">
<!-- start gallery header -->
<link rel="stylesheet" type="text/css" href="galerie/foliogallery.css" />
<link rel="stylesheet" type="text/css" href="galerie/colorbox/colorbox.css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript" src="galerie/colorbox/jquery.colorbox-min.js"></script>
<!-- end gallery header -->
<script type="text/javascript">
$(document).ready(function(){
// initiate colorbox
$(".albumpix").colorbox({rel:'albumpix', maxWidth:'98%', maxHeight:'98%', slideshow:true, slideshowSpeed:3500, slideshowAuto:false});
});
</script>
<br />
<br />
<!--
folioGallery v1.2 - 2014-02-01
(c) 2014 Harry Ghazanian - foliopages.com/php-jquery-ajax-photo-gallery-no-database
This content is released under the http://www.opensource.org/licenses/mit-license.php MIT License.
-->
<div class="fg">
<div class="titlebar">
<span class="title">Galeries Photos</span> - 5 albums
</div>
<div class="clear"></div>
<div class="thumb-wrapper">
<div class="thumb">
<a class="showAlb" rel="Big Bear California" href="/smockarate/index.php?album=Big+Bear+California">
<img src="galerie/albums/Big Bear California/thumbs/pict6.jpg" width="150" alt="Big Bear California" />
</a>
</div>
<div class="caption">Big Bear California</div>
</div>
Et quand je clique sur le dossier des photos, au lieu d'afficher l'album de photos, il me redirige vers la page d'accueil du site, et regardant de près, j'ai vu href="smockarate/index.php?album au lieu de gallery.php?album et le localhost ne fait pas partie. Je test ce script en local avec Easyphp 5.3.8.1.
Ma question est : comment faire pour que ce script détecte le localhost.
Merci de votre aide.
Seng
]]>Free n'étant pas mon FAI,J'ai donc suivi tes conseils auprès de :http://www.free.fr/assistance/252.html, où j'ai pu remplir un formulaire : Free Accès Libre
Je n'ai plus qu'à attendre le retour par courrier ...
A Bientôt
]]>J'ai pris le temps de relire la page indiquée dans le message et j'ai attribué un 777 sur tous les fichiers et répertoires .
J'ai toujours le même soucis
C'est pourquoi je t'ai parlé de la commande chown
Je peux me tromper, mais je suspectais (et suspecte encore) un problème de propriétaire de fichier.
Ma version de php est 5.3.27-1 et ZitePLUS 0.9.2
Ok, cette config php5.3 et Ziteplus 0.9.2 tourne en production, donc pas de soucis avec cela.
J'ai essayé comme indiqué ici par ftp :
(2) Cliquez sur Télécharger pour envoyer les fichiers sur le serveur (Nota: Vous pouvez aussi envoyer les fichiers via ftp dans le répertoire: zdata/ztemp/files/07790101f2c7d0c0ab80ae7c75c3ac62)
J'ai donc placé deux fichiers par ftp mais ils ne figure pas dans la liste de ZITEPLUS.
Attention: il ne faut pas fermer sa session Ziteplus durant cette manipulation, sinon l'adresse après files/ n'est plus la même
Une autre idée ?
Pour l'instant, je pense toujours à un problème de propriétaire des fichiers et répertoires.
Donc voir si tu peux appliquer ce qui est conseillé sur la page à "Pour changer le propriétaire d'un fichier sur un serveur Linux en ligne de commande:".
Dans la mesure ou ton serveur est local, la conseil de regarder les logs apache et/ou php est aussi pas mal
cela permettra de voir si un message d'erreur explicite est enregistré par le serveur.
ça fait longtemps que je n'ai pas utilisé un smeserver, aussi je ne pourrais pas être catégorique, mais il y a de grande chance que quand tu transfères tes fichiers (ftp et installation initiale) ceux ci appartiennent à l'utilisateur root et que le serveur web utilise un autre utilisateur (c'est conseillé en tout cas). Hors pour que le cms fonctionne bien, il vaut mieux que ces fichiers appartiennent a l'utilisateur (ou au groupe de l'utilisateur) du serveur web.
a+
Jean-Paul
salut jpg
dans ziteplus il y a un petit hic quand il y à beaucoup de documents !
comme tu avais pu le constaté avec un certain site que je t'avais joint avec 1600 documents
Oui, je me souviens
cela m'a d'ailleurs permis d'optimiser cette gestion des documents
(néamoins ce module reste très bien conçut avec la gestions des rubriques)
est ce que avec cette outil on peut faire une gestion plus simple des doc
juste comme ceci voir une fenêtre avec des dossiers et images à l'intérieur me parait plus clair à gérer mais ...cela me parait bien complexe à réaliser
ziteplus scannerait les dossiers du repetoire doc
les dossiers scanné seront créer ou supprimé dans rubrique.dta
puis ziteplus scan le contenue des dossiers et assigne le contenue à un fichier rub_***nom_repertoire**.dtatous ceci rendrait la gestion de document plus souple et moins gourmand si il y à beaucoup d'image (exemple : site pour un photographe)
de plus en intégrant ce monsta on la gestion de dossier, le drag and drop + doc volumineux exemple vidéo et un affichage clair.
je ne sais si cela est réalisable et si cela est réellement une bonne idée
avantage du module actuel tel qu'il est et que l'on aura pas avec cette outil :
possibilité d'assigné plusieurs rubrique à 1 image
description de l'image
title de l'image
Ok, maintenant je comprends mieux la question
Pour le chargement de plusieurs fichiers par drag&drop, c'est déjà fonctionnel dans l'alpha mis en ligne de la 0.9.3
Pour les répertoires ou pseudo répertoire, oui j'y songe fortement, mais a priori je vais le faire via la gestion des documents.
Le nouveau gestionnaire me semble adapté (ou en tout cas il le sera quand j'aurais fini les modifs) a un fonctionnement de ce type.
a+
Jean-Paul
perso j'utilise ZazouMiniWebServer (ZWMS pour les intimes).
Aussi léger que "Uniform Server" (10 à 14 Mo), en français et jamais de bug.
Il est aussi bien installable sur disque dur qu'en solution portable. Juste à lire la documentation et bien placer dans le bon répertoire (_web.zmwsc) ses fichiers ... et ça roule.
Exit EasyPhp, Wamp et autres solutions.
]]>