Programador PHP freelance

Estoy en pleno desarrollo de una tienda virtual con Prestashop para un cliente del sector de la ferretería. El cliente tiene su aplicación de gestión de productos en el servidor de la empresa y la base de datos de estos debe de ser sincronizada con el e-commerce de forma automática de modo que cualquier modificación en la misma se vea actualizada en la base de datos del Prestashop.

Inicialmente había pensado en la posibilidad de hacer un script que sincronizara las dos bases de datos conectando directamente con ellas pero visto que el Prestashop dispone de un módulo de importación a partir de ficheros CSV, he decidido utilizarlo.

En esta arquitectura existen dos partes, la parte del cliente situada en el servidor local de la empresa y la parte de la tienda virtual situada en un alojamiento web, que entre otras cosas requiere dar de alta reglas en el firewall para permitir conectar al Mysql desde una IP externa, cosa que finalmente no necesitaremos.

En la parte del cliente programaré un script que exporte en el formato CSV, esperado por Prestashop, tanto las categorías como los productos -en este caso lo único que necesito exportar- y que suba ambos ficheros al servidor donde está ubicada la tienda.

En la parte de la tienda virtual se requiere un script que sea capaz de lanzar el proceso de importación y es el que describiré a continuación.

Existía la posibilidad, en esta segunda parte, de simular la navegación utilizando CURL, haciendo el login y posterior proceso de importación, pero complica mucho más las cosas cuando lo que necesitamos es simplemente llamar a la clase AdminImport y utilizar su funcionalidad.

Aquí dejo el código del script que, situado en la parte de la tienda, lanza una importación de un fichero CSV productos (pro.csv) o categorías (cat.csv), según se le indique por GET['entity']

Este script debe de ser situado en el directorio admin del Prestashop.

Espero que le pueda (re)servir a alguien.

<?php
 
define('PS_ADMIN_DIR', getcwd());
 
include(PS_ADMIN_DIR.'/../config/config.inc.php');
include(PS_ADMIN_DIR.'/functions.php');
include_once './tabs/AdminImport.php';
 
 
if (!isset($_GET['entity']))
	die();
 
$import = New AdminImport();
 
switch ($_GET['entity']) {
	case 0:
		loadCategoriesPost();
		$import->categoryImport();
		break;
 
	case 1:
		loadProductsPost();
		$import->productImport();
		break;
 
	default:
		die();
		break;
}
 
 
function loadCategoriesPost() {
	$_POST = array (
		'tab' => 'AdminImport',
		'skip' => '0', 
		'csv' => 'cat.csv',
		'convert' => '',
		'entity' => '0',
		'separator' => ';',
		'multiple_value_separator' => ',',
		'import' => 'Importar datos CSV',
		'type_value' =>
		array (
			0 => 'id',
			1 => 'active',
			2 => 'name',
			3 => 'parent',
			4 => 'description',
			5 => 'meta_title',
			6 => 'meta_keywords',
			7 => 'meta_description',
			8 => 'link_rewrite',
			9 => 'image',
		),
	);
}
 
function loadProductsPost() {
	$_POST = array (
		'tab' => 'AdminImport',
		'skip' => '0',
		'csv' => 'pro.csv',
		'convert' => '',
		'entity' => '1',
		'separator' => ';',
		'multiple_value_separator' => ',',
		'import' => 'Importar datos CSV',
		'type_value' =>
		array (
			0 => 'id',
			1 => 'active',
			2 => 'name',
			3 => 'category',
			4 => 'price_tex',
			5 => 'tax_rate',
			6 => 'wholesale_price',
			7 => 'on_sale',
			8 => 'reduction_price',
			9 => 'reduction_percent',
			10 => 'reduction_from',
			11 => 'reduction_to',
			12 => 'reference',
			13 => 'supplier_reference',
			14 => 'supplier',
			15 => 'manufacturer',
			16 => 'ean13',
			17 => 'ecotax',
			18 => 'weight',
			19 => 'quantity',
			20 => 'description_short',
			21 => 'description',
			22 => 'tags',
			23 => 'meta_title',
			24 => 'meta_keywords',
			25 => 'meta_description',
			26 => 'available_now',
			27 => 'available_later',
			28 => 'image',
			29 => 'no',
		),
	);
}
?>
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Hoy ha sido un día normal. Lo suficientemente duro como para que no haya tenido tiempo de averiguar que se movía por la red.

Al margen de esa inopia, en una mis breves incursiones por Twitter he detectado movimientos interesantes entre la comunidad. En concreto se ha promovido un manifiesto que, como bien dice @suenosdelarazon en su blog, atiende al más puro sentido común. La industria de la ‘cultura’ saca sus garras, el gobierno mueve ficha y ahora la comunidad, de forma espontánea e improvisada, se pone las pilas y decide forjar un arma a modo de manifiesto que contrarreste tanta sinrazón.

Y como no, me veo moralmente obligado a secundarlo y espero además que sirva para hacer despertar del letargo este blog, dicho sea de paso ;-)

Ahí va el manifiesto… y si lo consideráis oportuno re-publícadlo donde queráis.

Ante la inclusión en el Anteproyecto de Ley de Economía Sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

18 Feb, 2009

Revivir el 23-F. Una experiencia Twitter

Posted by: admin In: Desarrollo

Unos amigos y yo hemos decidido experimentar sobre las posibilidades de Twitter para ver hasta donde llega y hemos creado un experimento basado en el inminente 23-F.

Aquí tenéis el enlace para engancharse al evento.

Sigue el 23-F minuto a minuto en Twitter

La idea es retransmitir por Twitter el próximo 23-F como si aún estuviéramos en 1981. De hecho, como si en 1981 hubiéramos tenido Twitter. Minuto a minuto. Dando todos los detalles de lo que ocurrió justo en el mismo momento del día en que ocurrió y crear así una experiencia colectiva. Nuestra intención no es para nada abrir debate político sino que la experiencia sirva como plataforma para compartir un momento pasado colectivo a partir de vivencias individuales. Particularmente solo recuerdo que mi madre tenia miedo y que yo no entendía pq no iba al colegio. Cada cual tendrá sus recuerdos y todos pueden ser puestos en común utilizando Twitter.

Creemos que puede ser algo interesante y solo lamentamos no haber tenido más tiempo para su desarrollo (tuvimos la idea este domingo y disponemos de poco tiempo libre)

Cualquier consejo, apoyo o movimiento a favor será recompensado con gratitud, que para la gente de bien, es el mejor de los premios. [ No descartamos invitar a un café a los colaboradores ;-) ]

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

26 Dec, 2008

Un nuevo año que entra

Posted by: admin In: Desarrollo

Ya se acaba este año y ha sido muy divertido y gratificante. Otro año más he tenido la oportunidad de crecer profesional y personalmente.

Hemos tenido de todo. Proyectos complejos, proyectos graciosos, proyectos apasionantes, etc… pero la nota común siempre ha sido el sentimiento de emoción en cada uno de ellos.

Solo por esto ya ha valido la pena pasar este año… y como nada me dice que el año que viene va a ser diferente…

felicitacion 2009

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

08 Oct, 2008

Longitud máxima del title, description y keywords

Posted by: admin In: SEO

El tema ha ido evolucionando bastante y cada vez los crawlers se ponen más duros y restrictivos con sus requisitos. Por eso posteo aquí cuales son las longitudes máximas recomendables para caerles bien a nuestros amigos los buscadores y conseguir mejor posicionamiento.

La longitud máxima del title no debería ser superior a 80 carácteres.

Por otro lado, la longitud máxima del description no debería ser superior a 250 carácteres.

Y para terminar, la longitud máxima de keywords debería de ser de 25 palabras o 500 carácteres.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]
Tags: , ,

Me he visto en la tesitura de intentar cambiar en dinámico el tipo de un input de tipo text a tipo password y viceversa.

Algo tan sencillo como hacer lo siguiente:

obj = document. getElementById('campo_password');
obj.type = 'text';

Todo funciona perfectamente con Firefox pero cuando lo he probado con Internet Explorer 7 el navegador me devuelve un error con el objeto y no hay manera.

He probado a realizar el cambio desde jquery para que el framework se encargara de realizar la modificación pero tampoco ha funcionado. Internet Explorer devuelve el mismo error. Grrrrrrrrrrr

Al final he encontrado este código por Internet que soluciona el problema. Hace más cosas pero seguro que un programador espabilado sabrá aislar la funcionalidad que necesite ;-)

Llamandolo así convertireís el campo a tipo text donde thisInput es el objeto input

changeInputType(thisInput,'text',txtLabel,false,true);
function changeInputType(
  oldElm, // a reference to the input element
  iType, // value of the type property: 'text' or 'password'
  iValue, // the default value, set to 'password' in the demo
  blankValue, // true if the value should be empty, false otherwise
  noFocus) {  // set to true if the element should not be given focus
 
  if(!oldElm || !oldElm.parentNode || (iType.length<4) || 
    !document.getElementById || !document.createElement) return;
  var newElm = document.createElement('input');
  newElm.type = iType;
  if(oldElm.name) newElm.name = oldElm.name;
  if(oldElm.id) newElm.id = oldElm.id;
  if(oldElm.className) newElm.className = oldElm.className;
  if(oldElm.size) newElm.size = oldElm.size;
  if(oldElm.tabIndex) newElm.tabIndex = oldElm.tabIndex;
  if(oldElm.accessKey) newElm.accessKey = oldElm.accessKey;
  newElm.onfocus = function(){return function(){
    if(this.hasFocus) return;
    var newElm = changeInputType(this,'password',iValue,
      (this.value.toLowerCase()==iValue.toLowerCase())?true:false);
    if(newElm) newElm.hasFocus=true;
  }}();
  newElm.onblur = function(){return function(){
    if(this.hasFocus)
    if(this.value=='' || (this.value.toLowerCase()==iValue.toLowerCase())) {
      changeInputType(this,'text',iValue,false,true);
    }
  }}();
 // hasFocus is to prevent a loop where onfocus is triggered over and over again
  newElm.hasFocus=false;
  oldElm.parentNode.replaceChild(newElm,oldElm);
  if(!blankValue) newElm.value = iValue;
  if(!noFocus || typeof(noFocus)=='undefined') {
    window.tempElm = newElm;
    setTimeout("tempElm.hasFocus=true;tempElm.focus();",1);
  }
  return newElm;
}
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

04 Oct, 2008

Configurar el servidor MySQL con UTF8

Posted by: admin In: Desarrollo| Sistemas

Siguiendo con los bricoconsejos para trabajar con MySQL y UTF8, dejo aquí los parámetros que hay que modificar en el fichero de configuración my.cnf para que todo se ejecute por defecto en UTF8.

[mysqld]
character-set-filesystem=UTF8
character-set-server=UTF8
default-collation=UTF8_general_ci
default-character-set=UTF8

[client]
default-character-set=UTF8

[mysqldump]
default-character-set=UTF8
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]
Tags: ,

04 Oct, 2008

Pasar parámetros por defecto en Javascript

Posted by: admin In: Desarrollo

Es una lástima pero Javascript, al contrario que otros lenguajes, no permite pasar parámetros por defecto en sus funciones.

Esto tiene solución mediante un pequeño truco en el código.

Imaginad que tenemos esto:

1
2
3
4
function test(arg) {
  arg = arg || 23;
  return arg;
}

Si llamamos a test() sin parametro nos va a devolver 23. Problema resuelto de forma sencilla ;-)

Pero seamos más puristas.

Si por ejemplo la llamamos pasándole el valor NULL nos vamos a encontrar con que también nos devolverá 23 y en algunos casos nos puede interesar manejar el valor NULL de forma diferente

Si quisieramos corregirlo tendríamos que utilizar esto:

function test(arg) {
  arg = (typeof arg == ‘undefined’) ? 23 : arg;
  return arg;
}

Con esta opción si llamamos a test() sin parámetro nos devuelve 23 pero si llamamos a test(null) nos devolvería null con lo que podriamos manejar el caso de forma diferente.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

La función en principio está pensada para convertir una cadena - el título de un post por ejemplo - en una URL amigable o URL friendly.

Por ejemplo. La cadena Hola mundo! (Continuación) al pasarla por la función quedaría convertida en hola-mundo-(continuacion)
Me encontré con varias funciones por ahí que hacían lo mismo pero me dieron muchos problemas porque trabajaban directamente con caracteres en vez de con el código del carácter.
Por otro lado adaptar la función para que solo elimine los acentos es inmediato por eso lo he puesto en el título del post. Por eso y porque ahora en un proyecto vuelvo a ella para reutilizarla en ese sentido.

Probarla y si os gusta y os funciona podéis dejarme un comentario para que lo sepa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function desaccent($string)
{
$string = strtolower($string) ;$string = str_replace(”?”, “”, $string) ;
$string = str_replace(”¿”, “”, $string) ;
$string = str_replace(!, “”, $string) ;
$string = str_replace(*, “”, $string) ;
$string = str_replace(,, “”, $string) ;
 
return strtr(utf8_decode($string),
“\xe1\xc1\xe0\xc0\xe2\xc2\xe4\xc4\xe3\xc3\xe5\xc5″.
“\xaa\xe7\xc7\xe9\xc9\xe8\xc8\xea\xca\xeb\xcb\xed”.
“\xcd\xec\xcc\xee\xce\xef\xcf\xf1\xd1\xf3\xd3\xf2″.
“\xd2\xf4\xd4\xf6\xd6\xf5\xd5\x8\xd8\xba\xf0\xfa\xda”.
“\xf9\xd9\xfb\xdb\xfc\xdc\xfd\xdd\xff\xe6\xc6\xdf\xf8″..’”,
“aAaAaAaAaAaAacCeEeEeEeEiIiIiIiInNo”.
“OoOoOoOoOoOoouUuUuUuUyYyaAso—”);
}
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

18 Sep, 2008

Generar una fecha aleatoria en MySQL

Posted by: admin In: Desarrollo

Pego aquí una query para insertar fechas aleatorias en una tabla de MySQL.

update mytable
set mycolumn = str_to_date(
concat(
floor(1 + rand() * (12-1)), /* Generate a random month */
'-',
floor(1 + rand() * (28 -1)), /* Generate a random day */
'-',
'2008'
),
'%m-%d-%Y'
);

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Categories

Publicidad

About

ProgramadorPHP.es es el blog profesional de Vicent González i Castells, programador freelance especializado en desarrollo de aplicaciones web. vigoncas@aaa.upv.es

CURRÍCULUM

Tags