Escape character conversion ****
// If you have extensive html in your descriptions and it's getting mangled on upload, turn this off
// set to 1 = replace quotes with escape characters
// set to 0 = no quote replacement
global $replace_quotes;
$replace_quotes = false;
// **** Field Separator ****
// change this if you can't use the default of tabs
// Tab is the default, comma and semicolon are commonly supported by various progs
// Remember, if your descriptions contain this character, you will confuse EP!
global $separator;
$separator = "\t"; // tab is default
//$separator = ","; // comma
//$separator = ";"; // semi-colon
//$separator = "~"; // tilde
//$separator = "-"; // dash
//$separator = "*"; // splat
// *** Excel safe output ***
// this setting will supersede the previous $separator setting and create a file
// that excel will import without spanning cells from embedded commas.
global $excel_safe_output;
$excel_safe_output = false; // default is: false
if ($excel_safe_output == true) { $separator = ","; }
// *** Preserve Tabs, Carriage returns and Line feeds ***
// this setting will preserve the special chars that can cause problems in
// a text based output. When used with $excel_safe_output, it will safely
// preserve these elements in the export and import.
global $preserve_tabs_cr_lf;
$preserve_tabs_cr_lf = false; // default is: false
// **** Max Category Levels ****
// change this if you need more or fewer categories
global $max_categories;
$max_categories = 3; // 7 is default
// VJ product attributes begin
// **** Product Attributes ****
// change this to false, if do not want to download product attributes
global $products_with_attributes;
$products_with_attributes = true;
// change this to true, if you use QTYpro and want to set attributes stock with EP.
global $products_attributes_stock;
$products_attributes_stock = false;
// change this if you want to download selected product options
// this might be handy, if you have a lot of product options, and your output file exceeds 256 columns (which is the max. limit MS Excel is able to handle)
global $attribute_options_select;
//$attribute_options_select = array('Size', 'Model'); // uncomment and fill with product options name you wish to download // comment this line, if you wish to download all product options
// VJ product attributes end
// *** Show settings on EP page ***
global $show_ep_settings;
$show_ep_settings = false; // default is: false
// ****************************************
// Froogle configuration variables
// -- YOU MUST CONFIGURE THIS! IT WON'T WORK OUT OF THE BOX!
// ****************************************
// **** Froogle product info page path ****
// We can't use the tep functions to create the link, because the links will point to the admin, since that's where we're at.
// So put the entire path to your product_info.php page here
global $froogle_product_info_path;
$froogle_product_info_path = "http://www.yourdomain.com/catalog/product_info.php";
// **** Froogle product image path ****
// Set this to the path to your images directory
global $froogle_image_path;
$froogle_image_path = "http://www.yourdomain.com/catalog/images/";
// **** Froogle - search engine friendly setting
// if your store has SEARCH ENGINE FRIENDLY URLS set, then turn this to true
// I did it this way because I'm having trouble with the code seeing the constants
// that are defined in other places.
global $froogle_SEF_urls;
$froogle_SEF_urls = false;
// ****************************************
// End Froogle configuration variables
// ****************************************
//*******************************
//*******************************
// E N D
// C O N F I G U R A T I O N
// V A R I A B L E S
//*******************************
//*******************************
//*******************************
//*******************************
// S T A R T
// INITIALIZATION
//*******************************
//*******************************
//*******************************
// If you are running a pre-Nov1-2002 snapshot of OSC, then we need this include line to avoid
// errors like:
// undefined function tep_get_uploaded_file
if (!function_exists(tep_get_uploaded_file)){
include ('easypopulate_functions.php');
}
//*******************************
// modify tableBlock for use here.
class epbox extends tableBlock {
// constructor
function epbox($contents, $direct_ouput = true) {
$this->table_width = '';
if (!empty($contents) && $direct_ouput == true) {
echo $this->tableBlock($contents);
}
}
// only member function
function output($contents) {
return $this->tableBlock($contents);
}
}
// VJ product attributes begin
global $attribute_options_array;
$attribute_options_array = array();
if ($products_with_attributes == true) {
if (is_array($attribute_options_select) && (count($attribute_options_select) > 0)) {
foreach ($attribute_options_select as $value) {
$attribute_options_query = "select distinct products_options_id from " . TABLE_PRODUCTS_OPTIONS . " where products_options_name = '" . $value . "'";
$attribute_options_values = tep_db_query($attribute_options_query);
if ($attribute_options = tep_db_fetch_array($attribute_options_values)){
$attribute_options_array[] = array('products_options_id' => $attribute_options['products_options_id']);
}
}
} else {
$attribute_options_query = "select distinct products_options_id from " . TABLE_PRODUCTS_OPTIONS . " order by products_options_id";
$attribute_options_values = tep_db_query($attribute_options_query);
while ($attribute_options = tep_db_fetch_array($attribute_options_values)){
$attribute_options_array[] = array('products_options_id' => $attribute_options['products_options_id']);
}
}
}
// VJ product attributes end
global $filelayout, $filelayout_count, $filelayout_sql, $langcode, $fileheaders;
// these are the fields that will be defaulted to the current values in the database if they are not found in the incoming file
global $default_these;
$default_these = array(
'v_products_image',
#'v_products_mimage',
#'v_products_bimage',
#'v_products_subimage1',
#'v_products_bsubimage1',
#'v_products_subimage2',
#'v_products_bsubimage2',
#'v_products_subimage3',
#'v_products_bsubimage3',
'v_categories_id',
'v_products_price',
'v_products_quantity',
'v_products_weight',
'v_date_avail',
'v_instock',
'v_tax_class_title',
'v_manufacturers_name',
'v_manufacturers_id',
'v_products_dim_type',
'v_products_length',
'v_products_width',
'v_products_height',
'v_products_upc'
);
//elari check default language_id from configuration table DEFAULT_LANGUAGE
$epdlanguage_query = tep_db_query("select languages_id, name from " . TABLE_LANGUAGES . " where code = '" . DEFAULT_LANGUAGE . "'");
if (tep_db_num_rows($epdlanguage_query)) {
$epdlanguage = tep_db_fetch_array($epdlanguage_query);
$epdlanguage_id = $epdlanguage['languages_id'];
$epdlanguage_name = $epdlanguage['name'];
} else {
Echo 'Strange but there is no default language to work... That may not happen, just in case... ';
}
$langcode = ep_get_languages();
if ( $dltype != '' ){
// if dltype is set, then create the filelayout. Otherwise it gets read from the uploaded file
ep_create_filelayout($dltype); // get the right filelayout for this download
}
//*******************************
//*******************************
// E N D
// INITIALIZATION
//*******************************
//*******************************
if ( $download == 'stream' or $download == 'activestream' or $download == 'tempfile' ){
//*******************************
//*******************************
// DOWNLOAD FILE
//*******************************
//*******************************
$filestring = ""; // this holds the csv file we want to download
$result = tep_db_query($filelayout_sql);
$row = tep_db_fetch_array($result);
// $EXPORT_TIME=time(); // start export time when export is started.
$EXPORT_TIME = strftime('%Y%b%d-%H%I');
if ($dltype=="froogle"){
$EXPORT_TIME = "FroogleEP" . $EXPORT_TIME;
} else {
$EXPORT_TIME = "EP" . $EXPORT_TIME;
}
// Here we need to allow for the mapping of internal field names to external field names
// default to all headers named like the internal ones
// the field mapping array only needs to cover those fields that need to have their name changed
if ( count($fileheaders) != 0 ){
$filelayout_header = $fileheaders; // if they gave us fileheaders for the dl, then use them
} else {
$filelayout_header = $filelayout; // if no mapping was spec'd use the internal field names for header names
}
//We prepare the table heading with layout values
foreach( $filelayout_header as $key => $value ){
$filestring .= $key . $separator;
}
// now lop off the trailing tab
$filestring = substr($filestring, 0, strlen($filestring)-1);
// set the type
if ( $dltype == 'froogle' ){
$endofrow = "\n";
} else {
// default to normal end of row
$endofrow = $separator . 'EOREOR' . "\n";
}
$filestring .= $endofrow;
if ($download == 'activestream'){
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=$EXPORT_TIME" . (($excel_safe_output == true)?".csv":".txt"));
// Changed if using SSL, helps prevent program delay/timeout (add to backup.php also)
// header("Pragma: no-cache");
if ($request_type== 'NONSSL'){
header("Pragma: no-cache");
} else {
header("Pragma: ");
}
header("Expires: 0");
echo $filestring;
}
$num_of_langs = count($langcode);
while ($row){
// if the filelayout says we need a products_name, get it
// build the long full froogle image path
$row['v_products_fullpath_image'] = $froogle_image_path . $row['v_products_image'];
// Other froogle defaults go here for now
$row['v_froogle_instock'] = 'Y';
$row['v_froogle_shipping'] = '';
$row['v_froogle_upc'] = '';
$row['v_froogle_color'] = '';
$row['v_froogle_size'] = '';
$row['v_froogle_quantitylevel'] = '';
$row['v_froogle_manufacturer_id'] = '';
$row['v_froogle_exp_date'] = '';
$row['v_froogle_product_type'] = 'OTHER';
$row['v_froogle_delete'] = '';
$row['v_froogle_currency'] = 'USD';
$row['v_froogle_offer_id'] = $row['v_products_model'];
$row['v_froogle_product_id'] = $row['v_products_model'];
// names and descriptions require that we loop thru all languages that are turned on in the store
foreach ($langcode as $key => $lang){
$lid = $lang['id'];
// for each language, get the description and set the vals
$sql2 = "SELECT *
FROM ".TABLE_PRODUCTS_DESCRIPTION."
WHERE
products_id = " . $row['v_products_id'] . " AND
language_id = '" . $lid . "'
";
$result2 = tep_db_query($sql2);
$row2 = tep_db_fetch_array($result2);
// I'm only doing this for the first language, since right now froogle is US only.. Fix later!
// adding url for froogle, but it should be available no matter what
if ($froogle_SEF_urls){
// if only one language
if ($num_of_langs == 1){
$row['v_froogle_products_url_' . $lid] = $froogle_product_info_path . '/products_id/' . $row['v_products_id'];
} else {
$row['v_froogle_products_url_' . $lid] = $froogle_product_info_path . '/products_id/' . $row['v_products_id'] . '/language/' . $lid;
}
} else {
if ($num_of_langs == 1){
$row['v_froogle_products_url_' . $lid] = $froogle_product_info_path . '?products_id=' . $row['v_products_id'];
} else {
$row['v_froogle_products_url_' . $lid] = $froogle_product_info_path . '?products_id=' . $row['v_products_id'] . '&language=' . $lid;
}
}
$row['v_products_name_' . $lid] = $row2['products_name'];
$row['v_products_description_' . $lid] = $row2['products_description'];
$row['v_products_url_' . $lid] = $row2['products_url'];
// froogle advanced format needs the quotes around the name and desc
$row['v_froogle_products_name_' . $lid] = '"' . strip_tags(str_replace('"','""',$row2['products_name'])) . '"';
$row['v_froogle_products_description_' . $lid] = '"' . strip_tags(str_replace('"','""',$row2['products_description'])) . '"';
// support for Linda's Header Controller 2.0 here
if(isset($filelayout['v_products_head_title_tag_' . $lid])){
$row['v_products_head_title_tag_' . $lid] = $row2['products_head_title_tag'];
$row['v_products_head_desc_tag_' . $lid] = $row2['products_head_desc_tag'];
$row['v_products_head_keywords_tag_' . $lid] = $row2['products_head_keywords_tag'];
}
// end support for Header Controller 2.0
}
// for the categories, we need to keep looping until we find the root category
// start with v_categories_id
// Get the category description
// set the appropriate variable name
// if parent_id is not null, then follow it up.
// we'll populate an aray first, then decide where it goes in the
$thecategory_id = $row['v_categories_id'];
$fullcategory = ''; // this will have the entire category stack for froogle
for( $categorylevel=1; $categorylevel<$max_categories+1; $categorylevel++){
if ($thecategory_id){
$sql2 = "SELECT categories_name
FROM ".TABLE_CATEGORIES_DESCRIPTION."
WHERE
categories_id = " . $thecategory_id . " AND
language_id = " . $epdlanguage_id ;
$result2 = tep_db_query($sql2);
$row2 = tep_db_fetch_array($result2);
// only set it if we found something
$temprow['v_categories_name_' . $categorylevel] = $row2['categories_name'];
// now get the parent ID if there was one
$sql3 = "SELECT parent_id
FROM ".TABLE_CATEGORIES."
WHERE
categories_id = " . $thecategory_id;
$result3 = tep_db_query($sql3);
$row3 = tep_db_fetch_array($result3);
$theparent_id = $row3['parent_id'];
if ($theparent_id != ''){
// there was a parent ID, lets set thecategoryid to get the next level
$thecategory_id = $theparent_id;
} else {
// we have found the top level category for this item,
$thecategory_id = false;
}
//$fullcategory .= " > " . $row2['categories_name'];
$fullcategory = $row2['categories_name'] . " > " . $fullcategory;
} else {
$temprow['v_categories_name_' . $categorylevel] = '';
}
}
// now trim off the last ">" from the category stack
$row['v_category_fullpath'] = substr($fullcategory,0,strlen($fullcategory)-3);
// temprow has the old style low to high level categories.
$newlevel = 1;
// let's turn them into high to low level categories
for( $categorylevel=6; $categorylevel>0; $categorylevel--){
if ($temprow['v_categories_name_' . $categorylevel] != ''){
$row['v_categories_name_' . $newlevel++] = $temprow['v_categories_name_' . $categorylevel];
}
}
// if the filelayout says we need a manufacturers name, get it
if (isset($filelayout['v_manufacturers_name'])){
if ($row['v_manufacturers_id'] != ''){
$sql2 = "SELECT manufacturers_name
FROM ".TABLE_MANUFACTURERS."
WHERE
manufacturers_id = " . $row['v_manufacturers_id']
;
$result2 = tep_db_query($sql2);
$row2 = tep_db_fetch_array($result2);
$row['v_manufacturers_name'] = $row2['manufacturers_name'];
}
}
// If you have other modules that need to be available, put them here
// VJ product attribs begin
if (isset($filelayout['v_attribute_options_id_1'])){
$languages = tep_get_languages();
$attribute_options_count = 1;
foreach ($attribute_options_array as $attribute_options) {
$row['v_attribute_options_id_' . $attribute_options_count] = $attribute_options['products_options_id'];
for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
$lid = $languages[$i]['id'];
$attribute_options_languages_query = "select products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$attribute_options['products_options_id'] . "' and language_id = '" . (int)$lid . "'";
$attribute_options_languages_values = tep_db_query($attribute_options_languages_query);
$attribute_options_languages = tep_db_fetch_array($attribute_options_languages_values);
$row['v_attribute_options_name_' . $attribute_options_count . '_' . $lid] = $attribute_options_languages['products_options_name'];
}
$attribute_values_query = "select products_options_values_id from " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$attribute_options['products_options_id'] . "' order by products_options_values_id";
$attribute_values_values = tep_db_query($attribute_values_query);
$attribute_values_count = 1;
while ($attribute_values = tep_db_fetch_array($attribute_values_values)) {
$row['v_attribute_values_id_' . $attribute_options_count . '_' . $attribute_values_count] = $attribute_values['products_options_values_id'];
$attribute_values_price_query = "select options_values_price, price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$row['v_products_id'] . "' and options_id = '" . (int)$attribute_options['products_options_id'] . "' and options_values_id = '" . (int)$attribute_values['products_options_values_id'] . "'";
$attribute_values_price_values = tep_db_query($attribute_values_price_query);
$attribute_values_price = tep_db_fetch_array($attribute_values_price_values);
$row['v_attribute_values_price_' . $attribute_options_count . '_' . $attribute_values_count] = $attribute_values_price['price_prefix'] . $attribute_values_price['options_values_price'];
//// attributes stock add start
if ( $products_attributes_stock == true ) {
$stock_attributes = $attribute_options['products_options_id'].'-'.$attribute_values['products_options_values_id'];
$stock_quantity_query = tep_db_query("select products_stock_quantity from " . TABLE_PRODUCTS_STOCK . " where products_id = '" . (int)$row['v_products_id'] . "' and products_stock_attributes = '" . $stock_attributes . "'");
$stock_quantity = tep_db_fetch_array($stock_quantity_query);
$row['v_attribute_values_stock_' . $attribute_options_count . '_' . $attribute_values_count] = $stock_quantity['products_stock_quantity'];
}
//// attributes stock add end
for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
$lid = $languages[$i]['id'];
$attribute_values_languages_query = "select products_options_values_name from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$attribute_values['products_options_values_id'] . "' and language_id = '" . (int)$lid . "'";
$attribute_values_languages_values = tep_db_query($attribute_values_languages_query);
$attribute_values_languages = tep_db_fetch_array($attribute_values_languages_values);
$row['v_attribute_values_name_' . $attribute_options_count . '_' . $attribute_values_count . '_' . $lid] = $attribute_values_languages['products_options_values_name'];
}
$attribute_values_count++;
}
$attribute_options_count++;
}
}
// VJ product attribs end
// this is for the separate price per customer module
if (isset($filelayout['v_customer_price_1'])){
$sql2 = "SELECT
customers_group_price,
customers_group_id
FROM
".TABLE_PRODUCTS_GROUPS."
WHERE
products_id = " . $row['v_products_id'] . "
ORDER BY
customers_group_id"
;
$result2 = tep_db_query($sql2);
$ll = 1;
$row2 = tep_db_fetch_array($result2);
while( $row2 ){
$row['v_customer_group_id_' . $ll] = $row2['customers_group_id'];
$row['v_customer_price_' . $ll] = $row2['customers_group_price'];
$row2 = tep_db_fetch_array($result2);
$ll++;
}
}
if ($dltype == 'froogle'){
// For froogle, we check the specials prices for any applicable specials, and use that price
// by grabbing the specials id descending, we always get the most recently added special price
// I'm checking status because I think you can turn off specials
$sql2 = "SELECT
specials_new_products_price
FROM
".TABLE_SPECIALS."
WHERE
products_id = " . $row['v_products_id'] . " and
status = 1 and
expires_date < CURRENT_TIMESTAMP
ORDER BY
specials_id DESC"
;
$result2 = tep_db_query($sql2);
$ll = 1;
$row2 = tep_db_fetch_array($result2);
if( $row2 ){
// reset the products price to our special price if there is one for this product
$row['v_products_price'] = $row2['specials_new_products_price'];
}
}
//elari -
//We check the value of tax class and title instead of the id
//Then we add the tax to price if $price_with_tax is set to 1
$row_tax_multiplier = tep_get_tax_class_rate($row['v_tax_class_id']);
$row['v_tax_class_title'] = tep_get_tax_class_title($row['v_tax_class_id']);
$row['v_products_price'] = round($row['v_products_price'] +
($price_with_tax * $row['v_products_price'] * $row_tax_multiplier / 100),2);
// Now set the status to a word the user specd in the config vars
if ( $row['v_status'] == '1' ){
$row['v_status'] = $active;
} else {
$row['v_status'] = $inactive;
}
// remove any bad things in the texts that could confuse EasyPopulate
$therow = '';
foreach( $filelayout as $key => $value ){
//echo "The field was $key
";
$thetext = $row[$key];
// kill the carriage returns and tabs in the descriptions, they're killing me!
if ($preserve_tabs_cr_lf == false || $dltype == 'froogle') {
$thetext = str_replace("\r",' ',$thetext);
$thetext = str_replace("\n",' ',$thetext);
$thetext = str_replace("\t",' ',$thetext);
}
if ($excel_safe_output == true && $dltype != 'froogle') {
// use quoted values and escape the embedded quotes for excel safe output.
$therow .= '"'.str_replace('"','""',$thetext).'"' . $separator;
} else {
// and put the text into the output separated by $separator defined above
$therow .= $thetext . $separator;
}
}
// lop off the trailing tab, then append the end of row indicator
$therow = substr($therow,0,strlen($therow)-1) . $endofrow;
if ($download == 'activestream'){
echo $therow;
} else {
$filestring .= $therow;
}
// grab the next row from the db
$row = tep_db_fetch_array($result);
}
// now either stream it to them or put it in the temp directory
if ($download == 'activestream'){
die();
} elseif ($download == 'stream'){
//*******************************
// STREAM FILE
//*******************************
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=$EXPORT_TIME" . (($excel_safe_output == true)?".csv":".txt"));
// Changed if using SSL, helps prevent program delay/timeout (add to backup.php also)
// header("Pragma: no-cache");
if ($request_type== 'NONSSL'){
header("Pragma: no-cache");
} else {
header("Pragma: ");
}
header("Expires: 0");
echo $filestring;
die();
} elseif ($download == 'tempfile') {
//*******************************
// PUT FILE IN TEMP DIR
//*******************************
$tmpfname = $tempdir . "$EXPORT_TIME" . (($excel_safe_output == true)?".csv":".txt");
//unlink($tmpfname);
$fp = fopen( $tmpfname, "w+");
fwrite($fp, $filestring);
fclose($fp);
echo "You can get your file in the Tools/File Manager here: " . $tempdir . "EP" . $EXPORT_TIME . (($excel_safe_output == true)?".csv":".txt");
die();
}
} // *** END *** download section
?>
>
|
|
";
echo "File uploaded. ";
echo "Filename: " . $localfile . "
|
No products_model field in record. This line was not imported
";
echo "
";
}
// end of row insertion code
}
require(DIR_WS_INCLUDES . 'application_bottom.php');
?>