Cómo cargar archivos en diferentes páginas de PrestaShop - Top Programming Questions and Answers
Posted On: Sep 14, 2018
Categories: Einkaufswagen & Plattformen
PrestaShop es el carrito de compras más simple que se adapta a las pequeñas empresas. Si está buscando abrir una nueva tienda, PrestaShop debería estar en su primera opción. La razón es que es totalmente de código abierto y uno puede modificarlo de acuerdo con esta propia elección.
El tema que seleccionamos hoy para la sesión de preguntas y respuestas es básicamente una funcionalidad avanzada de PrestaShop y que es la opción de carga de archivos en diferentes páginas de PrestaShop. Al ser un comerciante, a veces necesita obtener algunos archivos de los clientes en forma de PDF, Excel, video, MP3, JPEG o cualquiera de los otros formatos de archivo. No es mejor tener servidores de nube de terceros para obtener archivos. ¿Por qué no hacerlo a través de su propio servidor de tienda? Del mismo modo, a veces necesita enviar un archivo a sus clientes, se puede hacer a través de PrestaShop y, por lo tanto, reducir la necesidad de servicios externos.
La publicación de hoy apunta a lo mismo. Al usar esta función, las personas obtienen algunos errores o errores y buscan una solución para ellos. Hoy hemos tratado de dar todas las soluciones posibles a esas cuestiones. Así que dado aquí Las mejores preguntas y respuestas de programación sobre la opción de carga de archivos en PrestaShop;
Pregunta No. 1: Hola, ¿quiero desactivar la opción de carga en el formulario de contacto para que nadie pueda enviarme los archivos a través de esta opción?
Respuesta:Puede desactivar esta opción desde el back office. Vaya a clientes>Servicios al cliente. Donde puede activar o desactivar la opción según su elección.
Pregunta No. 2: Hola, quiero crear un campo de entrada en el formulario de registro del cliente. A través de estos campos, los visitantes tienen que cargar un archivo que contenga la prueba de que tiene derecho a acceder a la tienda. Quiero verificar esta prueba y luego permitir su registro. ¿Cómo es posible?
Respuesta:Es necesario modificar el formulario de registro. Puede acceder al formulario de registro a través de ./themes/YOUR-THEME/authentication.tpl. Justo después del campo del día de nacimiento alrededor de la línea 130, debe agregar esto;
<divclass="form-group">
<labelfor="fileUpload">{l s='Select file'} *
<inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
Puede agregar el archivo en la clase de cliente y Controllers(AdminCustomersController.php, AuthController.php, Customer.php).
En primer lugar, asigne un nombre a un campo 'fileupload' a través del cual está declarando y creando el campo.
Ejecutemos esta instrucción en SQL para crear el campo en la tabla de clientes para almacenar el nombre de archivo.
ALTERTABLE'ps_customer'ADD'fileUpload' VARCHAR(100)NOTNULL;
En ./classes/Customer.php alrededor de la línea ~30 encontraremos las variables declaradas. Agregue el nuevo de esta manera:
classCustomerCoreextendsObjectModel
{
public $id;
public $fileUpload;
public $id_shop;
...
luego, en la línea ~ 192, agregue el nuevo campo de esta manera:
'date_add'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
'date_upd'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
'fileUpload'=> array('type'=>self::TYPE_STRING,'validate'=>'isGenericName'),
),
Ahora, dentro de ./controllers/front/AuthController.php alrededor de la línea ~379 preparamos la información:
// Preparing customer
$customer =newCustomer();
$lastnameAddress =Tools::getValue('lastname');
$firstnameAddress =Tools::getValue('firstname');
$_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);
$_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);
// Add this line
$fileUpload =Tools::getValue('fileUpload');
...
alrededor de la línea ~ 423 encontrará la validación de cumpleaños, por lo que debe realizar el campo de validación.
$customer->firstname =Tools::ucwords($customer->firstname);
$customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
if(!Validate::isBirthDate($customer->birthday))
$this->errors[]=Tools::displayError('Invalid date of birth.');
// Add this code...
//$customer->fileUpload = 'N/A';
// If you want the uploader as OPTIONAL, remove the comment of the line above.
$file = $_FILES['fileUpload'];
$allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
{
$filename = uniqid()."-".basename($file['name']);
$filename = str_replace(' ','-', $filename);
$filename = strtolower($filename);
$filename = filter_var($filename, FILTER_SANITIZE_STRING);
$file['name']= $filename;
$uploader =newUploaderCore();
$uploader->upload($file);
$customer->fileUpload = $filename;
}
De la misma manera, en la línea ~552, dejándolo así:
$customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
if(!Validate::isBirthDate($customer->birthday))
$this->errors[]=Tools::displayError('Invalid date of birth');
// Add this code...
//$customer->fileUpload = 'N/A';
// If you want the uploader as OPTIONAL, remove the comment of the line above.
$file = $_FILES['fileUpload'];
$allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
{
$filename = uniqid()."-".basename($file['name']);
$filename = str_replace(' ','-', $filename);
$filename = strtolower($filename);
$filename = filter_var($filename, FILTER_SANITIZE_STRING);
$file['name']= $filename;
$uploader =newUploaderCore();
$uploader->upload($file);
$customer->fileUpload = $filename;
}
De esta manera, los archivos se cargarán en la carpeta ./upload/, si desea especificar otra subcarpeta simplemente inserte la ruta en $uploader->upload('my-path/'.$_FILES['fileUpload']);
Para agregar los campos de entrada en el formulario de registro, abra ./themes/YOUR-THEME/authentication.tpl alrededor de ~ 182 y ~ 509 justo después de los campos de cumpleaños.
<divclass="form-group">
<labelfor="fileUpload">{l s='Select file'} *
<inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
No olvides configurar el formulario para enviar información multimedia en cada
<formmethod="post"id="create-account_form" ... enctype="multipart/form-data">
Para mostrar el nombre de archivo en la lista de clientes, abra ./controllers/admin/AdminCustomersController.php alrededor de la línea ~ 159 y agregue:
'connect'=> array(
'title'=> $this->l('Last visit'),
'type'=>'datetime',
'search'=>false,
'havingFilter'=>true
),
'fileUpload'=> array(
'title'=> $this->l('Uploaded File'),
'type'=>'text',
'search'=>true,
'havingFilter'=>true
)
));
En el mismo archivo, alrededor de ~821:
// Connections
'connections'=> $connections,
// Uploaded File
'fileUpload'=> $fileUpload,
// Referrers
'referrers'=> $referrers,
'show_toolbar'=>true
Limpie la memoria caché después de actualizar los archivos.
Si desea mostrar los archivos dentro de la Vista de cliente, debe modificar ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl
Coloque este código justo después de la validación $customer->birthday en las líneas ~ 550 y ~ 420 para ejecutar el cargador en AuthController.php
if(isset($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['tmp_name']))
{
$extension = array('.txt','.rtf','.doc','.docx','.pdf','.png','.jpeg','.gif','.jpg');
$filename = uniqid().basename($_FILES['fileUpload']['name']);
$filename = str_replace(' ','-', $filename);
$filename = strtolower($filename);
$filename = filter_var($filename, FILTER_SANITIZE_STRING);
$_FILES['fileUpload']['name']= $filename;
$uploader =newUploaderCore();
$uploader->upload($_FILES['fileUpload']);
$customer->fileUpload = $filename;
}
Question No. 3: Hi, I want that the order information will be printed on a single page and I should have option to select which part should appear on print page and which material not. By default, it prints on 3 pages which is a bit useless.
Respuesta:Vaya a override.css en /admin/themes/default/css/override.css desde donde puede cambiar el estilo de impresión según sea necesario.
@media print {
p {text-indent: 10%}
}
Debe adjest con la acción css "display:none" con PayPal pestaña y otra pestaña.
Pregunta No. 4: Estoy usando PrestaShop 1.6 y quiero hacer uso de la importación.csv. Hemos importado las imágenes y el texto y hemos establecido la opción de carga de archivos en 1. Ahora guíame a cómo cargar y adjuntar un archivo PDF como una hoja de datos con productos.
Respuesta:Entonces, en adminImportController.php, agregue esas dos líneas en la lista de campos para la importación de productos (caso $this->entities[$this->l('Products')])
'delete_existing_attachments'=> array('label'=> $this->l('Delete existing attachments (0 = No, 1 = Yes)')),
'attachment'=> array('label'=> $this->l('attachment')),
Then at the end of the function productImport(), after those lines:
else{
StockAvailable::setQuantity((int)$product->id,0,(int)$product->quantity,(int)$this->context->shop->id);
}
};
add this:
// Attachment files import
//delete existing attachments if "delete_existing_attachments" is set to 1
if(isset($product->delete_existing_attachments))
if((bool)$product->delete_existing_attachments)
$product->deleteAttachments();
$attachments = get_object_vars($product);
if(isset($attachments['attachment'])&&!empty($attachments['attachment']))
foreach(explode($this->multiple_value_separator, $attachments['attachment'])as $single_attachment)
{
$tab_attachment = explode('|', $single_attachment);
$attachment_filename = isset($tab_attachment[0])? $tab_attachment[0]:'';
$attachment_name = isset($tab_attachment[1])? trim($tab_attachment[1]): $attachment_filename ;
$attachment_description = isset($tab_attachment[2])? trim($tab_attachment[2]):'';
if(!empty($attachment_filename))
{
$id_attachment =(int)Attachment::addAttachmentImport($attachment_filename, $attachment_name, $attachment_description);
Attachment::addAttchmentProductImport($product->id, $id_attachment);
Product::updateCacheAttachment($product->id);
}
}
En el archivo de clase de datos adjuntos (clases/datos adjuntos.php)
añádase al final esas dos funciones:
publicstaticfunction addAttachmentImport($filename, $name, $description)
{
$attachment =newAttachment();
$languages =Language::getLanguages();
foreach($languages as $language)
$attachment->name[$language['id_lang']]= strval($name);
$attachment->description[$language['id_lang']]= $description;
$attachment->file = sha1($filename);
$attachment->file_name = $filename;
$path_file = _PS_DOWNLOAD_DIR_.$filename;
$attachment->file_size = filesize($path_file);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$attachment->mime = finfo_file($finfo, $path_file);
$attachment->addAttachment();
return(int)$attachment->id;
}
publicstaticfunction addAttchmentProductImport($id_product, $id_attachment)
{
returnDb::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'product_attachment` (`id_attachment`, `id_product`)
VALUES ('.(int)$id_attachment.', '.(int)$id_product.')
');
}
elimine el archivo de caché: /cache/class_index.php
Debe colocar sus archivos en la carpeta /Download.
En su archivo cvs, la columna "adjunto" podría contener esto:
miarchivo1.doc| Nombre de mi archivo
O si desea adjuntar varios archivos a un producto:
miarchivo1.doc| Nombre de mi archivo%myfile2.pdf| Nombre de mi archivo
Pregunta No. 5: ¿Hay alguna manera de obligar a los visitantes a cargar un documento de la empresa en la página de registro? Mientras buscaba en Internet, encontré tales módulos de carga allí que permiten cargar en la página de pedido, producto y carrito, pero ¿cómo hacerlo al registrarse?
Respuesta:Lamentablemente, ya hay un módulo disponible para este propósito. Por lo tanto, debe hacer una modificación central o escribir su propio módulo. Sin embargo, si no eres un experto en código, ponte en contacto con alguna empresa de desarrollo de módulos.
Nota: Estas preguntas son respondidas por los principales desarrolladores de la comunidad y no reflejan FMEModules.