Principales respuestas a preguntas sobre la personalización de productos PrestaShop

Posted On: Sep 14, 2018
Categories: Einkaufswagen & Plattformen
En un momento en el que hay una gran competencia en el mercado, solo los exitosos son aquellos que han adoptado las últimas tendencias y técnicas del negocio. Los dueños de tiendas que más facilitan a los clientes la compra tienen más probabilidades de tener éxito. La última tendencia que siguen los dueños de tiendas expertos es permitir que el cliente personalice los atributos de los productos por su cuenta, por ejemplo, si el cliente está comprando una camiseta, puede insertar un logotipo, escribir algo, pegar una imagen o cualquier estilo de diseño en la camiseta. Todo lo hará el cliente y, cuando haya realizado toda la personalización, podrá enviarla al administrador en la misma página del producto. Como resultado, se entregará lo mismo a los clientes. Como los clientes obtienen el control total de su producto, les gusta ir a esa tienda.
Cuando entramos en la implementación, PrestaShop en sí no es tan flexible. Aquí no podemos decir que los desarrolladores de PrestaShop no conozcan esta función. La conocen muy bien, pero para hacer que el software sea realmente liviano, solo brindan la función necesaria en su instalación. Por lo tanto, es necesario diseñar su propio módulo para este propósito o utilizar un módulo de diseño personalizado de PrestaShop gratuito o de pago.
Aquí en esta guía, estamos discutiendo algunos problemas básicos relacionados con la personalización de productos de PrestaShop. Con suerte, esta publicación de preguntas y respuestas lo ayudará mucho a resolver los problemas de la tienda. Así que comencemos aquí;
Pregunta n.º 1: Hola, tengo un problema con el campo de personalización de PrestaShop. Cuando los clientes cargan un archivo de imagen, lo guardan y luego actualizan la página. Muestra una miniatura dañada. Además, cuando hago clic en la imagen o la abro en una nueva pestaña, simplemente va a la página de error 404. ¿Cuál es el problema?
Respuesta: Tienes que editar el archivo /upload/.htaccess y quitar la línea php_flag engine off. Encontrarás estas líneas al final del archivo. Guarda el archivo y funcionará bien.
Pregunta n.° 2: Hola, quiero cargar un archivo PDF en la página de personalización del producto. Actualmente, solo puedo cargar archivos de imágenes. ¿Qué modificación necesito para esto?
Respuesta: Para habilitar esta función en tu tienda, tienes que anular el método de carga de imágenes del controlador del producto en override>controllers>front
. Descargue el siguiente código, colóquelo en ProductController.php
y cárguelo en override>controllers>front
.
class ProductController extends ProductControllerCore
{
const CUSTOMIZATION_FILE_DIR = 'customizations';
protected function pictureUpload()
{
si (!($field_ids = $this->product->getCustomizationFieldIds()))
... falso;
$campos_de_archivo_autorizados = matriz();
foreach ($field_ids AS $field_id)
<código> {
<código> ... Producto::PERSONALIZAR_ARCHIVO)
$authorized_file_fields[(int)$field_id['id_customization_field']] = 'archivo' . (int)$campo_id['campo_personalización_id'];
}
$índices = array_flip($campos_de_archivo_autorizados);
foreach ($_FILES AS $nombre_de_campo => $archivo)
{
si (en_matriz($nombre_campo, $campos_archivo_autorizados) Y isset($archivo['nombre_temporal']) Y !vacío($archivo['nombre_temporal']))
{
// Si hay un error de carga, deje que el padre lo gestione es
... si ($file['error'] != CARGA_ERR_OK)
continuar;
// Si el archivo no está permitido, deje que el padre lo gestione eso
si (!$this->isUploadTypeAllowed($archivo))
...// Desactivar el PDF para evitar que el padre maneje este archivo
unset($_FILES[$nombre_campo]);
// Crear dir
<código> mkdir(_PS_UPLOAD_DIR_ . ProductController::CUSTOMIZATION_FILE_DIR.'/'.$this->context->cart->id, 0777, true);
// Marcar el archivo como personalizado subir
$file_name = ProductController::CUSTOMIZATION_FILE_DIR.'/'.$this->context->cart->id.'/P'. md5(uniqid(rand(), verdadero));
$tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS');
... $tmp_name))
<código>{
$this->errors[] = Tools::displayError('Se produjo un error durante la ejecución del PDF subir.');
... falso;
}
// Copiar archivo a la carga dir
<código> ... _PS_UPLOAD_DIR_.$nombre_archivo))
{
$this->errors[] = Tools::displayError('Se produjo un error durante la ejecución del PDF subir.');
... falso;
}
// Modifique el nuevo archivo
<código> ... 0777))
<código>{
$this->errors[] = Tools::displayError('Se produjo un error durante la ejecución del PDF subir.');
... falso;
}
// Crea un pulgar falso para evitar errores al eliminar, este truco evita muchos métodos principales anular
file_put_contents(_PS_UPLOAD_DIR_ . $nombre_archivo . '_pequeño', '');
chmod(_PS_UPLOAD_DIR_ . $nombre_archivo . '_pequeño', 0777);
// Registrar el archivo
<código> $this->context->cart->addPictureToProduct($this->product->id, $índices[$nombre_campo], Producto::PERSONALIZAR_ARCHIVO, $nombre_archivo);
// Eliminar temporal archivo
desvincular($tmp_name);
}
}
return parent::imageUpload();
}
función protegida isUploadTypeAllowed($archivo)
{
/* Detectar tipo de contenido mime */
$mime_type = false;
$types = array('application/pdf',); // Aquí se pueden agregar tipos mime adicionales
if (function_exists('finfo_open'))
{
$finfo = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
}
<código> elseif (función_existe('tipo_contenido_mime'))
<código>{
$mime_type = mime_content_type($file['tmp_name']);
}
<código> elseif (función_existe('exec'))
<código>{
$tipo_mime = trim(exec('archivo -b --tipo-mime '.escapeshellarg($archivo['nombre_tmp'])));
}
si (vacío($tipo_mime) || $mime_type == 'archivo normal')
{
$mime_type = $archivo['tipo'];
<código> }
<código>
<código> si (($pos = strpos($tipo_mime, ';')) !== falso)
$mime_type = substr($mime_type, 0, $pos);
// ¿es permitido?
return $mime_type && in_array($mime_type, $types);
}
}
}
Limpiar la caché.
if isset($pictures.$key)}
<divclass="customizationUploadBrowse">
{if substr(basename($pictures.$key), 0, 1) == 'P'}
{l s='Ver el archivo'}
{else}
<imgsrc="{$pic_dir}{$pictures.$key}_small"alt=""/>
{/if}
{/if}
Además, tienes que arreglar la vista previa del archivo en el frontend de la tienda. En product.tpl, use el siguiente código:{if isset($pictures.$key)}
{if substr(basename($pictures.$key),0,1)=='P'}
{l s='Ver el archivo'}
{else}
{/if}
Abre "order-payment.tpl", "order-detail.tpl", "order-return.tpl" y busca "customizationUploaded", comenta el div y pega este código encima:
{foreach $custom_data como $imagen}
{si substr(nombrebase($imagen.valor), 0, 1) == 'P'}
<un href="{$pic_dir}{$picture.value}" destino="_blank">Abrir archivo adjuntoun>
{de lo contrario}
<img src="{$pic_dir}{$picture.value}_small" alt="" />
{/if}
<un href="{$link->getProductDeletePictureLink($producto, $campo.id_campo_personalización)|escape:'html':'UTF-8'}" título="{l s='Eliminar'}" >
<img src="{$img_dir}icon/delete.gif" alt="{l s='Eliminar'}" clase="personalización_eliminar_icono" ancho="11" altura="13" />
a>
{/foreach}
- Ahora, el último paso: abra "/ps-admin/themes/default/template/controllers/orders/_customized_data.tpl", busque "Product::CUSTOMIZE_FILE", comenta el primer foreach y pega este código arriba:
{foreach from=$datas item=data}
<div clase="grupo-formulario">
<span clase="col-lg-4 etiqueta-control"><fuerte>{si $datos['nombre']}{$datos['nombre']}{de lo contrario}{l s='Imagen n.º'}{$datos@iteración}{/si}fuerte>span>
<div clase="col-lg-8">
{si substr(nombrebase($datos.valor), 0, 1) == 'P'}
<un href="{$pic_dir}{$data.value}" objetivo="_blank">Abrir archivo adjuntoa>
{else}
<un href="displayImage.php?img={$data['value']}&name={$order->id|intval}-file{$data@iteration}" clase="_blank">
<img clase="img-miniatura" origen="{$smarty.const._THEME_PROD_PIC_DIR_}{$data['value']}_small" alt=""/>
a>
{/si}
{/si}
div>
div>
{/foreach}
Pregunta n.° 3: He creado 2 archivos nuevos en las páginas de personalización de productos, pero no puedo No estoy satisfecho después de crearlo. Como usuario, debe ir a la parte inferior y hacer clic en las pestañas adicionales. ¿Puedo mover estos campos al mismo lugar donde existe el menú desplegable de combinación de productos? Intenté hacerlo moviendo el código del pie de página a otros lugares como product.tpl, pero no funciona.
Respuesta: puede hacerlo con el siguiente método.
Archivo:
/themes/your-template/product.tpl
Busque y elimine el siguiente código:
{if isset($product) && $product->customizable}
<divid="idTab10"class="bullet customization_block">
<formmethod="post"action="{$customizationFormTarget}"enctype="multipart/form-data"id="customizationForm"class="clearfix">
<pclass="infoCustomizable">
{l s='Después de guardar el producto personalizado, recuerda añadirlo a tu carrito.'}
{if $product->uploadable_files}
{l s='Los formatos de archivo permitidos son: GIF, JPG, PNG'}{/if}
{if $producto->archivos_cargables|intval}
<divclass="ArchivoProductos_personalizables">
{l s='Imágenes'}
<ulid="archivos_cargables"class="clearfix">
{counter start=0 assignment='campo_personalización'}
{foreach from=$campos_personalización item='campo' name='campos_personalización'}
{if $campo.type == 0}
<liclass="Línea_de_carga_personalización{if $campo.required} required{/if}">{assign var='key' valor='imágenes_'|cat:$producto->id|cat:'_'|cat:$campo.id_campo_personalización}
<código>{if isset($imágenes.$clave)}
<código><divclass="personalizaciónSubirExplorar">
<código><imgsrc="{$pic_dir}{$imágenes.$clave}_small"alt=""/>
<código><imgsrc="{$img_dir}icon/delete.gif"alt="{l s='Eliminar'}"class="customization_delete_icon"width="11"height="13"/>
{/if}
<divclass="customizationUploadBrowse">
<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Seleccione un archivo de imagen de su computadora'}{/if}{if $field.required}*{/if}
<inputtype="file"name="file{$field.id_customization_field}"id="img{$customizationField}"class="customization_block_input {if isset($pictures.$key)}relleno{/if}"/>
{contador}
{/if}
{/foreach}
{/if}
{if $product->campos_de_texto|intval}
<divclass="Texto_de_Productos_personalizables">
{l s='Texto'}
<ulid="campos_de_texto">
{inicio_de_contador=0 asignar='campopersonalización'}
{foreach from=$campospersonalización item='campo' name='campospersonalización'}
{si $campo.tipo == 1}
<liclass="customizationUploadLine{si $campo.requerido} requerido{/si}">
<labelfor="campotexto{$campopersonalización}">{asignar var='clave' valor='campostexto_'|cat:$producto->id|cat:'_'|cat:$campo.id_campo_personalización} {si !vacío($campo.nombre)}{$campo.nombre}{/si}{si $campo.requerido}*{/si}
<código><textareatype="texto"name="campo_texto{$campo.id_campo_personalización}"id="campo_texto{$campo_personalización}"rows="1"cols="40"class="customization_block_input">{si está establecido($campos_texto.$clave)}{$campos_texto.$clave|stripslashes}{/si}
<código>{contador}
<código>{/si}
<código>{/para_cada}
<código>{/si}
<código><pid="datos_personalizados"&g t;
<inputtype="hidden"name="quantityBackup"id="quantityBackup"value=""/>
<inputtype="hidden"name="submitCustomizedDatas"value="1"/>
<inputtype="button"class="button"value="{l s='Guardar'}"onclick="javascript:saveCustomization()"/>
<spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="loader"/>
<pclass="clear required">* {l s='campos obligatorios'}
{/if}
-------
Y antes de esta línea:
{if (isset($product) && $product->description) || (isset($características) && $características) || (isset($accesorios) && $accesorios) || (isset($HOOK_PRODUCT_TAB) && $HOOK_PRODUCT_TAB) || (isset($archivos adjuntos) && $archivos adjuntos) || isset($product) && $product->customizable}
Pegue este código:
{if isset($product) && $product->customizable}
<divclass="bullet customization_block">
<formmethod="post"action="{$customizationFormTarget}"enctype="multipart/form-data"id="customizationForm"class="clearfix">
<pclass="infoCustomizable">
{l s='Después de guardando tu producto personalizado, recuerda agregarlo a tu carrito.'}
{if $product->uploadable_files}
{l s='Los formatos de archivo permitidos son: GIF, JPG, PNG'}{/if}
{if $product->uploadable_files|intval}
<divclass="customizableProductsFile">
{l s='Imágenes'}
<ulid="archivos_cargables"class="clearfix">
{counter start=0 assignment='customizationField'}
{foreach from=$customizationFields item='campo' name='customizationFields'}
{if $field.type == 0}
<liclass="customizationUploadLine{if $field.required} obligatorio{/if}">{assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}
{if isset($pictures.$key)}
<divclass="customizationUploadBrowse">
<código>
<código> <imgsrc="{$img_dir}icon/delete.gif"alt="{l s='Eliminar'}"class="customization_delete_icon"width="11"height="13"/>
<código>
<código>
{/if}
<divclass="customizationUploadBrowse">
<labelclass="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Seleccione un archivo de imagen de su computadora'}{/if}{if $campo.obligatorio}*{/si}
<código> <tipo_de_entrada="archivo"nombre="archivo{$campo.id_campo_personalización}"id="img{$campo_personalización}"clase="bloque_personalización_entrada {si se establece($imágenes.$clave)}lleno{/si}"/>
<código>
<código>
<código>{contador}
{/si}
{/para cada}
{/si}
{si $producto->campos_de_texto|valor_int}
<divclass="TextoDeProductosPersonalizables">
{l s='Texto'}
<ulid="campos_de_texto">
{counter start=0 assignment='campo_personalización'}
{foreach from=$campos_personalización item='campo' name='campos_personalización'}
{if $campo.type == 1}
<liclass="línea_de_carga_personalización{if $campo.required} obligatorio{/if}">
<labelfor="campoDeTexto{$CampoDePersonalización}">{assign var='key' value='camposDeTexto_'|cat:$producto->id|cat:'_'|cat:$campo.id_campoDePersonalización} {if !empty($campo.nombre)}{$campo.nombre}{/if}{if $campo.obligatorio}*{/if}
<textareatype="text"name="campoDeTexto{$campo.id_campoDePersonalización}"id="campoDeTexto{$CampoDePersonalización}"rows="1"cols="40"class="customization_block_input">{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}
{contador}
{/if}
{/foreach}
{/if}
<pid="datospersonalizados">
<código> <tipodeentrada="oculto"nombre="cantidadCopiaDeRespaldo"id="cantidadCopiaDeRespaldo"valor=""/>
<código> <tipodeentrada="oculto"nombre="enviarDatosPersonalizados"valor="1"/>
<código> <tipodeentrada="botón"clase="button"value="{l s='Guardar'}"onclick="javascript:saveCustomization()"/>
<spanid="ajax-loader"style="display:none"><imgsrc="{$img_ps_dir}loader.gif"alt="cargador"/>
<pclass="borrar obligatorios">* {l s='campos obligatorios'}
{/if}
----
Después de la búsqueda:
{if isset($product)&& $product->customizable}
{l s='Personalización del producto'}
{/if}
cambiar por
{* {if isset($product)&& $product->customizable}
{l s='Personalización del producto'}
{/if}
*}
Nota: Para Modificar product.tpl, tienes que hacer una compilación forzada.
Pregunta n.º 4: Quiero mostrar la pestaña de personalización del producto junto a la pestaña de más información. En este momento, se muestra debajo de las pestañas predeterminadas.
Respuesta: ¡Hola!
Editar product.tpl
Cambiar
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments}
a
{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments || $product->personalizable}
En
, encima de {$HOOK_PRODUCT_TAB} insertar línea:
{if $product->personalizable}
{l s='Personalización del producto'}
{/if}
En
, encima de {$HOOK_PRODUCT_TAB_CONTENT} insertar :
{if $product->customizable}
{l s='Después de guardar su producto personalizado, recuerde agregarlo a su carrito.'}
{if $product->uploadable_files}
{l s='Los formatos de archivo permitidos son: GIF, JPG, PNG'}{/if}
{if $product->uploadable_files|intval}
{l s='Imágenes'}
{counter start=0 asignar='customizationField'}
{foreachfrom=$customizationFields item='campo' nombre='customizationFields'}
{si $campo.tipo ==0}
{asignar var='clave' valor='imágenes_'|cat:$producto->id|cat:'_'|cat:$campo.id_customization_field}
{si isset($imágenes.$clave)}
{/if}
<código>
<código> {contador}
<código> {/si}
<código> {/foreach}
<código>
<código> {/si}
<código>
<código> {si $producto->campos_de_texto|intval}
<código>
{l s='Textos'}
{counter start=0 assignment='customizationField'}
{foreachfrom=$customizationFields item='campo' name='customizationFields'}
{if $field.type ==1}
{assign var='key' valor='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field}
{if!empty($campo.nombre)}{$campo.nombre}{/if}{if $campo.required}*{/if}