Tag Archives: php

Entendiendo las clases de PHP Reflection

ReflectionMethod

Esta clase permite llamar a métodos de una clase de manera dinámica. Imaginemos que tenemos una clase Manager con dos métodos:

class Manager
{
    metodoHola()
    {
        echo 'Hola';
    }
 
    metodoAdios()
    {
        echo 'Adios';
    }
}

Si queremos llamar a los métodos de la clase Manager de forma dinámica, en función de un parámetro, la clase ReflectionMethod nos permite hacerlo:

$reflectionMethod = new \ReflectionMethod('Manager', 'metodo'.ucfirst($variable));
$reflectionMethod->invoke($manager);

En el anterior ejemplo, si $variable = 'hola', al ejecutar $reflectionMethod->invoke($manager) ejecutaríamos el método metodoHola. Si en cambio fuese $variable = 'adios' llamaríamos a metodoAdios.

Conexión a más de una BD en WordPress

Recientemente me he encontrado con un inconveniente adaptando un WordPress. En un página necesitaba conectar con una Base de Datos diferente de la de wordpress, es decir, hacer dos conexiones simultáneas a Bases de Datos diferentes. Para conectarme a la BD Lo hice de la forma clásica utilizando las funciones mysql_connect(), mysql_select_db(), mysql_close() y ningún problema, hasta que quise llamar a la función wp_list_pages() en el footer, que me daba error. Tras varias pruebas me di cuenta que esto se debía a que al conectar con una segunda Base de Datos, la conexión con la BD de WordPress se cerraba. Buscando en internet, encontré cómo resolverlo en Separate DB connection for WordPress plugins.

La solución es muy sencilla. Se trata de establecer el cuarto parámetro $new_link a true en la función mysql_connect(). De este modo se establece un nuevo enlace con la BD y mantiene el de WordPress.

$connection = mysql_connect('localhost', 'mysql_user', 'mysql_password', true);

Posteriormente, cuando se quiera ejecutar una consulta utilizando este enlace se tiene que especificar:

$result = mysql_query('SELECT * FROM table', $connection);

Y siempre es recomendable cerrar la conexión:

mysql_close($connection);

Indexació de webs multiidioma amb PHP i Apache

La indexació de pàgines als buscadors és quelcom que s’ha tornat gairebé imprescindible a l’hora de publicar una pàgina web. I aquesta importància recau d’igual manera en sites multiidioma on totes les pàgines en tots els idiomes han d’estar indexades.

Jo conec dos sistemes per fer pàgines web multiidioma. El primer seria el clàssic de ficar la web en un idioma, per exemple català, dins http://www.javierseixas.com/blog/wp-admin/post.php?action=edit&post=23la carpeta ‘ca’. Per traduïr-la a un altre idioma, per exemple el castellà, es duplica la carpeta, se li assigna el nom ‘es’ i es tradueixen tots els arxius html que la componen. Aquest sistema no el recomano ja que obliga a que quan s’hagi de fer una modificació fer-la en tants arxius com pàgines hi hagin, lo qual duplica el treball i el temps. De totes maneres no queda més remei que fer-ho així en servidors que no suportin algun tipus de llenguatge.

El segon sistema que conec és mitjantçant includes que contenen les textos fixes, com titol de seccions, nom de botons, etc. Hi ha un include per cada idioma, i mitjançant una sessió carregarà un include o un altre. S’haurà de declarar una sessió per defecte, per quan l’usuari entri per primer cop l’assigni i carregui l’idioma per defecte. Si l’usuari canvia l’idioma canviarà el valor de la sessió.

Fins aquí tot bé, però què passa quan un robot entra al nostre site? El robot trobarà l’enllaç per canviar d’idioma, però no sabrà interpretar el canvi de sessió, per lo qual, el robot només detectarà i indexarà el nostre site en l’idioma per defecte. I com es soluciona aquest problema?

La clau està en col·locar a l’enllaç on es canvia l’idioma una adreça falsa. Per exemple:

<a href="http://www.javierseixas.com/ca">Català</a>
<a href="http://www.javierseixas.com/es">Castellà</a>

Fet això, el PHP haurà de saber en quin idioma s’està navegant. Això es pot saber per la funció $_SERVER['REQUEST_URI'] que retorna la part de l’adreça després del domini. Tot seguit, el PHP haurà de decidir quin include incloure segons hagi dit el REQUEST_URI, per exemple, ca per català , es pel castellà, en per l’anglés. En aquest punt recomano seguir les sigles que utilitza la wikipedia.

I el darrer punt clau el juga Apache. S’ha d’activar el ModRewrite i escriure les regles per l’idioma concret:

RewriteRule ^ca/(.+) /?sec=$1
RewriteRule ^es/(.+) /?sec=$1
RewriteRule ^en/(.+) /?sec=$1