Import z XML do Prestashop 1.6.0.8 – aktualizováno
Hraji si s importem z XML do Prestahopu 1.6.0.8. Začala jsem importem kategorií a hned jsem se narazila na problémy. Především je potřeba se podívat do jakých tabulek je potřeba importovat
ps_category, ps_category_group, ps_category_lang a ps_category_shop (na tu poslední jsem zapomněla a pak jsem hledala problém, proč mi kategorie v BO nefungují). Další věcí, na kterou nesmíme zapomenout jak jsou ukládány categorie v prestashopu, používá se nested set model.
Třída Category používá dvě hezké metody
1 2 |
Category::regenerateEntireNtree(); Category::recalculateLevelDepth(); |
tak doufám, že z pomocí jejich se mi podaří import dokončit. Problém v mém případě importu XML, že v souboru jsou podkategorie uvedené dříve než nadřazená kategorie, takže mám problém se zjištěním hloubky zanoření importované kategorie.
Doplněno: U importu kategorii je nutno naplnit položku level_depth, jinak nebude fungovat zobrazení stromu kategorií.
Nástřel funkce pro přidání obrázků.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
function addImage($id_product,$file,$cover,$position) { $flag = Db::getInstance()->insert('image',array( 'id_product' => $id_product, 'position'=> $position, 'cover' => $cover )); $imagesTypes = ImageType::getImagesTypes('products'); $id_image = Db::getInstance()->Insert_ID(); $path_d = _PS_IMG_DIR_.'p/'.$id_image; $path = _PS_IMG_DIR_.'p/'.$id_image.'/'.$id_image.'.jpg'; mkdir($path_d); $data = file_get_contents($file); $fp = fopen($path, 'w'); fwrite($fp, $data); fclose($fp); $sourceFile['tmp_name']= $path; foreach ($imagesTypes AS $k => $imageType) { if (!ImageManager::resize ( $sourceFile['tmp_name'], _PS_IMG_DIR_.'p/'.$id_image.'/'.$id_image.'-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height'] ) ) echo "Chyba IMG ".$file."<br />"; } } |
Doplněno 2: Tak časem jsem zjistila, že bude lepší používat přímo funkce z prestashopu než psát pro všechno vlastní funkce. Jen je potřeba řádně hledat ve zdrojovém kódu přímo prestashopu. Takže jsem podrobně prozkoumala AdminImportController a výše uvedené jsem nahradila novu funkcí
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
function copyImg($id_entity, $id_image = null, $url, $entity = 'products', $regenerate = true) { $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import'); $watermark_types = explode(',', Configuration::get('WATERMARK_TYPES')); switch ($entity) { default: case 'products': $image_obj = new Image($id_image); $path = $image_obj->getPathForCreation(); break; case 'categories': $path = _PS_CAT_IMG_DIR_.(int)$id_entity; break; case 'manufacturers': $path = _PS_MANU_IMG_DIR_.(int)$id_entity; break; case 'suppliers': $path = _PS_SUPP_IMG_DIR_.(int)$id_entity; break; } $url = str_replace(' ', '%20', trim($url)); // Evaluate the memory required to resize the image: if it's too much, you can't resize it. if (!ImageManager::checkImageMemoryLimit($url)) return false; // 'file_exists' doesn't work on distant file, and getimagesize makes the import slower. // Just hide the warning, the processing will be the same. if (Tools::copy($url, $tmpfile)) { ImageManager::resize($tmpfile, $path.'.jpg'); $images_types = ImageType::getImagesTypes($entity); if ($regenerate) foreach ($images_types as $image_type) { ImageManager::resize($tmpfile, $path.'-'.stripslashes($image_type['name']).'.jpg', $image_type['width'], $image_type['height']); if (in_array($image_type['id_image_type'], $watermark_types)) Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_entity)); } } else { unlink($tmpfile); return false; } unlink($tmpfile); return true; } |
Import kategorií a produktů mám již vyřešen, teď mi zbývá pořešit ještě kombinace u produktů