tutos > Un textarea QuickForm2 avec BBcodes


Un textarea QuickForm2 avec BBcodes

Mis en ligne le 24 juin 2009
Tags : QuickForm2 BBcodes

Pour permettre l'insertion de balises html dans un texte entré via un textarea géré par QuickForm2, il suffit de modifier la classe TextArea.php (HTML/QuickForm2/Element/TextArea.php).
Notez que je travaille avec une version locale, c'est-à-dire installée manuellement dans mon DocumentRoot, de ce package PEAR.

L'on va donc y ajouter une variable et deux méthodes :

protected $bbcode = false;
public function enableBBcodes(){
$this->bbcode = true;
return $this;
}
public function BBcodesEnabled(){
return $this->bbcode;
}


Le textarea se définit donc comme suit :

$content = $fieldset->addElement('textarea', 'content', array('cols' => 40, 'rows' => 40), array('label' => "Contenu"))->setId("_content");
$content->enableBBcodes();


Remarquez qu'il convient de définir explicitement l'id attribuée au textarea de façon à ne pas rencontrer de problèmes avec javascript.
L'affichage est facile à adapter. Pour référence, j'inclus le code se chargeant d'afficher mes formulaires :

require_once ABSLPATH . '/assets/php/HTML/QuickForm2.php';
function output_fieldset($fieldset) {
echo '<fieldset' . $fieldset->getAttributes(true) . ">\n<legend>" . $fieldset->getLabel() . "</legend>\n";
foreach ($fieldset as $element) {
output_element($element);
}
echo "</fieldset>\n";
}

function get_icons($id) {
$imgdir = "/assets/images/bbcode/";
$txtarea = "textarea" . $id;
$out = "";
$out .= '<div class="float-left">' . "\n";
$out .= "\t" . '<div class="toolbar">' . "\n";
$out .= "\t" . '<img name="bold" src="' . $imgdir . 'bold.gif" class="bbicon" onclick="' . $txtarea . '.simpleTag(\'b\');" alt="Gras" />' . "\n";
$out .= "\t" . '<img name="italic" src="' . $imgdir . '/italic.gif" class="bbicon" onclick="' . $txtarea . '.simpleTag(\'i\');" alt="Italique" />' . "\n";
$out .= "\t" . '<img name="under" src="' . $imgdir . 'under.gif" class="bbicon" onclick="' . $txtarea . '.simpleTag(\'u\');" alt="Sousligné" />' . "\n";
$out .= "\t" . '<img name="strike" src="' . $imgdir . 'strike.gif" class="bbicon" onclick="' . $txtarea . '.simpleTag(\'s\');" alt="Barré" />' . "\n";
$out .= "\t" . '<img src="' . $imgdir . 'blackdot.gif" width="1" style="padding: 4px; padding-top: 12px;" alt="" />' . "\n";
$out .= "\t" . '<img name="code" src="' . $imgdir . 'code.gif" class="bbicon" onclick="' . $txtarea . '.simpleTag(\'code\');" alt="Code" />' . "\n";
$out .= "\t" . '<img src="' . $imgdir . 'blackdot.gif" width="1" style="padding: 4px; padding-top: 12px;" alt="" />' . "\n";
$out .= "\t" . '<img name="img" src="' . $imgdir . 'img.gif" class="bbicon" onclick="' . $txtarea . '.promptIMGTag(\'img\');" alt="Image" />' . "\n";
$out .= "\t" . '<img src="' . $imgdir . 'blackdot.gif" width="1" style="padding: 4px; padding-top: 12px;" alt="" />' . "\n";
$out .= "\t" . '<img name="url" src="' . $imgdir . 'url.gif" class="bbicon" onclick="' . $txtarea . '.promptURLTag(\'url\');" alt="URL" />' . "\n";
$out .= "\t" . '</div>' . "\n";
return $out;
}

function output_element($element) {
$error = $element->getError();
if ($element->getType() == "hidden" || $element->getType() == "submit")
$html = $element->__toString() . "\n" . '<div class="clear-both"></div>' . "\n";
else {
$element_type = $element->getType();
if (!empty($error)) {
$html = '<div class="input-error">' . $error . '</div>' . "\n";
$html .= '<div class="form-item-error">' . "\n";
} else
$html = '<div class="form-item">' . "\n";
if ($element_type != "checkbox" and $element_type != "radio") {
$html .= "\t" . '<label';
if ($element->isRequired())
$html .= ' class="required"';
$html .= '>' . $element->getLabel() . '</label>' . "\n";
}
switch($element_type) {
case "textarea" :
if ($element->BBcodesEnabled())
$html .= get_icons($element->getId());
$html .= "\t" . $element->__toString() . "\n";
if ($element->BBcodesEnabled())
$html .= "\t" . '<script type="text/javascript">var textarea' . $element->getId() . ' = new TextArea(\'' . $element->getId() . '\');</script>' . "\n";
break;
default :
$html .= "\t" . $element->__toString() . "\n";
}
$html .= "\t" . '<div class="clear-both"></div>' . "\n" . '</div>' . "\n";
}
echo $html;
}

function display_form($form) {
echo '<form' . $form->getAttributes(true) . '>' . "\n";
foreach ($form as $element) {
if ($element->getType() == $fieldset")
output_fieldset($element);
else
output_element($element);
}
echo "\n</form>";
}