function fn_get_default_layouts_sources($theme_name = '', $themes_path = '') { $layouts_sources = array(); if (empty($themes_path)) { $themes_path = fn_get_theme_path('[themes]', 'C'); } if (empty($theme_name)) { $installed_themes = fn_get_dir_contents($themes_path, true); foreach ($installed_themes as $theme_name) { $layouts_sources = array_merge($layouts_sources, fn_get_default_layouts_sources($theme_name, $themes_path)); } } else { $layouts_path = $themes_path . '/' . $theme_name . '/layouts/'; $layouts = fn_get_dir_contents($layouts_path, false, true, '.xml'); foreach ($layouts as $layout_name) { $layout_path = fn_normalize_path($layouts_path . $layout_name); if (file_exists($layout_path)) { $layout_data = Exim::instance(Registry::get('runtime.company_id'), 0, $theme_name)->getLayoutData($layout_path, false); if (!empty($layout_data)) { $layout_data['theme_name'] = $theme_name; $layout_data['filename'] = $layout_name; $layouts_sources[] = $layout_data; } } } } return $layouts_sources; }
/** * Installes addon * * @param string $addon Addon to install * @param bool $show_notification Display notification if set to true * @param bool $install_demo If defined as true, addon's demo data will be installed * @return bool True if addons installed successfully, false otherwise */ function fn_install_addon($addon, $show_notification = true, $install_demo = false) { $status = db_get_field("SELECT status FROM ?:addons WHERE addon = ?s", $addon); // Return true if addon is installed if (!empty($status)) { return true; } $addon_scheme = SchemesManager::getScheme($addon); if (empty($addon_scheme)) { // Required add-on was not found in store. return false; } // Unmanaged addons can be installed via console only if ($addon_scheme->getUnmanaged() && !defined('CONSOLE')) { return false; } if ($addon_scheme != false) { // Register custom classes Registry::get('class_loader')->add('', Registry::get('config.dir.addons') . $addon); if ($addon_scheme->isPromo()) { $texts = fn_get_addon_permissions_text(); fn_set_notification('E', __('error'), $texts['text']); return false; } $_data = array('addon' => $addon_scheme->getId(), 'priority' => $addon_scheme->getPriority(), 'dependencies' => implode(',', $addon_scheme->getDependencies()), 'conflicts' => implode(',', $addon_scheme->getConflicts()), 'requirements' => $addon_scheme->getRequirements(), 'version' => $addon_scheme->getVersion(), 'separate' => $addon_scheme->getSettingsLayout() == 'separate' ? 1 : 0, 'has_icon' => $addon_scheme->hasIcon(), 'unmanaged' => $addon_scheme->getUnmanaged(), 'status' => 'D'); // Check system requirements (needed versions, installed extensions, etc.) if (!$addon_scheme->checkRequirements($_data['requirements'])) { return false; } $dependencies = SchemesManager::getInstallDependencies($_data['addon']); if (!empty($dependencies)) { fn_set_notification('W', __('warning'), __('text_addon_install_dependencies', array('[addon]' => implode(',', $dependencies)))); return false; } if ($addon_scheme->callCustomFunctions('before_install') == false) { fn_uninstall_addon($addon, false); return false; } // Add add-on to registry Registry::set('addons.' . $addon, array('status' => 'D', 'priority' => $_data['priority'])); // Execute optional queries if ($addon_scheme->processQueries('install', Registry::get('config.dir.addons') . $addon) == false) { fn_uninstall_addon($addon, false); return false; } if (fn_update_addon_settings($addon_scheme) == false) { fn_uninstall_addon($addon, false); return false; } db_query("REPLACE INTO ?:addons ?e", $_data); foreach ($addon_scheme->getAddonTranslations() as $translation) { db_query("REPLACE INTO ?:addon_descriptions ?e", array('lang_code' => $translation['lang_code'], 'addon' => $addon_scheme->getId(), 'name' => $translation['value'], 'description' => $translation['description'])); } if ($original = $addon_scheme->getOriginals()) { db_query("REPLACE INTO ?:original_values ?e", array('msgctxt' => 'Addon:' . $addon, 'msgid' => $original['name'])); db_query("REPLACE INTO ?:original_values ?e", array('msgctxt' => 'AddonDescription:' . $addon, 'msgid' => $original['description'])); } // Install templates fn_install_addon_templates($addon_scheme->getId()); // Put this addon settings to the registry $settings = Settings::instance()->getValues($addon_scheme->getId(), Settings::ADDON_SECTION, false); if (!empty($settings)) { Registry::set('settings.' . $addon, $settings); $addon_data = Registry::get('addons.' . $addon); Registry::set('addons.' . $addon, fn_array_merge($addon_data, $settings)); } // Add optional language variables $language_variables = $addon_scheme->getLanguageValues(false); if (!empty($language_variables)) { db_query('REPLACE INTO ?:language_values ?m', $language_variables); } // Get only original values $language_variables = $addon_scheme->getLanguageValues(true); if (!empty($language_variables)) { db_query('REPLACE INTO ?:original_values ?m', $language_variables); } if (fn_allowed_for('ULTIMATE')) { foreach (fn_get_all_companies_ids() as $company) { ProductTabs::instance($company)->createAddonTabs($addon_scheme->getId(), $addon_scheme->getTabOrder()); } } else { ProductTabs::instance()->createAddonTabs($addon_scheme->getId(), $addon_scheme->getTabOrder()); } // Execute custom functions if ($addon_scheme->callCustomFunctions('install') == false) { fn_uninstall_addon($addon, false); return false; } if ($show_notification == true) { fn_set_notification('N', __('notice'), __('text_addon_installed', array('[addon]' => $addon_scheme->getName()))); } // If we need to activate addon after install, call "update status" procedure if ($addon_scheme->getStatus() != 'D') { fn_update_addon_status($addon, $addon_scheme->getStatus(), false); } if (file_exists(Registry::get('config.dir.addons') . $addon . '/layouts.xml')) { if (fn_allowed_for('ULTIMATE')) { foreach (fn_get_all_companies_ids() as $company) { $layouts = Layout::instance($company)->getList(); foreach ($layouts as $layout_id => $layout) { Exim::instance($company, $layout_id)->importFromFile(Registry::get('config.dir.addons') . $addon . '/layouts.xml'); } } } else { $layouts = Layout::instance()->getList(); foreach ($layouts as $layout_id => $layout) { Exim::instance(0, $layout_id)->importFromFile(Registry::get('config.dir.addons') . $addon . '/layouts.xml'); } } } // Clean cache fn_clear_cache(); if ($install_demo) { $addon_scheme->processQueries('demo', Registry::get('config.dir.addons') . $addon); if ($addon_scheme->callCustomFunctions('demo') == false) { fn_uninstall_addon($addon, false); return false; } } return true; } else { // Addon was not installed because scheme is not exists. return false; } }
/** * Installs theme * * @param int $layout_id layout ID to create logo for * @param string $theme_name theme name * @param int $company_id company ID * @return boolean always true */ function fn_install_theme($theme_name, $company_id = null, $install_layouts = true) { // Copy files fn_install_theme_files($theme_name, $theme_name, true); Settings::instance()->updateValue('theme_name', $theme_name, '', true, $company_id); $repo_dest = fn_get_theme_path('[themes]/' . $theme_name, 'C', $company_id, false); $logo_ids = array(); // Import theme layout $layouts = fn_get_dir_contents($repo_dest . '/layouts/', false, true, '.xml'); // FIXME: Backward compability for layouts if (empty($layouts) && file_exists($repo_dest . '/layouts.xml')) { $layouts = array('../layouts.xml'); } if (!empty($layouts) && $install_layouts) { foreach ($layouts as $layout_name) { $layout_path = fn_normalize_path($repo_dest . '/layouts/' . $layout_name); if (file_exists($layout_path)) { $layout_id = Exim::instance($company_id, 0, $theme_name)->importFromFile($layout_path, array('override_by_dispatch' => true, 'clean_up' => true, 'import_style' => 'create')); if (empty($layout_id)) { continue; } $layout_data = Layout::instance()->get($layout_id); $_o_ids = fn_create_theme_logos_by_layout_id($theme_name, $layout_id, $company_id, false, $layout_data['style_id']); $logo_ids = array_merge($logo_ids, $_o_ids); } } } else { $params = array('theme_name' => $theme_name); $exists = Layout::instance($company_id)->getList($params); if (empty($exists)) { $layout_id = Layout::instance($company_id)->update(array('name' => __('main'), 'theme_name' => $theme_name, 'is_default' => 1)); $layout_data = Layout::instance()->get($layout_id); $logo_ids = fn_create_theme_logos_by_layout_id($theme_name, $layout_id, $company_id, false, $layout_data['style_id']); } } return $logo_ids; }
public static function restoreSettingsAndCSS($upgrade_dirs) { // Restore langvars - for all languages except EN and RU $languages = Lang::getLanguages(); $except_langs = array('en', 'ru'); foreach ($languages as $language) { $backup_file = $upgrade_dirs['backup_settings'] . 'lang_' . $language['lang_code'] . '.bak'; if (!in_array($language['lang_code'], $except_langs) and file_exists($backup_file)) { LanguageValues::updateLangVar(unserialize(fn_get_contents($backup_file)), $language['lang_code']); } } // Restore blocks $old_company_id = Registry::get('runtime.company_id'); foreach ($upgrade_dirs['backup_company_settings'] as $company_id => $dir) { Registry::set('runtime.company_id', $company_id); $backup_file = $dir . 'blocks.xml'; if (file_exists($backup_file)) { if (version_compare(PRODUCT_VERSION, '4.1.1', '>=')) { Registry::set('runtime.layout', Layout::instance()->getDefault()); } Exim::instance($company_id, fn_twg_get_default_layout_id())->importFromFile($backup_file); } } Registry::set('runtime.company_id', $old_company_id); // Restore settings if addon was connected $restored_settings = array('my_private_key', 'my_public_key', 'his_public_key', 'email', 'customer_connections', 'admin_connection'); $settings = array(); foreach ($_SESSION['twigmo_backup_settings'] as $setting => $value) { if (in_array($setting, $restored_settings)) { $settings[$setting] = $value; } } $settings['version'] = TWIGMO_VERSION; unset($_SESSION['twigmo_backup_settings']); TwigmoSettings::set($settings); $connector = new TwigmoConnector(); if (!$connector->updateConnections(true)) { $connector->disconnect(array(), true); } // Restore images self::copyFiles($upgrade_dirs['backup_files']['media_frontend'], $upgrade_dirs['installed']['media_frontend']); return true; }
/** * Copy blocks from one company to another * @param $array snapping IDs of the company blocks are copied to * @param int $company_id company ID to copy blocks to */ public function copy($snapping_ids, $company_id) { static $_unique_blocks = array(); $exim = Exim::instance($company_id); $block_matches = array(); $blocks = db_get_hash_array("SELECT ?:bm_blocks.* FROM ?:bm_blocks LEFT JOIN ?:bm_snapping ON ?:bm_snapping.block_id = ?:bm_blocks.block_id WHERE ?:bm_snapping.snapping_id IN (?n)", 'block_id', array_keys($snapping_ids)); foreach ($blocks as $block_id => $block) { $descriptions = db_get_hash_array("SELECT * FROM ?:bm_blocks_descriptions WHERE block_id = ?i", 'lang_code', $block_id); // Get unique block key $unique_key = $exim->getUniqueBlockKey($block['type'], $block['properties'], $descriptions[CART_LANGUAGE]['name']); if (isset($_unique_blocks[$company_id][$unique_key])) { $new_block_id = $_unique_blocks[$company_id][$unique_key]; } else { $block['company_id'] = $company_id; unset($block['block_id']); $new_block_id = db_query("INSERT INTO ?:bm_blocks ?e", $block); foreach ($descriptions as $description) { $description['block_id'] = $new_block_id; db_query("INSERT INTO ?:bm_blocks_descriptions ?e", $description); } $block_content = db_get_array("SELECT * FROM ?:bm_blocks_content WHERE block_id = ?i AND snapping_id = 0 AND object_id = 0 AND object_type = ''", $block_id); foreach ($block_content as $content) { $content['block_id'] = $new_block_id; db_query("INSERT INTO ?:bm_blocks_content ?e", $content); } $_unique_blocks[$company_id][$unique_key] = $new_block_id; } $block_matches[$block_id] = $new_block_id; } //update snappings foreach ($block_matches as $old_block_id => $new_block_id) { db_query("UPDATE ?:bm_snapping SET block_id = ?i WHERE block_id = ?i AND snapping_id IN (?n)", $new_block_id, $old_block_id, $snapping_ids); } }
} fn_mkdir(dirname(Registry::get('config.dir.layouts') . $filename)); fn_put_contents(Registry::get('config.dir.layouts') . $filename, $content); fn_set_notification('N', __('notice'), __('text_exim_data_exported')); // Direct download if ($_REQUEST['output'] == 'D') { return array(CONTROLLER_STATUS_REDIRECT, 'block_manager.manage?meta_redirect_url=block_manager.get_file%26filename=' . $_REQUEST['filename']); // Output to screen } elseif ($_REQUEST['output'] == 'C') { return array(CONTROLLER_STATUS_REDIRECT, 'block_manager.get_file?to_screen=Y&filename=' . $_REQUEST['filename']); } } if ($mode == 'import_layout') { $data = fn_filter_uploaded_data('filename'); if (!empty($data[0]['path'])) { $result = Exim::instance()->importFromFile($data[0]['path'], $_REQUEST); if ($result) { fn_set_notification('N', __('notice'), __('text_exim_data_imported_clear')); } } } if (defined('AJAX_REQUEST')) { if ($result === true) { Registry::get('ajax')->assign('status', 'OK'); } elseif (is_numeric($result)) { Registry::get('ajax')->assign('id', intval($result)); Registry::get('ajax')->assign('status', 'OK'); } else { Registry::get('ajax')->assign('status', 'FAIL'); } Registry::get('ajax')->assign('mode', $mode);