/** * Gets available languages * @return array languages list */ public function getLanguages() { if (empty($this->languages)) { $this->languages = Languages::getAll(); } return $this->languages; }
function fn_rus_spsr_install() { $service = array('status' => 'A', 'module' => 'spsr', 'code' => 'spsr', 'sp_file' => '', 'description' => 'СПСР'); $service['service_id'] = db_query('INSERT INTO ?:shipping_services ?e', $service); foreach (Languages::getAll() as $service['lang_code'] => $lang_data) { db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } }
function fn_rus_dellin_install() { $service = array('status' => 'A', 'module' => 'dellin', 'code' => '301', 'sp_file' => '', 'description' => 'Деловые линии'); $service_id = db_query('INSERT INTO ?:shipping_services ?e', $service); $service['service_id'] = $service_id; foreach (Languages::getAll() as $service['lang_code'] => $lang_data) { db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } }
function fn_rus_pecom_install() { $objects = fn_rus_pecom_schema(); foreach ($objects as $object) { $service = array('status' => $object['status'], 'module' => $object['module'], 'code' => $object['code'], 'sp_file' => $object['sp_file'], 'description' => $object['description']); $service['service_id'] = db_query('INSERT INTO ?:shipping_services ?e', $service); foreach (Languages::getAll() as $service['lang_code'] => $lang_data) { db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } } }
function fn_rus_edost_install() { $services = fn_get_schema('edost', 'services', 'php', true); foreach ($services as $service) { $service_id = db_query('INSERT INTO ?:shipping_services ?e', $service); $service['service_id'] = $service_id; foreach (Languages::getAll() as $service['lang_code'] => $lang_data) { db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } } }
public function delete($id) { $data = array(); $status = Response::STATUS_BAD_REQUEST; if (LLanguages::deleteLanguages(array($id))) { $status = Response::STATUS_NO_CONTENT; } elseif (!fn_notification_exists('extra', 'language_is_default')) { $status = Response::STATUS_NOT_FOUND; } return array('status' => $status, 'data' => $data); }
function fn_rus_pickpoint_install() { $service = array('status' => 'A', 'module' => 'pickpoint', 'code' => 'pickpoint', 'sp_file' => '', 'description' => 'Pickpoint'); $service['service_id'] = db_query('INSERT INTO ?:shipping_services ?e', $service); foreach (Languages::getAll() as $service['lang_code'] => $lang_data) { db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } db_query("CREATE TABLE IF NOT EXISTS `?:rus_pickpoint_postamat` (\n `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,\n `city_name` varchar(150) NOT NULL,\n `country_name` varchar(150) NOT NULL,\n `region_name` varchar(150) NOT NULL,\n `number` varchar(20) NOT NULL,\n `name` varchar(250) NOT NULL,\n `work_time` varchar(100) NOT NULL,\n `post_code` varchar(16) NOT NULL,\n `address` varchar(255) NOT NULL,\n PRIMARY KEY (`id`)\n ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;"); $http_url = fn_get_storefront_protocol(); $url = $http_url . '://e-solution.pickpoint.ru/api/'; RusPickpoint::postamatPickpoint($url . 'postamatlist'); }
function fn_rus_russianpost_install() { $objects = fn_rus_russianpost_schema(); foreach ($objects as $object) { $service = array('status' => $object['status'], 'module' => $object['module'], 'code' => $object['code'], 'sp_file' => $object['sp_file'], 'description' => $object['description']); $service_id = db_get_field('SELECT service_id FROM ?:shipping_services WHERE module = ?s AND code = ?s', $object['module'], $object['code']); if (empty($service_id)) { $service['service_id'] = db_query('INSERT INTO ?:shipping_services ?e', $service); foreach (Languages::getAll() as $service['lang_code'] => $lang_data) { db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } } } }
function fn_rus_pickup_install() { $service = array('status' => 'A', 'module' => 'pickup', 'code' => 'pickup', 'sp_file' => '', 'description' => 'Pickup'); $service['service_id'] = db_get_field('SELECT service_id FROM ?:shipping_services WHERE module = ?s AND code = ?s', $service['module'], $service['code']); if (empty($service['service_id'])) { $service['service_id'] = db_query('INSERT INTO ?:shipping_services ?e', $service); } $languages = Languages::getAll(); foreach ($languages as $lang_code => $lang_data) { if ($lang_code == 'ru') { $service['description'] = "Самовывоз"; } else { $service['description'] = "Pickup"; } $service['lang_code'] = $lang_code; db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } }
function fn_yandex_delivery_install() { $service = array('status' => 'A', 'module' => 'yandex', 'code' => 'yandex', 'sp_file' => '', 'description' => 'Yandex.Delivery'); $service['service_id'] = db_get_field('SELECT service_id FROM ?:shipping_services WHERE module = ?s AND code = ?s', $service['module'], $service['code']); if (empty($service['service_id'])) { $service['service_id'] = db_query('INSERT INTO ?:shipping_services ?e', $service); } $languages = Languages::getAll(); foreach ($languages as $lang_code => $lang_data) { if ($lang_code == 'ru') { $service['description'] = "Яндекс.Доставка"; } else { $service['description'] = "Yandex.Delivery"; } $service['lang_code'] = $lang_code; db_query('INSERT INTO ?:shipping_service_descriptions ?e', $service); } }
function fn_settings_actions_addons_banners_banner_multilang($new_value, $old_value) { if ($new_value == 'N') { $lang_codes = Languages::getAll(); unset($lang_codes[DEFAULT_LANGUAGE]); $banners_multilang = array(); foreach ($lang_codes as $lang_code => $lang_data) { list($banners) = fn_get_banners(array(), $lang_code); foreach ($banners as $banner) { $banners_multilang[$lang_code][$banner['banner_id']] = $banner; } } list($banners) = fn_get_banners(array(), DEFAULT_LANGUAGE); foreach ($banners as $banner) { if ($banner['type'] != 'G') { continue; } $main_image_id = !empty($banner['main_pair']['image_id']) ? $banner['main_pair']['image_id'] : 0; foreach ($lang_codes as $lang_code => $lang_data) { $banner_lang = $banners_multilang[$lang_code][$banner['banner_id']]; $lang_image_id = !empty($banner_lang['main_pair']['image_id']) ? $banner_lang['main_pair']['image_id'] : 0; if ($lang_image_id != 0 && ($main_image_id == 0 || $main_image_id != $lang_image_id)) { fn_delete_image($lang_image_id, $banner_lang['main_pair']['pair_id'], 'promo'); $lang_image_id = 0; } if ($lang_image_id == 0 && $main_image_id != 0) { $data_banner_image = array('banner_id' => $banner['banner_id'], 'lang_code' => $lang_code); $banner_image_id = db_query("INSERT INTO ?:banner_images ?e", $data_banner_image); fn_add_image_link($banner_image_id, $banner['main_pair']['pair_id']); $data_desc = array('description' => empty($banner['main_pair']['icon']['alt']) ? '' : $banner['main_pair']['icon']['alt'], 'object_holder' => 'images'); fn_create_description('common_descriptions', 'object_id', $main_image_id, $data_desc); } db_query("UPDATE ?:banner_descriptions SET url = ?s WHERE banner_id = ?i", $banner['url'], $banner['banner_id']); } } } return true; }
/** * Updates product feature variant * * @param int $feature_id Feature identifier * @param array $feature_type Feature type * @param array $variant Feature variant data * @param string $lang_code 2-letters language code * * @return array $variant_id Feature variant identifier */ function fn_update_product_feature_variant($feature_id, $feature_type, $variant, $lang_code = DESCR_SL) { if (empty($variant['variant']) && (!isset($variant['variant']) || $variant['variant'] !== '0')) { return false; } $variant['feature_id'] = $feature_id; if (isset($variant['variant_id'])) { $variant_id = db_get_field('SELECT variant_id FROM ?:product_feature_variants WHERE variant_id = ?i', $variant['variant_id']); unset($variant['variant_id']); } if (empty($variant_id)) { $join = db_quote('INNER JOIN ?:product_feature_variants fv ON fv.variant_id = fvd.variant_id'); $variant_id = db_get_field("SELECT fvd.variant_id FROM ?:product_feature_variant_descriptions AS fvd {$join} WHERE variant = ?s AND feature_id = ?i", $variant['variant'], $feature_id); } if (empty($variant_id)) { $variant_id = $variant['variant_id'] = db_query("INSERT INTO ?:product_feature_variants ?e", $variant); foreach (Languages::getAll() as $variant['lang_code'] => $_v) { db_query("INSERT INTO ?:product_feature_variant_descriptions ?e", $variant); } } else { db_query("UPDATE ?:product_feature_variants SET ?u WHERE variant_id = ?i", $variant, $variant_id); db_query("UPDATE ?:product_feature_variant_descriptions SET ?u WHERE variant_id = ?i AND lang_code = ?s", $variant, $variant_id, $lang_code); } if ($feature_type == 'N') { // number db_query('UPDATE ?:product_features_values SET ?u WHERE variant_id = ?i AND lang_code = ?s', array('value_int' => $variant['variant']), $variant_id, $lang_code); } return $variant_id; }
/** * @deprecated * * Gets list of all languages defined in store * used for adding desciptions and etc. * * @param boolean $edit Flag that determines if language list is used to be edited * @return array $languages Languages list */ function fn_get_translation_languages($edit = false) { return Languages::getAll($edit); }
/** * @deprecated * * Updates language * * @param array $language_data Language data * @param string $lang_id language id * @return string language id */ function fn_update_language($language_data, $lang_id) { return Languages::update($language_data, $lang_id); }
protected function getLangCodes() { return array_keys(Languages::getAll()); }
function fn_banners_install() { // FIXME if (DEFAULT_LANGUAGE != 'en') { db_query("UPDATE ?:banner_images SET lang_code = ?s WHERE lang_code = ?s", DEFAULT_LANGUAGE, 'en'); // Demo data } $banners = db_get_array("SELECT ?:banners.banner_id, ?:banner_images.banner_image_id FROM ?:banners LEFT JOIN ?:banner_images ON ?:banner_images.banner_id = ?:banners.banner_id AND ?:banner_images.lang_code = ?s", DEFAULT_LANGUAGE); foreach ($banners as $k => $v) { $banners[$k]['main_pair'] = fn_get_image_pairs($v['banner_image_id'], 'promo', 'M', true, false, DEFAULT_LANGUAGE); } foreach (Languages::getAll() as $lang_code => $v) { fn_banners_clone($banners, $lang_code); } return true; }
function fn_banners_install() { $banners = db_get_hash_multi_array("SELECT ?:banners.banner_id, ?:banner_images.banner_image_id, ?:banner_images.lang_code FROM ?:banners LEFT JOIN ?:banner_images ON ?:banner_images.banner_id = ?:banners.banner_id", array('lang_code', 'banner_id')); $langs = array_keys(Languages::getAll()); $need_clone_langs = array_diff($langs, array_keys($banners)); if (!empty($need_clone_langs)) { $clone_lang = DEFAULT_LANGUAGE; if (in_array(DEFAULT_LANGUAGE, $need_clone_langs)) { $clone_lang = 'en'; } foreach ($banners[$clone_lang] as $banner_id => &$banner) { $banner['main_pair'] = fn_get_image_pairs($banner['banner_image_id'], 'promo', 'M', true, false, $clone_lang); } foreach ($need_clone_langs as $need_clone_lang) { fn_banners_clone($banners[$clone_lang], $need_clone_lang); } } foreach ($banners['en'] as $banner_id => &$banner) { $banner['main_pair'] = fn_get_image_pairs($banner['banner_image_id'], 'promo', 'M', true, false, 'en'); } if (!in_array('en', $langs)) { $banner_images_ids = db_get_fields("SELECT banner_image_id FROM ?:banner_images WHERE lang_code = ?s", 'en'); foreach ($banner_images_ids as $banner_image_id) { fn_delete_image_pairs($banner_image_id, 'promo'); } if (!empty($banner_images_ids)) { db_query("DELETE FROM ?:banner_images WHERE banner_image_id IN (?n)", $banner_images_ids); } } return true; }
function fn_yml_add_logs() { $setting = Settings::instance()->getSettingDataByName('log_type_yml_export'); if (!$setting) { $setting = array('name' => 'log_type_yml_export', 'section_id' => 12, 'section_tab_id' => 0, 'type' => 'N', 'position' => 10, 'is_global' => 'N', 'edition_type' => 'ROOT,VENDOR', 'value' => '#M#export'); $descriptions = array(); foreach (Languages::getAll() as $lang_code => $_lang) { $descriptions[] = array('object_type' => Settings::SETTING_DESCRIPTION, 'lang_code' => $lang_code, 'value' => __('yml2_log')); } $setting_id = Settings::instance()->update($setting, null, $descriptions, true); $variant_id = Settings::instance()->updateVariant(array('object_id' => $setting_id, 'name' => 'export', 'position' => 5)); foreach (Languages::getAll() as $lang_code => $_lang) { $description = array('object_id' => $variant_id, 'object_type' => Settings::VARIANT_DESCRIPTION, 'lang_code' => $lang_code, 'value' => __('yml2_log_export')); Settings::instance()->updateDescription($description); } } return true; }
/** * @deprecated * * Gets only active languages list (as lang_code => name) * * @param bool $include_hidden if true get hiddenlanguages too * @return array Currencies list */ function fn_get_simple_languages($include_hidden = false) { return Languages::getSimpleLanguages($include_hidden); }
/** * 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' => isset($translation['description']) ? $translation['description'] : '')); } foreach ($addon_scheme->getLanguages() as $lang_code => $_v) { $lang_code = strtolower($lang_code); $path = $addon_scheme->getPoPath($lang_code); if (!empty($path)) { Languages::installLanguagePack($path, array('reinstall' => true, 'validate_lang_code' => $lang_code)); } } // 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; } }
public static function setActualLangValues() { $addons = self::getInstalledAddons(); $languages = db_get_fields("SELECT lang_code FROM ?:languages"); foreach ($addons as $addon) { $addon_scheme = AddonSchemesManager::getScheme($addon); if (!empty($addon_scheme)) { // Add optional language variables $language_variables = $addon_scheme->getLanguageValues(); if (!empty($language_variables)) { db_query('REPLACE INTO ?:language_values ?m', $language_variables); } foreach ($languages as $lang_code) { $description = $addon_scheme->getDescription($lang_code); $addon_name = $addon_scheme->getName($lang_code); db_query("UPDATE ?:addon_descriptions SET description = ?s, name = ?s WHERE addon = ?s AND lang_code = ?s", $description, $addon_name, $addon, $lang_code); } $tabs = $addon_scheme->getSections(); if (!empty($tabs)) { foreach ($tabs as $tab_index => $tab) { $addon_section_id = db_get_field("SELECT section_id FROM ?:settings_sections WHERE name = ?s AND parent_id = (SELECT section_id FROM ?:settings_sections WHERE name = ?s)", $tab['id'], $addon); //Can't check edition here, so just skip description update if addon section was not found. if (!empty($addon_section_id)) { fn_update_addon_settings_descriptions($addon_section_id, Settings::SECTION_DESCRIPTION, $tab['translations']); $settings = $addon_scheme->getSettings($tab['id']); foreach ($settings as $k => $setting) { $setting_id = db_get_field("SELECT object_id FROM ?:settings_objects WHERE name = ?s AND section_tab_id = ?i", $setting['id'], $addon_section_id); if (!empty($setting_id)) { fn_update_addon_settings_descriptions($setting_id, Settings::SETTING_DESCRIPTION, $setting['translations']); if (isset($setting['variants'])) { foreach ($setting['variants'] as $variant_k => $variant) { $variant_id = db_get_field("SELECT variant_id FROM ?:settings_variants WHERE object_id = ?i AND name = ?s", $setting_id, $variant['id']); if (!empty($variant_id)) { fn_update_addon_settings_descriptions($variant_id, Settings::VARIANT_DESCRIPTION, $variant['translations']); } } } } } } } } } } General::connectToOriginalDB(array('table_prefix' => General::formatPrefix())); $prefix = Registry::get('config.table_prefix'); /* db_query("INSERT INTO ?:state_descriptions (SELECT state_id, ?s as lang_code, state FROM " . $prefix . "state_descriptions WHERE lang_code = ?s) ON DUPLICATE KEY UPDATE ?:state_descriptions.state_id = ?:state_descriptions.state_id", General::$default_language, DEFAULT_LANGUAGE); if (fn_allowed_for('ULTIMATE')) { db_query("INSERT INTO ?:ult_language_values (SELECT ?s as lang_code, name, value, company_id FROM " . $prefix . "ult_language_values WHERE lang_code = ?s) ON DUPLICATE KEY UPDATE ?:ult_language_values.value = ?:ult_language_values.value", General::$default_language, DEFAULT_LANGUAGE); } $new_ver_langs = db_get_fields("SELECT lang_code FROM " . $prefix . "languages"); foreach (db_get_fields("SELECT lang_code FROM ?:languages") as $lang_code) { $_lang_code = in_array($lang_code, $new_ver_langs) ? $lang_code : DEFAULT_LANGUAGE; //We can update only core settings descriptions because addons descriptions were updated during settings restore. db_query("INSERT INTO ?:settings_descriptions " . "(SELECT object_id, object_type, ?s as lang_code, value, tooltip FROM " . $prefix . "settings_descriptions WHERE object_id IN " . "(SELECT object_id FROM " . $prefix . "settings_objects WHERE section_id IN " . "(SELECT section_id FROM " . $prefix . "settings_sections WHERE type = 'CORE')) " . "AND lang_code = ?s) " . "ON DUPLICATE KEY UPDATE ?:settings_descriptions.value = " . $prefix . "settings_descriptions.value, ?:settings_descriptions.tooltip = " . $prefix . "settings_descriptions.tooltip", $lang_code, $_lang_code ); db_query("INSERT INTO ?:language_values " . "(SELECT ?s as lang_code, name, value FROM " . $prefix . "language_values WHERE lang_code = ?s) " . "ON DUPLICATE KEY UPDATE ?:language_values.name = " . $prefix . "language_values.name", $lang_code, $_lang_code ); } db_query("REPLACE INTO ?:original_values (SELECT * FROM " . $prefix . "original_values)"); */ $langs = db_get_fields("SELECT lang_code FROM ?:languages"); $po_path = Registry::get('config.dir.lang_packs'); $params = array('install_newly_added' => true, 'reinstall' => true); foreach ($langs as $lang_code) { $params['force_lang_code'] = $lang_code; $params['validate_lang_code'] = true; if (!is_dir($po_path . $lang_code)) { $params['validate_lang_code'] = false; if (is_dir($po_path . General::$default_language)) { $lang_code = General::$default_language; $params['force_lang_code'] = General::$default_language; } elseif (is_dir($po_path . 'en')) { $lang_code = 'en'; $params['force_lang_code'] = 'en'; } } $result = Languages::installCrowdinPack($po_path . $lang_code, $params); } return true; }
/** * Imports nessesared languages * * @return bool true on success, false otherwise */ public function setupLanguages($demo) { $languages = $this->_cart_settings['languages']; if (!empty($languages)) { foreach ($languages as $lang_code) { $pack_path = Registry::get('config.dir.install') . App::DB_LANG . "/{$lang_code}/{$lang_code}.po"; $edition_pack_path = Registry::get('config.dir.install') . App::DB_LANG . "/{$lang_code}/{$lang_code}" . '_' . fn_get_edition_acronym(PRODUCT_EDITION) . '.po'; if (!file_exists($pack_path)) { App::instance()->setNotification('W', 'Missing language pack', 'Unable to find: ' . $pack_path . ' (skipped)', true); continue; } $this->_parseSql(Registry::get('config.dir.install') . App::DB_LANG . "/{$lang_code}/" . App::DB_LANG_DATA, 'text_installing_additional_language', array('lang_code' => $lang_code)); if ($demo) { $this->_parseSql(Registry::get('config.dir.install') . App::DB_LANG . "/{$lang_code}/" . App::DB_LANG_DEMO, 'text_installing_additional_language', array('lang_code' => $lang_code)); } // Install language variables from PO files $params = array('lang_code' => $lang_code); $_langs = Languages::get($params); $is_exists = count($_langs) > 0 ? true : false; Languages::installLanguagePack($pack_path, array('reinstall' => $is_exists)); if (file_exists($edition_pack_path)) { Languages::installLanguagePack($edition_pack_path, array('reinstall' => true)); } } // share all additional languages if (fn_allowed_for('ULTIMATE')) { db_query("REPLACE INTO ?:ult_objects_sharing (`share_company_id`, `share_object_id`, `share_object_type`) " . "SELECT ?:companies.company_id, ?:languages.lang_id, 'languages' " . "FROM ?:languages INNER JOIN ?:companies;"); } $languages = db_get_hash_array("SELECT * FROM ?:languages", 'lang_code'); Registry::set('languages', $languages); return true; } else { return false; } }
function fn_qwintry_create_shipping_service() { $service = array('status' => 'A', 'module' => 'qwintry', 'code' => 'Qwintry Air'); $service_id = db_query('INSERT INTO ?:shipping_services ?e', $service); $service_description = array('service_id' => $service_id, 'description' => 'Qwintry Air'); foreach (Languages::getAll() as $service_description['lang_code'] => $_v) { db_query("INSERT INTO ?:shipping_service_descriptions ?e", $service_description); } $section_id = db_get_field('SELECT section_id FROM ?:settings_sections WHERE name = ?s', 'Shippings'); $setting = array('edition_type' => 'ROOT', 'name' => 'qwintry_enabled', 'section_id' => $section_id, 'section_tab_id' => 0, 'type' => 'C', 'value' => 'Y', 'position' => 35, 'is_global' => 'N', 'handler' => '', 'parent_id' => 0); $setting_id = db_query('INSERT INTO ?:settings_objects ?e', $setting); $setting_description = array('object_id' => $setting_id, 'object_type' => 'O', 'value' => 'Enable Qwintry Air', 'tooltip' => ''); foreach (Languages::getAll() as $setting_description['lang_code'] => $_v) { db_query("INSERT INTO ?:settings_descriptions ?e", $setting_description); } }
protected function insert() { $table_name = $this->getTableName(); $description_table_name = $this->getDescriptionTableName(); $primary_field = $this->getPrimaryField(); $_data = $this->prepareAttributes(); $result = db_query("INSERT INTO {$table_name} ?e", $_data); if ($this->primaryAutoIncrement()) { $this->id = $result; } else { $this->id = $this->{$primary_field}; } if (!empty($description_table_name)) { $_data[$primary_field] = $this->id; foreach (Languages::getAll() as $_data['lang_code'] => $v) { db_query("INSERT INTO {$description_table_name} ?e", $_data); } } $this->{$primary_field} = $this->id; return true; }
/** * Updates SEO names according to path when parent was changed for object. * * @param integer $object_id object ID * @param string $object_type object type * @param array $params params * * @return bool Whether SEO-names were regenerated successfully. */ function fn_seo_update_tree_object($object_id, $object_type, $params) { if (isset($params['old_id_path']) && empty($params['old_id_path'])) { return false; // newly created object, skip } // Update item itself if it wasn't deleted if (!isset($params['after_deletion']) || !$params['after_deletion']) { $lang_codes = array(); $seo_settings = fn_get_seo_settings($params['company_id']); if ($seo_settings['single_url'] == 'Y') { $lang_codes[] = Registry::get('settings.Appearance.frontend_default_language'); } else { $lang_codes = array_keys(Languages::getAll()); } foreach ($lang_codes as $lang_code) { $seo_name = fn_seo_get_name($object_type, $object_id, '', $params['company_id'], $lang_code); fn_create_seo_name($object_id, $object_type, $seo_name, 0, '', $params['company_id'], $lang_code, true); } } if (empty($params['old_id_path'])) { return true; } $condition = fn_get_seo_company_condition('?:seo_names.company_id', '', $params['company_id']); // Regenerate siblings' SEO-names fn_iterate_through_seo_names('fn_regenerate_seo_name', db_quote("path = ?s AND type IN (?a) ?p", $params['old_id_path'], $params['object_types'], $condition)); // Regenerate children SEO-names fn_iterate_through_seo_names('fn_regenerate_seo_name', db_quote("path LIKE ?l AND type IN (?a) ?p", $params['old_id_path'] . '/%', $params['object_types'], $condition)); return true; }
/** * Validates and installs package * * @todo Implement language installer * @todo Additional migrations validation * * @param string $package_id Package id like "core", "access_restrictions", etc * @return array($result, $data) Installation result */ public function install($package_id, $request) { $result = true; $logger = Log::instance($package_id); $logger->add(''); $logger->add(str_replace('[package_id]', $package_id, 'Start installation of the "[package_id]" upgrade package')); $logger->add('================================================'); $logger->add('Get all available validators'); Output::steps(5); // Validators, Backups (database/files), Copying Files, Migrations, Languages Output::display(__('uc_title_validators'), __('uc_upgrade_progress'), false); $validators = $this->getValidators(); $schema = $this->getSchema($package_id, true); $information_schema = $this->getSchema($package_id, false); $package_validators = $this->getPackageValidators($package_id, $schema); if (!empty($package_validators)) { $validators = array_merge($package_validators, $validators); } foreach ($validators as $validator) { $logger->add(str_replace('[validator]', $validator->getName(), 'Execute "[validator]" validator')); Output::display(__('uc_execute_validator', array('[validator]' => $validator->getName())), '', false); list($result, $data) = $validator->check($schema, $request); if (!$result) { break; } } if (!$result) { $logger->add('Upgrade stopped: Awaiting resolving validation errors: ' . $validator->getName()); return array($result, array($validator->getName() => $data)); } else { $backup_filename = "upg_{$package_id}_{$information_schema['from_version']}-{$information_schema['to_version']}_" . date('dMY_His', TIME); // Prepare restore.php file. Paste necessary data and access information $restore_key = $this->prepareRestore($backup_filename . '.zip'); if (empty($restore_key)) { $logger->add('Upgrade stopped: Unable to prepare restore file. restore.php was locally modified/removed or renamed.'); return array(false, array(__('restore') => __('upgrade_center.unable_to_prepare_restore'))); } $content_path = $this->getPackagesDir() . $package_id . '/content/'; // Run pre script if (!empty($schema['scripts']['pre'])) { include_once $content_path . 'scripts/' . $schema['scripts']['pre']; } $this->closeStore(); $logger->add('Backup files and Database'); Output::display(__('backup_data'), '', true); $backup_file = DataKeeper::backup(array('pack_name' => $backup_filename, 'compress' => 'zip', 'set_comet_steps' => false, 'move_progress' => false)); if (empty($backup_file) || !file_exists($backup_file)) { $logger->add('Upgrade stopped: Failed to backup DB/Files'); return array(false, array(__('backup') => __('text_uc_failed_to_backup_tables'))); } // Send mail to admin e-mail with information about backup Mailer::sendMail(array('to' => 'company_site_administrator', 'from' => 'default_company_site_administrator', 'data' => array('backup_file' => $backup_file, 'settings_section_url' => fn_url('settings.manage'), 'restore_link' => Registry::get('config.http_location') . '/var/upgrade/restore.php?uak=' . $restore_key), 'tpl' => 'upgrade/backup_info.tpl'), 'A', Registry::get('settings.Appearance.backend_default_language')); $logger->add('Copy package files'); Output::display(__('uc_copy_files'), '', true); // Move files from package $this->applyPackageFiles($content_path . 'package', $this->config['dir']['root']); $this->cleanupOldFiles($schema, $this->config['dir']['root']); // Copy files from themes_repository to design folder $this->processThemesFiles($schema); Output::display(__('uc_run_migrations'), '', true); // Run migrations if (!empty($schema['migrations'])) { $logger->add('Run migrations'); $minimal_date = 0; foreach ($schema['migrations'] as $migration) { preg_match('/^[0-9]+/', $migration, $matches); if (!empty($matches[0])) { $date = $matches[0]; if ($date < $minimal_date || empty($minimal_date)) { $minimal_date = $date; } } } $config = array('migration_dir' => $content_path . 'migrations/', 'package_id' => $package_id); Migration::instance($config)->migrate($minimal_date); } // Install languages Output::display(__('uc_install_languages'), '', true); if (!empty($schema['languages'])) { $logger->add('Install langauges from the upgrade package'); $avail_languages = Languages::getAvailable('A', true); foreach ($avail_languages as $lang_code => $language) { if (in_array($lang_code, $schema['languages'])) { $logger->add(str_replace('[lang_code]', $lang_code, 'Install the \\"[lang_code]\\" language')); Output::display(__('install') . ': ' . $lang_code, '', false); Languages::installCrowdinPack($content_path . 'languages/' . $lang_code, array('install_newly_added' => true, 'validate_lang_code' => true, 'reinstall' => true)); } else { $pack_code = ''; if (in_array(CART_LANGUAGE, $schema['languages'])) { $pack_code = CART_LANGUAGE; } elseif (in_array('en', $schema['languages'])) { $pack_code = 'en'; } if (file_exists($content_path . 'languages/' . $pack_code)) { // Fill the unknown language by the Default/EN language variables Languages::installCrowdinPack($content_path . 'languages/' . $pack_code, array('reinstall' => true, 'force_lang_code' => $lang_code, 'install_newly_added' => true)); } } } } } // Run post script if (!empty($schema['scripts']['post'])) { include_once $content_path . 'scripts/' . $schema['scripts']['post']; } Output::display(__('text_uc_upgrade_completed'), '', true); $logger->add('Upgrade completed'); $this->deletePackage($package_id); // Clear obsolete files fn_clear_cache(); fn_rm(Registry::get('config.dir.cache_templates')); return array(true, array()); }
<?php /*************************************************************************** * * * (c) 2004 Vladimir V. Kalynyak, Alexey V. Vinokurov, Ilya M. Shalnev * * * * This is commercial software, only users who have purchased a valid * * license and accept to the terms of the License Agreement can install * * and use this program. * * * **************************************************************************** * PLEASE READ THE FULL TEXT OF THE SOFTWARE LICENSE AGREEMENT IN THE * * "copyright.txt" FILE PROVIDED WITH THIS DISTRIBUTION PACKAGE. * ****************************************************************************/ defined('BOOTSTRAP') or die('Access denied'); if ($mode == 'generate_ammo_file') { $ammo_file_generator = new \Tygh\Addons\YandexTank\AmmoFileGenerator(Tygh::$app['db'], array_keys(\Tygh\Languages\Languages::getActive()), \Tygh\Registry::get('config.current_host')); $ammo_file_generator->generate(\Tygh\Registry::get('config.dir.var') . 'ammo.txt'); }
/** * @param array $package_content_schema Package content schema * @param Log $logger Logger instance * @param string $package_content_path Package content path * * @return array First element is a list of languages to be installed, second element is a list languages failed to install */ public function installLanguages($package_content_schema, Log $logger, $package_content_path) { $failed_to_install = array(); $installed_languages = array_keys(Languages::getAvailable('A', true)); if (empty($package_content_schema['languages'])) { $logger->add('Installing languages using upgraded *.po files'); $po_pack_basepath = $this->config['dir']['lang_packs']; $lang_codes_to_install = $this->getLangCodesToReinstallFromContentSchema($package_content_schema); } else { $logger->add('Installing languages provided by package'); $po_pack_basepath = $package_content_path . 'languages/'; $lang_codes_to_install = (array) $package_content_schema['languages']; } $logger->add(sprintf('Already installed languages: %s', implode(', ', $installed_languages))); $logger->add(sprintf('Languages to be installed: %s', implode(', ', $lang_codes_to_install))); if (in_array(CART_LANGUAGE, $lang_codes_to_install)) { $fallback_lang_code = CART_LANGUAGE; } elseif (in_array('en', $lang_codes_to_install)) { $fallback_lang_code = 'en'; } else { $fallback_lang_code = null; } foreach ($installed_languages as $lang_code) { $logger->lineStart(sprintf('Installing "%s" language... ', $lang_code)); if (in_array($lang_code, $lang_codes_to_install)) { Output::display(__('install') . ': ' . $lang_code, '', false); if (false === Languages::installCrowdinPack($po_pack_basepath . $lang_code, array('install_newly_added' => true, 'validate_lang_code' => $lang_code, 'reinstall' => true))) { $logger->lineEnd('FAILED'); $failed_to_install[] = $lang_code; } else { $logger->lineEnd('OK'); } } elseif ($fallback_lang_code !== null) { if (false === Languages::installCrowdinPack($po_pack_basepath . $fallback_lang_code, array('reinstall' => true, 'force_lang_code' => $lang_code, 'install_newly_added' => true))) { $logger->lineEnd('FAILED'); $failed_to_install[] = $lang_code; } else { $logger->lineEnd('OK'); } } else { $logger->lineEnd('SKIPPED'); } } return array($lang_codes_to_install, $failed_to_install); }
protected function installUpgradePackage($package_id, $request) { $result = true; $information_schema = $this->getSchema($package_id, false); $logger = Log::instance($package_id); $logger->drawHeader()->add(array(sprintf('Starting installation of the "%s" upgrade package', $package_id), sprintf('Upgrading version %s to %s', $information_schema['from_version'], $information_schema['to_version']), sprintf('Running as user "%s"', fn_get_process_owner_name()))); Output::steps(5); // Validators, Backups (database/files), Copying Files, Migrations, Languages Output::display(__('uc_title_validators'), __('uc_upgrade_progress'), false); $logger->add('Executing pre-upgrade validators'); $validators = $this->getValidators(); $schema = $this->getSchema($package_id, true); $package_validators = $this->getPackageValidators($package_id, $schema); $logger->add(sprintf('Found %u validators at package', sizeof($package_validators))); if (!empty($package_validators)) { $validators = array_merge($package_validators, $validators); } foreach ($validators as $validator) { $logger->add(sprintf('Executing "%s" validator', $validator->getName())); Output::display(__('uc_execute_validator', array('[validator]' => $validator->getName())), '', false); list($result, $data) = $validator->check($schema, $request); if (!$result) { break; } } if (!$result) { $logger->add(sprintf('Upgrade stopped: awaiting resolving "%s" validator errors', $validator->getName())); return array($result, array($validator->getName() => $data)); } else { $result = self::PACKAGE_INSTALL_RESULT_SUCCESS; $backup_filename = "upg_{$package_id}_{$information_schema['from_version']}-{$information_schema['to_version']}_" . date('dMY_His', TIME); $logger->add(sprintf('Backup filename is "%s"', $backup_filename)); // Prepare restore.php file. Paste necessary data and access information $restore_preparation_result = $this->prepareRestore($package_id, $schema, $information_schema, $backup_filename . '.zip'); if (!$restore_preparation_result) { $logger->add('Upgrade stopped: unable to prepare restore file.'); return array(false, array(__('restore') => __('upgrade_center.error_unable_to_prepare_restore'))); } list($restore_key, $restore_file_path, $restore_http_path) = $restore_preparation_result; $content_path = $this->getPackagesDir() . $package_id . '/content/'; // Run pre script if (!empty($schema['scripts']['pre'])) { $pre_script_file_path = $content_path . 'scripts/' . $schema['scripts']['pre']; $logger->add(sprintf('Executing pre-upgrade script "%s"', $pre_script_file_path)); include_once $pre_script_file_path; $logger->add('Pre-upgrade script executed successfully'); } $logger->add('Closing storefront'); $this->closeStore(); $logger->add('Backing up files and database'); Output::display(__('backup_data'), '', true); $backup_file = DataKeeper::backup(array('pack_name' => $backup_filename, 'compress' => 'zip', 'set_comet_steps' => false, 'move_progress' => false, 'extra_folders' => array('var/langs'))); if (empty($backup_file) || !file_exists($backup_file)) { $logger->add('Upgrade stopped: failed to backup DB/files'); return array(false, array(__('backup') => __('text_uc_failed_to_backup_tables'))); } $logger->add(sprintf('Backup created at "%s"', $backup_file)); // Send mail to admin e-mail with information about backup $email_recipients = array(); $user_data = fn_get_user_short_info($_SESSION['auth']['user_id']); if (!empty($user_data['email'])) { $email_recipients[] = $user_data['email']; } $user_is_root_admin = isset($_SESSION['auth']['is_root']) && $_SESSION['auth']['is_root'] == 'Y'; if (!$user_is_root_admin) { $root_admin_id = db_get_field("SELECT user_id FROM ?:users WHERE company_id = 0 AND is_root = 'Y' AND user_type = 'A'"); $root_admin_data = fn_get_user_short_info($root_admin_id); if (!empty($root_admin_data['email'])) { $email_recipients[] = $root_admin_data['email']; } } $logger->add(sprintf('Sending upgrade information e-mail to: %s', implode(', ', $email_recipients))); $mail_sent = Mailer::sendMail(array('to' => $email_recipients, 'from' => 'default_company_site_administrator', 'data' => array('backup_file' => $backup_file, 'settings_section_url' => fn_url('settings.manage'), 'restore_link' => "{$restore_http_path}?uak={$restore_key}"), 'tpl' => 'upgrade/backup_info.tpl'), 'A', Registry::get('settings.Appearance.backend_default_language')); if ($mail_sent) { $logger->add('E-mail was successfully sent'); } else { $logger->add('Failed to send e-mail'); return array(false, array()); } Output::display(__('uc_copy_files'), '', true); // Move files from package $logger->add('Copying package files'); $this->applyPackageFiles($content_path . 'package', $this->config['dir']['root']); $logger->add('Deleting files removed at new version'); $this->cleanupOldFiles($schema, $this->config['dir']['root']); // Copy files from themes_repository to design folder $logger->add('Processing themes files'); $this->processThemesFiles($schema); Output::display(__('uc_run_migrations'), '', true); // Run migrations if (empty($schema['migrations'])) { $logger->add('No migrations found at package'); } else { $logger->add(sprintf('Executing %u migrations found at package', sizeof($schema['migrations']))); $minimal_date = 0; foreach ($schema['migrations'] as $migration) { preg_match('/^[0-9]+/', $migration, $matches); if (!empty($matches[0])) { $date = $matches[0]; if ($date < $minimal_date || empty($minimal_date)) { $minimal_date = $date; } } } $config = array('migration_dir' => realpath($content_path . 'migrations/'), 'package_id' => $package_id); try { $migration_succeed = Migration::instance($config)->migrate($minimal_date); } catch (DatabaseException $e) { // Find out which migration caused an exception using its trace $failed_migration_file = null; // DatabaseException could be thrown as a replacement of original exception, // in this case we should look through original's exception trace $exception_with_trace = $e->getPrevious() ?: $e; foreach ($exception_with_trace->getTrace() as $trace) { if (isset($trace['file']) && strpos($trace['file'], $config['migration_dir']) === 0) { $failed_migration_file = basename($trace['file']); break; } } $this->setNotification('E', __('error'), __('uc_migration_failed', array('[migration]' => $failed_migration_file))); $migration_succeed = false; $logger->add((string) $e); } if ($migration_succeed) { $logger->add('Migrations were executed successfully'); } else { $result = self::PACKAGE_INSTALL_RESULT_WITH_ERRORS; $logger->add('Failed to execute migrations'); } } // Install languages Output::display(__('uc_install_languages'), '', true); // Install langs that are provided by package if (!empty($schema['languages'])) { $logger->add('Installing languages provided by package'); $logger->add(sprintf('Package languages: %s', implode(', ', $schema['languages']))); $avail_languages = Languages::getAvailable('A', true); $logger->add(sprintf('Already installed languages: %s', implode(', ', array_keys($avail_languages)))); foreach ($avail_languages as $lang_code => $language) { if (in_array($lang_code, $schema['languages'])) { $logger->add(sprintf('Installing "%s" language', $lang_code)); Output::display(__('install') . ': ' . $lang_code, '', false); Languages::installCrowdinPack($content_path . 'languages/' . $lang_code, array('install_newly_added' => true, 'validate_lang_code' => true, 'reinstall' => true)); } else { $pack_code = ''; if (in_array(CART_LANGUAGE, $schema['languages'])) { $pack_code = CART_LANGUAGE; } elseif (in_array('en', $schema['languages'])) { $pack_code = 'en'; } if (!empty($pack_code) && file_exists($content_path . 'languages/' . $pack_code)) { // Fill the unknown language by the Default/EN language variables Languages::installCrowdinPack($content_path . 'languages/' . $pack_code, array('reinstall' => true, 'force_lang_code' => $lang_code, 'install_newly_added' => true)); } } } } else { // Install languages using upgraded /var/langs/*/*.po files $logger->add('Installing languages using upgraded *.po files'); $langs_meta = Languages::getLangPacksMeta('', '', true); $lang_packs = array(); foreach ($langs_meta as $value) { $lang_packs[$value['lang_code']] = $value; } $logger->add(sprintf('Found language packs: %s', implode(', ', array_keys($lang_packs)))); $avail_languages = Languages::getAvailable('A', true); $logger->add(sprintf('Already installed languages: %s', implode(', ', array_keys($avail_languages)))); foreach ($avail_languages as $lang_code => $language) { if (isset($lang_packs[$lang_code])) { $logger->add(sprintf('Installing "%s" language', $lang_code)); Output::display(__('install') . ': ' . $lang_code, '', false); $pack_path = $this->config['dir']['lang_packs'] . $lang_code; Languages::installCrowdinPack($pack_path, array('install_newly_added' => true, 'validate_lang_code' => true, 'reinstall' => true)); } else { $pack_code = ''; if (isset($lang_packs[CART_LANGUAGE])) { $pack_code = CART_LANGUAGE; } elseif (isset($lang_packs['en'])) { $pack_code = 'en'; } $pack_path = $this->config['dir']['lang_packs'] . $pack_code; if (!empty($pack_code) && file_exists($pack_path)) { // Fill the unknown language by the Default/EN language variables Languages::installCrowdinPack($pack_path, array('reinstall' => true, 'force_lang_code' => $lang_code, 'install_newly_added' => true)); } } } } } $upgrade_schema = $this->getSchema($package_id); // Run post script if (!empty($schema['scripts']['post'])) { $post_script_file_path = $content_path . 'scripts/' . $schema['scripts']['post']; $logger->add(sprintf('Executing post-upgrade script "%s"', $post_script_file_path)); include_once $post_script_file_path; $logger->add('Post-upgrade script executed successfully'); } // Clear obsolete files $logger->add('Cleaning cache'); fn_clear_cache(); fn_rm(Registry::get('config.dir.cache_templates')); // Add information to "Installed upgrades section" $logger->add('Saving upgrade information to DB'); $this->storeInstalledUpgrade($upgrade_schema); // Collect statistic data $logger->add('Sending statistics'); Http::get(Registry::get('config.resources.updates_server') . '/index.php?dispatch=product_updates.updated', $this->getStatsData($package_id), array('timeout' => 10)); $this->onSuccessPackageInstall($package_id, $schema, $information_schema); $logger->add('Deleting package contents'); $this->deletePackage($package_id); Output::display(__('text_uc_upgrade_completed'), '', true); $logger->add('Upgrade completed!'); return array($result, array()); }