Donde guardo mis ideas

Carlos Coronado Maleno

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.

Desarrollador de aplicaciones.
Consultor tecnológico.

Facebook Twitter LinkedIn Skype  

14 Respuestas hace mucho.

  1. 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.

  2. golfovi dice:

    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.

  3. 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.

  4. golfovi dice:

    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?

  5. golfovi dice:

    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.

  6. golfovi dice:

    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?

  7. golfovi dice:

    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!

  8. golfovi dice:

    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.



Política de privacidad

Utilizamos "cookies" propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Puede leer la política de cookies aquí.

Hemos detectado que estás usando un bloqueador de publicidad. Por favor, considera desactivarlo en esta web. Aunque no es mucho, la publicidad nos ayuda a paliar los gastos de mantener esta web activa. Muchas gracias

No cedemos los datos a terceros, solo lo usamos para enviarte notificaciones cuando publicamos algo nuevo.
No enviamos publicidad.