getIdShop(); $status = 0; if ($def && (int)$settings['status'] == 1) { $status = 1; } $layout = new JXMegaLayoutLayouts(); $layout->id_shop = $id_shop; $layout->hook_name = $settings['hook']; if (!$new_name_layout) { $layout->layout_name = $settings['layout_name']; } else { $layout->layout_name = $new_name_layout; } $layout->status = $status; $layout->save(); // assign layout to pages if (isset($settings['pages']) && !Tools::isEmpty($settings['pages'])) { $new_layout = new JXMegaLayoutLayouts($layout->id); $new_layout->assignLayoutToPages($new_layout->hook_name, $settings['pages']); } return $layout->id; } protected function createLayoutItems($layout_items, $id_parent = null, $styles = array()) { foreach ($layout_items as $item) { if (!isset($id_parent)) { $id_parent = 0; } $layout = new JXMegaLayoutItems(); $layout->id_parent = $id_parent; $layout->id_layout = $this->id_layout; $id_unique = 'it_' . Tools::passwdGen(12, 'NO_NUMERIC'); switch ($item['type']) { case 'module': $layout->type = $item['type']; $layout->module_name = $item['module_name']; $layout->specific_class = $item['specific_class']; $layout->sort_order = $item['sort_order']; $layout->id_unique = $id_unique; $layout->extra_css = $item['extra_css']; $layout->origin_hook = $item['origin_hook']; break; case 'wrapper': $layout->type = $item['type']; $layout->sort_order = $item['sort_order']; $layout->specific_class = $item['specific_class']; $layout->id_unique = $id_unique; break; case 'row': $layout->type = $item['type']; $layout->sort_order = $item['sort_order']; $layout->specific_class = $item['specific_class']; $layout->id_unique = $id_unique; break; case 'col': $layout->type = $item['type']; $layout->sort_order = $item['sort_order']; $layout->specific_class = $item['specific_class']; $layout->col = $item['col']; $layout->col_xs = $item['col_xs']; $layout->col_sm = $item['col_sm']; $layout->col_md = $item['col_md']; $layout->col_lg = $item['col_lg']; $layout->col_xl = $item['col_xl']; $layout->col_xxl = $item['col_xxl']; $layout->id_unique = $id_unique; break; case 'block': $layout->type = $item['type']; $layout->module_name = $item['module_name']; $layout->specific_class = $item['specific_class']; $layout->sort_order = $item['sort_order']; $layout->id_unique = $id_unique; break; case 'content': $layout->type = $item['type']; $layout->module_name = $item['module_name']; $layout->specific_class = $item['specific_class']; $layout->sort_order = $item['sort_order']; $layout->id_unique = $id_unique; break; } $styles[$id_unique] = $item['id_unique']; $layout->add(); if ($item['child']) { $styles = $this->createLayoutItems($item['child'], $layout->id, $styles); } } return $styles; } protected function restoreLayoutMap($import_layouts, $map = array(), $id_parent = 0, $level = 0) { if (!$import_layouts) { return $map; } foreach ($import_layouts as $layout) { $layout['id_item'] = rand(1, 100000); $child_layouts = $layout['child']; $map[$level][$id_parent][] = $layout; $map = $this->restoreLayoutMap($child_layouts, $map, $layout['id_item'], $level + 1); } return $map; } protected function getLayoutStyles($path, $styles) { if (count($styles) > 0) { $style_obj = new Jxmegalayout(); $style_folder = $path . 'styles/'; $img_folder = $path . 'images/'; if (file_exists($style_folder)) { foreach ($styles as $new_id => $old_id) { if ($style_obj->checkUniqueStylesExists($old_id, $style_folder)) { $style_content = $style_obj->getStylesContent($old_id, $style_folder); $styles_enc = $style_obj->encodeStyles($style_content); $style_obj->saveItemStyles($new_id, $styles_enc, $style_folder, true); copy($style_folder . $new_id . '.css', $style_obj->style_path . $new_id . '.css'); } } } $style_obj->combineAllItemsStyles(); if (file_exists($img_folder)) { Jxmegalayout::recurseCopy($img_folder, _PS_IMG_DIR_); } } } protected function importModuleExtraCss($path, $unique_ids) { $obj = new Jxmegalayout(); foreach ($unique_ids as $new_id => $old_id) { if (!is_dir($path.'files/modules/')) { return true; } if (is_dir($path.'files/modules/'.$old_id) && $css = Tools::scandir($path.'files/modules/'.$old_id, 'css')) { $css_path = $obj->localPath().'views/css/items/modules/'; if (!file_exists($css_path)) { mkdir($css_path, 0777); } if (!file_exists($css_path.$new_id)) { mkdir($css_path.$new_id, 0777); } foreach ($css as $file) { copy($path.'files/modules/'.$old_id.'/'.$file, $css_path.'/'.$new_id.'/'.$file); } } } } public function layoutPreview($path, $file_name, $rawData = false) { $lang = new Jxmegalayout(); $errors = null; if (JXMegaLayoutImport::isZip($path . $file_name)) { $temp_folder = $this->checkTempFolder($path); $zip = new ZipArchive(); $zip->open($path . $file_name); $zip->extractTo($temp_folder); if (!$layout_items = $this->readSettings($temp_folder, 'grid.json')) { $errors = $lang->displayError($lang->l('Grid file is missing')); } $map = $this->restoreLayoutMap($layout_items); $render = new Jxmegalayout(); if (!$layout_settings = $this->readSettings($temp_folder)) { $errors .= $lang->displayError($lang->l('Settings file is missing')); } if ($errors != null) { if ($rawData) { return array('errors' => $errors); } Context::getContext()->smarty->assign(array( 'error' => $errors )); } else { if (!isset($layout_settings['version'])) { $version = false; } else { $version = $layout_settings['version']; } Context::getContext()->smarty->assign(array( 'layout_preview' => $render->renderLayoutAdmin($map, true), 'layout_name' => $layout_settings['layout_name'], 'hook_name' => $layout_settings['hook'], 'pages' => implode(', ', array_keys($layout_settings['pages'])), 'compatibility' => $this->checkCompatibility($version) )); if ((bool)JXMegaLayoutLayouts::getLayoutByName($layout_settings['layout_name'])) { Context::getContext()->smarty->assign(array( 'check_name' => false, )); } if ($rawData) { return array( 'layout_preview' => $render->renderLayoutAdmin($map, true), 'layout_name' => $layout_settings['layout_name'], 'hook_name' => $layout_settings['hook'], 'pages' => implode(', ', array_keys($layout_settings['pages'])), 'compatibility' => $this->checkCompatibility($version), 'check_name' => !(bool)JXMegaLayoutLayouts::getLayoutByName($layout_settings['layout_name']), 'errors' => $errors ); } } return $lang->display($lang->getLocalPath(), 'views/templates/admin/tools/import-preview.tpl'); } else { Context::getContext()->smarty->assign(array( 'error' => $lang->displayError($lang->l('Layout archive must have zip format')) )); return $lang->display($lang->getLocalPath(), 'views/templates/admin/tools/import-preview.tpl'); } } /** * Write layout js and css files * * @param string $old_name * @param string $name * @param string $path * @return bool */ protected function writeLayoutFiles($old_name, $name, $path) { $obj = new Jxmegalayout(); if (!file_exists($obj->css_layouts_path)) { mkdir($obj->css_layouts_path, 0777); } if (!file_exists($obj->js_layouts_path)) { mkdir($obj->js_layouts_path, 0777); } $result = true; $result &= copy($path . 'files/' . $old_name . '.css', $obj->css_layouts_path . $name . '.css'); $result &= copy($path . 'files/' . $old_name . '.js', $obj->js_layouts_path . $name . '.js'); return $result; } /** * @param string $path path to import * @param string $file_name name of the archive * @param bool $def is this layout default(from "default" folder) * @param string $name_layout layout name * * @return bool|string result */ public function importLayout($path, $file_name, $def = false, $name_layout = false) { $temp_folder = JXMegaLayoutImport::checkTempFolder($path); $lang = new Jxmegalayout(); if (JXMegaLayoutImport::isZip($path . $file_name)) { $zip = new ZipArchive(); $zip->open($path . $file_name); $zip->extractTo($temp_folder); if (!$settings = $this->readSettings($temp_folder)) { return false; } if (!$name_layout) { $name_layout = $settings['layout_name']; } if (!$this->id_layout = $this->createLayout($settings, $def, $name_layout)) { return false; } $layout_items = $this->readSettings($temp_folder, 'grid.json'); $styles = $this->createLayoutItems($layout_items); $this->writeLayoutFiles($settings['layout_name'], $name_layout, $temp_folder); $this->getLayoutStyles($temp_folder, $styles); $this->importModuleExtraCss($temp_folder, $styles); Jxmegalayout::cleanFolder($temp_folder); return true; } elseif ($def) { return true; } else { return $lang->displayError($lang->l('Layout archive must have zip format')); } } protected function checkCompatibility($version) { $jxmegalayout = new Jxmegalayout(); if (!$version || Tools::version_compare($version, '1.0', '<')) { return $jxmegalayout->displayError($jxmegalayout->l('This layout archive is not supported')); } return false; } }