Material: Integrando PHP5 y AS3 a través de AMF
Dejo aquí todo el material de la charla que ofrecí en la PHPConfrence el viernes:
Slides

Ejemplo 1: Chat AMF

AMF File Chat: Chat realizado con WebOrb para PHP + Flex.
Se puede ver en acción la implementación de mensajería de WebOrb para PHP y un sistema de transferencia de archivos a través del canal del Chat.
Ejemplo 2: Gestor Contactos

Gestor de Contactos realizado con PHP + Flex. Se puede ver cómo con una misma base de código, solo cambiando las rutas de los gateways AMF se puede atacar a un mismo servicio a través de las diferentes implementaciones presentadas: Weborb, AMFPHP y Zend_AMF.
Nota 1: Zend framework debe estar instalado en el include_path de PHP para que funcione con Zend_AMF. Las demás implementaciones funcionan out of the box.
Nota 2: Se debe crear la base de datos MySQL gestor_contactos y ejecutar el script SQL contra ésta para crear la tabla contacto.
Enjoy!
Doctrine: ORM Open Source para PHP 5.2+
Doctrine es un potente y completo sistema ORM (object relational mapper) para PHP 5.2+ con un DBAL (database abstraction layer) incorporado.
Justo lo estoy utilizando para un proyecto y estoy empezando a ver su potencial, pero de la documentación se puede extraer que tiene todas las características necesarias para ser funcional en (casi?) cualquier proyecto.
Entre muchas otras cosas tienes la posibilidad de exportar una base de datos existente a sus clases correspondientes y también a la inversa, es decir convertir clases (convenientemente creadas siguiendo las pautas del ORM) a tablas de una base de datos.
Por otro lado, como la librería es bastante grande ésta tiene un método para ser ‘compilada’ al pasar a producción.
Dejo un índice de temas que estoy utilizando para buscar referencias durante el desarrollo:
- Relations
- Introduction
- Foreign key associations
- Join table associations
- Many-to-Many
- Self-referencing (Nest relations):
- Inheritance
- Foreign key constraints
- Dealing with relations
- Creating related records
- Retrieving related records
- Updating related records
- Deleting related records
- Many-to-Many relations
- Hierarchical data
- Transactions
- Internationalization with I18n
- Component overview
- Other
Evitar Subqueries con Joins
Una petición típica en una relación de uno a n es saber qué relaciones no se han dado todavía en un momento dado.
Por ejemplo, teniendo estas tablas (sacado de una duda de un lector):
-
CREATE TABLE noticia (
-
id_noticia INT(11) NOT NULL AUTO_INCREMENT,
-
id_categoria INT(11) NOT NULL,
-
noticia TEXT NOT NULL,
-
PRIMARY KEY (id_noticia)
-
) TYPE=MyISAM;
-
CREATE TABLE categorias(
-
id_categoria INT(11) NOT NULL AUTO_INCREMENT,
-
nombre_categoria TEXT NOT NULL,
-
PRIMARY KEY(id_categoria)
-
) TYPE=MyISAM;
Queremos sacar todas las categorías que no tienen ninguna noticia relacionada.
Para ello podemos hacer dos cosas, utilizar una subquery para la que tendremos que disponer de MySQL 4.1 o superior , o utilizar un LEFT JOIN.
En este caso concreto voy a utilizar un LEFT JOIN:
-
SELECT DISTINCT
-
cat.nombre_categoria
-
FROM
-
categorias AS cat
-
LEFT JOIN
-
noticia AS new
-
ON
-
cat.id_categoria = new.id_categoria
-
WHERE
-
new.id_categoria IS NULL
Enlaces relacionados: * INNER JOIN o EQUI-JOIN :: Consultas MySQL..
Pack de herramientas gratuitas
Siempre va bien saber qué herramientas utiliza otra gente para ver si nos estamos perdiendo algo.
Es por esto que he decidido poner un listado de las herramientas gratuitas que utilizo actualmente.
Si alguien sabe de alguna que cree que me falta, por favor que lo diga :)
- Utilidades
- 7zip: compresor/descompresor de archivos
- FireFox: navegador web
- ThunderBird: cliente de correo
- FilleZilla: cliente FTP
- WinMerge: comparador de archivos
- Putty: cliente SSH - telnet
- SpyBot: busca y destruye spyware
- WinAmp: reproductor de audio, video y radio
- ActionScript
- Flash Resource Manger: Visor externo para la ayuda de Flash
- SEPY: Editor para ActionScript (+PHP)
- Natural Docs
( + Natural GUI ): Generador de documentación para AS (entre otros leguajes) - gmodeler: Diagramador UML para lenguajes ECMAscript (+generador de código)
- Flasm: Desensamblador/optimizador de archivos .swf
- MTASC
( + WinMTASC GUI ): Compilador multi plataforma para AS 2.0 - SOS: Output externo para aplicaciones Flash
- PHP
- phpDocumentor: Generador de documentación para PHP
- PHP Designer 2005: Editor PHP (+HTML +XHTML +CSS +SQL)
- MySQL
- MySQL Query Browser: Gestor bases de datos MySQL
- DBdesigner: Sistema visual para diseño de bases de datos
- C#
- SharpDevelop: IDE para el lenguaje C#
- C/C++
- Bloodshed Dev C++: IDE para el lenguage C y C++
- RegExp
- RegExpEditor: Editor de expresiones regulares
- Servidor local
- Wamp Server
: PHP+Apache+MySQL en un único pack instalable
Formateando el código ( source code formatters )
A veces trabajando con código de otra gente encuentras que, o bien el código carece de estilo y está completamente desordenado o el estilo no es de tu agrado y te dificulta la lectura.
Otras veces simplemente quieres arreglar algo que has hecho de una manera fácil y rápida.
En cualquier de los dos casos hay una solución a la que yo personalmente acudo con frecuencia. Son los formateadores de código (code formatters).
A medida que los vas necesitando vas viendo que hay gente por ahí que se ha dedicado a crear un buen repertorio de ellos.
Este es un listado de algunos que he encontrado gratuitos:
SQL: - SQLInform ActionScript, PHP: - SEPY HTML: - Tidy - TidyUI (Entorno gráfico para Tidy) JavaScript: - JavaScript code improver Java: - JALOPY Delphi: - JEDI PHP, Java, C++, C, Perl, JavaScript, CSS: - Pretty Printer
Seleccionar varias veces la misma tabla en la cláusula SELECT
Me he encontrado con el siguiente problema:
Tengo una tabla en la que tengo que sacar valores relacionados de la misma tabla dos veces.
Por ejemplo, siguiendo el ejemplo del post sobre INNER JOIN creamos la base de datos contactos si no la tenemos y las tablas clientes, localidades y tipos_clientes con la diferencia que añadiremos un campo más en clientes.
Para modificar la tabla "clientes":
-
ALTER TABLE
-
contactos.clientes
-
ADD COLUMN
-
lugar_procedencia INT(3) UNSIGNED NOT NULL
-
AFTER
-
localidad;
Ahora tenemos un nuevo campo llamdo lugar_procedencia que vamos a rellenar de la siguiente manera:
-
UPDATE clientes SET lugar_procedencia=1 WHERE id = 1;
-
UPDATE clientes SET lugar_procedencia=2 WHERE id = 2;
-
UPDATE clientes SET lugar_procedencia=3 WHERE id = 3;
-
UPDATE clientes SET lugar_procedencia=2 WHERE id = 4;
Una vez hecho esto ya podemos ver como se hace el select para poder sacar valores de la tabla localidades dos veces de una sola vez:
-
SELECT
-
clientes.nombre AS nombre,
-
localidad_actual.nombre_localidad AS localidad,
-
localidad_procedencia.nombre_localidad AS procedencia,
-
tipos_cliente.tipo AS tipo_cliente
-
-
FROM
-
clientes,
-
localidades AS localidad_actual,
-
localidades AS localidad_procedencia,
-
tipos_cliente
-
-
WHERE
-
clientes.localidad = localidad_actual.id AND
-
clientes.lugar_procedencia = localidad_procedencia.id AND
-
clientes.tipo_cliente = tipos_cliente.id;
Esto devolverá el siguiente resultado:
| nombre | localidad | procedencia | tipo_cliente |
|---|---|---|---|
| Marcos Gonzalez | Oviedo | Oviedo | Desarrollador |
| Daniel Aguilar | Barcelona | Barcelona | Desarrollador |
| Abel Molina | Barcelona | Girona | Diseñador |
| Ingeniería y Mezclas | Girona | Barcelona | Otros |
Lo que hemos hecho es asignar un alias diferente a la misma tabla para que MySQL la procese como si fuera otro campo:
(...) localidades AS localidad_actual, localidades AS localidad_procedencia (...)
de lo contrario trataría a los dos campos como uno y el resultado no sería el esperado.
Además hemos tenido éso en cuenta en la cláusula WHERE para que MySQL sepa bien donde estamos buscando las relaciones.
Enlaces relacionados: * ...Consultas MySQL a multiples tablas relacionadas
INNER JOIN o EQUI-JOIN :: Consultas MySQL a multiples tablas relacionadas
Desde MySQL es posible realizar una consulta que devuelva los valores de una tabla que está relacionada con otras de una sola vez.
Por ejemplo, tenemos una tabla principal bien normalizada, con muchos campos que estan relacionados mediante un id con otras tablas que contienen los valores reales.
Lo que necesitamos hacer es convertir esa tabla ppal en otra en que los IDs se conviertan en dichos valores reales, y para ello utilizaremos JOINs:
Hay varios tipos de JOIN:
- Cross-Join - Equi-Join o Inner Join - Left Join
En este ejemplo se verá la utilización de lo que se llama un Equi-Join o Inner Join.
Para ver el funcionamiento creamos una base de datos de ejemplo:
-
CREATE DATABASE contactos;
-
USE contactos;
-
-
CREATE TABLE clientes (
-
id INT(3),
-
nombre VARCHAR(100),
-
tipo_cliente INT(2),
-
localidad INT(3)
-
);
-
-
CREATE TABLE tipos_cliente
-
(
-
id INT(2),
-
tipo VARCHAR(255)
-
);
-
-
CREATE TABLE localidades
-
(
-
id INT(3),
-
nombre_localidad VARCHAR(255)
-
);
-
-
# rellenamos la tabla "clientes"
-
INSERT INTO clientes VALUES ( 1, 'Marcos Gonzalez', 1, 1 );
-
INSERT INTO clientes VALUES ( 2, 'Ingeniería y Mezclas', 3, 2 );
-
INSERT INTO clientes VALUES ( 3, 'Daniel Aguilar', 1, 3 );
-
INSERT INTO clientes VALUES ( 4, 'Abel Molina', 2, 3 );
-
-
#rellenamos la tabla tipos_cliente
-
INSERT INTO tipos_cliente VALUES ( 1, 'Desarrollador' );
-
INSERT INTO tipos_cliente VALUES ( 2, 'Diseñador' );
-
INSERT INTO tipos_cliente VALUES ( 3, 'Otros' );
-
-
# rellenamos la tabla localidades
-
INSERT INTO localidades VALUES ( 1, 'Oviedo' );
-
INSERT INTO localidades VALUES ( 2, 'Girona' );
-
INSERT INTO localidades VALUES ( 3, 'Barcelona' );
Y ahora la consulta:
Lo que queremos hacer es recoger todos los valores de la tabla clientes pero recogiendo el valor real de los Id's, que está situado en otras tablas relacionadas.
-
SELECT
-
clientes.nombre AS nombre_cliente,
-
localidades.nombre_localidad AS localidad_cliente,
-
tipos_cliente.tipo AS tipo_cliente
-
FROM clientes,
-
localidades,
-
tipos_cliente
-
WHERE clientes.localidad=localidades.id
-
AND clientes.tipo_cliente=tipos_cliente.id;
Lo que hemos hecho aquí es, en la clausula SELECT seleccionar los campos de los que queremos sacar información y darles un nombre de alias con AS. El alias nos sirve para utilizar nombres que nos aclaren más la función de la tabla en cuestión, pero es totalmente opcional en este caso.
Seguidamente, en la clausula FROM decimos de qué tablas sacamos la información del SELECT, y para acabar debemos aclarar las condiciones que se tienen que cumplir para que los valores sean los correctos en cada columna.
En este caso los id's de la tabla ppal (clientes) deben coincidir con los id's de las tablas relacionadas.
Si ejecutamos esta consulta debemos obtener el siguiente valor:
| nombre_cliente | localidad_cliente | tipo_cliente |
|---|---|---|
| Marcos Gonzalez | Oviedo | Desarrollador |
| Daniel Aguilar | Barcelona | Desarrollador |
| Abel Molina | Barcelona | Diseñador |
| Ingeniería y Mezclas | Girona | Otros |
Enlaces relacionados: * JOIN Syntax
Update de la clase PHP ConsultaMysql
Mi amigo Marcos Gonzalez me ha pasado un nuevo método para la clase de peticiones MySQL comunes. El nuevo método transforma la query a formato XML y lo devuelve en utf-8.
Para ver el update ves al post original:
Enlace al post original: * clase ConsultaMysql v.1.1
Clase PHP para tratar bases de datos MYSQL
* Nuevo método añadido para recibir la query en formato XML -> Última actualización 18/12/04 - descarga la última versión al final del post.
Aquí dejo una clase que hice hace tiempo para tratar bases de datos MYSQL.
Como extra lleva un par de métodos específicos para usar con Flash y uno para sacar info del server MYSQL de forma gráfica:
- result_par_valor_split() ( devuelve una cadena "Devuelve una cadena del tipo: id=1#2#5#3#4&title=Título 1#Título 2#Título 3# etc..." con los resultados de la consulta ) - result_par_valor_indx() Éste por Marcos Gonzalez ( Devuelve una cadena del tipo: "n_datos=5&id_0=1&title_0=Título 0&id_1=2&title_1=Título 2 etc..." ) - info () ( saca información de la consulta y del servidor MYSQL )
Además de lo fundamental:
- conectar () - escapar_chars () (añade contrabarras a los caracteres " ' \ ) - desescapar_chars () (la inversa del anterior) - ejecutar_consulta () (ejecuta la cosulta en curso) - result_num_filas () (devuelve el numero total de filas (horizontal) de la consulta) - result_num_columnas () (devuelve el numero total de columnas (vertical) de la consulta) - result_array_asoc () (devuelve un array asociativo de la consulta) - cerrar_conexion () (cierra la conexión)
Aquí la clase:
-
<?php
-
-
/*
-
* clase ConsultaMysql
-
* version 1.1
-
* autor Joan|Garnet http://www.joangarnet.com
-
*/
-
-
-
class ConsultaMysql
-
{
-
/////////////////////////
-
// PROPIEDADES PÚLICAS //
-
/////////////////////////
-
-
var $servidor_mysql; // direccion del servidor Mysql, normalmente es "localhost"
-
var $usuario; // usuario del servidor Mysql
-
var $password; // password del servidor Mysql
-
var $bbdd; // nombre de la base de datos
-
var $consulta; // aquí debes meter la consulta Mysql
-
var $separador; /* si vas a usar el mdo result_par_valor_split(),
-
puedes asignar como separar los strings.
-
Por defecto se separan con "#"*/
-
var $testeando; // true o false
-
var $email_admin; /* si "$testeando" es false, entonces pon
-
el email del admin aqui para que reciba
-
notificaciones por email de los errores mysql */
-
var $resXML; // para almacenar el resultado de la query en formato XML
-
-
//////////////////////////
-
// PROPIEDADES PRIVADAS //
-
//////////////////////////
-
-
var $conexion;
-
var $selec_bbdd;
-
var $string_sucio;
-
var $string_limpio;
-
var $resultado;
-
var $par_valor;
-
var $par_valor_split;
-
var $par_valor_indx;
-
var $largo_separador;
-
var $indice;
-
var $valor;
-
var $n_filas;
-
var $n_columnas;
-
var $fila;
-
var $arr_asoc;
-
-
-
/////////////////////////////
-
// CONSTRUCTOR DE LA CLASE //
-
/////////////////////////////
-
-
function ConsultaMysql ()
-
{
-
$this->separador = "#";
-
}
-
-
//////////////////////
-
// MÉTODOS PRIVADOS //
-
//////////////////////
-
-
function err ()
-
{
-
if ($this-> testeando )
-
{
-
echo "<b><font color='red'>ERROR:</b> --> </b>" .
-
}
-
else
-
{
-
echo "<b><font color='red'>Ha habido un error</font></b>";
-
if ($this-> email_admin )
-
{
-
echo ", el administrador ha sido informado por email";
-
"Error mysql en" .$_SERVER ['PHP_SELF'] ,
-
"\n en->" .$_SERVER ['PHP_SELF'].$_SERVER ['QUERY_STRING'].
-
}
-
}
-
}
-
-
//////////////////////
-
// MÉTODOS PÚBLICOS //
-
//////////////////////
-
-
function conectar ()
-
{
-
// conecta a la bbdd
-
$this-> conexion = @mysql_connect ($this-> servidor_mysql , $this-> usuario , $this-> password ) or $this-> err ();
-
}
-
function escapar_chars ()
-
{
-
// añade contrabarras a las palabras que lleven ' " \
-
return ($this-> string_limpio );
-
}
-
function desescapar_chars ()
-
{
-
// quita las contrabarras para mostrar el texto original con ' " \
-
return ($this-> string_limpio );
-
}
-
function ejecutar_consulta ()
-
{
-
// ejecuta consulta Mysql
-
$this-> resultado = @mysql_query ($this-> consulta , $this-> conexion ) or $this-> err ($this-> resultado ) or $this-> err ();
-
return ($this-> resultado );
-
}
-
function result_num_filas ()
-
{
-
// devuelve el numero total de filas (horizontal) de la consulta
-
return $this-> n_filas;
-
}
-
function result_num_columnas ()
-
{
-
// devuelve el numero total de columnas (vertical) de la consulta
-
return $this-> n_columnas;
-
}
-
function result_array_asoc ()
-
{
-
// devuelve un array asociativo de la consulta (por nombres de campo envez de por indice de campo)
-
{
-
$this-> arr_asoc [] = $this-> fila;
-
}
-
return ($this-> arr_asoc );
-
}
-
function result_par_valor_split ()
-
{
-
// devuelve una cadena "var0=valor1,valor2,valor3&var1=valor1,valor2,valor3&var2= etc..." con los resultados de la consulta
-
$this-> result_array_asoc ();
-
for ($k = 0; $k <sizeof ($this-> arr_asoc ); $k ++)
-
{
-
{
-
{
-
$this-> par_valor [$this-> indice] = "";
-
}
-
$this-> par_valor [$this-> indice] .= $this-> valor .$this-> separador;
-
}
-
}
-
foreach ($this-> par_valor as $indice => $valor )
-
{
-
$this-> par_valor_split .= $indice ."=" .$valor;
-
$this-> par_valor_split .= "&";
-
}
-
}
-
-
-
//////////////////////////////////////
-
// //
-
// método por Marcos Gonzalez //
-
// http://www.q-interactiva.com //
-
// //
-
//////////////////////////////////////
-
function result_par_valor_indx ()
-
{
-
/*
-
RECIBE:
-
no recibe ningun parámetro ya que todos los que necesita los puede obtener
-
de la propia clase.
-
DEVUELVE:
-
Devuelve en la propiedad par_valor la respuesta a la consulta en formato
-
pares de variables valores indexados. Siempre a esta serie de parejas variable
-
valor indexadas, les precede una variable llamada n_datos que contiene el numero
-
de resultados obtenidos.
-
DESCRIPCION:
-
Obtiene en el numero de filas el numero de resultados obtenidos en la
-
consulta, y a su vez obtiene en el numero de columnas el numero de campos de los
-
resultados obtenidos. Posteriormente por cada respuesta (fila) concatena la cadena de
-
respuesta con un nuevo grupo de pares variable - valor indexadas con el indice de fila
-
del resultado.
-
*/
-
$this-> result_num_filas ();
-
$this-> result_num_columnas ();
-
$this-> par_valor_indx = "n_datos=" .$this-> n_filas ."&";
-
$fil = $this-> result_array_asoc ($this-> resultado );
-
for ($i = 0 ; $i <$this-> n_filas ; $i ++)
-
{
-
foreach ($fil [$i] as $indice => $valor )
-
{
-
$this-> par_valor_indx .= $indice ."_" .$i ."=" .$valor ."&";
-
}
-
}
-
}
-
-
-
//////////////////////////////////////
-
// //
-
// método por Marcos Gonzalez //
-
// http://www.q-interactiva.com //
-
// //
-
//////////////////////////////////////
-
function result_XML()
-
{
-
/*
-
RECIBE: no recibe ningun parámetro ya que todos los que necesita los puede obtener
-
de la propia clase.
-
DEVUELVE: Devuelve en la propiedad resXML la respuesta a la consulta en formato
-
XML.
-
DESCRIPCION: Obtiene en el numero de filas el numero de resultados obtenidos en la
-
consulta, y a su vez obtiene en el numero de columnas el numero de campos de los
-
resultados obtenidos. Posteriormente por cada respuesta (fila) crea un nodo con sus
-
nodos anidados.
-
*/
-
$this->result_num_filas();
-
$this->result_num_columnas();
-
-
$this->resXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<datos>\n";
-
-
$fil = $this->result_array_asoc ( $this->resultado );
-
-
for ( $i=0 ; $i<$this->n_filas ; $i++ )
-
{
-
$this->resXML .= "\t<dato>\n";
-
foreach ( $fil[$i] as $indice=>$valor )
-
{
-
$this->resXML .= "\t\t<".$indice.">".$valor."</".$indice.">\n";
-
-
}
-
$this->resXML .= "\t</dato>\n";
-
}
-
-
$this->resXML.="</datos>";
-
}
-
-
-
-
function cerrar_conexion ()
-
{
-
// cierra la conexion existente
-
}
-
function info ()
-
{
-
// devuelve informacion de los campos de la tabla en la cosulta dada de forma grafica,
-
// la versión del server mysql y otros datos que pueden interesar acerca del estado del serviddor mysql
-
$this-> i = 0;
-
$this-> n_columnas = $this-> result_num_columnas ();
-
echo "<table cellpadding=3 border=1><tr>";
-
while ($this-> i <$this-> n_columnas )
-
{
-
echo"<td style='font-type:Arial;font-size:14px;'>" .
-
"<b style='color:green;'>longitud max</b> " .mysql_field_len ($this-> resultado , $this-> i )."<br />" .
-
"</td>";
-
$this-> i ++;
-
}
-
echo "<b style='color:green;'>La informaciel server es la siguiente:</b><br />" .
-
echo "<br /><pre>";
-
echo "</pre>";
-
echo "</tr></table>";
-
}
-
} // fin de la clase
-
-
?>
Contador de visitas PHP para Movable Type
He hecho un sencillo sistema en PHP y Flash para poder llevar cuenta de las visitas por cada post en el blog.
Aquí dejo el código y una explicación de como instalarlo.
Los requisitos necesarios para poder hacerlo funcionar son que el servidor soporte PHP y que Movable Type esté montado en una base de datos Mysql.
1. Creación de la nueva tabla
Lo primero que tenemos que hacer es crear una nueva tabla en la base de datos del blog que nos permita llevar cuenta de las visitas por cada post. Para ello he adjuntado en el archivo a descargar un script .sql que nos creará la nueva tabla llamada mt_entry_visitor_count.
2. Entrada de las variables del archivo PHP
Editamos el archivo contador_visitas.php y cambiamos las variables necesarias:
-
// edita estas variables
-
$server = "localhost";
-
$usuario = "mi_usuario_base_datos";
-
$password = "mi_password_base_datos";
-
$base_datos = "base_datos_movable_type";
-
// fin edita estas variables
3. Subir los archivos
Una vez tenemos la tabla creada en la bbdd y el archivo php editado, subimos los dos archivos a la carpeta correspondiente
En mi caso tengo una carpeta llamada mt-static en a cual he creado una subcarpeta llamada backend. Ahí he subido los archivos contador.swf y contador_visitas.php
Si no lo tienes montado así, súbelos donde te parezca más indicado, pero que sea fuera del directorio cgi-bin.
4. Modificar los templates de Movable Type
Ahora que ya está todo listo toca modificar los templates para empezar el recuento y que se muestre el contador en cada post.
Vamos al panel de Movable Type en la parte de templates y editamos:
* En la parte Index Templates: - Main Index * En la parte Archive-Related Templates: - Category Archive - Date-Based Archive - Individual Entry Archive
y agregamos en cada uno de ellos el código que incrusta el .swf del contador entre los tags <MTEntries> </MTEntries> cambiando el valor de los tags param name="movie" y embed src= por las urls correspondientes.
Por ejemplo yo lo tengo así:
En la parte donde aparece "Posteado por....." justo al final, que será después del tag </MTEntryIfAllowPings>
<p class="posted"> ... blah blah .... blah blah .....<a href="<$MTEntryPermalink archive_type="Individual"$>#trackbacks">TrackBack</a> </MTEntryIfAllowPings><br> // empieza código para el contador de visitas <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="175" height="15" id="contador" align="middle"> <param name="allowScriptAccess" value="sameDomain" /> <param name="movie" value="http://www.joangarnet.com/mt-static/backend/contador.swf?entry_id=<$MTEntryID$>&url_base=http://www.joangarnet.com/mt-static/" /> <param name="quality" value="high" /> <param name="bgcolor" value="#f5f5f5" /> <embed src="http://www.joangarnet.com/mt-static/backend/contador.swf?entry_id=<$MTEntryID$>&url_base=http://www.joangarnet.com/mt-static/" quality="high" bgcolor="#f5f5f5" width="175" height="15" name="contador" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object> // fin código para el contador de visitas </p> </MTEntries>
La parte que se tiene que modificar sería exactamente:
<param name="movie" value="http://www.mi_dominio.com/tu_ruta_hasta_backend/backend/contador.swf?entry_id=<$MTEntryID$>&url_base=http://www.joangarnet.com/tu_ruta_hasta_backend/" /> <embed src="http://www.mi_dominio.com/tu_ruta_hasta_backend/backend/contador.swf?entry_id=<$MTEntryID$>&url_base=http://www.joangarnet.com/tu_ruta_hasta_backend/"











