Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2012-06-20 14:12:17

fix
Membre
Inscription : 2005-01-20
Site Web

Ajouter une pièce jointe dans un plugin

Bonjour,

Je souhaiterais ajouter la possibilité d'ajouter des pièces jointes dans les billets de l'un de mes plugins.

En m'inspirant du plugin "attachments" existant (inclus dans le core de Dotclear), j'ai ajouté le code suivant :

<?php if ($event_post_id) {
	echo '<h3 class="clear">'.__('Attachments').'</h3>';
	foreach ($event_post_media as $f) {
		$ftitle = $f->media_title;
		if (strlen($ftitle) > 18) { $ftitle = substr($ftitle,0,16).'...'; }
		echo '<div class="media-item">'.
			'<a class="media-icon" href="media_item.php?id='.$f->media_id.'">'.
			'<img src="'.$f->media_icon.'" alt="" title="'.$f->basename.'" /></a>'.
			'<ul>'.
			'<li><a class="media-link" href="media_item.php?id='.$f->media_id.'"'.
			'title="'.$f->basename.'">'.$ftitle.'</a></li>'.
			'<li>'.$f->media_dtstr.'</li>'.
			'<li>'.files::size($f->size).' - '.
			'<a href="'.$f->file_url.'">'.__('open').'</a>'.'</li>'.
			'<li class="media-action"><a class="attachment-remove" id="attachment-'.$f->media_id.'" '.
			'href="post_media.php?post_id='.$event_post_id.'&amp;media_id='.$f->media_id.'&amp;remove=1">'.
			'<img src="images/check-off.png" alt="'.__('remove').'" /></a>'.
			'</li>'.
			'</ul>'.
			'</div>';
	}
	unset($f);
	if (empty($event_post_media)) { echo '<p>'.__('No attachment.').'</p>'; }
	echo '<p><a href="media.php?post_id='.$event_post_id.'">'.__('Add files to this page').'</a></p>';
} ?>

Résultat : les pièces jointes sont bien ajoutées à mes billets (et s'affichent correctement côté public), mais, côté admin, j'obtiens systématiquement une erreur ("Erreurs : Ce billet n'existe pas."). En effet, une fois que la pièce jointe est ajoutée, je suis redirigé vers une url du type :

http://www.monsite.com/dotclear/admin/post.php?id=244

alors que les urls des billets de mon plugin sont du type :

http://www.monsite.com/dotclear/admin/plugin.php?p=monPlugin&m=list&todo=edit&id=244

Est-il possible de modifier cette redirection (j'imagine que ça se passe quelque part dans le plugin de base "attachments") sans impacter le comportement des pièces jointes pour les billets traditionnels ?

Merci de votre aide !

Dernière modification par fix (2012-06-20 14:17:41)

Hors ligne

#2 2012-06-20 14:24:56

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Ajouter une pièce jointe dans un plugin

La redirection est faite dans le fichier dotclear/admin/post_media.php.

Tu pourrais peut-être dupliquer ce fichier dans ton plugin, puis modifier l'attribut action de la balise form dans la fonction adminPostAfterForm du fichier _admin.php ?

Hors ligne

#3 2012-06-20 14:36:23

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

Merci de ton aide... mais je comprends mal : pourquoi devoir dupliquer le fichier post_media.php si c'est pour devoir faire une modif dans le fichier _admin.php ?

Ne puis-je pas simplement modifier la cible du http::redirect dans le fichier post_media.php dupliqué dans mon plugin ?

Dernière modification par fix (2012-06-20 14:38:10)

Hors ligne

#4 2012-06-20 15:05:52

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Ajouter une pièce jointe dans un plugin

L'action du formulaire dans _admin.php appelle le code contenu dans le fichier post_media.php, c'est là où se fait la redirection. Si tu modifies celui-ci, cela aura le même comportement pour les pièces attachées "ordinaires", ce que tu ne veux probablement pas ;)

Je suggérais donc, dans l'attribut action de la balise form du fichier _admin.php, de modifier l'adresse du fichier qui traitera la requête, et qui sera donc une copie modifiée de post_media.php pour ne pas toucher à ce fichier du core.

Hors ligne

#5 2012-06-20 15:10:44

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

Si je comprends bien ce que tu suggères, il faut donc que je modifie quand même le core de DC :
1. dans le fichier _admin.php, je remplace l'url de post_media.php par l'url monplugin/post_media.php ;
2. dans monplugin/post_media.php, je modifie la redirection.

Mais cela impactera l'ajout de toutes les pièces jointes, y compris dans les billets ordinaires, non ?

Dernière modification par fix (2012-06-20 15:11:19)

Hors ligne

#6 2012-06-20 15:16:48

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Ajouter une pièce jointe dans un plugin

Ah non, je ne suggère pas de modifier le core ! Je pensais que tu avais créé un plugin en dupliquant attachments ?

Hors ligne

#7 2012-06-20 15:18:39

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

Non non... C'est un plugin qui n'a rien à voir avec attachments. Je voudrais simplement inclure, dans l'édition de billets à l'intérieur de mon plugin, la possibilité d'ajouter des pièces jointes :)

Un plugin peut-il surcharger la fonction d'un autre plugin ? Serait-il possible de dupliquer et modifier la fonction adminPostAfterForm à l'intérieur de mon plugin ?

Hors ligne

#8 2012-06-20 15:19:00

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Ajouter une pièce jointe dans un plugin

fix a écrit :

1. dans le fichier _admin.php, je remplace l'url de post_media.php par l'url monplugin/post_media.php ;
2. dans monplugin/post_media.php, je modifie la redirection.

Dans le fichier _admin.php de ton plugin, tu remplaces l'url, oui. À aucun moment tu ne touches à celui du plugin attachments ;)

Hors ligne

#9 2012-06-20 15:21:09

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Ajouter une pièce jointe dans un plugin

fix a écrit :

Un plugin peut-il surcharger la fonction d'un autre plugin ? Serait-il possible de dupliquer et modifier la fonction adminPostAfterForm à l'intérieur de mon plugin ?

Pas surcharger, mais copier oui : adminPostAfterForm est un comportement qui peut être utilisé par tous les plugins.

Hors ligne

#10 2012-06-20 15:23:33

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

À défaut, puisque j'ai déjà copié la fonction adminPostFormSidebar du plugin attachments dans mon plugin, je devrais pouvoir modifier la ligne suivante :

'href="post_media.php?post_id='.$post_id.'&amp;media_id='.$f->media_id.'&amp;remove=1">'.

Il faudrait rediriger vers la copie de post_media.php dans mon plugin... Je vais voir de ce côté-là.

Dernière modification par fix (2012-06-20 15:36:56)

Hors ligne

#11 2012-06-20 15:46:31

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

Je n'y parviens pas... et je m'y perds.

Voilà le code ajouté dans mon plugin :

<?php $core->addBehavior ('adminPostAfterForm',array('EventattachmentAdmin','adminPostAfterForm'));
class EventattachmentAdmin
{
	public static function adminPostAfterForm($post) {
		if ($post !== null)
		{
			$core =& $GLOBALS['core'];
			echo
				'<form action="event_post_media.php" id="attachment-remove-hide" method="post">'.
				'<div>'.form::hidden(array('post_id'),$post->post_id).
				form::hidden(array('media_id'),'').
				form::hidden(array('remove'),1).
				$core->formNonce().'</div></form>';
		}
	}
}

Ce code ne semble pas avoir d'effet : quand j'ajoute une pièce jointe, je suis toujours redirigé vers le fichier post_media.php du plugin attachments (au lieu du fichier "event_post_media.php" spécifié dans le code ci-dessus)...

Hors ligne

#12 2012-06-23 05:27:05

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

Faut-il qu'une fonction soit ajoutée dans un fichier particulier du plugin pour qu'elle soit appelée à la place d'une fonction existante ? Ceci pourrait peut-être expliquée sa non prise en compte apparente ?

À défaut, je me demandais si cela ne pouvait pas provenir de mon appel à la fonction (toujours dans l'idée qu'elle puisse "surcharger" une fonction existante) :

$core->addBehavior ('adminPostAfterForm',array('EventattachmentAdmin','adminPostAfterForm'));

Merci de votre aide !

Hors ligne

#13 2012-06-23 08:49:30

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Ajouter une pièce jointe dans un plugin

fix a écrit :

Faut-il qu'une fonction soit ajoutée dans un fichier particulier du plugin pour qu'elle soit appelée à la place d'une fonction existante ?

Oui, la fonction qui est déclenchée dans la page d'édition du billet doit être dans le fichier _admin.php du plugin, je croyais jusqu'à présent que tu avais simplement dupliqué le plugin attachments et que donc tu avais ce fichier dans ton plugin ?

Je déplace dans tous les cas ta question dans le coin des sorciers ;)

Hors ligne

#14 2012-06-23 09:07:27

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Ajouter une pièce jointe dans un plugin

Mmm... Ça ne fonctionne toujours pas.

Voici le contenu du fichier _admin.php de mon plugin :

<?php
$_menu['Blog']->addItem(__('Agenda'),'plugin.php?p=agendaPlugin','index.php?pf=agendaPlugin/icone-16.png',
		preg_match('/plugin.php\?p=agendaPlugin(&.*)?$/',$_SERVER['REQUEST_URI']),
		$core->auth->check('usage,contentadmin',$core->blog->id));

$core->auth->setPermissionType('agenda',__('manage agenda'));
$core->addBehavior('initWidgets',array('agendaPlugin','initWidgets'));
$core->addBehavior('adminDashboardFavs',array('agendaPlugin','dashboardFavs'));
$core->addBehavior ('adminPostAfterForm',array('agendaPlugin','adminPostAfterForm'));

class agendaPlugin
{
	public static function initWidgets(&$w)
	{
		$w->create('Agenda',__('Agenda'),
			array('publicAgendaPlugin','agendaWidget'));
		$w->Agenda->setting('title',__('Title:'),
			'default value','text');
 		$w->Agenda->setting('grouped', __('Grouper les Evenements'),1,'check');
		$w->Agenda->setting('onlyfutures', __('Afficher uniquement les Evenements futurs'),1,'check');
		$w->Agenda->setting('titleonly', __('Afficher uniquement le titre'),1,'check');
		$w->Agenda->setting('homeonly',__('Home page only'),0,'check');
 	
	}
	
	public static function dashboardFavs($core,$favs)
    {
        $favs['agenda'] = new ArrayObject(array(
            'agenda',
            __('Agenda'),
            'plugin.php?p=agendaPlugin',
            'index.php?pf=agendaPlugin/icone-16.png',
            'index.php?pf=agendaPlugin/icone-64.png',
            'usage,contentadmin',
            null,
            null));
    }
	
	public static function adminPostAfterForm($post) {
		if ($post !== null)
		{
			$core =& $GLOBALS['core'];
			echo
				'<form action="/dotclear-files/plugins/agendaPlugin/event_post_media.php" id="attachment-remove-hide" method="post">'.
				'<div>'.form::hidden(array('post_id'),$post->post_id).
				form::hidden(array('media_id'),'').
				form::hidden(array('remove'),1).
				$core->formNonce().'</div></form>';
		}
	}
}
?>

Le formulaire de la fonction adminPostAfterForm devrait normalement rediriger vers /dotclear-files/plugins/agendaPlugin/event_post_media.php... Ce n'est pourtant pas le cas. Autrement dit, il me semble que ma fonction n'est toujours pas prise en compte, à la place de celle de base dans DC...

Dernière modification par fix (2012-06-23 09:08:23)

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map