DokuWiki

It's better when it's simple

Herramientas de usuario

Herramientas del sitio


es:tips:template_chooser

Template Chooser

Era molesto para mi, que en nuestro wiki yo tuviera que escribir el mismo para cierto tipo de documentación una y otra vez o copiar esta a mi clipboard y ponerla luego en Dokuwiki.

Por eso I hice esta simple cosa. Si usted odia javascript, usted podria irse py esconderse, porque esto será espantoso…

El “plugin” es llamado “Template chooser” y no es conforme al estándar de plugins actual de dokuwiki que existe actualmente. A lo mejor en alguna versión futura, que me permita incluir mejor esto. Hasta entonces, aquí está lo que hice.

Yo tengo dos ficheros en mi directorio template, el primero incluye una función para seleccionar una caja select con la lista de templates, el otro es un feo javascript para este.

Ponga estos dos ficheros en el path de su template (normaly 'lib/tpl/default/')

El primero es uno llamado “template_chooser.php”:

<?php
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../../').'/');
if (is_null($conf['template_chooser']['namespace'])) {
    $conf['template_chooser']['namespace'] = 'templates';
}
if (is_null($lang['select_template'])) {
        $lang['select_template'] = 'Select template';
}
function read_files($path, $preg) {
    $templates = array();
    $dh = opendir($path);
    while (($file = readdir($dh)) !== false) {
        if ((is_dir($path.'/'.$file)) && (!in_array($file, array('.', '..')))) {
            $tmp = read_files($path.'/'.$file, $preg);
            $templates = array_merge($templates, $tmp);
        }
        if (preg_match($preg, $file)) {
            // Read in file
            $contents = file($path.'/'.$file);
            // Template name is in the first line and cutted out
            $templatename = array_shift($contents);
            if (preg_match('/\$\$TEMPLATE:(.*?)\$\$/', $templatename, $matches)) {
                $templates[$matches[1]] = $contents;
            }
        }
    }
    closedir($dh);
    return $templates;
}
function tpl_template_chooser() {
    global $conf,$lang;
    $template_dir = DOKU_INC.'data/pages/'.$conf['template_chooser']['namespace'];
    if (!file_exists($template_dir)) {
        return true;
    }
    $templates = read_files($template_dir, '/\.txt$/');
    ?>
    <script type="text/javascript">
    <!--**Bold Text**
    <?php
    foreach ($templates as $key => $value) {
        print "var newitem = new template_chooser_template('$key', ''\n";
        foreach ($value as $line) {
	  $line = addslashes(rtrim($line));
	  print "  + '$line\\n'\n";
        }
        print ");\ntemplate_chooser_templates.push(newitem);\n";
    }
    ?>
    //-->
    </script>
    <?php
    if (count($templates) > 0) {
        ksort($templates);
        print '<div id="template_chooser">';
        print $lang['select_template'].' <select onChange="template_chooser_set_template(this)" name="template_chooser">';
        print '<option value="">-</option>';
        foreach ($templates as $key => $value) {
            print '<option value="'.$key.'">'.$key.'</option>';
        }
        print '</select>';
        print '</div>';
    }
}
?>

El segundo es llamado “template_chooser.js”. (Billante idea, eh?)

var template_chooser_templates = new Array();
 
function template_chooser_template(template_name, template_content)
{
    this.template_name = template_name;
    this.template_content = template_content;
}
 
function template_chooser_set_template(selector)
{
    tpl_name = selector[selector.selectedIndex].value;
 
    if (tpl_name == '') {
        return true;
    }
 
    textbox = document.getElementById('wiki__text');
 
    tpl_content = '';
    // Get Content
    for (var i=0; i<template_chooser_templates.length; i++) {
        if (template_chooser_templates[i].template_name == tpl_name) {
            tpl_content = template_chooser_templates[i].template_content;
        }
    }
 
    if (tpl_content != '') {
        textbox.value = textbox.value + tpl_content;
    }
}

Ahora, añada estas dos líneas en su fichero main.php:

En el área html-head, añada:

<script src="<?php print DOKU_TPL.'template_chooser.js'; ?>" type="text/javascript"></script>

Y en el punto donde usted quiera, añada la caja select como se muestra a continuación:

<?php
        // Include template chooser
        if (($ACT == 'edit') || ($ACT == 'preview')) {
            include(dirname(__FILE__).'/template_chooser.php');
            tpl_template_chooser();
        }
?>

Despues de esto, nada debería pasar. Esto es debido a que probablemente no ha creado el espacio de nombres para los templates. Yo uso el espacio “templates”, pero esto puede ser configurado a través de los valores de configuración “$conf['template_chooser']['namespace']” en su fichero local.php.

Si ustede crea el espacio de nombres y pone un documento en él, debe añadir esta línea al inicio del contenido:

$$TEMPLATE:<Short description of template>$$

Si usted no pone esta línea, no se mostrará el documento en la lista select. Esta línea será usada para determinar que mostrar en la lista select. Por supuesto, esta línea será quitada del contenido del template.

Ahora, hay dos cosas más que usted debe hacer. En el fichero lant.php del lengaje escogido, añada “$lang['select_template']” y fije este al valor que desea que se muestre a la izquierda de la caja select.

Y usted puede añadir un estilo para el id “#template_chooser” en su fichero css para modificar el despliegue de la caja de selección.

Añada a al fichero 'layout.css' lo siguiente:

/* ---------------  Template Chooser  ----------------- */
 
#template_chooser {
 margin-left: 40px;
 float: right;
}

Esto debería ser todo. Una vez haya configurado todo esto, usted debería tener una caja select que se muestra sus templates almacenados en el espacio de nombre “templates”

Las discusiones las puede seguir en http://www.dokuwiki.org/wiki:es:tips:template_chooser

es/tips/template_chooser.txt · Última modificación: 2008-04-09 10:50 por 80.38.194.219

Excepto donde se indique lo contrario, el contenido de este wiki esta bajo la siguiente licencia: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki