public function out() { if ($this->position > $this->max_length) { $this->position = 0; fn_echo('<br />'); } fn_echo($this->symbol); $this->position++; }
if ($mode == 'generate' || $mode == 'get') { $access_key = !empty($_REQUEST['access_key']) ? $_REQUEST['access_key'] : ''; $price_id = !empty($_REQUEST['price_id']) ? $_REQUEST['price_id'] : 0; if (empty($price_id) && !empty($access_key)) { $price_id = fn_yml_get_price_id($access_key); } $options = fn_yml_get_options($price_id); if (!empty($options) && $options['enable_authorization'] == 'Y' && empty($access_key)) { $options = array(); } if (!empty($options)) { $company_id = Registry::get('runtime.company_id'); if (fn_allowed_for('MULTIVENDOR')) { $company_id = 0; } $offset = !empty($_REQUEST['offset']) ? $_REQUEST['offset'] : 0; $lang_code = DESCR_SL; if (Registry::isExist('languages.ru')) { $lang_code = 'ru'; } $yml = new Yml2($company_id, $price_id, $lang_code, $offset, isset($_REQUEST['debug'])); if ($mode == 'get') { $yml->get(); } else { $yml->generate(); } } else { fn_echo(__("error")); } exit; }
/** * Creates database and imports dump there * @param string $db_name db name * @return boolean true on success, false - otherwise */ public static function createDb($db_name = '') { $snapshot_dir = Registry::get('config.dir.snapshots'); $dbdump_filename = empty($db_name) ? 'cmp_current.sql' : 'cmp_release.sql'; if (!fn_mkdir($snapshot_dir)) { fn_set_notification('E', __('error'), __('text_cannot_create_directory', array('[directory]' => fn_get_rel_dir($snapshot_dir)))); return false; } $dump_file = $snapshot_dir . $dbdump_filename; if (is_file($dump_file)) { if (!is_writable($dump_file)) { fn_set_notification('E', __('error'), __('dump_file_not_writable')); return false; } } $fd = @fopen($snapshot_dir . $dbdump_filename, 'w'); if (!$fd) { fn_set_notification('E', __('error'), __('dump_cant_create_file')); return false; } if (!empty($db_name)) { Database::changeDb($db_name); } // set export format db_query("SET @SQL_MODE = 'MYSQL323'"); fn_start_scroller(); $create_statements = array(); $insert_statements = array(); $status_data = db_get_array("SHOW TABLE STATUS"); $dbdump_tables = array(); foreach ($status_data as $k => $v) { $dbdump_tables[] = $v['Name']; } // get status data $t_status = db_get_hash_array("SHOW TABLE STATUS", 'Name'); foreach ($dbdump_tables as $k => $table) { fn_echo('<br />' . __('backupping_data') . ': <b>' . $table . '</b> '); $total_rows = db_get_field("SELECT COUNT(*) FROM {$table}"); $index = db_get_array("SHOW INDEX FROM {$table}"); $order_by = array(); foreach ($index as $kk => $vv) { if ($vv['Key_name'] == 'PRIMARY') { $order_by[] = '`' . $vv['Column_name'] . '`'; } } if (!empty($order_by)) { $order_by = 'ORDER BY ' . implode(',', $order_by); } else { $order_by = ''; } // Define iterator if (!empty($t_status[$table]) && $t_status[$table]['Avg_row_length'] < DB_MAX_ROW_SIZE) { $it = DB_ROWS_PER_PASS; } else { $it = 1; } for ($i = 0; $i < $total_rows; $i = $i + $it) { $table_data = db_get_array("SELECT * FROM {$table} {$order_by} LIMIT {$i}, {$it}"); foreach ($table_data as $_tdata) { $_tdata = fn_add_slashes($_tdata, true); $values = array(); foreach ($_tdata as $v) { $values[] = $v !== null ? "'{$v}'" : 'NULL'; } fwrite($fd, "INSERT INTO {$table} (`" . implode('`, `', array_keys($_tdata)) . "`) VALUES (" . implode(', ', $values) . ");\n"); } fn_echo(' .'); } } fn_stop_scroller(); if (!empty($db_name)) { Settings::instance()->reloadSections(); } if (fn_allowed_for('ULTIMATE')) { $companies = fn_get_short_companies(); asort($companies); $settings['company_root'] = Settings::instance()->getList(); foreach ($companies as $k => $v) { $settings['company_' . $k] = Settings::instance()->getList(0, 0, false, $k); } } else { $settings['company_root'] = Settings::instance()->getList(); } if (!empty($db_name)) { Database::changeDb(Registry::get('config.db_name')); } $settings = self::processSettings($settings, ''); $settings = self::formatSettings($settings['data']); ksort($settings); $data = print_r($settings, true); fwrite($fd, $data); fclose($fd); @chmod($snapshot_dir . $dbdump_filename, DEFAULT_FILE_PERMISSIONS); return true; }
// Log database optimization fn_log_event('database', 'optimize'); $all_tables = db_get_fields("SHOW TABLES"); fn_set_progress('parts', sizeof($all_tables)); foreach ($all_tables as $table) { fn_set_progress('echo', __('optimizing_table') . " <b>{$table}</b>...<br />"); db_query("OPTIMIZE TABLE {$table}"); db_query("ANALYZE TABLE {$table}"); $fields = db_get_hash_array("SHOW COLUMNS FROM {$table}", 'Field'); if (!empty($fields['is_global'])) { // Sort table by is_global field fn_echo('.'); db_query("ALTER TABLE {$table} ORDER BY is_global DESC"); } elseif (!empty($fields['position'])) { // Sort table by position field fn_echo('.'); db_query("ALTER TABLE {$table} ORDER BY position"); } } fn_set_notification('N', __('notice'), __('done')); } if ($mode == 'delete') { if (!empty($_REQUEST['backup_file'])) { fn_rm(Registry::get('config.dir.backups') . fn_basename($_REQUEST['backup_file'])); } } return array(CONTROLLER_STATUS_OK, 'datakeeper.manage'); } if ($mode == 'getfile' && !empty($_REQUEST['file'])) { fn_get_file(Registry::get('config.dir.backups') . fn_basename($_REQUEST['file'])); } elseif ($mode == 'manage') {
/** * Updates progress bar title * @param string $text title text */ public function changeTitle($text = '') { return fn_echo("<script type=\"text/javascript\">parent.Tygh.\$('#comet_container_controller').ceProgress('setTitle', " . json_encode(array('title' => $text)) . ');</script>'); }
function fn_se_get_products_data($product_ids, $company_id = 0, $lang_code = NULL, $fl_echo = true) { $xml = ''; $products = array(); if (!empty($product_ids)) { list($products) = fn_get_products(array('disable_searchanise' => true, 'area' => 'A', 'sort_by' => 'null', 'pid' => $product_ids, 'extend' => array('description', 'search_words', 'popularity', 'sales')), 0, $lang_code); } if ($fl_echo) { fn_echo('.'); } if (!empty($products)) { foreach ($products as &$_product) { $_product['exclude_from_calculate'] = true; //pass additional params to fn_gather_additional_products_data for some speed up } fn_gather_additional_products_data($products, array('get_features' => false, 'get_icon' => true, 'get_detailed' => true, 'get_options' => false, 'get_discounts' => false, 'get_taxed_prices' => false)); if ($fl_echo) { fn_echo('.'); } if (!fn_allowed_for('ULTIMATE:FREE')) { $usergroups = empty($usergroups) ? array_merge(fn_get_default_usergroups(), db_get_hash_array("SELECT a.usergroup_id, a.status, a.type FROM ?:usergroups as a WHERE a.type = 'C' ORDER BY a.usergroup_id", 'usergroup_id')) : $usergroups; } else { $usergroups = array(); } fn_se_get_products_additionals($products, $company_id, $lang_code); fn_se_get_products_features($products, $company_id, $lang_code); $schema = $items = array(); foreach ($products as $product) { $item = array(); $data = fn_se_prepare_product_data($product, $usergroups, $company_id, $lang_code); foreach ($data as $name => $d) { $name = isset($d['name']) ? $d['name'] : $name; $item[$name] = $d['value']; unset($d['value']); if (!empty($d)) { $schema[$name] = $d; } } $items[] = $item; } } return array('schema' => $schema, 'items' => $items); }
//fn_set_notification('I','view>',print_r($view)); $view->assign('total_print', $total_print); $view->assign('order_info', $order_info); $view->assign('fonts_path', fn_get_theme_path('[relative]/[theme]/media/fonts')); if ($order_info['shipping_cost'] != 0) { $view->assign('shipping_cost', true); } if ($mode == "send_account_payment") { if (!empty($order_info['email'])) { fn_disable_live_editor_mode(); $html = array($view->displayMail('addons/rus_payments/print_invoice_payment.tpl', false, 'C')); Pdf::render($html, fn_get_files_dir_path() . 'account_payment.pdf', 'save'); $data = array('order_info' => $order_info, 'total_print' => $total_print, 'fonts_path' => fn_get_theme_path('[relative]/[theme]/media/fonts')); Mailer::sendMail(array('to' => $order_info['email'], 'from' => 'default_company_orders_department', 'data' => $data, 'attachments' => array(fn_get_files_dir_path() . 'account_payment.pdf'), 'tpl' => 'addons/rus_payments/print_invoice_payment.tpl', 'is_html' => true), 'A'); fn_set_notification('N', __('notice'), __('text_email_sent')); } } else { $view->assign('show_print_button', true); $view->displayMail('addons/rus_payments/print_invoice_payment.tpl', true, 'C'); } exit; } elseif ($mode == 'get_stamp') { Header("Content-Type: image/png"); Header("Content-Type: image/jpg"); Header("Content-Type: image/jpeg"); Header("Content-Type: image/gif"); $path_stamp = fn_get_image_pairs($_REQUEST['payment_id'], 'stamp', 'M', true, true, DESCR_SL); $image = fn_get_contents($path_stamp['icon']['absolute_path']); fn_echo($image); exit; }
function fn_google_export_add_additional_google_categories() { $available_langs = array_keys(fn_google_export_available_categories()); fn_echo(__('google_export_start_import')); foreach ($available_langs as $lang) { $new_feature = array("Google product category ({$lang})" => array('S' => fn_get_google_categories($lang))); $parent_feature_id = db_get_field("SELECT feature_id FROM ?:product_features_descriptions WHERE description = 'Google export features' AND lang_code = ?s", DEFAULT_LANGUAGE); fn_google_export_add_feature($new_feature, $parent_feature_id, true); fn_google_export_update_alt_languages('product_features_descriptions', 'feature_id', true); fn_google_export_update_alt_languages('product_feature_variant_descriptions', 'variant_id', true); } }
function fn_send_confirmation_email($subscriber_id, $list_id, $email, $lang_code = CART_LANGUAGE) { $list = fn_get_mailing_list_data($list_id); if ($list['register_autoresponder']) { $autoresponder = fn_get_newsletter_data($list['register_autoresponder']); $body = $autoresponder['body_html']; $body = fn_render_newsletter($body, array('list_id' => $list_id, 'subscriber_id' => $subscriber_id, 'email' => $email)); if (AREA == 'A') { fn_echo(__('sending_email_to', array('[email]' => $email)) . '<br />'); } fn_send_newsletter($email, $list, $autoresponder['newsletter'], $body, array(), $lang_code, $list['reply_to']); } }
function fn_yandex_auth_error($msg) { header('WWW-Authenticate: Basic realm="Authorization required"'); header('HTTP/1.0 401 Unauthorized'); fn_echo($msg); exit; }
function fn_export($pattern, $export_fields, $options) { if (!empty($pattern['pre_processing'])) { $func = $pattern['pre_processing']; $function = array_shift($func); $args = $func; foreach ($args as $k => $v) { if (strpos($v, '@') !== false) { $_opt = str_replace('@', '', $v); $args[$k] = isset($options[$_opt]) ? $options[$_opt] : ''; } } call_user_func_array($function, $args); } if (isset($options['fields_names'])) { if ($options['fields_names']) { $fields_names = $export_fields; $export_fields = array_keys($export_fields); } } $primary_key = $pattern['key']; array_walk($primary_key, 'fn_attach_value_helper', $pattern['table'] . '.'); $table_fields = $primary_key; $joins = array(); $processes = array(); $conditions = array(); // Build list of fields that should be retrieved from the database foreach ($pattern['export_fields'] as $field => $data) { if (!in_array($field, $export_fields)) { continue; } // Do no link this field if (isset($data['linked']) && $data['linked'] == false) { // do something? } elseif (empty($data['table']) || $data['table'] == $pattern['table']) { $table_fields[] = $pattern['table'] . '.' . (!empty($data['db_field']) ? $data['db_field'] . ' as "' . $field . '"' : $field); // Linked object tables } else { $table_fields[] = $data['table'] . '.' . (!empty($data['db_field']) ? $data['db_field'] . ' as "' . $field . '"' : $field); } if (!empty($data['process_get'])) { $processes[$field]['function'] = array_shift($data['process_get']); $processes[$field]['args'] = $data['process_get']; } } // Build the list of joins if (!empty($pattern['references'])) { foreach ($pattern['references'] as $table => $data) { $ref = array(); foreach ($data['reference_fields'] as $k => $v) { if (strval($v) == 'key' || strval($v) == '#key') { $_val = sizeof($primary_key) == 1 ? reset($primary_key) : ''; } elseif ($v[0] == '&') { $_val = $pattern['table'] . '.' . substr($v, 1); } elseif (strpos($v, '@') !== false) { $_opt = str_replace('@', '', $v); $_val = "'" . $options[$_opt] . "'"; } else { $_val = "'{$v}'"; } $ref[] = "{$table}.{$k} = {$_val}"; // fixme } $joins[] = $data['join_type'] . ' JOIN ?:' . $table . " as {$table} ON " . implode(' AND ', $ref); } } // Add retrieve conditions if (!empty($pattern['condition'])) { $_cond = array(); foreach ($pattern['condition'] as $field => $value) { if (is_array($value)) { $_val = implode("','", $value); } elseif (strpos($value, '@') !== false) { $_opt = str_replace('@', '', $value); $_val = $options[$_opt]; } else { $_val = $value; } $_cond[] = $pattern['table'] . ".{$field} IN ('{$_val}')"; } $conditions[] = implode(' AND ', $_cond); } // Limit scope to the current vendor's products only (if in vendor mode) $company_condition = fn_get_company_condition('products.company_id', false); if (!empty($company_condition)) { $conditions[] = $company_condition; } // Build main query $query = "SELECT " . implode(', ', $table_fields) . " FROM ?:" . $pattern['table'] . " as " . $pattern['table'] . ' ' . implode(' ', $joins) . (!empty($conditions) ? ' WHERE ' . implode(' AND ', $conditions) : ''); $step = 30; // define number of rows to get from database $iterator = 0; // start retrieving from $data_exported = false; fn_start_scroller(); fn_echo(fn_get_lang_var('exporting_data') . '<br />'); while ($data = db_get_array($query . " LIMIT {$iterator}, {$step}")) { $data_exported = true; $iterator += $step; $result = array(); foreach ($data as $k => $v) { $result[$k] = fn_array_key_intersect($v, $pattern['export_fields']); foreach ($processes as $field => $process_data) { $args = array(); foreach ($process_data['args'] as $ak => $av) { if ($av == '#this') { $args[$ak] = $v[$field]; } elseif ($av == '#key') { $args[$ak] = sizeof($pattern['key']) == 1 ? $v[reset($pattern['key'])] : ''; } elseif (strpos($av, '@') !== false) { $_opt = str_replace('@', '', $av); $args[$ak] = $options[$_opt]; } elseif ($av == '#field') { $args[$ak] = $field; } else { $args[$ak] = $av; } } $result[$k][$field] = call_user_func_array($process_data['function'], $args); } } // Sort result array $_result = array(); foreach ($result as $k => $v) { foreach ($export_fields as $field) { if (isset($fields_names[$field])) { $_result[$k][$fields_names[$field]] = $v[$field]; } else { $_result[$k][$field] = $v[$field]; } } } unset($result); // Put data $enclosure = isset($pattern['enclosure']) ? $pattern['enclosure'] : '"'; fn_echo(' .'); fn_put_csv($_result, $options, $enclosure); unset($_result); } fn_stop_scroller(); if (!empty($pattern['post_processing'])) { $func = $pattern['post_processing']; if (file_exists(DIR_EXIM . $options['filename'])) { $function = array_shift($func); $args = $func; foreach ($args as $k => $v) { if (strpos($v, '@') !== false) { $_opt = str_replace('@', '', $v); $args[$k] = $options[$_opt]; } } $data_exported = call_user_func_array($function, $args); } } echo '<br/>'; echo '<a href="/var/exim/' . $options['filename'] . '">' . $options['filename'] . '</a>'; return $data_exported; }
protected function _convertOrders($default_company_id) { $limit = 50; General::connectToOriginalDB(array('table_prefix' => General::formatPrefix())); db_query("UPDATE ?:order_data SET type='A' WHERE type='G'"); //change marker for addon Reward points $orders_count = db_get_field("SELECT COUNT(*) FROM ?:orders"); $crypt = new Crypt_Blowfish($this->store_data['crypt_key']); $crypt_new = new Crypt_Blowfish(Registry::get('config.crypt_key')); $location_fields = array('s_firstname as firstname', 's_lastname as lastname', 's_address as address', 's_address_2 as address_2', 's_city as city', 's_state as state', 's_country as country', 's_zipcode as zipcode', 's_phone as phone', 's_address_type as address_type'); fn_set_progress('step_scale', ceil($orders_count / $limit)); for ($i = 0; $i <= floor($orders_count / $limit); $i++) { $order_ids = db_get_fields("SELECT order_id FROM ?:orders LIMIT ?i, ?i", $i * $limit, $limit); $data = array(); $shipment_items = array(); fn_set_progress('echo', '<br />' . General::getUnavailableLangVar('converting_orders'), true); foreach ($order_ids as $order_id) { $order_info = array(); $order_info['shipping'] = unserialize(db_get_field("SELECT data FROM ?:order_data WHERE type='L' AND order_id = ?i", $order_id)); $order_info['products'] = db_get_hash_array("SELECT * FROM ?:order_details WHERE order_id = ?i", 'item_id', $order_id); $location = db_get_row("SELECT ?p FROM ?:orders WHERE order_id = ?i", implode(',', $location_fields), $order_id); if ($order_info['products']) { foreach ($order_info['products'] as $cart_id => $product) { if ($product['extra']) { $order_info['products'][$cart_id]['extra'] = unserialize($product['extra']); } } } $products = array(); foreach ($order_info['products'] as $cart_id => $product) { $products[$cart_id] = $product['extra']; $products[$cart_id]['amount'] = $product['amount']; $products[$cart_id]['product_id'] = $product['product_id']; } $product_groups = $this->_groupProductsListOrder($products); $shippings = array(); foreach ($product_groups as $key_group => $group) { if (!empty($order_info['shipping'])) { foreach ($order_info['shipping'] as $shipping_id => $shipping) { $_shipping = $shipping; $_shipping['shipping_id'] = $shipping_id; unset($_shipping['rates']); if (isset($_shipping['tracking_number'])) { $shipment = array('shipping_id' => $shipping_id, 'tracking_number' => $_shipping['tracking_number'], 'carrier' => strtolower($_shipping['carrier'])); $shipment_id = db_query("INSERT INTO ?:shipments ?e", $shipment); foreach ($group['products'] as $cart_id => $product) { $shipment_items[] = array('item_id' => $cart_id, 'shipment_id' => $shipment_id, 'order_id' => $order_id, 'product_id' => $product['product_id'], 'amount' => $product['amount']); } unset($_shipping['tracking_number']); unset($_shipping['carrier']); } if (!empty($shipping_id)) { foreach ($shipping['rates'] as $company_id => $rate) { if ($company_id == $group['company_id'] || $company_id == 0 && $group['company_id'] == $default_company_id) { $_shipping['rate'] = $rate; $_shipping['group_key'] = $key_group; $product_groups[$key_group]['shippings'][$shipping_id] = $_shipping; $product_groups[$key_group]['chosen_shippings'][] = $_shipping; $product_groups[$key_group]['package_info'] = !empty($_shipping['packages_info']) ? $_shipping['packages_info'] : array(); $product_groups[$key_group]['package_info']['location'] = $location; $shippings[$shipping_id] = !empty($shippings[$shipping_id]) ? $shippings[$shipping_id] : $_shipping; $shippings[$shipping_id]['rates'][$key_group] = $shipping_id; } } } } } } $payment_info = db_get_field("SELECT data FROM ?:order_data WHERE type='P' AND order_id = ?i", $order_id); if (!empty($payment_info)) { $payment_info = $crypt->decrypt(base64_decode($payment_info)); $payment_info = base64_encode($crypt_new->encrypt($payment_info)); $data[] = array('order_id' => $order_id, 'type' => 'P', 'data' => $payment_info); } $data[] = array('order_id' => $order_id, 'type' => 'G', 'data' => serialize($product_groups)); $data[] = array('order_id' => $order_id, 'type' => 'L', 'data' => serialize(array_values($shippings))); fn_echo(' .'); } if (!empty($data)) { db_query("REPLACE INTO ?:order_data ?m", $data); } if (!empty($shipment_items)) { db_query("REPLACE INTO ?:shipment_items ?m", $shipment_items); } } db_query("UPDATE ?:shipments SET carrier = LOWER(carrier);"); db_query("UPDATE ?:shipments SET carrier = 'usps' WHERE carrier = 'usp';"); db_query("UPDATE ?:shipments SET carrier = 'fedex' WHERE carrier = 'fdx';"); db_query("UPDATE ?:shipments SET carrier = 'swisspost' WHERE carrier = 'chp';"); }
fn_install_addon('twigmo', false); $_SESSION['twigmo_upgrade'] = array('upgrade_dirs' => $upgrade_dirs, 'install_src_dir' => $install_src_dir); fn_stop_scroller(); echo '<br><br>'; fn_redirect('upgrade_center.upgrade_twigmo.step2'); } } if ($mode == 'upgrade_twigmo' and $action == 'step2' and isset($_SESSION['twigmo_upgrade']) && !fn_twg_is_on_saas()) { fn_start_scroller(); fn_echo(__('twgadmin_restore_settings') . '<br>'); fn_ftp_connect(Settings::instance()->getValues('Upgrade_center')); fn_echo('.'); $upgrade_dirs = $_SESSION['twigmo_upgrade']['upgrade_dirs']; fn_echo('.'); // Uninstal addon fn_uninstall_addon('twigmo', false); fn_echo('.'); // Install fn_install_addon('twigmo', false); fn_echo('.'); // Restore settings TwigmoUpgrade::restoreSettingsAndCSS($upgrade_dirs, $auth['user_id']); fn_echo('.'); // Clear template cache fn_rm(Registry::get('config.dir.cache_templates')); fn_echo('.'); fn_echo('<br><b>' . __('twgadmin_upgrade_completed') . '<b><br>'); unset($_SESSION['twigmo_upgrade']); fn_stop_scroller(); return array(CONTROLLER_STATUS_REDIRECT, 'addons.update?addon=twigmo'); }
function fn_se_echo_connect_progress($text) { if (!defined('AJAX_REQUEST')) { fn_echo($text); } }
$address .= ', ' . $company_data['company_zipcode']; } if (!empty($company_data['company_country_descr'])) { $address .= ', ' . $company_data['company_country_descr']; } $text_header = str_replace("%company_address%", $address, $text_header); Mailer::sendMail(array('to' => $user_data['email'], 'from' => 'company_orders_department', 'data' => array('letter_body' => $text_header, 'subject' => $subject, 'products' => $products), 'tpl' => 'addons/abandoned_cart_reminder/notification.tpl'), 'C', $recipient_data['lang_code']); if (!empty($copy_email)) { Mailer::sendMail(array('to' => $copy_email, 'from' => 'company_orders_department', 'data' => array('letter_body' => $text_header, 'subject' => $subject, 'products' => $products), 'tpl' => 'addons/abandoned_cart_reminder/notification.tpl'), 'C', CART_LANGUAGE); } $sent++; if ($reminder_number == 1) { db_query("UPDATE ?:user_session_products SET abandoned_is_send_first = ?i WHERE user_id = ?i", time(), $recipient_data['user_id']); } elseif ($reminder_number == 2) { db_query("UPDATE ?:user_session_products SET abandoned_is_send_second = ?i WHERE user_id = ?i", time(), $recipient_data['user_id']); } } } } } } $delete_days = Registry::get('addons.abandoned_cart_reminder.delete'); if (!empty($delete_days)) { $today_start = strtotime("00:00"); $today_end = strtotime("23:59"); $period_start = $today_start - intval($delete_days) * 24 * 60 * 60; $period_end = $today_end - intval($delete_days) * 24 * 60 * 60; db_query("DELETE FROM ?:user_session_products WHERE timestamp >= ?i AND timestamp <= ?i", $period_start, $period_end); } fn_echo('Sent messages: ' . $sent);
} $counter->out(); } $tbl .= '</table>'; $counter->out(); Pdf::batchAdd($tbl); } } } //Close and output PDF document $temp_filename = fn_create_temp_file(); $imp_filename = $temp_filename . '.pdf'; fn_rename($temp_filename, $imp_filename); Pdf::batchRender($imp_filename, true); Storage::instance('assets')->put($filename, array('file' => $imp_filename, 'caching' => true)); fn_echo('<br />' . __('done')); } /** * * Adds product data in HTML format to price list table * @param array $product Product data * @param array $selected_fields Product fields that should be in price list * @param string $style Product row style (similar to the HTML style attribute, e.g.: style="background-color: #EEEEEE") * @param array $price_schema Price list columns scheme * @param array $options_variants Product options variants * * @return string Product data row in HTML format */ function fn_price_list_print_product_data($product, $selected_fields, $style, $price_schema, $options_variants = array()) { $tbl = '<tr>';
function fn_export($pattern, $export_fields, $options) { if (empty($pattern) || empty($export_fields)) { return false; } // Languages if (!empty($options['lang_code'])) { $multi_lang = $options['lang_code']; $count_langs = count($multi_lang); } else { $multi_lang = array(DEFAULT_LANGUAGE); $count_langs = 1; $options['lang_code'] = $multi_lang; } $can_continue = true; if (!empty($pattern['export_pre_moderation'])) { $data_export_pre_moderation = array('pattern' => &$pattern, 'export_fields' => &$export_fields, 'options' => &$options, 'can_continue' => &$can_continue); fn_exim_processing('export', $pattern['export_pre_moderation'], $options, $data_export_pre_moderation); } if (!$can_continue) { return false; } if (!empty($pattern['pre_processing'])) { fn_exim_processing('export', $pattern['pre_processing'], $options); } if (isset($options['fields_names'])) { if ($options['fields_names']) { $fields_names = $export_fields; $export_fields = array_keys($export_fields); } } $primary_key = array(); $_primary_key = $pattern['key']; foreach ($_primary_key as $key) { $primary_key[$key] = $key; } array_walk($primary_key, 'fn_attach_value_helper', $pattern['table'] . '.'); $table_fields = $primary_key; $processes = array(); // Build list of fields that should be retrieved from the database fn_export_build_retrieved_fields($processes, $table_fields, $pattern, $export_fields); if (empty($pattern['export_fields']['multilang'])) { $multi_lang = array(DEFAULT_LANGUAGE); $count_langs = 1; $options['lang_code'] = $multi_lang; } // Build the list of joins $joins = fn_export_build_joins($pattern, $options, $primary_key, $multi_lang); // Add retrieve conditions $conditions = fn_export_build_conditions($pattern, $options); if (!empty($pattern['pre_export_process'])) { $pre_export_process_data = array('pattern' => &$pattern, 'export_fields' => &$export_fields, 'options' => &$options, 'conditions' => &$conditions, 'joins' => &$joins, 'table_fields' => &$table_fields, 'processes' => &$processes); fn_exim_processing('export', $pattern['pre_export_process'], $options, $pre_export_process_data); } $total = db_get_field("SELECT COUNT(*) FROM ?:" . $pattern['table'] . " as " . $pattern['table'] . ' ' . implode(' ', $joins) . (!empty($conditions) ? ' WHERE ' . implode(' AND ', $conditions) : '')); fn_set_progress('parts', $total); fn_set_progress('step_scale', 1); $sorting = ''; if (!empty($pattern['order_by'])) { $sorting = ' ORDER BY ' . $pattern['order_by']; } // Build main query $query = "SELECT " . implode(', ', $table_fields) . " FROM ?:" . $pattern['table'] . " as " . $pattern['table'] . ' ' . implode(' ', $joins) . (!empty($conditions) ? ' WHERE ' . implode(' AND ', $conditions) : '') . $sorting; $step = fn_floor_to_step(DB_LIMIT_SELECT_ROW, $count_langs); // define number of rows to get from database $iterator = 0; // start retrieving from $progress = 0; $data_exported = false; $main_lang = reset($multi_lang); $manual_multilang = true; $field_lang = ''; foreach ($pattern['export_fields']['multilang'] as $key => $value) { if (array_search('languages', $value, true)) { if (!isset($value['linked']) || $value['linked'] === true) { $manual_multilang = false; } $field_lang = $key; break; } } if (empty($field_lang) || !in_array($field_lang, $export_fields)) { $multi_lang = array($main_lang); $count_langs = 1; } while ($data = db_get_array($query . " LIMIT {$iterator}, {$step}")) { $data_exported = true; if ($manual_multilang) { $data_lang = $data; $data = array(); foreach ($data_lang as $data_key => $data_value) { $data[] = array_combine($multi_lang, array_fill(0, $count_langs, $data_value)); } } else { $data_lang = array_chunk($data, $count_langs); $data = array(); foreach ($data_lang as $data_key => $data_value) { // Sort foreach ($multi_lang as $lang_code) { foreach ($data_value as $v) { if (array_search($lang_code, $v, true)) { $data[$data_key][$lang_code] = $v; } } } } } $result = array(); foreach ($data as $k => $v) { $progress += $count_langs; fn_set_progress('echo', __('exporting_data') . ': <b>' . $progress . '</b>'); fn_export_fill_fields($result[$k], $v, $processes, $pattern, $options); } $_result = array(); foreach ($result as $k => $v) { foreach ($multi_lang as $lang_code) { $_data = array(); foreach ($export_fields as $field) { if (isset($fields_names[$field])) { $_data[$fields_names[$field]] = $v[$lang_code][$field]; } else { $_data[$field] = isset($v[$lang_code][$field]) ? $v[$lang_code][$field] : ''; } } $_result[] = $_data; } } // Put data $enclosure = isset($pattern['enclosure']) ? $pattern['enclosure'] : '"'; fn_echo(' .'); if (isset($pattern['func_save_content_to_file']) && is_callable($pattern['func_save_content_to_file'])) { call_user_func($pattern['func_save_content_to_file'], $_result, $options, $enclosure); } else { fn_put_csv($_result, $options, $enclosure); } $iterator += $step; } if (!empty($pattern['post_processing'])) { fn_set_progress('echo', __('processing'), false); if ($data_exported && file_exists(fn_get_files_dir_path() . $options['filename'])) { $data_exported = fn_exim_processing('export', $pattern['post_processing'], $options); } } return $data_exported; }
function fn_exim_1c_init() { fn_echo("zip=no\n"); fn_echo('file_limit=' . FILE_LIMIT . "\n"); }
fn_theme_editor_set_style($_REQUEST['style_id']); // If theme elements passed, get them } elseif (!empty($_REQUEST['style']['data'])) { $data = $_REQUEST['style']['data']; $data = Styles::factory($theme_name)->processCopy('', $data); } $less = new Less(); $import_path[] = Registry::get('config.dir.root') . fn_get_theme_path('/[relative]/[theme]/css'); $import_path[] = Registry::get('config.dir.root') . fn_get_theme_path('/[relative]/[theme]/css/tygh'); $less->setImportDir($import_path); $content = $css_content . $less->customCompile($less_content, Registry::get('config.dir.root'), $data); // remove external fonts to avoid flickering when styles are reloaded //$content = preg_replace("/@font-face \{.*?\}/s", '', $content); } header('content-type: text/css'); fn_echo($content); exit; } elseif ($mode == 'duplicate') { // FIXME: Bacward preset compatibility if (!empty($_REQUEST['preset_id'])) { $_REQUEST['style_id'] = $_REQUEST['preset_id']; } if (!empty($_REQUEST['name']) && Styles::factory(fn_get_theme_path('[theme]', 'C'))->copy($_REQUEST['style_id'], $_REQUEST['name'])) { fn_theme_editor_set_style($_REQUEST['name']); } else { //FIXME: Presets backward compability $path = fn_get_theme_path('[relative]/[theme]/styles'); if (!is_dir($path)) { $path = fn_get_theme_path('[relative]/[theme]/presets'); } fn_set_notification('E', __('error'), __('theme_editor.style_data_cannot_be_saved', array('[theme_dir]' => $path)));
/** * Redirect browser to the new location * * @param string location - destination of redirect * @param bool no_delay - do not delay redirection if output was performed * @param bool allow_external_redirect - allow redirection to external resource * @return */ function fn_redirect($location, $no_delay = false, $allow_external_redirect = false) { $external_redirect = false; $protocol = defined('HTTPS') ? 'https' : 'http'; // Cleanup location from & signs and call fn_url() $location = str_replace('&', '&', fn_url(str_replace(array("\n", "\r"), array('', ''), $location))); // Convert absolute link with location to relative one if (strpos($location, '://') !== false || substr($location, 0, 7) == 'mailto:') { if (strpos($location, Registry::get('config.http_location')) !== false) { $location = str_replace(array(Registry::get('config.http_location') . '/', Registry::get('config.http_location')), '', $location); $protocol = 'http'; } elseif (strpos($location, Registry::get('config.https_location')) !== false) { $location = str_replace(array(Registry::get('config.https_location') . '/', Registry::get('config.https_location')), '', $location); $protocol = 'https'; } else { if ($allow_external_redirect == false) { // if external redirects aren't allowed, redirect to index script $location = INDEX_SCRIPT; } else { $external_redirect = true; } } // Convert absolute link without location to relative one } else { $_protocol = ""; $http_path = Registry::get('config.http_path'); $https_path = Registry::get('config.https_path'); if (!empty($http_path) && substr($location, 0, strlen($http_path)) == $http_path) { $location = substr($location, strlen($http_path) + 1); $_protocol = 'http'; } elseif (!empty($https_path) && substr($location, 0, strlen($https_path)) == $https_path) { $location = substr($location, strlen($https_path) + 1); $_protocol = 'https'; } $protocol = Registry::get('config.http_path') != Registry::get('config.https_path') && !empty($_protocol) ? $_protocol : $protocol; } if ($external_redirect == false) { fn_set_hook('redirect', $location); $protocol_changed = defined('HTTPS') && $protocol == 'http' || !defined('HTTPS') && $protocol == 'https'; // For correct redirection, location must be absolute with path $location = ($protocol == 'http' ? Registry::get('config.http_location') : Registry::get('config.https_location')) . '/' . ltrim($location, '/'); // Parse the query string $query_array = array(); if (strpos($location, '?') !== false) { $qs = substr($location, strpos($location, '?') + 1); $location = str_replace('?' . $qs, '', $location); parse_str($qs, $query_array); } if ($protocol_changed && (Registry::get('config.http_host') != Registry::get('config.https_host') || Registry::get('config.http_path') != Registry::get('config.https_path'))) { $query_array[SESS_NAME] = Session::get_id(); } // If this is not ajax request, remove ajax specific parameters if (!defined('AJAX_REQUEST')) { unset($query_array['is_ajax']); unset($query_array['result_ids']); } else { $query_array['result_ids'] = implode(',', Registry::get('ajax')->result_ids); $query_array['is_ajax'] = Registry::get('ajax')->request_type; $ajax_assigned_vars = Registry::get('ajax')->get_assigned_vars(); if (!empty($ajax_assigned_vars['html'])) { unset($ajax_assigned_vars['html']); } $query_array['_ajax_data'] = $ajax_assigned_vars; fn_define('AJAX_REDIRECT', true); } if (!empty($query_array)) { $location .= '?' . fn_build_query($query_array); } // Redirect from https to http location if ($protocol_changed && defined('HTTPS')) { $no_delay = true; fn_define('META_REDIRECT', true); } } if (!ob_get_contents() && !headers_sent() && !defined('META_REDIRECT')) { header('Location: ' . $location); exit; } else { if (defined('AJAX_REQUEST')) { die("AJAX REDIRECT AFTER OUTPUT"); } $delay = $no_delay == true ? 0 : 10; if ($no_delay == false) { fn_echo('<br /><div style="margin-top: 20px; border: 1px solid #dadada; background-color: #fcffd8; padding: 15px; float: left;">'); fn_echo(fn_get_lang_var('text_redirect_notice') . ' '); fn_echo('<a href="' . htmlspecialchars($location) . '" style="text-transform: lowercase;">' . fn_get_lang_var('continue') . '</a>'); fn_echo('</div>'); } fn_echo("<meta http-equiv=\"Refresh\" content=\"{$delay};URL=" . htmlspecialchars($location) . "\" />"); } fn_flush(); exit; }
function fn_set_progress($prop, $value, $extra = null) { if ($prop == 'echo') { fn_echo($value); fn_echo('<br>'); } return true; }
public static function updateAltLanguages($table, $keys, $show_process = false) { General::connectToOriginalDB(array('table_prefix' => General::formatPrefix())); $langs = self::getLangCodes(); if (!is_array($keys)) { $keys = array($keys); } $i = 0; $step = 50; while ($items = db_get_array("SELECT * FROM ?:{$table} WHERE lang_code = ?s LIMIT {$i}, {$step}", self::$default_language)) { $i += $step; foreach ($items as $v) { foreach ($langs as $lang) { $condition = array(); foreach ($keys as $key) { $lang_var = $v[$key]; $condition[] = db_quote("{$key} = ?s", $lang_var); } $condition = implode(' AND ', $condition); $exists = db_get_field("SELECT COUNT(*) FROM ?:{$table} WHERE {$condition} AND lang_code = ?s", $lang); if (empty($exists)) { $v['lang_code'] = $lang; db_query("REPLACE INTO ?:{$table} ?e", $v); if ($show_process) { fn_echo(' .'); } } } } } return true; }
/** * Recursively copy directory (or just a file) * * @param string $source * @param string $dest * @param bool $silent */ function fn_copy($source, $dest, $silent = true) { //var_dump($silent); //var_dump($source); // Simple copy for a file if (is_file($source)) { if (@is_dir($dest)) { $dest .= '/' . basename($source); } if (filesize($source) == 0) { $fd = fopen($dest, 'w'); fclose($fd); $res = true; } else { $res = @copy($source, $dest); } @chmod($dest, DEFAULT_FILE_PERMISSIONS); //var_dump('1'); return $res; } // Make destination directory if ($silent == false) { fn_echo('Creating directory <b>' . (strpos($dest, DIR_ROOT) === 0 ? str_replace(DIR_ROOT . '/', '', $dest) : $dest) . '</b><br />'); } if (!@is_dir($dest)) { if (fn_mkdir($dest) == false) { // var_dump('2'); return false; } } // Loop through the folder if (@is_dir($source)) { $dir = dir($source); while (false !== ($entry = $dir->read())) { // Skip pointers if ($entry == '.' || $entry == '..') { continue; } // Deep copy directories if ($dest !== $source . '/' . $entry) { if (fn_copy($source . '/' . $entry, $dest . '/' . $entry, $silent) == false) { // var_dump('3'); return false; } } } // Clean up $dir->close(); return true; } else { // var_dump('4'); return false; } }
/** * Set state for time-consuming processes * * @param string $prop property name * @param string $value value to set * @param mixed $extra extra data * @return boolean - always true */ function fn_set_progress($prop, $value, $extra = null) { if (Registry::get('runtime.comet') == true) { if ($prop == 'step_scale') { Tygh::$app['ajax']->setStepScale($value); } elseif ($prop == 'parts') { Tygh::$app['ajax']->setProgressParts($value); } elseif ($prop == 'echo') { Tygh::$app['ajax']->progressEcho($value, $extra === false ? $extra : true); } elseif ($prop == 'title') { Tygh::$app['ajax']->changeTitle($value); } } else { if ($prop == 'echo') { fn_echo($value); } } fn_set_hook('after_set_progress', $prop, $value, $extra); return true; }
$worksheet->set_row($row, $height);*/ } else { $worksheet->write($col . $row, $product[$field], $row % 2 == 0 ? $field_simple_odd : $field_simple); if (isset($width[$col])) { if ($width[$col] < strlen($product[$field])) { $width[$col] = strlen($product[$field]); } } else { $width[$col] = strlen($product[$field]); } } $col++; } $col = 'A'; $row++; } } $counter->Out(); } } foreach ($width as $col => $size) { if ($size > MAX_SIZE) { $size = MAX_SIZE; } $worksheet->set_column($col . ':' . $col, $size); } unset($bmp); //Close and output XLS document $workbook->close(); fn_echo('<br />' . fn_get_lang_var('done')); }
$image_path = 'sess_data/' . fn_basename($_REQUEST['image']); if (Storage::instance('custom_files')->isExist($image_path)) { $real_path = Storage::instance('custom_files')->getAbsolutePath($image_path); list(, , $image_type, $tmp_path) = fn_get_image_size($real_path); if ($type == 'T') { $thumb_path = $image_path . '_thumb'; if (!Storage::instance('custom_files')->isExist($thumb_path)) { // Output a thumbnail image list($cont, $format) = fn_resize_image($tmp_path, Registry::get('settings.Thumbnails.product_lists_thumbnail_width'), Registry::get('settings.Thumbnails.product_lists_thumbnail_height'), Registry::get('settings.Thumbnails.thumbnail_background_color')); if (!empty($cont)) { Storage::instance('custom_files')->put($thumb_path, array('contents' => $cont)); } } $real_path = Storage::instance('custom_files')->getAbsolutePath($thumb_path); } header('Content-type: ' . $image_type); fn_echo(fn_get_contents($real_path)); exit; } // Not image file. Display spacer instead. header('Content-type: image/gif'); readfile(fn_get_theme_path('[themes]/[theme]') . '/media/images/spacer.gif'); exit; } elseif ($mode == 'thumbnail') { $img = fn_generate_thumbnail($_REQUEST['image_path'], $_REQUEST['w'], $_REQUEST['h']); if (!empty($img)) { header('Content-type: ' . fn_get_file_type($img)); fn_echo(fn_get_contents($img)); } exit; }
/** * Fuctnions parses SQL file and import data from it * * @param string $file File for import * @param integer $buffer Buffer size for fread function * @param bool $show_status Show or do not show process by printing ' .' * @param integer $show_create_table 0 - Do not print the name of created table, 1 - Print name and get lang_var('create_table'), 2 - Print name without getting lang_var * @param bool $check_prefix Check table prefix and replace it with the installed in config.php * @param bool $track Use queries cache. Do not execute queries that already are executed. * @param bool $skip_errors Skip errors or not * @param bool $move_progress_bar Move COMET progress bar or not on show progress * @return bool false, if file is not accessible */ function db_import_sql_file($file, $buffer = 16384, $show_status = true, $show_create_table = 1, $check_prefix = false, $track = false, $skip_errors = false, $move_progress_bar = true) { if (file_exists($file)) { $path = dirname($file); $file_name = fn_basename($file); $tmp_file = $path . "/{$file_name}.tmp"; $executed_queries = array(); if ($track && file_exists($tmp_file)) { $executed_queries = unserialize(fn_get_contents($tmp_file)); } if ($skip_errors) { $_skip_errors = Registry::get('runtime.database.skip_errors'); Registry::set('runtime.database.skip_errors', true); } $fd = fopen($file, 'r'); if ($fd) { $ret = array(); $rest = ''; $fs = filesize($file); if ($show_status && $move_progress_bar) { fn_set_progress('step_scale', ceil($fs / $buffer)); } while (!feof($fd)) { $str = $rest . fread($fd, $buffer); $rest = fn_parse_queries($ret, $str); if ($show_status) { fn_set_progress('echo', '<br />' . __('importing_data'), $move_progress_bar); } if (!empty($ret)) { foreach ($ret as $query) { if (!in_array($query, $executed_queries)) { if ($show_create_table && preg_match('/CREATE\\s+TABLE\\s+`?(\\w+)`?/i', $query, $matches)) { if ($show_create_table == 1) { $_text = __('creating_table'); } elseif ($show_create_table == 2) { $_text = 'Creating table'; } $table_name = $check_prefix ? fn_check_db_prefix($matches[1], Registry::get('config.table_prefix')) : $matches[1]; if ($show_status) { fn_set_progress('echo', '<br />' . $_text . ': <b>' . $table_name . '</b>', $move_progress_bar); } } if ($check_prefix) { $query = fn_check_db_prefix($query); } Database::query($query); if ($track) { $executed_queries[] = $query; fn_put_contents($tmp_file, serialize($executed_queries)); } if ($show_status) { fn_echo(' .'); } } } $ret = array(); } } fclose($fd); return true; } if ($skip_errors) { Registry::set('runtime.database.skip_errors', $_skip_errors); } } return false; }
RusEximCommerceml::importDataOffersFile($xml, $service_exchange, $lang_code); } } fn_echo("success\n"); } } elseif ($type == 'sale' && $user_data['user_type'] != 'V' && $s_commerceml['exim_1c_check_prices'] != 'Y') { if ($mode == 'checkauth') { RusEximCommerceml::exportDataCheckauth(); } elseif ($mode == 'init') { RusEximCommerceml::exportDataInit(); } elseif ($mode == 'file') { if (RusEximCommerceml::createImportFile($filename) === false) { fn_echo("failure"); exit; } if ($s_commerceml['exim_1c_import_statuses'] == 'Y' && strpos($filename, 'orders') == 0) { $xml = RusEximCommerceml::getFileCommerceml($filename); if ($xml === false) { fn_echo("failure"); exit; } RusEximCommerceml::importFileOrders($xml, $lang_code); } fn_echo("success\n"); } elseif ($mode == 'query') { RusEximCommerceml::exportDataOrders($lang_code); } elseif ($mode == 'success') { fn_echo("success"); } } exit;
/** * Dispathes the execution control to correct controller * * @return nothing */ function fn_dispatch($controller = '', $mode = '', $action = '', $dispatch_extra = '', $area = AREA) { Debugger::checkpoint('After init'); $auth = $_SESSION['auth']; $controller = empty($controller) ? Registry::get('runtime.controller') : $controller; $mode = empty($mode) ? Registry::get('runtime.mode') : $mode; $action = empty($action) ? Registry::get('runtime.action') : $action; $dispatch_extra = empty($dispatch_extra) ? Registry::get('runtime.dispatch_extra') : $dispatch_extra; fn_set_hook('before_dispatch', $controller, $mode, $action, $dispatch_extra, $area); $view = Registry::get('view'); $run_controllers = true; $external = false; $status = CONTROLLER_STATUS_NO_PAGE; // CSRF protection if (fn_is_csrf_protection_enabled($auth) && !fn_csrf_validate_request(array('server' => $_SERVER, 'request' => $_REQUEST, 'session' => $_SESSION, 'controller' => $controller, 'mode' => $mode, 'action' => $action, 'dispatch_extra' => $dispatch_extra, 'area' => $area, 'auth' => $auth))) { fn_set_notification('E', __('error'), __('text_csrf_attack')); fn_redirect(fn_url()); } // If $config['http_host'] was different from the domain name, there was redirection to $config['http_host'] value. if (strtolower(Registry::get('config.current_host')) != strtolower(REAL_HOST) && $_SERVER['REQUEST_METHOD'] == 'GET' && !defined('CONSOLE')) { if (!empty($_SERVER['REDIRECT_URL'])) { $qstring = $_SERVER['REDIRECT_URL']; } else { if (!empty($_SERVER['REQUEST_URI'])) { $qstring = $_SERVER['REQUEST_URI']; } else { $qstring = Registry::get('config.current_url'); } } $curent_path = Registry::get('config.current_path'); if (!empty($curent_path) && strpos($qstring, $curent_path) === 0) { $qstring = substr_replace($qstring, '', 0, fn_strlen($curent_path)); } fn_redirect(Registry::get('config.current_location') . $qstring, false, true); } $upload_max_filesize = Bootstrap::getIniParam('upload_max_filesize'); $post_max_size = Bootstrap::getIniParam('post_max_size'); if (!defined('AJAX_REQUEST') && isset($_SERVER['CONTENT_LENGTH']) && ($_SERVER['CONTENT_LENGTH'] > fn_return_bytes($upload_max_filesize) || $_SERVER['CONTENT_LENGTH'] > fn_return_bytes($post_max_size))) { $max_size = fn_return_bytes($upload_max_filesize) < fn_return_bytes($post_max_size) ? $upload_max_filesize : $post_max_size; fn_set_notification('E', __('error'), __('text_forbidden_uploaded_file_size', array('[size]' => $max_size))); fn_redirect($_SERVER['HTTP_REFERER']); } // If URL contains session ID, remove it if (!defined('AJAX_REQUEST') && !empty($_REQUEST[Session::getName()]) && $_SERVER['REQUEST_METHOD'] == 'GET') { fn_redirect(fn_query_remove(Registry::get('config.current_url'), Session::getName())); } // If demo mode is enabled, check permissions FIX ME - why did we need one more user login check? if ($area == 'A') { if (Registry::get('config.demo_mode') == true) { $run_controllers = fn_check_permissions($controller, $mode, 'demo'); if ($run_controllers == false) { fn_set_notification('W', __('demo_mode'), __('demo_mode_content_text'), 'K', 'demo_mode'); if (defined('AJAX_REQUEST')) { exit; } fn_delete_notification('changes_saved'); $status = CONTROLLER_STATUS_REDIRECT; $_REQUEST['redirect_url'] = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : fn_url(''); } } else { $run_controllers = fn_check_permissions($controller, $mode, 'admin', '', $_REQUEST); if ($run_controllers == false) { if (defined('AJAX_REQUEST')) { $_info = Debugger::isActive() || fn_is_development() ? ' ' . $controller . '.' . $mode : ''; fn_set_notification('W', __('warning'), __('access_denied') . $_info); exit; } $status = CONTROLLER_STATUS_DENIED; } } } if ($_SERVER['REQUEST_METHOD'] != 'POST' && !defined('AJAX_REQUEST')) { if ($area == 'A' && empty($_REQUEST['keep_location']) && !defined('CONSOLE')) { if (!defined('HTTPS') && Registry::get('settings.Security.secure_admin') == 'Y') { fn_redirect(Registry::get('config.https_location') . '/' . Registry::get('config.current_url')); } elseif (defined('HTTPS') && Registry::get('settings.Security.secure_admin') != 'Y') { fn_redirect(Registry::get('config.http_location') . '/' . Registry::get('config.current_url')); } } elseif ($area == 'C') { $secure_controllers = fn_get_secure_controllers(); // if we are not on https but controller is secure, redirect to https if (!defined('HTTPS') && (Registry::get('settings.Security.secure_storefront') == 'full' || isset($secure_controllers[$controller]) && $secure_controllers[$controller] == 'active')) { fn_redirect(Registry::get('config.https_location') . '/' . Registry::get('config.current_url'), false, true); } // if we are on https and the controller is insecure, redirect to http if (defined('HTTPS') && Registry::get('settings.Security.secure_storefront') != 'full' && !isset($secure_controllers[$controller]) && Registry::get('settings.Security.keep_https') != 'Y') { fn_redirect(Registry::get('config.http_location') . '/' . Registry::get('config.current_url'), false, true); } } } LastView::instance()->prepare($_REQUEST); $controllers_cascade = array(); $controllers_list = array('init'); if ($run_controllers == true) { $controllers_list[] = $controller; $controllers_list = array_unique($controllers_list); } foreach ($controllers_list as $ctrl) { $core_controllers = fn_init_core_controllers($ctrl); list($addon_controllers) = fn_init_addon_controllers($ctrl); if (empty($core_controllers) && empty($addon_controllers)) { //$controllers_cascade = array(); // FIXME: controllers_cascade contains INIT. We should not clear initiation code. $status = CONTROLLER_STATUS_NO_PAGE; $run_controllers = false; break; } if (count($core_controllers) + count($addon_controllers) > 1) { throw new DeveloperException('Duplicate controller ' . $controller . var_export(array_merge($core_controllers, $addon_controllers), true)); } $core_pre_controllers = fn_init_core_controllers($ctrl, GET_PRE_CONTROLLERS); $core_post_controllers = fn_init_core_controllers($ctrl, GET_POST_CONTROLLERS); list($addon_pre_controllers) = fn_init_addon_controllers($ctrl, GET_PRE_CONTROLLERS); list($addon_post_controllers, $addons) = fn_init_addon_controllers($ctrl, GET_POST_CONTROLLERS); // we put addon post-controller to the top of post-controller cascade if current addon serves this request if (count($addon_controllers)) { $addon_post_controllers = fn_reorder_post_controllers($addon_post_controllers, $addon_controllers[0]); } $controllers_cascade = array_merge($controllers_cascade, $addon_pre_controllers, $core_pre_controllers, $core_controllers, $addon_controllers, $core_post_controllers, $addon_post_controllers); if (empty($controllers_cascade)) { throw new DeveloperException("No controllers for: {$ctrl}"); } } if ($mode == 'add') { $tpl = 'update.tpl'; } elseif (strpos($mode, 'add_') === 0) { $tpl = str_replace('add_', 'update_', $mode) . '.tpl'; } else { $tpl = $mode . '.tpl'; } $view = Registry::get('view'); if ($view->templateExists('views/' . $controller . '/' . $tpl)) { // try to find template in base views $view->assign('content_tpl', 'views/' . $controller . '/' . $tpl); } elseif (defined('LOADED_ADDON_PATH') && $view->templateExists('addons/' . LOADED_ADDON_PATH . '/views/' . $controller . '/' . $tpl)) { // try to find template in addon views $view->assign('content_tpl', 'addons/' . LOADED_ADDON_PATH . '/views/' . $controller . '/' . $tpl); } elseif (!empty($addons)) { // try to find template in addon views that extend base views foreach ($addons as $addon => $_v) { if ($view->templateExists('addons/' . $addon . '/views/' . $controller . '/' . $tpl)) { $view->assign('content_tpl', 'addons/' . $addon . '/views/' . $controller . '/' . $tpl); break; } } } /** * Performs actions after template assignment and before controller run * * @param string $controller controller name * @param string $mode controller mode name * @param string $area current working area * @param array $controllers_cascade list of controllers to run */ fn_set_hook('dispatch_assign_template', $controller, $mode, $area, $controllers_cascade); foreach ($controllers_cascade as $item) { $_res = fn_run_controller($item, $controller, $mode, $action, $dispatch_extra); // 0 - status, 1 - url $url = !empty($_res[1]) ? $_res[1] : ''; $external = !empty($_res[2]) ? $_res[2] : false; $permanent = !empty($_res[3]) ? $_res[3] : false; // Status could be changed only if we allow to run controllers despite of init controller if ($run_controllers == true) { $status = !empty($_res[0]) ? $_res[0] : CONTROLLER_STATUS_OK; } if ($status == CONTROLLER_STATUS_OK && !empty($url)) { $redirect_url = $url; } elseif ($status == CONTROLLER_STATUS_REDIRECT && !empty($url)) { $redirect_url = $url; break; } elseif ($status == CONTROLLER_STATUS_DENIED || $status == CONTROLLER_STATUS_NO_PAGE) { break; } } LastView::instance()->init($_REQUEST); // In console mode, just stop here if (defined('CONSOLE')) { $notifications = fn_get_notifications(); $exit_code = 0; foreach ($notifications as $n) { fn_echo('[' . $n['title'] . '] ' . $n['message'] . "\n"); if ($n['type'] == 'E') { $exit_code = 1; } } exit($exit_code); } if (!empty($auth['this_login']) && Registry::ifGet($auth['this_login'], 'N') === 'Y') { fn_set_notification('E', __('error'), __(ACCOUNT_TYPE . LOGIN_STATUS_USER_DISABLED)); $status = CONTROLLER_STATUS_DENIED; } // [Block manager] // block manager is disabled for vendors. if (!(fn_allowed_for('MULTIVENDOR') && Registry::get('runtime.company_id') || fn_allowed_for('ULTIMATE') && !Registry::get('runtime.company_id'))) { if (fn_check_permissions('block_manager', 'manage', 'admin')) { $dynamic_object = SchemesManager::getDynamicObject($_REQUEST['dispatch'], $area, $_REQUEST); if (!empty($dynamic_object)) { if ($area == 'A' && Registry::get('runtime.mode') != 'add' && !empty($_REQUEST[$dynamic_object['key']])) { $object_id = $_REQUEST[$dynamic_object['key']]; $location = Location::instance()->get($dynamic_object['customer_dispatch'], $dynamic_object, CART_LANGUAGE); if (!empty($location) && $location['is_default'] != 1) { $params = array('dynamic_object' => array('object_type' => $dynamic_object['object_type'], 'object_id' => $object_id), $dynamic_object['key'] => $object_id, 'manage_url' => Registry::get('config.current_url')); Registry::set('navigation.tabs.blocks', array('title' => __('layouts'), 'href' => 'block_manager.manage_in_tab?' . http_build_query($params), 'ajax' => true)); } } } } } // [/Block manager] // Redirect if controller returned successful/redirect status only if (in_array($status, array(CONTROLLER_STATUS_OK, CONTROLLER_STATUS_REDIRECT)) && !empty($_REQUEST['redirect_url']) && !$external) { $redirect_url = $_REQUEST['redirect_url']; } // If controller returns "Redirect" status, check if redirect url exists if ($status == CONTROLLER_STATUS_REDIRECT && empty($redirect_url)) { $status = CONTROLLER_STATUS_NO_PAGE; } // In backend show "changes saved" notification if ($area == 'A' && $_SERVER['REQUEST_METHOD'] == 'POST' && in_array($status, array(CONTROLLER_STATUS_OK, CONTROLLER_STATUS_REDIRECT))) { if (strpos($mode, 'update') !== false && $mode != 'update_status' && $mode != 'update_mode' && !fn_notification_exists('extra', 'demo_mode') && !fn_notification_exists('type', 'E')) { fn_set_notification('N', __('notice'), __('text_changes_saved'), 'I', 'changes_saved'); } } // Attach params and redirect if needed if (in_array($status, array(CONTROLLER_STATUS_OK, CONTROLLER_STATUS_REDIRECT)) && !empty($redirect_url)) { if (!isset($_REQUEST['return_to_list'])) { $params = array('page', 'selected_section', 'active_tab'); $url_params = array(); foreach ($params as $param) { if (!empty($_REQUEST[$param])) { $url_params[$param] = $_REQUEST[$param]; } } if (!empty($url_params)) { $redirect_url = fn_link_attach($redirect_url, http_build_query($url_params)); } } if (!isset($external)) { $external = false; } if (!isset($permanent)) { $permanent = false; } fn_redirect($redirect_url, $external, $permanent); } if (!$view->getTemplateVars('content_tpl') && $status == CONTROLLER_STATUS_OK) { // FIXME $status = CONTROLLER_STATUS_NO_PAGE; } if ($status != CONTROLLER_STATUS_OK) { if ($status == CONTROLLER_STATUS_NO_PAGE) { if ($area == 'A' && empty($auth['user_id'])) { // If admin is not logged in redirect to login page from not found page fn_set_notification('W', __('page_not_found'), __('page_not_found_text')); fn_redirect("auth.login_form"); } header(' ', true, 404); } $view->assign('exception_status', $status); if ($area == 'A') { $view->assign('content_tpl', 'exception.tpl'); // for backend only } if ($status == CONTROLLER_STATUS_DENIED) { $view->assign('page_title', __('access_denied')); } elseif ($status == CONTROLLER_STATUS_NO_PAGE) { $view->assign('page_title', __('page_not_found')); } } fn_set_hook('dispatch_before_display'); Debugger::checkpoint('Before TPL'); // Pass current URL to ajax response only if we render whole page if (defined('AJAX_REQUEST') && Registry::get('runtime.root_template') == 'index.tpl') { Registry::get('ajax')->assign('current_url', fn_url(Registry::get('config.current_url'), $area, 'current')); } Registry::get('view')->display(Registry::get('runtime.root_template')); Debugger::checkpoint('After TPL'); Debugger::display(); fn_set_hook('complete'); if (defined('AJAX_REQUEST')) { // HHVM workaround. Destroy Ajax object manually if it has been created. $ajax = Registry::get('ajax'); $ajax = null; } exit; // stop execution }
} if (is_array($data)) { // Ger newsletter data $newsletter_data = array(); foreach ($data['send_ids'] as $newsletter_id) { $n = array(); foreach (fn_get_translation_languages() as $lang_code => $v) { $n[$lang_code] = fn_get_newsletter_data($newsletter_id, $lang_code); $n[$lang_code]['body_html'] = fn_rewrite_links($n[$lang_code]['body_html'], $newsletter_id, $n[$lang_code]['campaign_id']); } $newsletter_data[] = $n; } foreach (array_splice($data['recipients'], 0, Registry::get('addons.newsletters.newsletters_per_pass')) as $subscriber) { foreach ($newsletter_data as $newsletter) { $body = fn_render_newsletter($newsletter[$subscriber['lang_code']]['body_html'], $subscriber); fn_echo(__('sending_email_to', array('[email]' => $subscriber['email'])) . '<br />'); if (!empty($newsletter[$subscriber['lang_code']]['newsletter_multiple'])) { $subjects = explode("\n", $newsletter[$subscriber['lang_code']]['newsletter_multiple']); $newsletter[$subscriber['lang_code']]['newsletter'] = trim($subjects[rand(0, count($subjects) - 1)]); } fn_send_newsletter($subscriber['email'], $subscriber, $newsletter[$subscriber['lang_code']]['newsletter'], $body, array(), $subscriber['lang_code'], $subscriber['reply_to']); } } if (!empty($data['recipients'])) { fn_set_storage_data('newsletters_batch_' . $_REQUEST['key'], serialize($data)); return array(CONTROLLER_STATUS_OK, 'newsletters.batch_send?key=' . $_REQUEST['key']); } else { fn_set_storage_data('newsletters_batch_' . $_REQUEST['key']); fn_set_notification('N', __('notice'), __('text_newsletter_sent')); $suffix = sizeof($data['send_ids']) == 1 ? ".update?newsletter_id=" . array_pop($data['send_ids']) : '.manage'; return array(CONTROLLER_STATUS_OK, 'newsletters' . $suffix);