Muchos habrán escuchado hablar de los famosos CMS (Content Management System) que están por todas partes hoy en día.
Si la cosa sigue así en un futuro no habrá más que unos cuantos desarrollando CMS’es y unos pocos utilizandolos para implementar sus sitios web.
Lo dicho: Typo3. Luego de muchos debates con un cliente “grande” y de escuchar sus repetidas opiniones a cerca de lo potente que es un CMS (cuando en realidad no tienen idea de nada) y de lo bien que les viene utilizar uno; me he puesto a investigar un poco.
Por ahora ya tengo todo el panel de administración (llevo con el un par de días) bajo la manga y la manera de hacer las cosas me parece bastante intuitiva -aunque con ciertas cosas muy mejorables- y puedo decir que es una herramienta que se parece a muchas otras. Typo3 es el CMS de elección para empresas “serias” y con proyectos “grandes” y todo esto se debe a que tiene un ventaja sobre sus competidores y es el uso de su propio pseudo-lenguaje. He de admitir que ese pseudo-lenguaje (TypoScript) es bastante potente y ofrece mucha flexibilidad a la hora de hacer ciertas cosas.
En una sola palabra: potente. Así es como describiría a Typo3, pero como todo en la vida también tiene su lado negativo y es que la documentación la tuvo que haber escrito alguien con muy pocas ganas y con el tiempo justo y digo esto porque solo de leer la documentación uno se entera de lo justo -o menos- y en la mayoría de los casos lo justo no es suficiente.
Iré, en los próximos días, investigando mucho más a fondo y por supuesto miraré el código del core de Typo3, ya que me interesaría saber cual es su lógica y sobre mis investigaciones publicaré lo que me pueda parecer interesante, todo acompañado de breves tutoriales -claro- ya que información en castellano es complicada de encontrar.
Never argue with an idiot; He will drag you down to his level and beat you with experience.
Para que el se ha encontrado con que quiere poder extender sus aplicaciones de PHP mediante plug-ins, aquí hay una idea muy simple de como se puede hacer.
Supongamos que tenemos un archivo llamado external_dateFormat.php que continue únicamente una función:
<?php
-
function external_dateFormat($string, $include_time = false, $date_format = 'd/m/Y', $time_format = 'H:i:s')
-
{
-
if($include_time)
-
{
-
$format = $date_format.' '.$time_format;
-
return date($format, strtotime($string));
-
}
-
else
-
return date($date_format, strtotime($string));
-
}
-
?>
Básicamente recibe unos parámetros y devuelve una fecha según el formato que reciba o el pre-determinado.
Ahora bien; por otro lado tenemos una clase en donde tenemos algunas funciones y queremos llamar a esta función dateFormat() solo en un momento dato y bajo ciertas circumstancias, como si se tratase de un plug-in por ejemplo.
A continuación la clase:
<?php
-
-
class isample {
-
-
// Aquí guardamos la sobrecarga de variables. Esto se puede omitir, pero si llegamos
-
// a tener estructuras de arrays muy complejas PHP se pierde.
-
private $_s_g = array();
-
-
// Cuando se trata de acceder (almacenar) una variable que no existe se invoca a este
-
// método que la guardará en el array anterior.
-
// $name es el nombre de la variable que queremos escribir
-
// $value el valor que tendrá
-
function __set($name, $value)
-
{
-
$this->_s_g[$name] = $value;
-
}
-
-
// Cuando se trata de acceder (leer) una variable que no existe se invoca a este
-
// método que la obtendrá del array anterior.
-
// $name es el nombre de la variable de la cual queremos saber su valor
-
function __get($name)
-
{
-
return $this->_s_g[$name];
-
}
-
-
// Cuando se trata de acceder a un método que no existe en esta clase se invoca
-
// método (mágico) que permite extender la llamada a otra funcíon o, en este caso,
-
// cargar nuestro "plug-in" del archivo externo.
-
// $name es el nombre del método al que queremos acceder
-
// $args son los argumentos que le pasaríamos
-
function __call($name, $args)
-
{
-
// Incluímos (solo una vez) el archivo con nuestra función
-
require_once('external_'.$name.'.php');
-
-
// A la variable fecha (que no está ligada al objecto) le asignamos el resultado de nuestra función.
-
// Llamamos a nuestra función y le pasamos los parámetros recibidos desde la llamada
-
$this->fecha = call_user_func_array('external_'.$name, $args);
-
}
-
}
-
-
$str = '2008-01-12 14:43:21';
-
$t = new isample(); // Creamos una nueva instacia del objeto
-
-
// Llamamos al método dateFormat que no existe en este objecto
-
$t->dateFormat($str, true, 'D d, M / Y');
-
-
// Mostramos el valor de la variable fecha (que solo existe mágicamente en el objeto)
-
echo $t->fecha;
-
-
?>
Y con este pequeño ejemplo se pueden implementar modelos más complejos de plug-in. Se puede, por ejemplo, utilizar ob_start(); y crear un potente y rápido sistema de cache para las funciones incluidas, pero eso ya es otra historia.
Espero que les sea de ayuda.
Hay veces en las que se quiere cortar un texto sin cortar por la mitad de una palabra, por ejemplo cuando usamos AJAX y queremos mostrar solo un par de líneas de la entrada de una noticia. Hay dos maneras de hacer esto: la primera (y quizá la más simple, pero no la mejor) es hacerlo en el servidor antes de que este devuelva los resultados al AJAX, pero en este caso nos podemos encontrar con que luego necesitamos el texto completo y eso implicaría una nueva llamada y con ello consumo de recursos.
Entonces nos queda la segunda opción: cortarlo según lo necesitemos en el script antes de mostrarlo. Para ello he escrito esta pequeña función que hace justamente eso. Recorta una cadena determinada a un largo determinado, sin cortar palabras por la mitad y con eso el texto queda un poco más presentable.
-
function trimText(string, largo)
-
{
-
largo = largo-3;
-
var newst = string.split(" ");
-
var contador = 0;
-
var finalstr = '';
-
-
for(var lar=0; lar<newst.length; ++lar) {
-
if(contador >= largo)
-
break;
-
else
-
{
-
contador += newst[lar].length;
-
finalstr += newst[lar]+' ';
-
if(finalstr.length-1 > largo)
-
{
-
finalstr = finalstr.substr(0, finalstr.indexOf(newst[lar], 0));
-
break;
-
}
-
}
-
}
-
return (finalstr != string) ?
-
finalstr.substr(0, finalstr.length-1)+'…' :
-
finalstr;
-
}
Y para llamarla:
-
var texto = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque sit amet nibh non metus bibendum sagittis. Suspendisse ante ligula, varius eu, ultrices sit amet, scelerisque vel, orci.'
-
var texto_cortado = trimText(texto, 50);
Listo, un mejor texto recortado.