Creating a link to download a file with Online Editor in eZ Publish

I've read a good article in french showing a way to insert direct download link to a file in eZ Publish and Online Editor. This post explains how to add a target view in Online Editor and how to use the Redirect Operator in this view to be redirected to download a file. Although I used this method, I don't think it's a good practice even if it's probably the most obvious, because templates should only be used for presentation. So I thought about another solution without redirection that only uses two features of eZ Publish / Online Editor :

 

 

First, declare a class for the <link /> tag with few lines like these in settings/override/content.ini.append.php :

 

[link]
AvailableClasses[]
AvailableClasses[]=download 

 

In extension/ezdhtml/settings/content.ini.append, I also add this :

 

[link]
ClassDescription[]
ClassDescription[download]=Téléchargement 

 

It's not required, but with these lines, Online Editor will display "Téléchargement" in the "Class" field which is more user friendly for french users ;-)

Then create an override of the template content/datatype/view/ezxmltags/link.tpl for example in override/templates/link_download.tpl in your design with the following code :

 

{def $n='' $attribute='' $url=false() $protocols=array('http', 'file', 'ftp', 'mailto', 'https')
}{if $protocols|contains( $href|explode(':')|extract_left(1) )not()
    }{set $n=fetch(content, node, hash(node_path, $href))
    }{if and($n, $n.object.class_identifier|eq('file'))
    }{set $attribute=$n.data_map.file
    }{set $url=concat( '/content/download/', $attribute.contentobject_id, '/', $attribute.id,'/version/', $attribute.version , '/file/', $attribute.content.original_filename|urlencode )
    }{/if}{/if}{if $url|not()}{set $url=$href}{/if}<a href={$url|ezurl}{section show=$id} id="{$id}"{/section}{section show=$title} title="{$title}"{/section}{section show=$target} target="{$target}"{/section}{section show=ne($classification|trim,'')} class="{$classification|wash}"{/section}>{$content}</a>{undef $n $attribute $url $protocols}

 

Finally, just add this override condition in settings/<your_siteaccess>/override.ini.append.php :

 

[download_link]
Source=content/datatype/view/ezxmltags/link.tpl
MatchFile=link_download.tpl
Subdir=templates
Match[classification]=download 

 

After clearing the cache, the new template will be used if the link has "download" in the class attribute and if it's not a full link (with a scheme protocol), it will try to generate a link to download the file. It can probably be improved by putting some datas in settings (object class(es), protocols list, ...)... The indentation is weird in order to be more readable without inserting unnecessary space the HTML code.

So with this configuration, if you want to insert a direct link to download a file in eZ Publish, you just have to choose the download class ( Téléchargement for me) and eZ Publish generates the right link to download.

» Commentaires

- Effectivement, meilleure solution que de changer le type de vue (#66113) par bkill le 03 Août 2007 à 11:32
Hello,

ta solution semble avantageuse sur deux points par rapport à celle que je présentais sur mon blog, en effet:
- pas besoin d'un opérateur de redirection, ou d'une quelconque extension pour faire le boulot
- choisir un type de classe de lien est plus pratique que de changer la vue étant donné que cette dernière option nécessite des versions récentes du produit, et oblige à la mise à jour dans le cas d'anciens sites...

Je vais tester ta solution dans les prochains jours en tout cas, merci :)
- Good info. (#66154) par Bisk le 13 Août 2007 à 21:09
I was looking to do something similar. Will give it go later. Thanks for the write-up!
- Probleme avec la description de la classe (#66251) par Stéphane le 10 Septembre 2007 à 16:36
Bonjour,

J'essaie en vain de mettre en place ton astuce dans un bloc xml. J'utilise ez 3.9.3 avec OE 4.2.3. La description de la classe dans le menu déroulant n'apparait pas. C'est "download" le nom de la classe qui est présent.
Par ailleurs, la classe de ce lien ne s'enregistre pas. Si je réédite le contenu, le lien n'a plus de classe. As-tu une idée concernant ce problème.

Merci d'avance.
- Re : Probleme avec la description de la classe (#66254) par Stéphane le 11 Septembre 2007 à 14:54
Bonjour,

Finalement j'ai réussi à faire marcher votre astuce.

Problème de vidage de cache probablement ?

Merci pour vos articles sur Ez qui sont très intéressant.


- Lien sur une image (#66616) par Delph le 24 Janvier 2008 à 14:12
Cette méthode marche vraiment très bien, merci !
Comment fait-on pour un fichier à télécharger dont le lien est sur une image ?
J'ai essayé mais là ça pose problème.
- Parfait! (#66647) par David P. le 08 Février 2008 à 11:56
Merci pour ton code! Je me suis bien creusé la tête avant de le récupérer.
J'ai fait un override général sans passer par la définition d'une classe spécifique et ça marche très bien (v3.9).

Thanks
- Re : Re : Probleme avec la description de la classe (#66698) par Benjamin le 13 Mars 2008 à 09:57
Pour ceux qui comme Stéphane ou David P. ont eu des soucis pour afficher "Téléchargement" à la place de "download" et affecter la classe aux liens (ce qui a conduit certains à supprimer la condition "Match[classification]"), c'est en fait dû à la mise en forme du code dans ce billet.

En effet, si on copie-colle le contenu des encarts de code, on se retrouve avec un espace en plus à la fin des blocs de texte copiés.

Du coup, la classe permise n'est plus "download" mais download ". Conséquence : on ne peux pas attribuer la classe "download" (un trimming de la chaîne doit être appliqué entre le choix de la classe et son application). Dans la directive d'override également, la classe concernée est "download ", ce qui l'empêche d'être appliquée quand la classe devrait être "download".

Attention donc aux copier-coller ;-)
- Problem / wrapper page (#66739) par Michael le 03 Avril 2008 à 01:52
Hello, I followed the steps you documented here, but I still got the wrapper page around, i.e. in front. I still have to click another link to get to the file.

Any ideas?
TIA
Michael
- Thanks! (#68016) par DanParchman le 30 Octobre 2009 à 17:54
This works great! Thanks for the tip.
- Merci beaucoup (#68041) par Matthieu le 19 Novembre 2009 à 16:38
Vraiment pratique et facile à mettre en place. Extrêmement utile lorsque l'on veut mettre un lien vers un fichier au milieu d'un paragraphe par exemple.

Merci

» Trackback

Aucun trackback

Les trackacks sont désactivés

Flux RSS des billets

Flux RSS des billets

Rechercher sur pwet.fr

À retenir

Derniers commentaires

Archives

Nuage de tags

Bioutifoul photos

Quelques liens

Licence d'utilisation

Contenu sous Licence Creative Commons By-Sa

Sauf mentions spécifiques, les billets et les photos publiés sur ce site sont placés sous la licence Creative Commons by-sa.

Pour toute utilisation dépassant le cadre de cette licence, merci de me contacter par e-mail.

Login