[SPIP Zone] Ajout de document dans un article

bonjour à tous,

N’étant pas un encore un pro de la programmation, la source donnée peut sûrement être améliorée. Cependant, elle a le mérite d’exister, voire de créer un débat.

Spip étant par définition un site collaboratif, nombres de personnes (dont je fait partie) recherchent à faciliter la vie des rédacteurs.
N’ayant pas tous des connaissances poussées en informatique, cela peut créer un frein au développement et à la participation. C’est pourquoi personnellement je cherches à faciliter la vie de mes rédacteurs en permanence pour les inciter à participer .

Dans ce cadre outre les commentaires, il est parfois souhaitable de laisser aux rédacteurs la possibilité d’ajouter un document ou une image .

voici le code à ajouter au fichier mes fonctions :

/*

  • ±---------------------------------+
  • Code à insérer upload de documents
  • ±------------------------------------+
  • Fonctions :
  • permet aux utilisateurs d’insérer un document ou une image
  • ±------------------------------------+
    */

function up_doc($id, $type=« article »,$script=NULL) {
include_spip(‹ inc/autoriser ›);
// il faut avoir les droits de modif sur l’article pour pouvoir uploader !
if (!autoriser(‹ joindredocument ›,$type,$id))
return «  »;

include_spip(‹ inc/presentation ›); // pour l’aide quand on appelle afficher_documents_colonne depuis un squelette
// seuls cas connus : article, breve ou rubrique
if ($script==NULL){
$script = $type.‹ s_edit ›;
if (!test_espace_prive())
$script = parametre_url(self(),« show_docs »,’’);
}
$id_document_actif = _request(‹ show_docs ›);

// Ajouter nouvelle image
$joindre = charger_fonction(‹ joindre ›, ‹ inc ›);
// Ajouter nouveau document
//$ret .= « 

\n
\n »;
if (!isset($GLOBALS[‹ meta ›][« documents_$type »]) OR $GLOBALS[‹ meta ›][« documents_$type »]!=‹ non ›) {
$ret .= $joindre(array(
‹ cadre › => ‹ enfonce ›,
‹ icone › => ‹ doc-24.gif ›,
‹ fonction › => ‹ creer.gif ›,
‹ titre › => T(‹ bouton_ajouter_document ›).aide(« ins_doc »),
‹ script › => $script,
‹ args › => "id
$type=$id",
‹ id › => $id,
‹ intitule › => _T(‹ info_telecharger ›),
‹ mode › => ‹ document ›,
‹ type › => $type,
‹ ancre › => ‹  ›,
‹ id_document › => 0,
‹ iframe_script › => generer_url_ecrire(« documents_colonne »,« id=$id&type=$type »,true)
));
}

return $ret;
}

// FIN du code upload

Il peut parfaitement être utilisé avec le plugin autorité pour définir les droits

Pour l’appeler à partir d’un squelette, il suffit d’insérer le code suivant :
[

(#ENV{id_article}|up_doc)
]

c’est tout !

Limitations :

lorsque quelqu’un insère une image, tout va bien, par contre lorsque c’est un document, aucun nom n’y est associé !

Ps: le code n’est pas de moi personnellement mais le but de spip étant la mutualisation, j’ai pensé utile de le partager même si pour certains cela peut s’avérer évident .
Il peut sûrement être amélioré !

@ +

all sécu

ps: si vous voulez voir ce que cela peut donner, vous pouvez vous rendre ici : http://www.allsecurite.com/fr/spip.php?article676 (une identification vous sera demandée car l’idéal serait en plus d’afficher doc inséré par xxx. Vous pouvez utiliser le log: redacteur et le pass: redacteur ). Le panel inséré est celui de l’espace privé (ici sous l’article, introuduit par " Ajouter vos infos) - merci de ne pas utiliser cette page comme bac à sable :slight_smile:

webmaster allsecurite.com a écrit :

Pour l'appeler à partir d'un squelette, il suffit d'insérer le code suivant :
[<div id="telecharge">(#ENV{id_article}|up_doc)</div>]

heu, ca veut dire qu'un upload n'est pris en compte qu'au recalcul de la page ?
donc qu'il faut un cache à 0 ?

il me semble qu'une balise dynamique est plus adaptée pour ce genre de chose.

tiens, voila encore un truc fait à l'arrache et pas commité :

<?php
if (!defined("_ECRIRE_INC_VERSION")) return; #securite

include_spip('base/abstract_sql');
include_spip("inc/documents");
include_spip("inc/autorisation");

function balise_FORMULAIRE_DOCUMENTS($p) {

  return calculer_balise_dynamique($p,'FORMULAIRE_DOCUMENTS',array('id_rubrique','id_article'));

}

function balise_FORMULAIRE_DOCUMENTS_stat($args, $filtres) {
    //id_rubrique explicite (et eventuellement id_article)
    if (intval($args[2]))
        return array($args[2],$args[3],$args[4]);
    else
        return array($args[0],$args[1],$args[2]);
}

function balise_FORMULAIRE_ATELIERS_DOCUMENTS_dyn($id_rubrique,$id_article,$redirect) {
    if (!$GLOBALS["auteur_session"])
        return 'pas authentifi&eacute;';
    global $options;
    $options = "avancees";
    $upload= "<script src='"._DIR_JAVASCRIPT."async_upload.js' type='text/javascript'></script>\n";
    $upload.= <<<EOF
        <script type='text/javascript'>
        jQuery("form.form_upload").async_upload(async_upload_article_edit);
        </script>
EOF;
    if ($id_article && autoriser('joindredocument','article',$id_article))
            return afficher_documents_colonne($id_article,'article',$redirect).$upload;
    elseif (autoriser('joindredocument','rubrique',$id_rubrique))
            return afficher_documents_colonne($id_rubrique,'rubrique',$redirect).$upload;
     else return 'pas autoris&eacute;';

}
?>

heu, je sais plus trop comment ca marche, de memoire il faut passer le redirect (généralement #SELF) pour ceux qui n'ont pas javascript, pour les autres ca tournera en ajax.
donc dans une boucle article ou rubrique :
#FORMULAIRE_DOCUMENTS{#SELF}
en dehors :
#FORMULAIRE_DOCUMENTS{#ENV{id_rubrique},#ENV{id_article},#SELF}
pour les documents de rubrique, sans doute :
#FORMULAIRE_DOCUMENTS{#ENV{id_rubrique},'',#SELF}

si ca marche (pas sur, je viens de l'extraire d'un code plus complexe et je n'ai pas testé), tu peux peut etre faire une petite contrib ?

@++