Sviluppando un componente mi sono imbattuto nel problema di dover avere diversi editor wysiwyg nella stessa pagina e mi sono accorto che quando si istanzia un editor gli altri si bloccano.
Nello specifico sto usando JCE
Dovo varie ricerche più o meno inutili ho deciso di mettere mano al codice del plugin e ho trovato una soluzione.
Soluzione:
File -> plugins/editors/jce/jce.php
Funzione -> onDisplay
Riporto qui il codice originale della funzione
function onDisplay($name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null)
{
$model = JModel::getInstance('editor', 'WFModel');
if (empty($id)) {
$id = $name;
}
// Only add "px" to width and height if they are not given as a percentage
if (is_numeric($width)) {
$width .= 'px';
}
if (is_numeric($height)) {
$height .= 'px';
}
if (empty($id)) {
$id = $name;
}
$buttons = $this->_displayButtons($id, $buttons, $asset, $author);
$editor = '<label for="' . $id . '" style="display:none;" aria-visible="false">' . $id . '_textarea</label><textarea id="' . $id . '" name="' . $name . '" cols="' . $col . '" rows="' . $row . '" style="width:' . $width . ';height:' . $height . ';" class="wfEditor source" wrap="off">' . $content . '</textarea>';
$editor .= $model->getToken($id);
$editor .= $buttons;
return $editor;
}
e qui il codice modificato
function onDisplay($name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null)
{
$model = JModel::getInstance('editor', 'WFModel');
$rand = rand();
if (empty($id)) {
$id = $name;
}
// Only add "px" to width and height if they are not given as a percentage
if (is_numeric($width)) {
$width .= 'px';
}
if (is_numeric($height)) {
$height .= 'px';
}
if (empty($id)) {
$id = $name;
}
$id=$id."_".$rand;
$buttons = $this->_displayButtons($id, $buttons, $asset, $author);
$editor = '<label for="' . $id . '" style="display:none;" aria-visible="false">' . $id . '_textarea</label><textarea id="' . $id . '" name="' . $name . '" cols="' . $col . '" rows="' . $row . '" style="width:' . $width . ';height:' . $height . ';" class="wfEditor source" wrap="off">' . $content . '</textarea>';
$editor .= $model->getToken($id);
$editor .= $buttons;
return $editor;
}
Come si vede dal codice sono state aggiunte due righe nuove.
La prima all'inizio della funzione $rand = rand();
genera un numero casuale.
La seconda $id=$id."_".$rand;
aggiunge questo numero casuale all'id dell'editor.
In questo modo se abbiamo più editor nella stessa pagina ognuno di essi prende un id diverso permettendoci di averne quanti ne vogliamo.
Note:Questa modifica non comporta differenze se si usa un solo editor ma può rallentare il caricamento della pagina quando se ne usano diversi in quanto l'editor viene reistanziato per ogni relativa textarea.
Sperando di essere di aiuto a qualcuno vi auguro a tutti buona giornata.