Zippeur

Il est parfois utile, notamment quand un article comprend beaucoup de documents joints, de proposer l’ensemble des documents sous forme de zip.

Ce plugin permet à SPIP de générer une archive zip à partir d’une liste de documents.

La présente version est valable à partir de la v7 du plugin.

Installation

Il s’installe comme n’importe quel plugin.

Il nécessite assez de place étant donné qu’on duplique les documents.

Les zip seront créés dans le dossier local/cache-zip.

Le plugin s’appuie sur les librairies de SPIP pour le Zippage.

Utilisation simple : le zip des documents joints à un article

Le plugin définit un modèle zip_doc_article qui permet de ziper les documents d’un article.

Dans le texte d’un article

Dans un article, appelez le modèle zip_doc_article de la manière suivante :

<zip_doc_article|>

L’appel du modèle renvoie un lien vers le zip.

Les documents de l’article courant seront alors zippés.

Avec cette méthode vous contrôlez les articles pour lesquelles vous proposez un zip.

Dans un squelette

Dans le squelette article.htmlou dans contenu/article.html si vous utilisez un squelette de type « Z », mettez

[(#MODELE{zip_doc_article}{id_article})]

Le zip sera proposé pour tous les articles qui possèdent des documents (que ces derniers soient en mode image ou document).

Vous pouvez passer un argument {mode=image} ou {mode=document} pour spécifier le mode... En l’absence d’argument mode le modèle prend les documents quelque soit le mode.

Utilisation simple : le zip des documents d’un album

Depuis la version 3.1, il est possible de zipper les documents d’un album : il suffit d’utiliser le modèle zip_doc_album. Ce modèle s’utilise de la même manière que le précédent, à l’exception que id_article est à remplacer par id_album.

Utilisation simple : lien vers le zip des documents de l’article / de l’album

Depuis la version 4.0, il est possible d’utiliser le raccourcis [texte->zip_doc_articlexxx] pour pointer vers un zip des document lié à l’article xxx ; de même on peut utiliser [texte->zip_doc_albumxxx] pour les documents de l’album xxx.

Usage avancé : zip sur mesure

Le plugin définit un filtre zippeur, qui s’applique sur un tableau (#ARRAY) contenant la liste des fichiers. Il retourne l’URL (relative) du zip.

[(touSlesdocs|zippeur{unedate,LaMethode,unnomdefichier,plat,unedureedevie,extension})]

L’argument unedate doit être une date formatée en SQL. En effet pour éviter de recalculer à chaque fois le zip (ce qui prendrait du temps), le plugin stocke en base de donnée le nom du zip associé à une date. Si la date passée en argument diffère de la date en base de donnée, le plugin recalcule le zip.

L’argument LaMethode doit être vide, il correspond à une ancienne version du plugin qui proposait plusieurs méthodes de zip, ce qui n’est plus le cas.

L’argument unnomdefichier (facultatif) peut-être le nom du fichier zip, sans l’extension. En l’absence de cet argument, le plugin en génére un à partir du contenu du tableau fournit en premier argument.

L’argument plat vaut 'non' par défaut. Si 'oui’, cela évite d’avoir dans le zip produit l’arboresence complète depuis le dossier local.

L’argument unedureedevie (facultatif) est apparu avec la version 3 du plugin. Il indique la durée de vie affecté au zip, à compter de la date de zippage. On consultera "Effacer les zip produits par le Zippeur" pour plus de détails.

L’argument extension, ajouté avec la version 5.1, est l’extension du zip (sans le point). Par défaut il vaut zip, mais il peut être changé pour par exemple produire un epub.

Exemple : je veux faire un zip de tous les fichiers présents sur le site.

[(#REM)<!-- On remplis un tableau avec les chemins de fichiers-->]

#SET{doc,#ARRAY}


<BOUCLE_doc(DOCUMENTS){tout}>
	[(#SET{doc,#GET{doc}|push{#FICHIER|copie_locale}})]
	[(#REM) ne pas oublier le copie_locale, sinon le zip ne contiendra pas les fichiers distant ]
</BOUCLE_doc>

[(#REM) On génére le zip en donnant comme date la dernière modification d'un document]

<BOUCLE_zip(DOCUMENTS){tout}{0,1}{!par maj}>
	<a href="[(#GET{doc}|zippeur{#MAJ,,toutlesdoc})]">Tout les docs</a>
</BOUCLE_zip>
</B_doc>

Usage très avancé : fabrication d’un ZIP contenant des fichiers issus de squelettes

Depuis la version 2.0, il est possible d’utiliser Zippeur au sein d’un squelette ou d’un plugin pour produire des Zip contenant des fichiers issus de l’interprétation d’un squelette SPIP.

Cette fonctionnalité est documentée dans un article à part.

Limites (attention pour SPIPeur avancé)

Il peut arriver que pour des fichiers très lourds (par exemple plus de 300 Mo) le serveur n’arrive pas à compresser. Pour le moment le plugin n’intégre pas automatiquement de « taille limite » avant essai de zippage.

Si vous êtes dans la possibilité d’avoir des fichiers lourds avec un serveur qui ne suivrait pas — et cela dépend de votre serveur —il faudrait que vous fassiez vous même le test dans les boucles.

Pour ce faire vous pouvez utiliser le critère somme de SPIP-Bonux afin de faire un test conditionnel.

Cas où le cache est désactivé

Si le cache de SPIP est désactivé à l’aide de la constante _NO_CACHE, les zip sont recalculés à chaque appel de la commande.

Toutefois si la constante _NO_CACHE_SAUF_ZIPPEUR est mise à 1, alors le zips seront aussi mis en cache.

Pour les webmestre : fichiers de log

Zippeur génére deux fichiers de logs spécifiques, dans le dossier tmp :
-  zippeur.log : à chaque fois qu’un zip est généré, son nom est rajouté.
-  zippeur_erreur.log : il peut arriver qu’un zip ne se fabriquent pas exactement comme souhaité. Ce fichier contient les erreurs qui peuvent se produire.

Discussion

11 discussions

  • 2

    Je ne comprends pas :

    Erreur d’exécution ../squelettes/modeles/zip_doc_article.html | File […]/plugins/auto/zippeur/v8.0.0/zippeur_fonctions.php Line 137 : Class « Spip\Archiver\SpipArchiver » not found"

    Que faire ?

    SPIP 4.2.6 et PHP Version 8.0.30

    • Il y avait un bug lié au fait que je devellopais sur 5.0 et pas 4.2, et donc l’autoloading des classes n’est pas le même.

      La v8.0.1 du plugin, juste envoyée, résoud le problème.

    • Super ! Merci !
      ça marche

    Répondre à ce message

  • 1
    Julien

    Bonjour,

    est-il possible de zipper un dossier et son contenu ? (garder la structure avec les sous-dossiers et les fichiers). J’utilise une boucle data avec la fonction glob.

    Exemple :

    -Customers
    -- Accounts
    --- nicolas.pdf
    --- david.pdf
    --- etc.pdf
    -- Orders
    --- nicolas.pdf
    --- david.pdf
    --- etc.pdf

    Qui deviendrait alors : IMG/zip/customers.zip

    • Spontanément je dirais oui, en utilisant ce qui est décrit dans « Usage avancé : zip sur mesure »

    Répondre à ce message

  • 2

    Bonjour,

    Merci pour ce plugin !

    Sur un SPIP 3.1.2 [23169] je n’ai pas de fichiers log. Du coup, je ne sais pas pourquoi les zips ne sont pas correctement fabriqués. Un fichier est créé, avec une entrée en base, mais il est vide.

    Sur SPIP 3.0.21 [22462], sur lequel le zippeur fonctionne, je n’ai pas de fichiers log non plus, d’ailleurs.

    Les 2 installations ont la même version du zippeur : 4.1.4

    Merci pour votre aide.

    • par défaut, seul les logs d’un certain niveaux sont enregistrés. Les logs de zippeur sont de niveau 5 -> pas enregistrés.

      mettre define('_LOG_FILTRE_GRAVITE', 8); dans le fichier mes_options.php permettra de tout voir (mais au prisque de fichier de log bien chargé).

    • Merci beaucoup pour votre réponse rapide ... et pour la mise à jour concernant les logs.

      Finalement, tout fonctionne très bien ... j’avais un problème dans ma boucle et le zippeur fabriquait allègrement des fichiers vides. (No comment).

      Mais sur un serveur de dev local fraîchement installé dans un monde en perpétuelle évolution, je me demandais si mon phpTrucZip (Php PclZip) était compatible.

      Encore merci !

    Répondre à ce message

  • 3

    Bonjour,

    Pour ceux que cela intéresse, voici un bout de code qui va produire un zip contenant tous les logos (normaux et pas survol) des auteurs faisant partis d’un certain groupe de mots-clés.

    <div id="global-inner">
    	<div class="nettoyeur"></div>
    	<h1>On crée le zip des logos d'auteurs</h1>
    	#ENV{date}
    	[(#SET{photos,#ARRAY})]
    	#SET{cmd,#ENV{cmd,#CONFIG{zippeur/zippeur_cmd}}}
    	[(#SET{nomdoc,photo_trombi})]
    	<B_trombi>
    	<div class="liste auteurs trombi">
    	[(#COMPTEUR_BOUCLE)]
    	<ul class="liste-items">
    	<BOUCLE_trombi(AUTEURS) {type_mot='trombi'} {logo} {par nom}>
    	[(#SET{logo_normal_nom,[(#LOGO_AUTEUR_NORMAL|fichier)]})]
    	[(#SET{logo_normal_src,#VAL{'IMG/'}|contact{#GET{logo_normal_nom}}})]
    	[(#SET{photos,#GET{photos}|push{#GET{logo_normal_src}}})]
    	<li class="item">[(#NOM)][ <a href="(#GET{logo_normal_src})">Photo : #GET{logo_normal_nom}</a></li>
    	</BOUCLE_trombi>
    	</ul>
    	<div class="complement">
    	[(#SET{urlzip,#GET{photos}|zippeur{#ENV{date},#GET{cmd},#GET{nomdoc}}})]
    		<a href="[(#GET{urlzip})]" title="">(<:zippeur:ensemble_fichier:> - [(#GET{urlzip}|filesize|taille_en_octets)])</a>
    	</div>
    	</div>
    	</B_trombi>
    </div>

    Cette boucle a été faite sur un SPIP 2.1 avec zippeur 3. Je me suis inspiré du modèle zip_doc_article du plugin.
    Elle va chercher tous les auteurs du groupe de mots-clés « trombi » et ayant un logo. On crée une liste pour avoir leur nom et le nom du fichier logo/photo. Cela nous permet d’avoir une liste complète des noms et les logos associés. Ce n’est pas forcément à mettre en page public, mais ça aide ;-)

    Attention tout de même, si vous avez beaucoup d’auteurs répondant à ces critères, votre page va mettre beaucoup de temps à s’afficher. Actuellement, j’ai 530 auteurs issus de cette boucle, ma page tourne depuis 10 minutes (en local). ;-)

    • Une erreur dans le code, c’est le filtre concat et pas contact. Soit donc :
      [(#SET{logo_normal_src,#VAL{'IMG/'}|concat{#GET{logo_normal_nom}}})]

       :-D

      Et donc, avec cette correction, ça prend 10 secondes pour générer en local un zip de 29Mo.

    • bah 10 secondes c’est nettement mieux que dix minutes :-P

    • Pour sûr ! ;-)

    Répondre à ce message

  • 9
    The Marauder

    Bonsoir,

    Je souhaiterais rendre cette fonction active uniquement à partir du moment ou un article dispose de plus d’un document mais je ne vois pas comment faire ?

    Merci :)

    • quelle fonction ? comment insérer vous le zip ?

    • The Marauder

      Désolé de ne pas avoir été clair :

      J’ai inséré ceci

      [(#MODELE{zip_doc_article}{id_article})]

      Dans mon squelette article.html afin de pouvoir télécharger des documents zippés. Seulement, je souhaiterais que la possibilité de télécharger du document zippé ne soit effective que si l’article contient au moins 2 documents. Donc si un article ne contient qu’un seul document, je ne souhaite pas que soit proposé de zipper celui-ci.

    • Il faut conditionner l’affichage de [(#MODELE{zip_doc_article}{id_article})].

      Une manière simple de le faire est la suivante :

      <BOUCLE_totdocuments(DOCUMENTS){id_article} />
      [(#TOTAL_BOUCLE|>{1}|oui)
       	[(#MODELE{zip_doc_article}{id_article})]
      ]
      <//B_totdocuments>

      Voir la documentation sur les filtres de tests et sur partie laternative des boucles pour plus d’infos

    • The Marauder

      Merci, j’y suis presque !

      J’ai du virer des trucs que tu as mis sur le code que tu m’a proposé. J’ai pas compris comment ils ont pu arriver la.
      Par contre, si il détecte bien n+x documents, il affiche aussi n+x fois le lien pour télécharger le zip ^^
      Je vais voir du coté des filtres de test et alternative des boucles.

    • heu bizarre là. Tu a mis où cette boucle ?

      tu peux me mettre le code complet ?

      bonne nuit
      ++

    • The Marauder
      <BOUCLE_totdocuments(DOCUMENTS){id_article}>
      [(#TOTAL_BOUCLE|>{1}|oui)
              [(#MODELE{zip_doc_article}{id_article})]
      ]
      </BOUCLE_totdocuments>

      J’ai placé cela dans BOUCLE_contenu_article du skel contenu/article.html de zpip.

      Bonne nuit à toi et merci pour ton aide

    • ce n’est pas la boucle que j’ai mise.

      Je reprend :

      <BOUCLE_totdocuments(DOCUMENTS){id_article} />
      [(#TOTAL_BOUCLE|>{1}|oui)
       	[(#MODELE{zip_doc_article}{id_article})]
      ]
      <//B_totdocuments>

      l. 1 : une boucle totodocuments autofermante, qui n’affiche rien.
      l. 5 : fin de la partie alternative. Tout ce qu’il y a entre <\BOUCLE...> et <\\B...> est executé si la boucle ne retourne rien. C’est le cas ici.
      l. 2 : on test si le la BOUCLE a un nombre d’itération supérieur à 1.
      l. 3. Si c’est le cas, on affiche le modele de zip

    • The Marauder

      J’avais (cru ?) pourtant mis ce code au départ avant de tester à « ma facon » ...

      En tout cas, maintenant ça fonctionne, merci encore :)

    • de rien... il y a tjr des choses qu’on croit faire et qu’on fait pas :-)

    Répondre à ce message

  • 2

    Bonjour et merci pour ce plugin

    Deux bricoles :

    1) Plugin Zippeur bien installé, pourtant dans la liste des plugins, j’ai le message « Installation du plugin Zippeur Echec » en haut de la liste. Grave ? Pourtant ça fonctionne...

    2) Lorsque je clique sur « En savoir plus » dans la liste des plugins... Erreur de redirection vers la page de spip-contrib.

    Encore Merci

    Répondre à ce message

  • 5

    Très bon ! Et fonctionne sur 2.3-dev sans soucis (hormis la configuration mais ça ne devrait pas être compliqué d’adapter).

    Sans bonux, pour éviter de tenter de zipper des fichiers de plus de 50mo je fais une petite boucle si le plus gros fichier ne dépasse pas 50mo.

    <BOUCLE_doc(DOCUMENTS){id_article}{taille > 50000000 }{!par taille}{tout}{0,1}>
    </BOUCLE_doc>
    </B_doc>
    [(#MODELE{zip_doc_article}{id_article})]
    <//B_doc>

    Encore bravo pour cet excellent plugin !

    • c’est quoi le pb avec la configuration ?

    • Normalement il n’y en a plus avec 48964, mais je n’ai pas testé en SPIP 2.0 + cfg, je n’ai essayé qu’en 2.1+cfg et 3.

      N’hésite pas à me dire si certaines modifs ne te conviennent pas. Merci encore pour ce plugin qui est très très pratique !

    • on verra, j’ai plus de 2.0, donc on va attendre qu’une personne poste un méchant commentaires :-)

      par contre je suis d’avis de ne pas mettre de borne supérieur dans plugin.xml car rien n’exclus que le plugins soit compatible spip 3.1, donc je préfére laisser l’intervalle ouvert

      j’ai testé hier soir sur SPIP 3 et j’ai pas eu besoin de modifier le plugin.xml. C’est quoi cette nouvelle pipeline « déclarer_table_principale » ? c’est indispensable ?

    • oui, j’ai corrigé la borne supérieur, Eric m’a demandé de mettre l’étoile (pris en charge par spip3 uniquement, mais avec la double déclaration ça passe.)

      La double déclaration dans plugin.xml c’est pour éviter de forcer l’installation de CFG. Mais dans le cas présent on pourrait imaginer avoir une unique déclaration car même en 2/2.1 le plugin peut être configuré soit par bonux, soit par CFG (donc on pourrait mettre utilise à la place de necessite, et faire une unique declaration pour spip du 2 au 3). Plusieurs plugins font cela, mais c’est vrai qu’il n’y a pas de « bonne solution ». Les utilisateurs qui n’ont ni l’un ni l’autre serait pénalisés mais ça peut s’indiquer dans la documentation du plugin. Je ne l’ai pas fait car je ne voulais pas trop "bousculer" le fonctionnement actuel du plugin, ça relève du choix des auteurs.

      Pour le pipeline declarer_table_principale, il y était déjà, je n’ai rien ajouté. Il sert à la déclaration de la table principale de zippeur, je crois que c’est tout.

      Désolé pour les oublis et merci pour tes corrections matinales.

    • oui pour la pipeline c’est moi qui suis fatigué :)

      pour la double déclaration, ce n’est pas très grave. Au grottes je migrerais vers le paquet.xml

    Répondre à ce message

  • 2

    Bonjour,

    Est-il possible d’avoir un zip contenant les fichiers avec le titre du document et non avec le nom initial du fichier ?

    Merci

    • pour le moment rien n’est prévu pour le permettre et je suis pas très chaud pour le coder : nombreux pb.

      Entre autres : gestions des extensions, des accents, des espaces, des tailles de noms.

    • effectivement, les gens peuvent mettre n’importe quoi en titre de documents.
      De plus il faudrait renommer les fichiers avant le zippage, sans toucher au nom en local.

      Pourquoi ne pas leurs donner le bon nom dés le départ ? ^^

    Répondre à ce message

  • 1

    Problème :

    Message dans la partie privée :

    Warning : filesize() [function.filesize] : stat failed for ../local/cache-zip/article_470.zip in /.../ecrire/public/composer.php(49) : eval()’d code on line 80

    Warning : filesize() [function.filesize] : stat failed for ../local/cache-zip/article_470.zip in /.../ecrire/public/composer.php(49) : eval()’d code on line 91

    Warning : filesize() [function.filesize] : stat failed for ../local/cache-zip/article_470.zip in /.../ecrire/public/composer.php(49) : eval()’d code on line 101

    Qu’est-ce qui ne va pas ?

    Merci

    Robert

    • un bug :)

      en fait une histoire de chemin.

      La version 0.5 corrige ce problème … ainsi que d’autres en terme de performance

    Répondre à ce message

  • 9

    Salut,
    Moi aussi j’attendais ce plugin depuis longtemps.
    Malheureusement, ça ne fonctionne pas sur un site hébergé chez Free.
    Voici le message d’erreur :

    vérifier les droits d’écriture
    Le système a rencontré une erreur lors de l’écriture du fichier _DIR_SITElocal//.ok. Veuillez, en tant qu’administrateur du site, vérifier les droits d’écriture sur le répertoire _DIR_SITElocal.

    Je n’arrive pas à le régler.

    Merci d’avance pour votre aide.

    • l’origine du problème est connue.

      pouvez vous tester ceci : remplace _DIR_SITE dans les fichier du plugin par _DIR_RACINE ?
      Il va falloir patienter un peu car je n’ai pas accés à SVN pour le moment.

    • Merci, ça fonctionne maintenant.

      J’aurai tout de même une dernière requête, Je voudrai resserrer le fichier zip uniquement sur les images (jpg,png...).
      Voici ce que j’ai mis sur ma page article mais ça ne fonctionne pas :

      [(#MODELE{zip_doc_article}{id_article}{mode=document}{extension==jpg|png|gif})]

      Il prend tous les documents en compte dans le zip.

      Voir cette page par exemple : http://pmbc1.free.fr/spip.php?article240

      Merci d’avance !!

    • modifiez le fichier modeles/zip_doc_articles.html du plugin :

      {extension ?}

      comme critère de chacune des 2 boucles ;

    • et vider le dossier local/cache-zip

    • Malgré plusieurs tests, ça ne marche pas.

      J’ai donc uniquement rajouté

      {extension==jpg|png|gif}

      à la 1re boucle du fichier modèle et mis

       [(#MODELE{zip_doc_article}{id_article})]

      dans mon article et là ça fonctionne parfaitement.

    • effectivement j’ai répondu un peu vite, cela ne pouvait marcher.

      En revanche :
      -  je vous conseil fortement de copier ce fichier dans le dossier modeles de votre dossiers squelettes. Sinon vous perdrez la modifications lors de la mise à jour du plugin.
      -  je vous conseil également de mettre ce critère sur la deuxième boucle pour éviter des pépins en cas de mise à jour des images.

    • Ok, merci pour les conseils.
      En tous cas, ce plugin me rend bien service.
      Merci encore !!

    • pourriez vous testez (à partir de 1 h) la nouvelle version que j’ai mise en ligne ce soir ?

      elle devrait résoudre le premier problème

      merci

    • Cette version résous le 1er pb.
      Merci.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom