Ticket #498 (closed new feature: fixed)

Opened 2 years ago

Last modified 2 years ago

plugin swf

Reported by: Lipki Owned by: Lipki
Priority: low Milestone: Jelix 1.1 beta 1
Component: jelix:plugins Version: 1.0.2
Severity: trivial Keywords:
Cc: Php version:
Review: review+ Hosting Provider:
Blocked By: Documentation needed: no
Blocking:

Description

Voici l'ébauche d'un plugin pour intégrer facilement un swf dans un fichier .tpl

Des explications détaillées a cette adresse

Modifications avant une review?

  • Trouver une classe js indépendante de jquery et plus light. (la faire moi-même ?!)
Rendre l'utilisation de js optionnel (en option : satay embed js)
  • Inclure les paramètres "param" et "flashvar" sous forme
    {param 'wmode', 'transparent'}
    {flashvar 'varname', 'varvalue'}

Attachments

block.swf.zip (78.6 kB) - added by Lipki 2 years ago.
swf.zip (2.8 kB) - added by Lipki 2 years ago.
swf.2.zip (3.1 kB) - added by Lipki 2 years ago.
swf.3.zip (3.2 kB) - added by Lipki 2 years ago.
swf.4.zip (6.8 kB) - added by Lipki 2 years ago.
trois_plugin_flash.diff (29.6 kB) - added by Lipki 2 years ago.
trois_plugin_flash.2.diff (20.4 kB) - added by Lipki 2 years ago.

Change History

Changed 2 years ago by Lipki

  Changed 2 years ago by laurentj

trouver une classe js indépendante de jquery et plus light

jquery sera livré par défaut dans la version 1.1, donc c'est pas nécessaire de refaire un script.

Rendre l'utilisation de js optionnel

Ça pourrait être bien. D'ailleurs y-t-il vraiment besoin de javascript. Parce qu'aprés tout, en theorie, y a juste besoin d'une balise object non ?

Inclure les paramètres "param" et "flashvar" sous forme

passer un tableau au plugin ne serait pas mieux ? À moins que ce soit super lourd ?

N'oublie pas que dans le trunk (donc 1.1), on peut mettre maintenant les paramètres de plugins sur plusieurs lignes.

  Changed 2 years ago by laurentj

  • review review- deleted

  Changed 2 years ago by Lipki

  • status changed from new to assigned
  • owner set to Lipki

je change donc en : trouver une classe de jquery plus light

D'ailleurs y-t-il vraiment besoin de javascript.

Je te renvoie a ces deux billets http://antoine.media-box.net/index.php?post/flash-satay-afficher-du-flash-tout-en-respectant-les-standards http://antoine.media-box.net/index.php?post/Flash-Satay-est-mort

d'où la possibilités de choisir l'intégration.

passer un tableau au plugin ne serait pas mieux ? À moins que ce soit super lourd ?

C'est ce qui existe dans la version actuel mais c'est effectivement lourd, et puis je trouve ça plus propre.

follow-up: ↓ 5   Changed 2 years ago by Lipki

première sous version : le mode-satay :

{swf 'promo/promo.swf', array('id'=>'promo1', 'width'=>150, 'height'=>150)}
        {param 'quality', 'hight'}
        {param 'wmode', 'transparent'}
        {param 'salign', 't'}
        {flashvar 'longeur', 150}
        {flashvar 'page', $j_basepath.'produits/A'}
        {flashvar 'promo', $j_basepath.'data/fichiers/promo/NOv-07.swf'}
        {image 'promo/promo_A.png'}
{/swf}
<object id="promo1" width="150" height="150" data="/site/www/data/fichiers/promo/promo.swf?&longeur=150&page=/site/www/produits/A&promo=/site/www/data/fichiers/promo/NOv-07.swf" type="application/x-shockwave-flash">
        <param value="/site/www/data/fichiers/promo/promo.swf?&longeur=150&page=/site/www/produits/A&promo=/site/www/data/fichiers/promo/NOv-07.swf" name="movie"/>
        <param value="hight" name="quality"/>
        <param value="transparent" name="wmode"/>
        <param value="t" name="salign"/>
        <img src="http://localhost/site/www/data/fichiers/promo/promo_A.png"/>
</object>

Changed 2 years ago by Lipki

in reply to: ↑ 4 ; follow-up: ↓ 6   Changed 2 years ago by Lipki

le mode-satay :
j'ai supprimer le première paramètre inutile.

avantage : valide, léger, contenu alternatif.
inconvénient : incompatible avec les navigateurs vétuste, pas de détection du flashplayer.


deuxième sous version : le mode-embed mode-biscuit :

{swf 'promo/promo.swf', array('id'=>'promo1', 'width'=>150, 'height'=>150)}
        {param 'quality', 'hight'}
        {param 'wmode', 'transparent'}
        {param 'salign', 't'}
        {flashvar 'longeur', 150}
        {flashvar 'page', $j_basepath.'produits/A'}
        {flashvar 'promo', $j_basepath.'data/fichiers/promo/NOv-07.swf'}
{/swf}
<object id="promo1" width="150" height="150" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
        <param value="/site/www/data/fichiers/promo/promo.swf?&longeur=150&page=/site/www/produits/A&promo=/site/www/data/fichiers/promo/NOv-07.swf" name="movie"/>
        <param value="hight" name="quality"/>
        <param value="transparent" name="wmode"/>
        <param value="t" name="salign"/>
        <embed width="150" height="150" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="/site/www/data/fichiers/promo/promo.swf?&longeur=150&page=/site/www/produits/A&promo=/site/www/data/fichiers/promo/NOv-07.swf" salign="t" wmode="transparent" quality="hight"></embed>
</object>

avantage : compatible avec les navigateurs vétuste.
inconvénient : invalide, code fouillis, pas de détection du flashplayer, pas de contenu alternatif.

Changed 2 years ago by Lipki

in reply to: ↑ 5   Changed 2 years ago by Lipki

troisième sous version : le mode-js :

{swf 'promo/promo.swf', array('id'=>'promo1', 'width'=>150, 'height'=>150, detect=true)}
        {param 'quality', 'hight'}
        {param 'wmode', 'transparent'}
        {param 'salign', 't'}
        {flashvar 'longeur', 150}
        {flashvar 'page', $j_basepath.'produits/A'}
        {flashvar 'promo', $j_basepath.'data/fichiers/promo/NOv-07.swf'}
        {image 'promo/promo_A.png'}
{/swf}
<script type="text/javascript" src="/site/www/js/jquery-1.1.4.js" ></script>
<script type="text/javascript" src="/site/www/js/jquery.flash.js" ></script>
<script type="text/javascript">
// <![CDATA[

                $(function(){
                        $("#promo1").flash({
                                width:"150",
                                height:"150",
                                quality:"hight", 
                                wmode:"transparent", 
                                salign:"t", 
                                src: "/site/www/data/fichiers/promo/promo.swf",
                        }, {
                                expressInstall: 1
                        }, function(htmlOptions) {
                                $this = $(this);
                                htmlOptions.flashvars.longeur = "150";
                                htmlOptions.flashvars.page = "/site/www/produits/A";
                                htmlOptions.flashvars.promo = "/site/www/data/fichiers/promo/NOv-07.swf";
                                $this.children().remove();
                                $this.prepend($.fn.flash.transform(htmlOptions));
                        });
                });
                
// ]]>
</script>
<div id="ronde">
        <img src="http://localhost/site/www/data/fichiers/promo/promo_A.png"/>
</div>

avantage : compatible avec les navigateurs vétuste, valide, détection du flashplayer, contenu alternatif.
inconvénient : utilise le javascript.

Changed 2 years ago by Lipki

  Changed 2 years ago by Lipki

  • review set to review?

J'ai garder la classe jquery.flash, finalement, on vera si elle doit être retouchée.

Près pour une première review?

  Changed 2 years ago by Lipki

  • severity changed from normal to trivial

  Changed 2 years ago by Lipki

  • docneeded set

  Changed 2 years ago by laurentj

  • review changed from review? to review-
  • docneeded unset
  • indentation non conforme au coding-style de jelix
  • commentaire en français
  • copyright 2007 : une erreur ou pas ?
  • dans les strings générées, il faut utiliser \n et non \r

block.swf.php

   $conf = @parse_ini_file(JELIX_APP_CONFIG_PATH.'swf.plugin.ini.php',true);

Apparement la conf ne contient qu'un paramètre. Je pense que ce serait mieux de le mettre dans la conf globale.

case 'biscuit' : 
        return jtpl_block_html_swf_biscuit($begin, $param);
        break;
case 'js' : 
	return jtpl_block_html_swf_js($begin, $param);
	break;

Les breaks sont inutiles, à cause des return. Vu que les fonctions appelées n'ont rien de commun, je pense que ce serait mieux de faire trois plugins plutôt qu'un. et du coup, cela rendrait le fichier ini totalement inutile. D'ailleurs, le fichier cache résultant de la compilation d'un template ne dépend pas d'une config quelconque, mais de la fraîcheur du fichier template d'origine. Ce qui veut dire qu'avec ton système, si on change la configuration (généré en mode biscuit plutôt qu'en mode satay), cela ne recompilera pas les templates, et donc les flashs ne seront pas générés selon le nouveau mode. Cela me conforte dans l'idée que ce fichier ini et ce paramètre de conf sont inutiles. À moins que tu ais d'autres idées derrière la tête ? :-)

        eval('$src = '.$param[0].';');
        eval('$options = '.$param[1].';');

Surtout pas ! Tu evalue des paramètres qui n'existent pas encore, étant donné que les plugins de type bloc sont évalués pendant la compilation, et pas pendant l'execution du template. Aussi, si par exemple je donne $truc en paramètre, ça fera un eval ('$src=$truc'). Mais helas, ici la variable $truc n'existe pas.

Bref cela remet en question tout le reste du code. En particulier le traitement de $options doit être fait dans le code source que tu génères.

        $sortie .= "\t\t".'$GLOBALS[\'gJCoord\']->response->addJSLink($gJConfig->urlengine[\'basePath\'].\'js/jquery-1.1.4.js\');'."\r";
        $sortie .= "\t\t".'$GLOBALS[\'gJCoord\']->response->addJSLink($gJConfig->urlengine[\'basePath\'].\'js/jquery.flash.js\');'."\r";

Dans certains circonstance, ces liens ne seront pas ajoutés à la page. C'est pourquoi il faut que cette portion de code doit être généré pour la partie meta du template, un truc dans le genre :

$compiler->addMetaContent('$GLOBALS[\'gJCoord\']->response->addJSLink($gJConfig->urlengine[\'basePath\'].\'js/jquery-1.1.4.js\');'."\r";
.'$GLOBALS[\'gJCoord\']->response->addJSLink($gJConfig->urlengine[\'basePath\'].\'js/jquery.flash.js\');'."\r";

ce code sera ainsi executée avant execution du template, avant même que le body de la page html est générée.

        $sortie .= "\t\t".'$GLOBALS[\'gJCoord\']->response->addJSCode($script1.$param.$script2.$var.$script3);'."\r";

Vu que ce script ne peut être générée que pendant l'execution du template, on ne peux pas faire un $compiler->addMetaContent. Aussi ici on ne peut que générer une balise "<script>" classique.

function jtpl_cfunction_html_param($tpl, $params) {
	
	global $gJConfig;
	$t = $GLOBALS['gJCoord']->response->body;
	
	eval('$name = '.$params[0].';');
	eval('$value = '.$params[1].';');
    return '$params[\''.$name.'\'] = \''.$value.'\';';
 
}

Ici aussi, pas d'eval. Il s'agit d'un fonction compilée (cfunction).

Je ne suis pas très fan des plugins param et flashvar. Si on peut tout passer aux plugins swf_*, ils n'ont pas trop d'intérêt je pense.

  Changed 2 years ago by Lipki

Je vais revoir ça a tête reposé, c'est assez froid dans ma tête.

  Changed 2 years ago by Lipki

  • review changed from review- to review?

Voila une nouvelle version avec trois plugins différent : swf, swfbiscuit, swfjs.

De manière général j'ai fait disparaitre le fichier de config, et les deux plugin param et flashvar.

Pour le plugin swf, j'ai supprimer le ob_start() qui n'était pas utile et tous les traitements ce font au moment de la balise d'ouverture.

Le plugin swfbiscuit devient un plugin cfunction, il n'a pas besoin d'être de type bloc puisqu'il n'accepte pas de contenu alternatif.

Dans le plugin swf, j'ai utiliser addMetaContent.
Comme pour le plugin swf, j'ai supprimer le ob_start() et tous les traitements ce font au moment de la balise d'ouverture.

Je suis très content de cette nouvelle version :)

Changed 2 years ago by Lipki

  Changed 2 years ago by laurentj

  • review changed from review? to review-
  • milestone set to Jelix 1.1

C'est beaucoup mieux en effet. Cependant:

  • dans le code généré, il ajouter un test sur la presence de $gJCoord->response
  • y a un peu trop de \t et cie, ça rend le code trés peu lisible. utiliser des espaces
  • il ne devrait pas y avoir de chemins "data/fichiers/" en dur. Le supprimer. Je ne vois pas de raison d'imposer un chemin.
  • dans le commentaire de documentation, mieux documenter les paramètres, en particulier expliquer ce que chacun veulent dire
  • chemins des scripts js : utiliser ceux fournie par jelix 1.1, et mettre le jquery.flash.js dans lib/jelix-www/jquery/flash/

Et livrer le patch sous forme de diff. Plus de zip dans tes tickets s'il te plait :-) c'est pas intégrable facilement dans les sources de jelix.

Changed 2 years ago by Lipki

Changed 2 years ago by Lipki

  Changed 2 years ago by Lipki

  • review changed from review- to review+

  Changed 2 years ago by Lipki

  • review changed from review+ to review?

  Changed 2 years ago by laurentj

  • review changed from review? to review+

c'est ok.

Ne pas oublier de mettre à jour les manifests pour le build et le CREDITS.

  Changed 2 years ago by Lipki

  • status changed from assigned to closed
  • resolution set to fixed

commited !

Note: See TracTickets for help on using tickets.