CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 11-10-2009 20:14:37

kamui545
Chef Pâtissier
Date d'inscription: 14-08-2009
Messages: 1638
Site web

[Helper] TinyMCE

Bonjour,

Voila donc aujourd'hui j'ai découvert un fabuleux helper pour TinyMCE.

http://bakery.cakephp.org/articles/view … e-helper-1

J'y ai apporté quelques modifications, donc si sa intéresse quelqu'un, voici le code modifié:

Code: php

  1. <?php
  2. class TinyMceHelper extends AppHelper
  3. {
  4.  
  5.     // Take advantage of other helpers
  6.     var $helpers = array('Javascript', 'Form');
  7.     // Check if the tiny_mce.js file has been added or not
  8.     var $_script = false;
  9.    
  10.     /**
  11.      * Adds the tiny_mce.js file and constructs the options
  12.      *
  13.      * @param string $fieldName Name of a field, like this "Modelname.fieldname", "Modelname/fieldname" is deprecated
  14.      * @param array $tinyoptions Array of TinyMCE attributes for this textarea
  15.      * @return string JavaScript code to initialise the TinyMCE area
  16.      */
  17.     function _build($fieldName, $tinyoptions = array())
  18.     {
  19.         if(!$this->_script)
  20.         {
  21.             // We don't want to add this every time, it's only needed once
  22.             $this->_script = true;
  23.             $this->Javascript->link('tiny_mce/tiny_mce.js', false);
  24.         }
  25.        
  26.         // Ties the options to the field
  27.         $tinyoptions['mode'] = 'exact';
  28.       $tinyoptions['elements'] = $this->domId($fieldName);
  29.      
  30.         // Liste les keys ayant une fonction
  31.         $value_arr = array();
  32.     $replace_keys = array();
  33.     foreach($tinyoptions as $key => &$value)
  34.     {
  35.       // Verifie si la valeur commence par 'function('
  36.       if(strpos($value, 'function(') === 0)
  37.       {
  38.         $value_arr[] = $value;
  39.         $value = '%' . $key . '%';
  40.         $replace_keys[] = '"' . $value . '"';
  41.       }
  42.     }
  43.    
  44.     // Encode l'array en json
  45.     $json = json_encode($tinyoptions);
  46.    
  47.     // Remplace les fonctions
  48.     $json = str_replace($replace_keys, $value_arr, $json);
  49.      
  50.         return $this->Javascript->codeBlock('tinyMCE.init(' . $json . ');');
  51.     }
  52.    
  53.     /**
  54.      * Creates a TinyMCE textarea.
  55.      *
  56.      * @param string $fieldName Name of a field, like this "Modelname.fieldname", "Modelname/fieldname" is deprecated
  57.      * @param array $options Array of HTML attributes.
  58.      * @param array $tinyoptions Array of TinyMCE attributes for this textarea
  59.      * @param string $preset
  60.      * @return string An HTML textarea element with TinyMCE
  61.      */
  62.     function textarea($fieldName, $options = array(), $tinyoptions = array(), $preset = null)
  63.     {
  64.       // If a preset is defined
  65.       if(!empty($preset))
  66.       {
  67.         $preset_options = $this->preset($preset);
  68.        
  69.         // If $preset_options && $tinyoptions are an array
  70.         if(is_array($preset_options) && is_array($tinyoptions))
  71.         {
  72.           $tinyoptions = array_merge($preset_options, $tinyoptions);
  73.         }
  74.         else
  75.         {
  76.           $tinyoptions = $preset_options;
  77.         }
  78.       }
  79.      
  80.         return $this->Form->textarea($fieldName, $options) . $this->_build($fieldName, $tinyoptions);
  81.     }
  82.  
  83.     /**
  84.      * Creates a TinyMCE textarea.
  85.      *
  86.      * @param string $fieldName Name of a field, like this "Modelname.fieldname", "Modelname/fieldname" is deprecated
  87.      * @param array $options Array of HTML attributes.
  88.      * @param array $tinyoptions Array of TinyMCE attributes for this textarea
  89.      * @return string An HTML textarea element with TinyMCE
  90.      */
  91.     function input($fieldName, $options = array(), $tinyoptions = array(), $preset = null)
  92.     {
  93.       // If a preset is defined
  94.       if(!empty($preset))
  95.       {
  96.         $preset_options = $this->preset($preset);
  97.        
  98.         // If $preset_options && $tinyoptions are an array
  99.         if(is_array($preset_options) && is_array($tinyoptions))
  100.         {
  101.           $tinyoptions = array_merge($preset_options, $tinyoptions);
  102.         }
  103.         else
  104.         {
  105.           $tinyoptions = $preset_options;
  106.         }
  107.       }
  108.      
  109.         $options['type'] = 'textarea';
  110.         return $this->Form->input($fieldName, $options) . $this->_build($fieldName, $tinyoptions);
  111.     }
  112.    
  113.     /**
  114.      * Creates a preset for TinyOptions
  115.      *
  116.      * @param string $name
  117.      * @return array
  118.      */
  119.     private function preset($name)
  120.     {
  121.       // Full Feature
  122.       if($name == 'full')
  123.       {
  124.         return array(
  125.         'theme' => 'advanced',
  126.         'plugins' => 'safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template',
  127.         'theme_advanced_buttons1' => 'save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect',
  128.         'theme_advanced_buttons2' => 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor',
  129.         'theme_advanced_buttons3' => 'tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen',
  130.         'theme_advanced_buttons4' => 'insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak',
  131.         'theme_advanced_toolbar_location' => 'top',
  132.         'theme_advanced_toolbar_align' => 'left',
  133.         'theme_advanced_statusbar_location' => 'bottom',
  134.         'theme_advanced_resizing' => true,
  135.         'theme_advanced_resize_horizontal' => false,
  136.         'convert_fonts_to_spans' => true
  137.         );
  138.       }
  139.  
  140.       // Basic
  141.       if($name == 'basic')
  142.       {
  143.         return array(
  144.         'theme' => 'advanced',
  145.         'theme_advanced_toolbar_location' => 'top',
  146.         'theme_advanced_toolbar_align' => 'left',
  147.           'theme_advanced_statusbar_location' => 'bottom',
  148.         'theme_advanced_resizing' => true,
  149.         'theme_advanced_resize_horizontal' => false,
  150.         'convert_fonts_to_spans' => true
  151.         );
  152.       }
  153.      
  154.       // BBCode
  155.       if($name == 'bbcode')
  156.       {
  157.         return array(
  158.         'theme' => 'advanced',
  159.         'plugins' => 'bbcode',
  160.         'theme_advanced_buttons1' => 'bold,italic,underline,undo,redo,link,unlink,image,forecolor,styleselect,removeformat,cleanup,code',
  161.         'theme_advanced_buttons2' => '',
  162.         'theme_advanced_buttons3' => '',
  163.         'theme_advanced_toolbar_location' => 'top',
  164.         'theme_advanced_toolbar_align' => 'left',
  165.         'theme_advanced_styles' => 'Code=codeStyle;Quote=quoteStyle',
  166.           'theme_advanced_statusbar_location' => 'bottom',
  167.         'theme_advanced_resizing' => true,
  168.         'theme_advanced_resize_horizontal' => false,
  169.         'entity_encoding' => 'raw',
  170.         'add_unload_trigger' => false,
  171.         'remove_linebreaks' => false,
  172.         'inline_styles' => false
  173.         );
  174.       }
  175.      
  176.       return null;
  177.     }
  178. }
  179. ?>

Donc concernant les modifications apportées, j'ai modifié le code pour qu'il prenne en compte plusieurs TinyMCE sur une même page.

Ensuite j'y ai rajouté un paramètre $preset (inspiré de l'ancienne méthode d'intégration de TinyMCE viaun element) qui permet de définir un groupe d'options pour éviter d'avoir a chaque fois à se retaper le code de $tinyoptions.

J'y ai mis 3 groupes par défaut: "Full Features", "Basic", "BBCode", vous pouvez bien évidement en rajouter/modifier à votre guise.

A noté que lorsqu'on utilise un preset, il est également possible d'y rajouter/modifier des options grâce a $tinyoptions.

En ce qui concerne l'utilisation, rien de plus simple:

Code: php

  1. echo $tinymce->input(
  2.   'champs',
  3.   array(
  4.     'label' => 'Mon Label'
  5.   ),
  6.   null,
  7.   'bbcode'
  8. );

Le helper se comporte comme $form->input(); pour les 2 premiers paramètres

Code: php

  1. $tinymce->input($fieldName, $options = array(), $tinyoptions = array(), $preset = null)

Le 1er paramètres et le noms du champs de votre formulaire.
Le 2eme, les options de votre champs (label, style, etc...)
Le 3eme est les options de TinyMCE.
Le 4eme, le nom de votre preset à utiliser

Si vous avez des questions, améliorations bugs rencontrés, n'hésitez surtout pas big_smile

Edit:

Pour ceux que sa intéresse, je compte faire un Helper sur le JCalendar Dynarch, en m'inspirant de la méthode de ce Helper, je vous tiendrais au courant smile

http://www.dynarch.com/projects/calendar/

Dernière modification par kamui545 (16-10-2009 12:44:29)

Hors ligne

 

#2 12-10-2009 08:18:20

real34
Cooker
Lieu: Toulouse
Date d'inscription: 28-06-2008
Messages: 1810
Site web

Re: [Helper] TinyMCE

Merci pour cette contribution !


Expert CakePHP - Co-gérant du studio web Occitech

Hors ligne

 

#3 16-10-2009 12:45:16

kamui545
Chef Pâtissier
Date d'inscription: 14-08-2009
Messages: 1638
Site web

Re: [Helper] TinyMCE

Mise à jour du Helper: Prise en charge des fonctions dans les options.

Hors ligne

 

#4 18-08-2010 14:27:55

patlafauche
Crêpe Suzette
Date d'inscription: 12-08-2010
Messages: 6

Re: [Helper] TinyMCE

Même si le topic est un peu vieux, je te remercie, j'ai installé tinymce dans mon projet mais via un helper ça va surement être plus propre;)

Hors ligne

 

#5 18-01-2011 21:07:02

cyril
Forêt noire
Date d'inscription: 18-01-2011
Messages: 90
Site web

Re: [Helper] TinyMCE

Merci beaucoup,
je cherchais justement une solution smile


Quand je ne sais pas je cherche, quand je sais je partage...

Hors ligne

 

#6 20-01-2011 01:41:24

cyril
Forêt noire
Date d'inscription: 18-01-2011
Messages: 90
Site web

Re: [Helper] TinyMCE

Bonjour et merci beaucoup pour ce helper mais j'ai une petite question technique.

J'ai l'habitude d'utiliser une feuille de style directement dans tynimce et j'ai donc modifié le helper en y ajoutant

Code: php

  1. 'content_css' =>  ''

et donc j'ai ajouté le paramètre dans mon input

Code: php

  1. 'content_css' =>  '/css/stylesheet.css'

mais styles sont bien présents mais les images de mes styles css ne s'affichent pas ???

Aurais tu une solution stp ?

Amicalement

Dernière modification par cyril (20-01-2011 01:45:23)


Quand je ne sais pas je cherche, quand je sais je partage...

Hors ligne

 

#7 20-01-2011 22:20:27

pluriels
Cooker
Lieu: Lyon
Date d'inscription: 22-07-2008
Messages: 831

Re: [Helper] TinyMCE

peut-être la manière dont le chemin des images est défini depuis la feuille de style ?

Hors ligne

 

Pied de page des forums

Propuls� par FluxBB
Traduction par FluxBB.fr