Ejercicio con PHP, strings y bucles

En esta entrada vamos a hacer un ejercicio con PHP en el que ordenaremos dos arrays y mostraremos su contenido concatenado en una sola frase, manteniendo la relación entre los ellos (sus índices) y eliminando resultados repetidos en la frase final. Este tipo fragmentos de código es útil para generadores de documentos que necesitan manipular strings.

En primer lugar se muestra la lista de variables que queremos ordenar, de dos en dos. Luego, esta misma lista ordenada, y más abajo vamos precisando a la hora de mostrar la frase, hasta que se enumeran todos los elementos ordenados y sin deshacer las «parejas» («primero» es pareja de «primera frase», por ejemplo)

A continuación se muestra el resultado de ejecutar el código php en esta misma entrada.


Código del ejemplo

<?php

echo «<!DOCTYPE html><html>
<header><title>Ejercicio de PHP || Blog de desarrollo web || Likonet.es</title></header>
<body>»;

// Tenemos dos arrays
// la tercera frase en quinto lugar es intencionada

$array[]=»cuarto»;
$array[]=»tercero»;
$array[]=»primero»;
$array[]=»segundo»;
$array[]=»segundo»;
$array[]=»tercero»;
$array[]=»segundo»;
$array[]=»cuarto»;
$array[]=»tercero»;

$arraydos[]=»cuarta frase»;
$arraydos[]=»tercera frase»;
$arraydos[]=»primera frase»;
$arraydos[]=»segunda frase»;
$arraydos[]=»segunda frase»;
$arraydos[]=»tercera frase»;
$arraydos[]=»segunda frase»;
$arraydos[]=»cuarta frase»;
$arraydos[]=»tercera frase»;

// Y mostramos su contenido con un for

for ($n=0;$n<count($array);$n++) {

    echo $array[$n].» – «.$arraydos[$n].»<br/>»;

}

echo «<hr>»;

// ordenamos el primer array con la función asort()
// esta función ordenará nuestro array por orden alfabético por defecto

asort($array);

// Mostramos el array con un foreach
// Como la función asort() mantiene los índices,
// podemos usar la variable $key definida en el foreach
// para hacer referencia al segundo array

foreach ($array as $key => $val) {

    echo $arraydos[$key].» – «.$val.»<br/>»;

}

echo «<hr>»;

// vemos cómo se han agrupado, lógicamente, los valores «tercera frase»

// Vamos a mostrarlo denuevo, pero con una frase construida con comas y «y»

// para ello construiremos dos cadenas a recorre con un for

foreach ($array as $key => $val) {

//    echo $arraydos[$key].» – «.$val.»<br/>»;

    $nuevoarraydos[]=$arraydos[$key];

    $nuevoarray[]=$val;

}

// y luego lo recorremos concatenando el resultado en una string

$nuevastring=»»;

for ($j=0;$j<count($nuevoarray);$j++) {

//    echo $nuevoarray[$j].» con «.$nuevoarraydos[$jota];    

    $nuevastring=$nuevastring.$nuevoarray[$j].» con «.$nuevoarraydos[$jota];

}

echo $nuevastring;

echo «<hr>»;

// Vamos a mejorar la construcción de esta frase

$nuevastringdos=»»;

$limite=count($nuevoarray);

for ($j=0;$j<$limite;$j++) {

    if ($j==0) {

        $nuevastringdos=$nuevastringdos.$nuevoarray[$j].» con «.$nuevoarraydos[$j];

    } elseif ($j==($limite-1)) {

    $nuevastringdos=$nuevastringdos.» y «.$nuevoarray[$j].» con «.$nuevoarraydos[$j];

    } else {

    $nuevastringdos=$nuevastringdos.», «.$nuevoarray[$j].» con «.$nuevoarraydos[$j];

    }

}

echo $nuevastringdos;

echo «<hr>»;

// aún se puede mejorar:
// cuando se repita un elemento del primer array,
// se evitará que se muestre para que no suene «redundante»

$nuevastringtres=»»;

$limite=count($nuevoarray);

for ($j=0;$j<$limite;$j++) {

    if ($j==0) {

        $nuevastringtres=$nuevastringtres.$nuevoarray[$j].» con «.$nuevoarraydos[$j];

    } elseif ($j==($limite-1)) {

        if ($nuevoarray[$j]==$nuevoarray[($j-1)]) {

            $puedeocultarse=»»;

        } else {

            $puedeocultarse=$nuevoarray[$j];

}

        $nuevastringtres=$nuevastringtres.» y «.$puedeocultarse.» con «.$nuevoarraydos[$j];

    } else {

        if ($nuevoarray[$j]==$nuevoarray[($j-1)]) {

            if ($nuevoarray[$j]==$nuevoarray[($j+1)]) { $puedeocultarse=»,»; } else {$puedeocultarse=» y»; }

            $coma=»»;

        } else {       

            $puedeocultarse=$nuevoarray[$j];

            $coma=», «;

        }

        $nuevastringtres=$nuevastringtres.$coma.$puedeocultarse.» con «.$nuevoarraydos[$j];

    }

}

echo $nuevastringtres;

echo «<hr>»;

echo «</body></html>»;

?>

Curso de Android Studio

En esta entrada nos vamos a centrar en los fundamentos básicos de Android Studio, aprenderemos a manejar el entorno y a crear nuestro primer proyecto (videojuego) para plataformas móviles.

1 – Crear un proyecto

En el paso de nombrar el proyecto, se necesita crear un package name único para que Play Store pueda crear una URL única. Por lo que rellenaremos el campo Company Domain siguiendo la estructura:

jorge.example.com.likonet.aplicaciondeejemplo

2 – Elegir SDK

Leer más

Javascript, arrays

Este sencillo ejercicio con HTML y Javascript puede servir de introducción para hablar de los arrays en Javascript.

Al cargar una web que contenga este código, se ejecutará mostrando los elementos de un array de diversas formas, como viene comentado en el código.

<!DOCTYPE html>
<html>
<body>

<i><p id=»listatostring»></p></i>
<i><p id=»unelemento»></p></i>
<i><p id=»0″></p>
<p id=»1″></p>
<p id=»2″></p>
<p id=»3″></p></i>
<i><p id=»todo»></p></i>

<script>

// crear un array
var fruits = [«Banana», «Orange», «Apple», «Mango»];

//limpia elementos vacíos
fruits = fruits.filter(Boolean);

// mostrar el array
// El método <i>toString()</i> devuelve un array como una string con los elementos del array separados por comas
document.getElementById(«listatostring»).innerHTML = fruits.toString();

// Sintaxis para enseñar un elemento de un array: <i>element[index]
document.getElementById(«unelemento»).innerHTML = fruits[3];

//recorrer el array
for (var i=0; i<fruits.length; i++) {

// Mostrar el array separado en distintos elementos HMTL
// permite filtrado e elementos con condicionales
if (fruits[i]!=»Apple») {
document.getElementById(i).innerHTML = fruits[i];

// mostrarlo de otra forma, quizá más elegante
// Mostrar el array dentro de un elemento HTML sin usar toString(),
// añadiendo un espacio entre elementos
document.getElementById(«todo»).innerHTML += » «+fruits[i];

}

}

</script>

</body>
</html>

Resumen P.O.O. (Programación Orientada a Objetos)

La programación orientada a objetos (POO/OOP) es el paradigma de programación por excelencia en el mundo del desarrollo del software. Hoy día no se concibe el desarrollo de software sin él, y es necesario que tanto expertos como neófitos en programación utilicen de forma adecuada y ESTRICTA la terminología asociada, para poder formular ideas y planteamientos en común sin mal entendidos.

No hace falta saber programar para entender y hablar de objetos.

Leer más

Insertar masivamente entradas en WordPress

Para crear muchas páginas de WordPress a la vez, he creado este fragmento de código que es válido par ala versión 4.5

Insertar entradas masivamente:

Es necesario editar los valores en negrita de forma correcta: las ID tienen que coincidir en la misma entrada, pero ha de ser única para cada una no repetirse en las otras. La «url-contenido» debe ser una frase en minúsculas con las palabras separadas por espacios. Hay que especificar la propia url en el campo «http://…», indicando el nombre del directorio de WordPress si fuera necesario, además de no olvidar que la ID va al final. Podemos editar a nuestro antojo las fechas de edición y publicación, así como la ID del autor (que vale 1 en nuestro ejemplo)

INSERT INTO `wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`)

VALUES

(ID, 1, '2016-01-01 00:00:00', '2016-01-01 00:00:00', 'CONTENIDO', 'Título de la página', 'publish', 'open', 'open', '', 'titulo-de-la-pagina', '', '', '2016-01-01 00:00:00', '', 0, 'http://eldominioque.sea/directorio/?p=ID', 0, 'post', '', 0),

(ID, 1, '2016-01-01 00:00:00', '2016-01-01 00:00:00', 'CONTENIDO', 'Título de la página', 'publish', 'open', 'open', '', 'titulo-de-la-pagina', '', '', '2016-01-01 00:00:00', '', 0, 'http://eldominioque.sea/directorio/?p=ID', 0, 'post', '', 0),

(ID, 1, '2016-01-01 00:00:00', '2016-01-01 00:00:00', 'CONTENIDO', 'Título de la página', 'publish', 'open', 'open', '', 'titulo-de-la-pagina', '', '', '2016-01-01 00:00:00', '', 0, 'http://eldominioque.sea/directorio/?p=ID', 0, 'post', '', 0);

Limpiar la tabla de revisiones

Útil para mantener la base de datos limpia. En la inserción de contenidos, ya que llega un momento que no necesitamos las revisiones de la entradas y podemos borrarlas rápidamente, ahorrando espacio.

DELETE FROM `basededatos`.`wp_posts` WHERE `post_type` = 'revision';

 

Personaliza los correos de Prestashop

¿Qué son las plantillas de email de Prestashop?

Prestashop permite enviar correos electrónicos automáticos cuando cambiamos el estado de un pedido. En Pedidos > Estados, si en un estado marcamos la opción «Enviar un mail al cliente», aparecerá un desplegable con las plantillas de email disponibles.

Edita el asunto del correo:

En la carpeta /mails/es/ se encuentra el archivo lang.php. Para editar fácilmente la traducción de los asuntos en Español, podemos cambiar la lista de frases que aparecen en este archivo por las que deseemos. Por ejemplo, si hay una línea que diga:

$_LANGMAIL[‘You are one of our best customers’] = ‘Gracias por ser uno de nuestros mejores clientes’;

Podemos cambiarla por:

$_LANGMAIL[‘You are one of our best customers’] = ‘¡Eres el mejor! ¡Te mereces un premio!’;

Si hay algún asunto que quieras editar en castellano y no aparece en la lista, puedes añadirlo si sabes su traducción en inglés

Añade tu propio diseño a la plantilla de correos electrónicos de tu tema:

Editando los dos archivos , .html y .txt de cualquier plantilla de email. Estas plantillas se definen, sobre todo, en el archivo HTML, en cuyo interior se establecen varias propiedades CSS que podemos personalizar a nuestro antojo.

Un breve ejemplo: vemos un fragmento del código del archivo payment.html

(…)<table class=»table table-mail» style=»width:100%;margin-top:10px;»><tr><td class=»space» style=»width:20px;padding:7px 0;»> </td>
<td align=»center» style=»padding:7px 0;»>
<table class=»table» bgcolor=»#ffffff» style=»width:100%;»><tr><td align=»center» class=»logo» style=»border-bottom:4px solid #333333;padding:7px 0;»>(…)

Podemos cambiar la parte que está en negrita para cambiar el color de fondo de la tabla.

Android y MySQL con Eclipse

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=656

«File» – «New» – «Project»:
Desplegaremos «Android» y seleccionaremos «Android Application Project»:

Introduciremos los datos para el nuevo proyecto Eclipse para dispositivos Android:
  • Application Name: nombre de la aplicación, no recomendamos nombres muy largos pues de lo contrario no cabrán en los títulos y demás donde aparezcan. En nuestro ejemplo la llamaremos «AccesoMySQL».
  • Project Name: nombre del nuevo proyecto Eclipse Android, por ejemplo «AjpdSoftMySQL».
  • Package Name: nombre del paquete, por ejemplo «com.example.ajpdsoftmysql».
  • Buil SDK: API level con el que se compilará la aplicación, por ejemplo «Android 4.1 (API 16).
  • Minimun Required SDK: este campo es importante, deberemos indicar el API level mínimo requerido, a mayor API Level menor número de dispositivos Android soportarán nuestra aplicación. Por lo tanto deberemos indicar el API level más pequeño posible, según los procedimientos que usemos y los imports requeriremos uno u otro. En nuestro caso el API Level mínimo será 5 (API 5: Android 2.0 (Eclair).
  • Create custom launcher icon: si queremos que el asistente nos permita crear un icono para nuestra aplicación marcaremos este check.
  • Create Project in Workspace: maraceremos esta opción para crear el nuevo proyecto Android en el espacio de trabajo del usuario por defecto.
Tras introducir los datos para el nuevo proyecto Eclipse para dispositivos Android pulsaremos «Next»:
Si hemos seleccionado la opción de crear un icono para la aplicación, el asistente nos mostrará la ventana para crear el icono personalizado, podremos cambiar el icono, cambiar color de fondo y otras opciones
Marcaremos «Create Activity» para crear una activity (ventana) principal de la aplicación, seleccionaremos el tipo de activity que crearemos, en nuestro caso «BlankActivity»:
Introduciremos los datos para la nueva activity:
  • Activity Name: nombre del activity (ventana), por ejemplo «AjdSoftMySQL».
  • Layout Name: nombre del fichero xml que contendrá los componentes visuales de la activity, por ejemplo «activity_ajpd_soft_my_sql».
  • Navitagion Type: podremos elegir aquí el tipo de navegación para la nueva actividad, las opciones: Tabs, Tabs + Swipe, Swipe Views + Title Strip y Dropdown. Estos tipos de navegación requerirán API Level iguales o superiores a la 14.
  • Title: título para la activity, por ejemplo «Acceso MySQL».
Para más información sobre los activity de Android podéis vistar este tutorial:
Tras introducir los datos para el activity pulsaremos «Finish» para crear el proyecto:
El asistente para añadir un nuevo proyecto Eclipse para dispositivos Android creará todos los ficheros necesarios para el proyecto, a continuación indicamos algunos de los más importantes:
  • /src/AjpdSoftMySQL.java: código java de la activity principal del proyecto. En este fichero colocaremos todo el código java de nuestra aplicación Android, al menos todo el que tenga que ver con su activity correspondiente.
  • /bin/AndroidManifest.xml: fichero de configuración principal de la aplicación donde se indicarán, por ejemplo, todas las activity de la aplicación.
  • /res/drawable-hdpi, /res/drawable-ldpi, /res/drawable-mdpi, /res/drawable-xhdpi: carpetas del proyecto donde se guardarán los ficheros de imágenes (iconos y demás) para las diferentes resoluciones.
  • /res/layout/activity_ajpd_soft_my_sql.xml: carpeta y fichero para el layout, donde se indicarán los componentes gráficos del activity relacionado, en este fichero indicaremos todo lo que el usuario verá en la aplicación Android de su móvil.
  • /res/menu/activity_ajpd_soft_my_sql.xml: carpeta y fichero con los datos necesarios para mostrar el menú de nuestra aplicación, lo usaremos para mostrar el segundo activity que crearemos posteriormente para indicar los datos de conexión con el servidor MySQL.
  • /res/values/strings.xml: en este fichero indicaremos todas las cadenas de texto que se mostrarán al usuario en los menús, botones, etiquetas, mensajes, etc.
El asistente nos dejará la pestaña del layout abierta, para edición en modo gráfico, añadiremos al layout del activity principal de la aplicación los siguientes componentes:
  • De la paleta «Form Widgets» añadiremos un «Spinner», en este desplegable mostraremos los catálogos (bases de datos) del servidor de MySQL al que nos conectemos.
  • De la paleta «Form Widgets» añadiremos un Button, este botón será el que pulse el usuario para obtener los catálogos del servidor MySQL.
  • De la paleta «Text Fields» añadiremos un «EditText» multilínea (Multiline Text), en este campo el usuario podrá introducir la consulta SQL a ejecutar contra el servidor MySQL.
  • De la paleta «Form Widgets» añadiremos un «CheckBox», en este check el usuario marcará si es una consulta de selección (SELECT, DESC, SHOW) o es una consulta de modificación de datos (INSERT, UPDATE, DROP,CREATE, ALTER).
  • De la paleta «Form Widgets» añadiremos un Button, este botón será el que pulse el usuario para ejecutar la consulta SQL.
  • De la paleta «Text Fields» añadiremos un «EditText» multilínea (Multiline Text), en este campo la aplicación devolverá el resultado de la ejecución de laconsulta SQL.
  • De la paleta «Text Fields» añadiremos un «TextView» en el que mostraremos un texto de aviso al usuario para que, si la consulta SQL es grande, use la cláusula LIMIT para limitar los registros a mostrar y que la aplicación no se ralentice en exceso.
Todos estos datos visuales se guardarán en el fichero /res/layout/activity_ajpd_soft_my_sql.xml, en nuestro caso tendrá este contenido:

xmlns:tools=»http://schemas.android.com/tools»
android:layout_width=»fill_parent»
android:layout_height=»fill_parent» >

android:id=»@+id/lsCatalogos»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_toLeftOf=»@+id/btCatalogos» />


android:id=»@+id/txtSQL»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/lsCatalogos»
android:ems=»10″
android:hint=»@string/text_SQL_Ejecutar»
android:inputType=»textMultiLine» >


android:id=»@+id/txtResultadoSQL»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/btEjecutar»
android:ems=»10″
android:inputType=»textMultiLine|none» />

android:id=»@+id/btCatalogos»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignBottom=»@+id/lsCatalogos»
android:layout_alignParentRight=»true»
android:layout_alignParentTop=»true»
android:text=»@string/text_catalogos» />

android:id=»@+id/btEjecutar»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/txtSQL»
android:text=»@string/text_ejecutar» />

android:id=»@+id/opConsultaModificacion»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignBaseline=»@+id/btEjecutar»
android:layout_alignBottom=»@+id/btEjecutar»
android:layout_alignParentLeft=»true»
android:text=»@string/text_consulta_seleccion» />

android:id=»@+id/textView1″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_below=»@+id/txtResultadoSQL»
android:text=»@string/text_aviso_SQL» />

El contenido del fichero donde se guardarán todas las cadenas de texto que usaremos en la aplicación «res/values/strings.xml«:


Acceso MySQL
Configuración
Acceso MySQL
Consulta SQL a ejecutar
Ejecutar
Resultado SQL
Acerca de …
Configuración
IP/Nombre red servidor
Puerto
Usuario
Contraseña
Base de datos
Acerca de
Guardar configuración
Catálogo/BD
Probar conexión
Catálogos
SQL de modificación
Utiliza LIMIT en las consultas SQL de selección,
si devuelven muchos registros podrían provocar que la
aplicación se ralentice en exceso o incluso deje de funcionar.
Por ejemplo: nselect * from factura limit 0,10 n(mostrará los 10
primeros registros)»
Introduzca consulta SQL

El contenido del fichero que mostrará el menú en el activity «/res/layout/menu/activity_ajpd_soft_my_sql.xml«:


android:title=»@string/text_menu_configuracion»
android:orderInCategory=»100″
android:showAsAction=»never»
/>

android:title=»@string/text_acercade»> 

Podremos compilar la aplicación para probarla y ver cómo quedan los componentes visuales, de momento ningún botón funcionará pues aún no lo hemos programado, pero nos servirá para comprobar que todo es correcto. Para ello pulsaremos en «Run» – «Run»:
Seleccionaremos «Android Application» y pulsaremos «OK»:
Si todo es correcto se iniciará el emulador de dispositivos Android y se ejecutará la aplicación:

Añadir segundo activity para introducción de los datos de conexión con servidor MySQL

Nuestra aplicación de ejemplo contará con dos activity, por un lado el anteriormente creado que será el principal, donde el usuario introducirá la consulta SQL a ejecutar y donde se mostrará el resultado. Por otro lado, nuestra aplicación requerirá de un segundo activity donde solicitaremos al usuario los datos de acceso al servidor MySQL al que nos conectaremos (IP, puerto, base de datos, usuario, contraseña).
Para añadir un segundo activity a nuestra aplicación para dispositivos Android desde Eclipse, pulsaremos con el botón derecho del ratón sobre el proyecto y seleccionaremos «New» – «Other»:
Desplegaremos «Android» y seleccionaremos «Android Activity»:
Seleccionaremos «BlankActivity» y pulsaremos «Next»:
Introduciremos los datos para el nuevo Activity:
  • Activity Name: nombre del activity (ventana), por ejemplo «Activity_Configuracion».
  • Layout Name: nombre del fichero xml que contendrá los componentes visuales de la activity, por ejemplo «activity_activity_configuracion».
  • Navitagion Type: podremos elegir aquí el tipo de navegación para la nueva actividad, las opciones: Tabs, Tabs + Swipe, Swipe Views + Title Strip y Dropdown. Estos tipos de navegación requerirán API Level iguales o superiores a la 14. Seleccionaremos «None».
  • Title: título para la activity, por ejemplo «Configuración».
Pulsaremos «Finish»:
El asistente nos dejará la pestaña del layout abierta, para edición en modo gráfico, añadiremos al layout del activity secundario (el que mostrará los datos de conexión al servidor MySQL) los siguientes componentes:
  • De la paleta «Text Fields» añadiremos un «TextView» en el que mostraremos un texto «IP/Nombre red servidor».
  • De la paleta «Text Fields» añadiremos un «EditText», en este campo el usuario introducirá la IP/DNS del servidor de MySQL al que quiera conectarse.
  • De la paleta «Text Fields» añadiremos un «TextView» en el que mostraremos un texto «Puerto».
  • De la paleta «Text Fields» añadiremos un «EditText», en este campo el usuario introducirá el puerto del servidor de MySQL al que quiera conectarse.
  • De la paleta «Text Fields» añadiremos un «TextView» en el que mostraremos un texto «Usuario».
  • De la paleta «Text Fields» añadiremos un «EditText», en este campo el usuario introducirá el usuario del servidor de MySQL al que quiera conectarse.
  • De la paleta «Text Fields» añadiremos un «TextView» en el que mostraremos un texto «Contraseña».
  • De la paleta «Text Fields» añadiremos un «EditText», en este campo el usuario introducirá la contraseña del servidor de MySQL al que quiera conectarse.
  • De la paleta «Form Widgets» añadiremos un Button, este botón será el que pulse el usuario para ejecutar la consulta SQL.
Todos estos datos visuales se guardarán en el fichero /res/layout/activity_activity_configuracion.xml, en nuestro caso tendrá este contenido:

xmlns:tools=»http://schemas.android.com/tools»
android:layout_width=»fill_parent»
android:layout_height=»fill_parent» >

android:id=»@+id/textView1″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentTop=»true»
android:text=»@string/text_IP» />

android:id=»@+id/txtIP»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/textView1″
android:ems=»10″
android:inputType=»text» >



android:id=»@+id/textView2″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_below=»@+id/txtIP»
android:text=»@string/text_Puerto» />

android:id=»@+id/txtPuerto»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/textView2″
android:inputType=»number»
android:ems=»10″ />

android:id=»@+id/textView4″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_below=»@+id/txtPuerto»
android:text=»@string/text_Usuario» />

android:id=»@+id/txtUsuario»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/textView4″
android:inputType=»text»
android:ems=»10″ />

android:id=»@+id/textView3″
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_below=»@+id/txtUsuario»
android:text=»@string/text_Contraseña» />

android:id=»@+id/txtContrasena»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_alignParentLeft=»true»
android:layout_alignParentRight=»true»
android:layout_below=»@+id/textView3″
android:inputType=»textPassword»
android:ems=»10″ />

android:id=»@+id/btProbarConexion»
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:layout_below=»@+id/txtContrasena»
android:layout_centerHorizontal=»true»
android:layout_marginTop=»16dp»
android:text=»@string/text_probar_conexion» />

Este activity también incorporará un menú, el fichero xml del menú «/res/layout/menu/activity_activity_config.xml«:



android:title=»@string/text_menu_guardar_configuracion»
android:orderInCategory=»100″/>
android:title=»@string/text_acercade»>

Descargar y añadir JDBC a proyecto Eclipse para acceso a MySQL desde Android

En primer lugar necesitaremos el JDBC para el motor de base de datos al que queramos acceder desde Android, en nuestro caso, como ejemplo, accederemos a un servidor de MySQL Server instalado en un equipo Linux. Para descargar el JDBC accederemos a la web oficial del motor de base de datos y descargaremos el fichero correspondiente al JDBC, para MySQLaccederemos a la URL:

http://dev.mysql.com/downloads/connector/j

A la fecha de este tutorial descargamos la versión Connector/J 5.1.24, podremos descargar el .tar o el .zip, ambos son válidos para cualquier sistema operativo. Una vez descargado el fichero mysql-connector-java-5.1.24.zip lo descomprimiremos pulsando con el botón derecho del ratón sobre él y seleccionado «Extraer aquí»:

Dentro de este fichero comprimido habrá varios (.jar, documentación, código fuente), el importante es el mysql-connector-java-5.1.24-bin.jar, copiaremos este fichero (pulsando sobre él con el botón derecho):

Desde Eclipse, exploraremos nuestro proyecto Android, pulsaremos con el botón derecho sobre la carpeta «libs» y pulsaremos en «Paste» (para pegar el fichero .jar del conector de MySQL):

Ejemplo acceso a BD MySQL desde Android con JDBC y Eclipse

Una vez agregado el conector .jar a nuestro proyecto (como hemos indicado aquí) ya podremos usar todas las funciones y prodedimientos para conectar con el motor de base de datosMySQL desde nuestra aplicación Android con Eclipse. Para ello será tan sencillo como agregar en los imports de nuestro fichero .java lo siguiente:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.sql.Statement;

Añadiremos la siguiente variable de tipo «Connection», que usaremos para conectarnos sólo una vez durante el proceso de ejecución de una consulta SQL en MySQL:

Connection conexionMySQL;

Añadiremos un procedimiento para conectarnos al servidor MySQL, así podremos usarlo cada vez que lo necesitemos. Dicho procedimiento necesitará usuario, contraseña, IP o DNS, puerto y catálogo del servidor de MySQL al que nos conectaremos, si hay algún error lo capturará y lo mostrará en una notificación Android:
    public void conectarBDMySQL (String usuario, String contrasena, 
      String ip, String puerto, String catalogo)
    {
     if (conexionMySQL == null)     
     {
      String urlConexionMySQL = "";
      if (catalogo != "")
       urlConexionMySQL = "jdbc:mysql://" + ip + ":" + puerto + "/" + catalogo;
      else
       urlConexionMySQL = "jdbc:mysql://" + ip + ":" + puerto;
      if (usuario != "" & contrasena != "" & ip != "" & puerto != "")
      {
       try 
       {
     Class.forName("com.mysql.jdbc.Driver");
        conexionMySQL = DriverManager.getConnection(urlConexionMySQL, 
          usuario, contrasena);     
    } 
       catch (ClassNotFoundException e) 
       {
               Toast.makeText(getApplicationContext(),
                          "Error: " + e.getMessage(),
                          Toast.LENGTH_SHORT).show();
       } 
       catch (SQLException e) 
       {
            Toast.makeText(getApplicationContext(),
                       "Error: " + e.getMessage(),
                       Toast.LENGTH_SHORT).show();
    }
      }
     } 

    }

y sigue…. 

Ejemplo de creación triggers MySQL con phpMyAdmin

logo mysql

Antes de ponernos manos a la obra, leamos la definición de Wikipedia de trigger:

Los Triggers o Disparadores son objetos que se asocian con tablas y se almacenan en la base de datos. Su nombre se deriva por el comportamiento que presentan en su funcionamiento, ya que se ejecutan cuando sucede algún evento sobre las tablas a las que se encuentra asociado. Los eventos que hacen que se ejecute un trigger son las operaciones de inserción (INSERT), borrado (DELETE) o actualización (UPDATE), ya que modifican los datos de una tabla.

Wikipedia

En esta entrada mostramos dos maneras de crear un trigger en una tabla de una base de datos MySQL.

1- Usando el formulario que phpMyAdmin nos facilita. Ponerle un nombre, elegir la tabla, decidir si se hará antes o después del evento, seleccionar uno de los tres eventos (AFTER, DELETE, UPDATE). He dejado el campo del definidor vacío, y se ha autorellenado con el usuario de la base de datos (gracias phpMyAdmin, no lo recordaba de memoria).

2- Escribiendo el código directamente en el phpMyAdmin. Es decir, escribiendo algo similar a lo siguiente:

CREATE TRIGGER nombre_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nombre_tabla
FOR EACH ROW
BEGIN
  -- Cuerpo del trigger
END;
  • BEFORE o AFTER: Indica si el trigger debe ejecutarse antes o después del evento especificado.
  • INSERT, UPDATE, o DELETE: Especifica el tipo de evento que activará el trigger.
  • nombre_tabla: Indica la tabla asociada al trigger.
  • FOR EACH ROW: Especifica que el trigger se ejecutará una vez por cada fila afectada por el evento.

Tipos de Triggers:

  1. BEFORE Triggers:
    • Se ejecutan antes de que se realice la acción asociada al trigger (por ejemplo, antes de la inserción, actualización o eliminación).
  2. AFTER Triggers:
    • Se ejecutan después de que se haya realizado la acción asociada al trigger.

Acceso a las Columnas de la Fila:

Dentro del cuerpo del trigger, puedes acceder a las columnas de la fila afectada usando la sintaxis NEW y OLD:

  • NEW.columna: Accede al valor de la columna después del evento (solo en triggers AFTER).
  • OLD.columna: Accede al valor de la columna antes del evento (solo en triggers BEFORE).

Ejemplo de Trigger

Este trigger ajusta automáticamente el valor de columna1 a ‘Valor predeterminado’ si se intenta insertar un registro con un valor nulo en esa columna.

DELIMITER //
CREATE TRIGGER before_insert_example
BEFORE INSERT
ON ejemplo_tabla
FOR EACH ROW
BEGIN
  IF NEW.columna1 IS NULL THEN
    SET NEW.columna1 = 'Valor predeterminado';
  END IF;
END;
//
DELIMITER ;

Eliminación de Triggers

Para eliminar un trigger, se utiliza la siguiente sintaxis:

DROP TRIGGER [IF EXISTS] nombre_trigger;

Consideraciones Importantes

  1. Cascada de Triggers:
    • Los triggers pueden activar otros triggers, lo que lleva a una cascada de acciones.
  2. Evitar Ciclos Infinitos:
    • Es importante evitar la creación de triggers que puedan entrar en un ciclo infinito.
  3. Desempeño:
    • El uso excesivo de triggers puede afectar el rendimiento, así que se deben utilizar con cuidado.
  4. Permisos:
    • Se necesitan los permisos adecuados para crear y ejecutar triggers.

SEO Prestashop – metaetiquetas de idiomas – hreflang

Esta modificación genera unas metaetiquetas en la sección head de cada página de nuestra tienda online Prestashop.
Testado en la versión 1.4.

Hemos encontrado que se indexan páginas de otros idiomas en los buscadores, para evitar esto hacemos uso de las etiquetas hreflang, que ayudan a los buscadores a organizar nuestra información traducida y dirigida a determinadso idiomas/regiones. En nuestro ejemplo usamos una versión simplificada de estas etiquetas, ya que sólo nos interesa gerenar metaetiquetas para los visitantes según su idioma.

Así, para una página en 3 idiomas, tenemos tres URL para la misma página:

  • www.mipaginaweb.com/es/el-contenido
  • www.mipaginaweb.com/en/the-content
  • www.mipaginaweb.com/fr/le-content

Por lo que las etiquetas se podrían mostrar de la siguiente manera:

  • <link href=»http://www.mipaginaweb.com/en/» hreflang=»en» rel=»alternate»>
  • <link href=»http://www.mipaginaweb.com/fr/» hreflang=»fr» rel=»alternate»>
  • <link href=»http://www.mipaginaweb.com/es/» hreflang=»es» rel=»alternate»>

Mediante MySQL, hacemos una consulta a la base de datos para mostrar las URL alternativas de cada página de nuestro sitio. Incluimos esta consulta en la cabecera de nuestro sitio, dentro de la sección head. Concretamente, en Prestashop debemos modificar el archivo header.tpl.

Añadir código PHP con MySQL a nuestro header.tpl es la forma más sencilla de implementar este cambio. Para una modificación más avanzada se recomienda hacer uso del override (de cara a futuras actualizaciones), o incluso crear una función en las clases de Prestashop (/classes/Meta.php) para que al mostrar las metaetiquetas de las descripciones o las palabras clave se mustren también los hreflang.

Instalación breve de multitienda Prestashop 1.6

Breve explicación para la instalación de una multitienda Prestashop. Esta guía es ampliable para casos concretos que requiera una configuración más completa. No trataremos lo relativo a compartir o no clientes, productos y otros datos, daremos por hecho que no está instalado ningún certificado SSL.

Descarga de guía para subdominios – multitienda –  Prestashop


  • Instalar Prestashop normalmente.
  • Crear subdirectorio donde queremos la tienda nueva en la carpeta raíz, en nuestro ejemplo lo llamaremos «subdirectorio».
  • Ir a B.O. > Preferencias > Configuración y habilitar la opción Multitienda (no cambiamos las opciones, no trataremos el tema con demasiada profundidad).
  • En Parámetros Avanzados > ya nos aparece la opción Multitienda.
  • Aquí podemos gestionar grupos y tiendas. Para crear una tienda nueva, creamos un grupo de tiendas (o seleccionamos el que ya está por defecto) y hacemos clic en Añadir Tienda.
  • La configuración debe quedar así:
    • Dominio: tu dominio principal
    • SSL: igual (de momento no explicaremos nada sobre el SSL),
    • URL física: directorio donde tenemos Prestashop, usualmente raíz o «/»,
    • URL virtual: nombre del directorio creado para la tienda, en nuestro ejemplo «subdirectorio»
    • URL final: debe quedar así: tudominio.loquesea/tutiendaprincipal/subdirectorio



Una buena guía: http://www.aquihaydominios.com/blog/como-activar-y-configurar-la-multitienda-en-prestashop/

Algo más de información: http://www.creamosweb.es/blog/activar-multitienda-prestashop/ – aquí dejamos un comentario

(Visto en: Foro Oficial Prestashop)