Como fazer upload de arquivos em páginas diferentes do PrestaShop-Principais perguntas e respostas sobre programação

Posted On: Sep 14, 2018
Categories: Shopping Carts & Platforms
O PrestaShop é o carrinho de compras mais simples que se adapta a pequenas empresas. Se você está pensando em abrir uma nova loja, o PrestaShop deve ser sua primeira opção. O motivo é que ele é totalmente de código aberto e pode ser modificado de acordo com sua escolha.
O tópico que selecionamos hoje para a sessão de perguntas e respostas é basicamente uma funcionalidade avançada do PrestaShop e é a opção Upload de arquivo em diferentes páginas do PrestaShop. Sendo um comerciante, às vezes você precisa obter alguns arquivos de clientes no formato PDF, Excel, vídeo, MP3, JPEG ou qualquer outro formato de arquivo. Não é melhor ter servidores de nuvem de terceiros para obter arquivos.
Por que não fazer isso por meio do servidor da sua própria loja?
Da mesma forma, às vezes você precisa enviar um arquivo para seus clientes, isso pode ser feito pelo próprio PrestaShop e, portanto, eliminando a necessidade de serviços externos.
A postagem de hoje tem o mesmo objetivo. Ao usar esse recurso, as pessoas recebem alguns erros ou bugs e procuram uma solução para eles. Tentamos hoje dar todas as soluções possíveis para tais problemas. Então, aqui estão as principais perguntas e respostas sobre programação sobre a opção de upload de arquivos no PrestaShop;
Pergunta nº 1
Olá, quero desabilitar a opção de upload no formulário de contato para que ninguém possa me enviar os arquivos por meio dessa opção?
Resposta: Você pode desativar essa opção no back office. Vá para clientes>Atendimento ao cliente. Onde você pode ativar ou desativar a opção conforme sua escolha.
Pergunta nº 2
Olá, quero criar um campo de entrada no formulário de registro do cliente. Por meio desses campos, os visitantes precisam enviar um arquivo contendo a prova de que ele tem direito de acessar a loja. Quero verificar essa prova e, então, permitir seu registro. Como isso é possível?
Resposta: Você precisa modificar o formulário de registro. Você pode acessá-lo por meio de ./themes/YOUR-THEME/authentication.tpl. Logo após o campo de data de nascimento, em torno da linha 130, você tem que adicionar isto;
<divclass="form-group">
<labelfor="fileUpload">{l s='Selecionar arquivo'} *
<inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
Você pode adicionar o campo na classe customer e Controllers(AdminCustomersController.php, AuthController.php, Customer.php).
Primeiro de tudo, nomeie um campo como ‘fileupload’ através do qual você está declarando e criando o campo. Vamos executar esta instrução no SQL para criar o campo na tabela de clientes para armazenar o nome do arquivo.
ALTERTABLE`ps_customer`ADD`fileUpload` VARCHAR(100)NOTNULL;
Em ./classes/Customer.php, por volta da linha ~30, encontraremos as variáveis declaradas. Adicione o novo assim:
classCustomerCoreextendsObjectModel
{
public $id;
public $fileUpload;
public $id_shop;
...
então na linha ~192 adicione o novo campo assim:
'date_add'=> array('tipo'=>self::TYPE_DATE,'validar'=>'isDate','copy_post'=>falso),
'date_upd'=> array('tipo'=>self::TYPE_DATE,'validar'=>'isDate','copy_post'=>falso),
'fileUpload'=> array('type'=>self::TYPE_STRING,'validate'=>'isGenericName'),
),
Agora, dentro de ./controllers/front/AuthController.php em torno da linha ~379, nós prépare as informações:
// Preparando o cliente
$customer =newCustomer();
$lastnameAddress =Tools::getValue('lastname');
$firstnameAddress =Tools::getValue('firstname');
$_POST['lastname']=Tools::getValue('customer_lastname', $lastnameAddress);
$_POST['firstname']=Tools::getValue('customer_firstname', $firstnameAddress);
// Adicione esta linha
$fileUpload =Tools::getValue('fileUpload');
por volta da linha ~423 você encontrará a validação de aniversário, então você tem que criar o campo de validação.
$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('Data de nascimento inválida.');
// Adicione este código...
//$customer->fileUpload = 'N/A';
// Se você quiser o carregador como OPCIONAL, remova o comentário da linha acima.
$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;
}
Da mesma forma, na linha ~552, deixando assim:
$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('Data inválida de nascimento');
// Adicione este código...
//$customer->fileUpload = 'N/A';
// Se você quiser o carregador como OPCIONAL, remova o comentário da linha acima.
$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, $permitido))
{
$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;
}
Dessa forma os arquivos serão enviados na pasta ./upload/, se você quiser especificar outra subpasta basta inserir o caminho em $uploader->upload('my-path/'.$_FILES['fileUpload']);
Para adicionar os campos de entrada no formulário de registro, abra ./themes/YOUR-THEME/authentication.tpl por volta de ~182 e ~509 logo após os campos de aniversário.
<divclass="form-group">
<labelfor="fileUpload">{l s='Selecionar arquivo'} *
<inputtype="hidden"name="MAX_FILE_SIZE"value="2000000"/>
<inputtype="file"class="required form-control"id="fileUpload"name="fileUpload"/>
Não se esqueça de configurar o formulário para enviar informações multimídia em todas as tags, como o código a seguir: (depende do tema)
<formmethod="post"id="create-account_form" ... enctype="multipart/form-data">
Para mostrar o nome do arquivo na lista de clientes, abra./controllers/admin/AdminCustomersController.php em torno da linha ~159 e adicione:
'connect'=> array(
'title'=> $this->l('Última visita'),
'type'=>'datetime',
'search'=>false,
'havingFilter'=>true
),
'fileUpload'=> array(
'title'=> $this->l('Arquivo Enviado'),
'type'=>'text',
'search'=>true,
'havingFilter'=>true
)
));
No mesmo arquivo, em torno de ~821:
// Conexões
'connections'=> $connections,
// Arquivo enviado
'fileUpload'=> $fileUpload,
// Referenciadores
'referrers'=> $referrers,
'show_toolbar'=>true
Limpe o cache após atualizar os arquivos. Se você quiser mostrar os arquivos dentro da Visualização do Cliente, você precisa modificar ./admin/themes/default/template/controllers/customers/helpers/view/view.tpl.coloque este código logo após a validação $customer->birthday nas linhas ~550 e ~420 para executar o carregador em AuthController.php
if(isset($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['name'])&&!empty($_FILES['fileUpload']['tmp_name']))
<código>{
<código> $extensão = array('.txt','.rtf','.doc','.docx','.pdf','.png','.jpeg','.gif','.jpg');
<código> $nomedoarquivo = uniqid().nomebase($_FILES['fileUpload']['nome']);
<código> $nomedoarquivo = str_replace(' ','-', $filename);
$filename = strtolower($filename);
$filename = filter_var($filename, FILTER_SANITIZE_STRING);
$_FILES['fileUpload']['nome']= $filename;
$uploader =newUploaderCore();
$uploader->upload($_FILES['fileUpload']);
$customer->fileUpload = $filename;
}
Pergunta nº 3: Olá, quero que as informações do pedido sejam impressas em uma única página e que eu tenha a opção de selecionar qual parte deve aparecer na página de impressão e qual material não. Por padrão, ele imprime em 3 páginas, o que é um pouco inútil.
Resposta: Vá para override.css em /admin/themes/default/css/override.css de onde você pode alterar o estilo de impressão conforme necessário.
@media print {
p {text-indent: 10%}
}
Você precisa ajustar com a ação css "display:none" com a aba Paypal e outra aba.
Pergunta nº 4
Estou usando o PrestaShop 1.6 e quero usar o import.csv. Importamos as imagens e o texto e definimos a opção de upload do arquivo como 1. Agora me oriente sobre como fazer upload e anexar um arquivo PDF como uma folha de dados com produtos.
Resposta: Então, no AdminImportController.php, adicione essas duas linhas na lista de campos para importação de produtos (case $this->entities[$this->l('Products')])
'delete_existing_attachments'=> array('label'=> $this->l('Excluir anexos existentes (0 = Não, 1 = Sim)')),
'attachment'=> array('label'=> $this->l('attachment')),
Então, no final da função productImport(), após essas linhas:
else{
EstoqueDisponível::setQuantity((int)$product->id,0,(int)$product->quantidade,(int)$this->context->shop->id);
}
};
adicione isto:
// Importação de arquivos de anexos
//exclua anexos existentes se "delete_existing_attachments" estiver definido como 1
if(isset($product->delete_existing_attachments))
if((bool)$product->delete_existing_attachments)
$product->deleteAttachments();
<código> $anexos = get_object_vars($produto);
<código> if(isset($anexos['anexo'])&&!empty($anexos['anexo']))
<código> foreach(explode($this->separador_de_valor_múltiplo, $anexos['anexo'])como $single_attachment)
{
$tab_attachment = explode('|', $single_attachment);
<código> $nome_do_arquivo_de_anexo = isset($tab_attachment[0])? $tab_attachment[0]:'';
<código> $nome_do_arquivo_de_anexo = isset($tab_attachment[1])? trim($tab_attachment[1]): $nome_do_arquivo_de_anexo ;
<código> $attachment_description = isset($tab_attachment[2])? trim($tab_attachment[2]):'';
<código> if(!empty($attachment_filename))
<código> {
<código> $id_attachment =(int)Attachment::addAttachmentImport($nome_do_arquivo_do_anexo, $nome_do_anexo, $descrição_do_anexo);
<código> Anexo::addAttchmentProductImport($product->id, $id_attachment);
<código> Produto::updateCacheAttachment($product->id);
<código> }
<código>
<código> }
No arquivo de classe de anexo (classes/Attachment.php) adicione no final essas duas funções:
publicstaticfunction addAttachmentImport($filename, $name, $description)
{
$attachment =newAttachment();
<código>
<código> $idiomas =Idioma::obterIdiomas();
<código> foreach($idiomas como $idioma)
<código> $attachment->nome[$idioma['id_lang']]= strval($nome);
<código> $attachment->descrição[$idioma['id_lang']]= $descrição;
<código>
<código> $anexo->arquivo = sha1($nomedoarquivo);
<código> $anexo->nome_do_arquivo = $nomedoarquivo;
<código>
<código> $caminho_arquivo = _PS_DOWNLOAD_DIR_.$nome_arquivo;
<código> $anexo->tamanho_arquivo = tamanho_arquivo($caminho_arquivo);
<código> $finfo = finfo_open(TIPO_MIME_DO_FILEINFO);
<código> $anexo->mime = finfo_file($finfo, $path_file);
<código> $anexo->addAttachment();
<código> return(int)$anexo->id;
<código> }
<código> função publicstatic addAttchmentProductImport($id_product, $id_attachment)
<código> {
returnDb::getInstance()->execute('
INSERIR EM `'._DB_PREFIX_.'anexo_do_produto` (`id_anexo`, `id_produto`)
VALORES ('.(int)$id_anexo.', '.(int)$id_produto.')
');
}
exclua o arquivo de cache: /cache/class_index.php Você deve colocar seus arquivos na pasta /Download. No seu arquivo cvs, a coluna "attachment" pode conter isto:
myfile1.doc|Nome do meu arquivo Ou se você quiser anexar vários arquivos a um produto:
myfile1.doc|Nome do meu arquivo%myfile2.pdf| Nome do meu arquivo
Pergunta nº 5
Existe uma maneira de obrigar os visitantes a fazer upload de um documento da empresa na página de registro. Ao pesquisar na Internet, encontrei esses módulos de upload que permitem o upload na página de pedido, produto e carrinho, mas como fazer isso no registro?
Resposta: Infelizmente, já existe um módulo disponível para essa finalidade. Portanto, você precisa fazer uma modificação central ou escrever seu próprio módulo. No entanto, se você não for especialista em código, entre em contato com alguma empresa de desenvolvimento de módulos.
Observação: essas perguntas são respondidas pelos principais desenvolvedores da comunidade e não refletem Módulos FME.
Opção de upload de arquivo no WooCommerce:
O File Uploader para WooCommerce permite que os clientes carreguem arquivos diretamente nas páginas de produtos, carrinhos e checkout, aprimorando a personalização e o gerenciamento de pedidos.