Una vez explicado como se crea un módulo para prestashop 1.5.x voy a mostar como se crea un producto desde un módulo y se le asigna una foto, sin morir en el intento 🙂
Para ello vamos a usar las clases Products e Image del Core.
Para crear un producto, solo tenemos que hacer estos pasos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | //idioma por defecto de la web 4 -> Español 1 -> Inglés $lang=(int)Configuration::get('PS_LANG_DEFAULT'); $p = new Product(); $p->id=0; $p->name = array( 1 => 'titulo del producto', $lang => 'titulo del producto' ); $p->reference = 'referencia'; $p->id_category_default=1; $p->price = 123.45; $p->wholesale_price= 123.45; $p->description = array( 1 => 'descripción del producto', $lang => 'descripción del producto' ); $p->description_short = array( 1 => 'descripción del producto', $lang => 'descripción del producto' ); $p->meta_description = array( 1 => 'la meta descripción', (int) ($lang) => 'la meta descripción' ); $p->meta_keywords = array( 1 => 'la meta descripción', (int) ($lang) => 'la meta descripción' ); $p->link_rewrite= array( 1 => Tools::link_rewrite('titulo del producto'), $lang => Tools::link_rewrite('titulo del producto') ); $p->id_tax_rules_group = 1; $p->quantity = 1; $p->active = 0; $p->available_for_order = 1; //función que inserta el producto $p->add(); //Si queremos asociar nuestro producto a varias categorías $p->addToCategories(array(1,15,45)); //Si queremos añadir etiquetas: $t = new Tag(); $t->name = 'titulo de la etiqueta'; $t->id_lang = $lang; if($t->add()) $t->setProducts(array($p->id)); //Establecemos el stock para que se pueda comprar StockAvailable::setQuantity($p->id, null, 1); //Indexamos el producto para que aparezca en el buscador. Search::indexation(); |
Y una vez que tenemos el producto creado, para añadir la imágen:
if($p->add()){
$i= new Image();
$i->id_product = $p->id;
$i->position=1;
$i->cover = 1;
$i->add();
ImageManager::resize(«ruta_completa_carpeta_foto».»nombre_foto.jpg»,
$i->getPathForCreation().».jpg»);
//esta función nos devuelve la ruta donde deberíamos colocar la foto
//e ImageManager la copia y genera la miniatura.
//También se le pueden pasar los datos de ancho y alto.
//Hay que generar las miniaturas a mano, ya que no es automático
//es decir, $i->getPathForCreation().»-home_default.jpg» , etc…
}
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | if($p->add()){ $i = new Image(); $i->id_product = $p->id; $i->position = 1; $i->cover = 1; if($i->add()){ $file = $i->getPathForCreation().'.jpg'; file_put_contents($file, file_get_contents(RUTA_DE_TU_IMAGEN_ORIGINAL)); //En vez de file_put_contents(), puedes copiar la imagen original en la ruta $file con fopen() o copy(). //Digamos que va a generar las miniaturas de la foto que esté en la ruta de $file. $images_types = ImageType::getImagesTypes('products'); foreach ($images_types as $img) ImageManager::resize($file, $i->getPathForCreation() . "-".$img['name'].".jpg", $img['width'], $img['height']); } } |
y con esto ya tenemos nuestro producto con su foto creada.
Espero que os sirva.
He editado la entrada y he añadido la indexación para la busqueda, el stock del producto y la generación de todas las miniaturas.
Un saludo.
Funcionnaaaaa!!!!. Muchas gracias era lo que buscaba, lo único que pasa es que cambio la ruta de la imagen por la ruta donde tengo mi imagen, y en lugar de mostrar mi imagen, muestra la de la interrogación, como que no genera las miniaturas.
Y otra cosa, ¿qué habría que hacer si quisiera modificar los datos de un producto creado con anterioridad?
Muchísimas gracias por tu tiempo, con gente como tu es como mejora el mundo.
De nada, para eso estamos 😛
Pues si no te genera las miniaturas habría que mirarlo. Te genera los jpg en las carpeta «p»? ( x ejem /img/p/1/2/3/123.jpg pero con el numero de tu foto)( si te genera los jpg pero no se ven es un problema con el htaccess)
Y respondiendo a lo segundo, siguiendo con mi ejemplo, para guardar cualquier cosa, primero instancia el objeto
$p = new Product(id_product)
Luego modificas lo que quieras
$p->reference=»asdf»
Y guardas
$p->save()
Y listo.
Un saludo.
Gracias por contestar, lo de actualizar el producto ok, lo de las imágenes, le estoy dando vueltas por si he puesto algo mal, y no veo el fallo, resulta que ni siquiera me genera las miniaturas. ¿Cual podría ser el problema?
Hola, te he actualizado el código con la última versión que estoy utilizando.
Dime si te funciona.
Un saludo.
Hola, perdona por tardar tanto en contestar, con el trabajo me es imposible cacharrear código. Ahora si me funciona perfectamente lo de añadir imágenes, te lo agradezco, eres un máquina. Ya solo me faltaría saber como añadir etiquetas al producto, rellenar sus propiedades y meta palabras clave. Ya se que no pido poco, jeje. ¿Eso sería dificil?
Un saludo.
Hola,
Para actualizar los metas sería de la misma forma que las descripciones, pero con sus respectivas variables:
$prod->meta_description = array(
1 => ‘la meta descripción’,
(int) ($lang) => ‘la meta descripción’
);
$prod->meta_keywords = array(
1 => ‘la meta descripción’,
(int) ($lang) => ‘la meta descripción’
);
Para añadir etiquetas, también te lo dejo por aquí, se parece al tema de las imágenes:
$t = new Tag();
$t->name = ‘titulo de la etiqueta’;
$t->id_lang = $lang;
if($t->add())
$t->setProducts(array($prod->id));
Para una lista completa de las variables que puedes actualizar puedes hacer:
echo print_r($producto);
Y verás todas las variables del objeto para poder actualizarlas.
Espero que te sirva.
Ok, ya veo, me aparecen todas las variables, menos las características que he creado yo desde el backend, para modificar esas características imagino que habrá que hacerlo con consultas a la base de datos, ¿no?
Se pueden añadir las características, pero es un poco más complejo. Mañana te pongo un trozo de código que tengo hecho que usa el tema de las características.
Ok, gracias, espero tu trozo de código.
Que es lo que quieres hacer con las características?? Crear nuevas?? O asignar a los productos esas características que ya existen??
Hola, estoy esperando el trozo de código donde se añaden las características, cuando tengas un hueco, si puedes subirlo. Muchas gracias por tu tiempo ¡máquina!
Perdona, me acaba de aparecer tu respuesta, no se que habrá pasado. Te explico, desde el panel admin he creado características por ejemplo: color, tamaño…, y quiero poder asignar a cada producto el valor para esas características.