Cómo cargar archivos en diferentes páginas de PrestaShop - Top Programming Questions and Answers

Posted On: Sep 14, 2018

Categories: Einkaufswagen & Plattformen

Tags: prestashop , módulo , carga de archivos

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'} <sup>*</sup></label>

    <inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>

    <inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>

</div>

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:

  1. classCustomerCoreextendsObjectModel
  2. {
  3. public $id;
  4. public $fileUpload;
  5. public $id_shop;
  6. ...

luego, en la línea ~ 192, agregue el nuevo campo de esta manera:

  1. 'date_add'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
  2. 'date_upd'=> array('type'=>self::TYPE_DATE,'validate'=>'isDate','copy_post'=>false),
  3. 'fileUpload'=> array('type'=>self::TYPE_STRING,'validate'=>'isGenericName'),
  4. ),

Ahora, dentro de ./controllers/front/AuthController.php alrededor de la línea ~379 preparamos la información:

  1. // Preparing customer
  2. $customer =newCustomer();
  3. $lastnameAddress =Tools::getValue('lastname');
  4. $firstnameAddress =Tools::getValue('firstname');
  5. $_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);
  6. $_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);
  7.  
  8. // Add this line
  9. $fileUpload =Tools::getValue('fileUpload');
  10.  
  11. ... 

alrededor de la línea ~ 423 encontrará la validación de cumpleaños, por lo que debe realizar el campo de validación.

  1. $customer->firstname =Tools::ucwords($customer->firstname);
  2. $customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
  3. if(!Validate::isBirthDate($customer->birthday))
  4.     $this->errors[]=Tools::displayError('Invalid date of birth.');
  5.  
  6. // Add this code...
  7. //$customer->fileUpload = 'N/A';
  8. // If you want the uploader as OPTIONAL, remove the comment of the line above.
  9. $file = $_FILES['fileUpload'];
  10. $allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
  11. $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
  12. if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
  13. {
  14. $filename = uniqid()."-".basename($file['name']);
  15. $filename = str_replace(' ','-', $filename);
  16. $filename = strtolower($filename);
  17. $filename = filter_var($filename, FILTER_SANITIZE_STRING);
  18.  
  19. $file['name']= $filename;
  20.  
  21. $uploader =newUploaderCore();
  22. $uploader->upload($file);
  23.  
  24. $customer->fileUpload = $filename;
  25. }

 

De la misma manera, en la línea ~552, dejándolo así:

  1. $customer->birthday =(empty($_POST['years'])?'':(int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'));
  2. if(!Validate::isBirthDate($customer->birthday))
  3.                $this->errors[]=Tools::displayError('Invalid date of birth');
  4.  
  5. // Add this code...
  6. //$customer->fileUpload = 'N/A';
  7. // If you want the uploader as OPTIONAL, remove the comment of the line above.
  8. $file = $_FILES['fileUpload'];
  9. $allowed = array('txt','rtf','doc','docx','pdf','png','jpeg','gif','jpg');
  10. $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
  11. if( file_exists($file['tmp_name'])&& in_array($extension, $allowed))
  12. {
  13. $filename = uniqid()."-".basename($file['name']);
  14. $filename = str_replace(' ','-', $filename);
  15. $filename = strtolower($filename);
  16. $filename = filter_var($filename, FILTER_SANITIZE_STRING);
  17.  
  18. $file['name']= $filename;
  19.  
  20. $uploader =newUploaderCore();
  21. $uploader->upload($file);
  22.  
  23. $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.

  1. <divclass="form-group">
  2.     <labelfor="fileUpload">{l s='Select file'} <sup>*</sup></label>
  3.     <inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
  4.     <inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
  5. </div>

No olvides configurar el formulario para enviar información multimedia en cada <formulario>etiquetas como el siguiente código: (depende del tema)

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

  1. 'connect'=> array(
  2.         'title'=> $this->l('Last visit'),
  3.         'type'=>'datetime',
  4.         'search'=>false,
  5.         'havingFilter'=>true
  6. ),
  7. 'fileUpload'=> array(
  8.         'title'=> $this->l('Uploaded File'),
  9.         'type'=>'text',
  10.         'search'=>true,
  11.         'havingFilter'=>true
  12. )
  13. ));

En el mismo archivo, alrededor de ~821:

  1. // Connections
  2. 'connections'=> $connections,
  3. // Uploaded File
  4. 'fileUpload'=> $fileUpload,
  5. // Referrers
  6. 'referrers'=> $referrers,
  7. '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.