Fix per upload massivo di allegati Prestashop (es. file PDF come schede prodotto)


La colonna "file caricabile" nel csv non si riferisce agli allegati ma alla possibilità per l'utente/visitatore di uploadare dei file dal front-end.

Avevo la necessità di importare centinaia di files come allegati pdf e ho risolto con pochi cambiamenti:

1/ Primo, fai un backup dei tuoi file e del tuo database per ripristinare i tuoi file in caso di errore.

2a/ in classes/attachment.php alla fine del file appena prima l'ultima }, aggiungi questo:

public function addAttachment($autodate = true, $nullValues = false)
{

$return = parent::add($autodate, true);
return $return;
}

public static function addAttachmentImport($filename, $name, $description)
{
$attachment = new Attachment();

$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;
}


public static function addAttchmentProductImport($id_product, $id_attachment)
{
return Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'product_attachment` (`id_attachment`, `id_product`)
VALUES ('.(int)$id_attachment.', '.(int)$id_product.')
');
}

2b/ in controller/admin/AdminImportController.php

cerca

case $this->entities[$this->l('Products')]:

dopo nella lista dei campi disponibili cerca

'delete_existing_images'=> array('label' => $this->l('Delete existing images (0 = No, 1 = Yes)')),
just below, add this

'delete_existing_attachments' => array('label' => $this->l('Delete existing attachments (0 = No, 1 = Yes)')),
'attachment' => array('label' => $this->l('attachment')),
Then in the same file, search for

Feature::cleanPositions();

subito sotto inserisci questo

// 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);
}

}

3/ Inserisci i tuoi file da uploadare nella directory /download

RICORDA i nomi dei files non devono contenere spazi.


4/ Nel tuo fil csv

Puoi aggiungere più file allegati per lo stesso prodotto.

Per ogni file devi specificare il filename, dopo puoi specificare un nome e una descrizione. Nome e descrizione sono opzionali.

Per separare filename, nome e descrizione, usa "|" come separatore.


Aggiungi queste due colonne:

- Attachment (filename|nome|descrizione)

- Delete existing attachment (0 = No, 1 = Yes)

Esempio per la colonna "Attachment" (qui il tuo separatore sarà %):

filename1.pdf|Nome del mio primo pdf|Descrizione del mio primo pdf%filename2.pdf%filename3.pdf

Fine

Hai trovato utile quest'articolo?