Déplacer un document vers un répertoire autre que IMG

NdM : Attention, il semblerait que la compatibilité de cette contrib avec SPIP 1.8 soit incertaine !

FONCTION

J’ai écrit ce filtre pour répondre à une attente de mon chef de projet : enregistrer les documents joints aux articles sur un serveur de données différent de celui où est hébergée la Base de données Mysql de SPIP.

Je l’ai modifié afin de le rendre aussi générique que possible et permettre à tout un chacun de l’utiliser comme il le souhaite. Ce filtre permet de :
-  déplacer un type de documents souhaité (images, word, pdf...)
-  spécifier un chemin propre ou laisser le filtre générer automatiquement une arborescence de répertoires identique à celle des rubriques dont dépend l’article lié au document.
-  effectuer les modifications nécessaires dans la base de données

COMMENT ÇA MARCHE ?

Comme il s’agit d’un filtre, pas besoin de savoir coder du PHP et surtout on ne touche pas au noyau de SPIP (merci Vincent ! ). On l’utilise comme les autres filtres , en lui passant 3 paramètres.
ex :

(#LOGO_DOCUMENT|#URL_DOCUMENT|deplacer_document{"","Q:/","doc,pdf,xls,ppt,rtf"})

-  le chemin : vide dans mon exemple. On peut lui indiquer le répertoire de destination. Dans le cas contraire, le script va générer automatiquement une arborescence de répertoires identique à celle de la hiérarchie de rubriques de l’article auquel est lié le document. L’arborescence débutera à la racine spécifiée ( voir ci-dessous). Ne pas oublier le « / » à la fin du chemin.
-  la racine : « Q :/ » dans mon cas. Si on n’indique pas de valeur au paramètre chemin, il faut indiquer au script la racine de l’arborescence, sinon elle est créée dans le répertoire courant. Ne pas oublier le « / » final.
-  le type de documents à rechercher : dans mon cas, je recherchais surtout des documents doc, pdf, xls, ppt et rtf. Si vous souhaitez modifier ces critères de recherche, changer ce paramètre en indiquant les extensions séparées par des virgules.

EXEMPLE

Si un document est lié à un article , disons processus.doc, lié à l’article « comment faire ». Cet article étant dans la rubrique « documentation » elle-même dans la rubrique « technique ». Le filtre va donc générer sur le serveur de fichier une arbo de type (si on appelle Q :/ la racine du serveur de fichier) :

Q :/technique/documentation/processus.doc

Si aucune racine n’est indiquée au filtre (ici Q :/), l’arborescence sera créée au niveau du répertoire courant, par exemple c :/www/monsite. On aura alors :

c :/www/monsite/technique/documentation/processus.doc

Voilà, les modifications seront prises en compte lors de la première visite de l’article en question !!! :)

Il n’y a qu’à faire un copier-coller du code suivant dans votre fichier mes_fonctions.php3 de SPIP :

<?php
/*
 *   +----------------------------------+
 *    Nom du Filtre :  deplacer_document()                                               
 *   +----------------------------------+
 *    Date : vendredi 21 novembre 2003
 *    Auteur :  seb 
 *    schoupas@opac-montpellier.fr
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *     deplacer un document vers un repertoire autre que IMG
 *     modifier le chemin indiqué dans la BDD
 *     pointer sur le nouveau chemin pour les URL affichées en HTML.

 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.uzine.net/spip_contrib/article.php3?id_article=300
*/



function deplacer_document($url,$chemin,$racine,$type)
{
        $type = explode(",",$type);
	if(is_array($type) ) $type = join ("|", $type);
	

	// on cherche dans le code HTML d'affichage les chemins d'accès spécifiques aux docs	
	if(ereg("(IMG)/($type)/([A-Za-z_]*).($type)",$url,$reg) )
	{
		$chemin_old = $reg[1]."/".$reg[2]."/";
		$fichier=$reg[3].".".$reg[4];

		//on récupère l'id du document et de l'article auquel il est rattaché dans la BDD		
		$query = "SELECT d.id_document,da.id_article,id_rubrique FROM spip_documents d,spip_documents_articles da,spip_articles a WHERE d.id_document=da.id_document AND da.id_article=a.id_article AND fichier ='".$chemin_old.$fichier."'";
		
		$result = spip_query($query);
		$row = spip_fetch_array($result);
		$id_document = $row["id_document"];
		$id_rubrique = $row["id_rubrique"];

		// variable ok teste si la création des répertoires s'est correctement effectuée
		$ok = true;

		//si aucun chemin n'est spécifié on crée une arborescence
		if($chemin == "")
		{

			//on construit la hierarchie de l'article pour créer le chemin d'accès
			$hierarchie = construire_hierarchie($id_rubrique);
			
			$hierarchie = explode("-", substr($hierarchie, 0, -1));

			$chemin = array();
			$i = 0;
			
			foreach($hierarchie as $tmp)
			{
				$query2 = "SELECT titre from spip_rubriques where id_rubrique=".$tmp;			
				$result2 = spip_query($query2);
				$row2 = spip_fetch_array($result2);
				$chemin[$i] = $row2['titre'];
				//on vérifie l'existence des répertoires et on les crée le cas échéant
				$repertoire = $racine.join("/",$chemin);
				if(!is_dir($repertoire))
					$ok = mkdir($repertoire,0666);
				$i++;
			}

			//on crée le nouveau chemin
			$chemin = $racine.join("/",$chemin)."/";
		}		
		
		//on vérifie maintenant si le fichier existe sur le rep distant
		//si ce n'est pas le cas, on le déplace du local vers le distant
		if(!file_exists($chemin.$fichier) && $ok )
		{			
			//on copie le fichier vers le repertoire distant
			if(copy($chemin_old.$fichier, $chemin.$fichier) )
			{
				//si la copie réussit,on l'efface du repertoire local
				unlink($chemin_old.$fichier);

				//on modifie le nom du fichier dans la BDD 
				$query = "SELECT fichier from spip_documents WHERE id_document=".$id_document;
				$result = spip_query($query);
				$row = spip_fetch_array($result);
				if($row['fichier']==$chemin_old.$fichier)
				{
					$query = "UPDATE spip_documents SET fichier = '".$chemin.$fichier."' WHERE id_document=".$id_document;
					$result = spip_query($query);
				}
				// on remplace avec le bon chemin d'accès à l'affichage
				$url = ereg_replace ($chemin_old.$fichier, $chemin.$fichier, $url);
				
			}
		}
		//on retourne l'url modifiée
		return $url;		
	}
	//si rien ne ressemble à un chemin type IMG/doc on retourne l'url telle quelle
	else return $url;
	
}
?>

Discussion

5 discussions

  • Bonjour

    Ca a l’air d’être super mais je n’arrive pas à le faire fonctionner. Est-ce que ca fonctionne avec la version 1.9.2 ?
    Si oui, comment et oùu met-on le filtre ? Quelqu’un pourrait me donner un exemple ? Merci

    Répondre à ce message

  • Est-ce qu’il faut appeler ce filtre (#LOGO_DOCUMENT|#URL_DOCUMENT|deplacer_document« »,« Q :/ »,« doc,pdf,xls,ppt,rtf ») dans « article.html » ?

    Si oui à quel endroit ? Si non dans quelle boucle ?

    Répondre à ce message

  • 1

    Euh... J’ai dû louper un épisode !?

    J’ai bien créé le fichier mes_fonctions.php3, mais ça ne fonctionne pas ! Et comment est-il « appelé » ce fichier quand j’ajoute de nouveaux documents à mes articles ?

    Merci d’avance !

    • Laurent

      Je suis tout a fait d’accord,

      le fichier mes_fonctions.php3 ce met bien dans le dossier ecrire ??
      J’ai mis l’appel au filtre dans mon squelette article au niveau de l’affichage des documents liés mais le filtre n’est pas reconnue comme tel, il n’est pas exécuté.

      Si qqc’un a une idée ce serais super génial.

      Merci d’avance.

    Répondre à ce message

  • jerome

    Bonjour,
    J’utilise spip ver1.7.2
    J’essaye d’utiliser le filtre pour déplacer des documents vers un serveur de donné mais il n’as pas l’air de fonctionner.
    J’ai vu dans le filtre que MKDIR est utilisé pour creer l’arborescance de répertoire. Est ce une fonction de php ou c’est uniquement la fonction pour un serveur de donné sous linux. Car dans ce cas la c’est normale que ca ne fonctionne pas chez moi car j’utilise un serveur de donné sous windows...

    Je tiens a préciser que je n’ais aucune erreur lors de l’execution du script php, il n’y a rien qui se passe.
    Merci d’avance pour les réponses ...

    Répondre à ce message

  • 1

    Bravo c’est super !

    On pourrait même imaginer une suite à cette contrib, qui ouvrirait un acces ftp et permettrait de mettre des photos sur un autre hebergeur par exemple.

    • génial !!
      je m’en sert pour déplacer les fichiers sur un répertoire sécurisé spécifique, et ça marche très bien :)

    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