Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Easy Populate & Products Attributes


VJ

Recommended Posts

I havea problem.

 

I can download the database to my temp directory but on uploading, using Easypopulate I get message -

File uploaded

40,000 bytes

 

(I can't remember the exact message from last night and the server is down this morning!)

 

I can find the uploaded file on the temp directory, but the database prices haven't changed.

 

Any ideas?

 

Did you find a solution yet?

Pixy

One day at a time - we all have to learn

Link to comment
Share on other sites

Pixy, you need to fix your v_product_model field, each and every one must be unique to use EP, some are unique, most have the same model # and some are even empty, which does not work.

Link to comment
Share on other sites

I'm getting the same problem, even when trying to use the sample output file.

 

File uploaded.

Temporary filename: /tmp/php7Mm5OT

User filename: sample_output_file.txt

Size: 80290

 

 

I'm pretty familiar with EP, and have used it on many sites in the past but I'm unable to get it to work with this new setup.

 

Can it have something to do with Registered Globals?

Link to comment
Share on other sites

I wanted to let people know that I figured out why I had my problem- even though the docs say that the 'tab delimited' method is the default, the latest package is set with a semi-colon as the default delimiter - look around line 80 to double check that the file you're trying to upload matches the setting for the delimiter or it will not work.

Link to comment
Share on other sites

that would explain why some of the files i have been getting from people are delimited that way, wish if people do things like that, they do it right . . .

Link to comment
Share on other sites

Ugh...frustration is my worst enemy :( Well, today I dived into EP and I am a little confused on what to do. So here are a few question I came accross while working with EP:

 

1. What is the difference between EPA & EPB. I exported the file from my test products and added 1 new one for a test run and it told me I had to use EPB.

 

2. How do I know what product ID to assign any new products in the file?

 

3. Can a file named the same as an old one with updated info overwright the old one (and in the SQL DB) and delete the products that are no longer available (i.e. discontinued products)?

 

4. Can I delete the extra fields I don't use (i.e. v_products_images_xl), or will that mess it all up?

 

5. I have several distributors that I can get csv files from. Is it possible to import them seperately to make it easier to do changes or do they all have to be merged into one massive file to import?

 

Well, so far that is all that I can think of at the moment so thank you all very much in advance for your help :)

Link to comment
Share on other sites

1. have no idea on epa and epb, havent seen that thus dont know what/where you got easypopulate and / or what version of osCommerce you are using.

2. oscommerce assigns the product id #, not easypopulate, thus again, you are working with something not from here.

3. easypopulate does not delete products.

4. v_products_images_xl is not in the stock ep.

5. as long as you have the correct fields in the csv from the distributor you are ok

Link to comment
Share on other sites

This has been quite the easter egg hunt. Since late last night I have been reading and reading and reading about how people have added fields to the easypopulate file and the download works fine, but the upload mixes the data all up.

 

Some have even pasted code to the screen for us to look at, and others are happy to let us know they have solved this issue.

 

I do not think the contribution where we can add new fields to easy populate is written correctly. At least from the stand point of providing us with a clear direction of where to exactly place the field names on the easypopulate.php file.

 

This is boggling, as I have no problem adding fields to my database, and pulling the data down to any page I want. But for some reason, the uploading of my easy populate file is mixing the data up.

 

Just where oh where :blink: on the easypopulate page do we have to make sure the new fields we are adding are placed in the right order. Giving line numbers to the location is not a great solution as some people have added lines of code to their file already.

 

Is this the only place? And if so, If we were to add a new field, where in this list should it go?

 

$query = "INSERT INTO ".TABLE_PRODUCTS." (
products_image,
products_model,
products_price,
products_status,
products_last_modified,
products_date_added,
products_date_available,
products_tax_class_id,
products_weight,
products_quantity,
manufacturers_id)
VALUES (

 

There are far to many people on this board asking for help for this issue. I can understand those of you who have the experience to not offer us solutions with out makeing us work for it, but golly gee... There are 90 pages of people asking almost the same questions... :thumbsup:

Edited by pura vida
Link to comment
Share on other sites

I noticed my question was asked on a similar thread that mibble responded to with

 

it duplicates because of not using categories properly, and or having an apostrophe in the categories name. dont use apostrophes . .

 

I havent used apostrophes but i think i may have used the categories incorrectly ...

 

i used the model of

v_categories_name_1 = Rocks

v_categories_name_2 = Sedimentary Rocks

v_categories_name_3 = Limestone Rocks

 

for the categories, so the model looks right

 

but i end up with duplicate products... forinstance

If before the upload the product lived in

v_categories_name_1 = Rocks

 

and after the upload i changed it to

v_categories_name_1 = Rocks

v_categories_name_2 = Sedimentary Rocks

v_categories_name_3 = Limestone Rocks

 

i would end up with the same product in both categories

 

how should this be fixed? any suggestions?

 

Question if i upload an EP file with NO products on it will my store be empty or will it make no changes to the current store ?

 

also i want to post a method for some users to use that are intimidated by looking at the EP file ... i created 2 spread sheets

 

www.nolagraphics.com/ep

 

1) the EP template file as blank(the header row may be different for your store so download a complete file from your store and delete everything except the header row)

 

2) a modified EP template file broken into worksheets and saved as an excel file for human readable format ;) This allows you to seperate each category and view your products easier (the header row may be differnt from your store so use this only as a model to create your own, new worksheets <which is what i am using there> can be created in excel by selecting INSERT-->WORKSHEET, further more they can be named your category name by dbl clicking on the tab at the bottom) Just to state it cause theres always gonna be that one person who tries ..

DO NOT UPLOAD THIS FILE VIA EP It may cause issues.. this is only to keep your inventory more organized

 

after editing your human readable format file copy and paste all rows into the EPtemplate file for each worksheet ... and then VIOLA you have built and updated your products...

Edited by energy0m
Link to comment
Share on other sites

Hi there,

 

Wondered if anybody could help me out with this one.

Am planning a site selling childrens clothing, and a lot of the stock changes price at a certain age, which is proving to be a nightmare! I am struggling with a stock control issue, does anybody have a solution please?

 

eg:

I have 6 coats.

3 are age 2-4 yrs, and are ? 20each.

3 are age 6 yrs and are ?25

 

They are listed as one product, i.e they all have the same model number, and when the customer chooses a size, the ?5 supplement is added to the larger size. I get that bit.

Problem is, how do I do the stock control bit??? It's driving me crazy.

I'm starting off with 6 items, if I sell two, how do I know which sizes I have sold and need to replace?

And worse still, I have a terrible thought that someone is going to tell me that I need to enter each different garment size as a seperate product!

Regards,

Claire

Link to comment
Share on other sites

Hi I checked and you are right it's not STS it's very weird when I have the contents of the shop that is allready there, it does not work but with the normal test products it does work ?

 

Im getting kind of desperate,does anybody have an idea why it would not work with content that is allready in there?

 

It does add links but when you click them it says products not found :'(

 

easypopulate is independent of sts, go back thru your sts installation.  or dsable sts and see what you get.

Link to comment
Share on other sites

hmm cant edit my message but in the admin it goes all fine:

 

Filename: EP_Split2.txt

| OSPAD23015 | noimage.jp | ARMSTRONG | ARMSTRONG | 18.74 | Bike-it | Bike-it In | Universeel | Active !New Product!

| OSPAD23015 | noimage.jp | ARMSTRONG | ARMSTRONG | 18.74 | Bike-it | Bike-it In | Universeel | Active !New Product!

| OSPAD23015 | noimage.jp | ARMSTRONG | ARMSTRONG | 18.75 | Bike-it | Bike-it In | Universeel | Active !New Product!

| OSPAD23016 | noimage.jp | ARMSTRONG | ARMSTRONG | 18.74 | Bike-it | Bike-it In | Universeel | Active !New Product!

| OSPAD23016 | noimage.jp | ARMSTRONG | ARMSTRONG | 18.74 | Bike-it | Bike-it In | Universeel | Active !New Product!

 

and in hte products table they look like:

1866 	 1 	 OSTMX1490100 	 noimage.jpg 	 56.4000 	 2005-05-15 15:07:49 	 2005-05-15 15:07:49 	 NULL 	 0.00 	 1 	 0 	 7 	 0
Edit  Delete  

 

and products description:

1147 4 Stuur 22x760 chroom Stuur chroom diameter 22mm, lengte 760mm, hoogte 8... 39

Edit Delete 1148 4 34

[code] :(

Link to comment
Share on other sites

hmm THis is so weird i have tested about everything today.. and i have figured out that it only does not work with the dutch language files ????

 

When i switch to english i can see them perfectly :huh: :o Does anybody know what could be causing this ?

Link to comment
Share on other sites

A simple question after looking at the last few days posts.

 

Should I use this?

 

It looked good but after reading this thread it definitely looks flaky!

 

All I need it for is stock management (at the moment) so any suggestions for an alternate contribution would be welcome if this is not suitable for a beginner.

 

Suggestions?

Link to comment
Share on other sites

Okay the file uploads and gives me this

File uploaded.

Temporary filename: /tmp/phpxdgOj0

User filename: EP2005May10-2008.txt

Size: 350012

But I do not see the products?

 

 

 

I am having the exact same problem did you figure out this yet

Edited by skatcb
Link to comment
Share on other sites

Sample easypopulate.php file.. Could someone PM me a sample easypopulate.php file where they have added new fields to the file? I am really struggling on this as my file keeps mixing the data fields around.

 

Please..........

Edited by pura vida
Link to comment
Share on other sites

Sample easypopulate.php file.. Could someone PM me a sample easypopulate.php file where they have added new fields to the file? I am really struggling on this as my file keeps mixing the data fields around.

 

Please..........

 

Better yet, post it here. I have seen tons of posts requesting help with this, and no real solution. Posting a sample easypopulate.php file where new fields have been added would undoubtedly help a lot of people.

Link to comment
Share on other sites

:thumbsup: :lol: Soultion to my problems, for all to read.. I hope this helps as this problem took for ever for me to figure out. I am surprised with how many people are asking for help about this.

 

 

I added 3 new fields to easy populate, and during an upload the data was being messed up in the database.

 

Also, i was getting

 

No products_model field in record. This line was not imported

1048 - Column 'products_status' cannot be null

 

 

 

Here are my solutions. I hope they help. They seem to work for me. The only problem I still have not solved is when I upload 500 products, they are not set to Active even though I have it set to active in the upload file. I fixed this by using phpadmin. I export the products table, then do a find replace and replace the 0 for status and make it a one. Then I upload and they are all active. This is a hack solutions.

 

Here is what I did to fix these errors.

 

No products_model field in record. This line was not imported"

 

This is easy. There are blank lines in the txt document after exporting from excel. I removed all the text lines, and even added an extra EOREOR on the bottom line.

For new people like me, i did not see any blank lines in my text document but when i put my curser on the text notepad, it stuck to the center of the page. Excel was adding blank space. I just went though and highlighted the blank space and deleted it.

 

1048 - Column 'products_status' cannot be null

 

For this, the file I was using was set for a ; not a tab in the easypopulate.php. I played around with these settings untill I saw all the data uploading. This was annoying because someone wrote about this forum and I just assumed the file I downloaded off the web was set right with a tab.

 

 

Here is my big fix. I am sure this is easy for some but this took me since last week to figure this out.

It appears that the location for where we add new fields on the easypopulate.php does matter.

 

I repeat, where you add the new field in easypopulate.php does matter. This should be changed in the contribution because I spent HOURS upon hours. I think I even raised the white flag at one point and asked one of this forums experts for help. (BTW, a little assist could have been nice).

 

I just did this with trail and error. (More error than expected but oh well)

 

Do a find and replace on your file like I did with mine.

 

3 new fields are

 

 

products_new_field_1

products_new_field_2

products_new_field_3

 

BTW, this is not the full file. Just take a look at what I added and compair to your. Hopefully it works for you. I am just glad my data is now uploaded and I can move on.

 

 

 

$filelayout = array_merge($filelayout, array(

'v_tax_class_title' => $iii++,

'v_status' => $iii++,

'v_products_new_field_1' => $iii++,

'v_products_new_field_2' => $iii++,

'v_products_new_field_3' => $iii++,

 

 

 

--------------

 

$filelayout_sql = "SELECT

 

p.products_id as v_products_id,

p.products_model as v_products_model,

p.products_image as v_products_image,

p.products_price as v_products_price,

p.products_weight as v_products_weight,

p.products_date_available as v_date_avail,

p.products_date_added as v_date_added,

p.products_tax_class_id as v_tax_class_id,

p.products_quantity as v_products_quantity,

p.products_new_field_1 as v_products_new_field_1,

p.products_new_field_2 as v_products_new_field_2,

p.products_new_field_3 as v_products_new_field_3,

p.manufacturers_id as v_manufacturers_id,

subc.categories_id as v_categories_id,

p.products_status as v_status

FROM

".TABLE_PRODUCTS." as p,

".TABLE_CATEGORIES." as subc,

".TABLE_PRODUCTS_TO_CATEGORIES." as ptoc

WHERE

p.products_id = ptoc.products_id AND

ptoc.categories_id = subc.categories_id

";

-----------------

 

// now do a query to get the record's current contents

$sql = "SELECT

 

p.products_id as v_products_id,

p.products_model as v_products_model,

p.products_image as v_products_image,

p.products_price as v_products_price,

p.products_weight as v_products_weight,

p.products_date_added as v_date_avail,

p.products_tax_class_id as v_tax_class_id,

p.products_quantity as v_products_quantity,

p.products_new_field_1 as v_products_new_field_1,

p.products_new_field_2 as v_products_new_field_2,

p.products_new_field_3 as v_products_new_field_3,

p.manufacturers_id as v_manufacturers_id,

subc.categories_id as v_categories_id

FROM

".TABLE_PRODUCTS." as p,

".TABLE_CATEGORIES." as subc,

".TABLE_PRODUCTS_TO_CATEGORIES." as ptoc

WHERE

p.products_id = ptoc.products_id AND

p.products_model = '" . $items[$filelayout['v_products_model']] . "' AND

ptoc.categories_id = subc.categories_id

";

 

 

--------------

 

$query = "INSERT INTO ".TABLE_PRODUCTS." (

 

products_image,

products_model,

products_price,

products_status,

products_last_modified,

products_date_added,

products_date_available,

products_tax_class_id,

products_weight,

products_quantity,

products_new_field_1,

products_new_field_2,

products_new_field_3,

manufacturers_id)

VALUES (

'$v_products_image',";

 

 

-----------------

 

$query .=" '$v_products_model',

'$v_products_price',

'$v_db_status',

CURRENT_TIMESTAMP,

$v_date_added,

$v_date_avail,

'$v_tax_class_id',

'$v_products_weight',

'$v_products_quantity',

'$v_products_new_field_1',

'$v_products_new_field_2',

'$v_products_new_field_3',

'$v_manufacturer_id')

";

 

 

----------------------------------------------

 

 

$query .= '", products_weight="'.$v_products_weight .

'", products_tax_class_id="'.$v_tax_class_id .

'", products_date_available= ' . $v_date_avail .

', products_date_added= ' . $v_date_added .

', products_last_modified=CURRENT_TIMESTAMP

, products_quantity="' . $v_products_quantity .

'", products_new_field_1="'.$v_products_new_field_1 .

'", products_new_field_2="'.$v_products_new_field_2 .

'", products_new_field_3="'.$v_products_new_field_3 .

'" ,manufacturers_id=' . $v_manufacturer_id .

' , products_status=' . $v_db_status . '

WHERE

(products_id = "'. $v_products_id . '")';

 

$result = tep_db_query($query);

 

 

----------------------

 

:thumbsup:

Link to comment
Share on other sites

Here's my solid ep.php in two part to avoid code cutting and including new fields for Ultrapics contribution. First part is from line 1 to 999 and the second have the rest.

 

<?php

// Current EP Version
$curver = '2.74-MS2';

/*
 $Id: easypopulate.php,v 2.74 2005/02/01 VJ Exp $
 Modified by Andrew_J to handle Ultrapics fields
*/

//
//*******************************
//*******************************
// C O N F I G U R A T I O N
// V A R I A B L E S
//*******************************
//*******************************

// **** Temp directory ****
// if you changed your directory structure from stock and do not have /catalog/temp/, then you'll need to change this accordingly.
//
$tempdir = "/temp/";
$tempdir2 = "/temp/";

//**** File Splitting Configuration ****
// we attempt to set the timeout limit longer for this script to avoid having to split the files
// NOTE:  If your server is running in safe mode, this setting cannot override the timeout set in php.ini
// uncomment this if you are not on a safe mode server and you are getting timeouts
// set_time_limit(330);

// if you are splitting files, this will set the maximum number of records to put in each file.
// if you set your php.ini to a long time, you can make this number bigger
global $maxrecs;
$maxrecs = 300; // default, seems to work for most people.  Reduce if you hit timeouts
//$maxrecs = 4; // for testing

//**** Image Defaulting ****
global $default_images, $default_image_manufacturer, $default_image_product, $default_image_category;

// set them to your own default "We don't have any picture" gif
$default_image_manufacturer = 'manufacturer_default.gif';
$default_image_product = 'default.gif';
$default_image_category = 'category_default.gif';

// or let them get set to nothing
//$default_image_manufacturer = '';
//$default_image_product = '';
//$default_image_category = '';

//**** Status Field Setting ****
// Set the v_status field to "Inactive" if you want the status=0 in the system
// Set the v_status field to "Delete" if you want to remove the item from the system <- THIS IS NOT WORKING YET!
// If zero_qty_inactive is true, then items with zero qty will automatically be inactive in the store.
global $active, $inactive, $zero_qty_inactive, $deleteit;
$active = 'Active';
$inactive = 'Inactive';
//$deleteit = 'Delete'; // not functional yet
$zero_qty_inactive = false;

//**** Size of products_model in products table ****
// set this to the size of your model number field in the db.  We check to make sure all models are no longer than this value.
// this prevents the database from getting fubared.  Just making this number bigger won't help your database!  They must match!
global $modelsize;
$modelsize = 20;

//**** Price includes tax? ****
// Set the v_price_with_tax to
// 0 if you want the price without the tax included
// 1 if you want the price to be defined for import & export including tax.
global $price_with_tax;
$price_with_tax =false;

// **** Quote -> 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 = true;

// **** 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

// **** Max Category Levels ****
// change this if you need more or fewer categories
global $max_categories;
$max_categories = 7; // 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 = 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




// ****************************************
// 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://localhost/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://localhost/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 = true;


// ****************************************
// 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
//*******************************
//*******************************


require('includes/application_top.php');
require('includes/database_tables.php');

//*******************************
// 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');
}
//*******************************

// 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'
);

//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 == 'tempfile' ){
//*******************************
//*******************************
// DOWNLOAD FILE
//*******************************
//*******************************
$filestring = ""; // this holds the csv file we want to download

if ( $dltype=='froogle' ){
 // set the things froogle wants at the top of the file
 $filestring .= "# html_escaped=YES\n";
 $filestring .= "# updates_only=NO\n";
 $filestring .= "# product_type=OTHER\n";
 $filestring .= "# quoted=YES\n";
}

$result = tep_db_query($filelayout_sql);
$row =  tep_db_fetch_array($result);

// 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;

$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'];

  	 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<br>";

	 $thetext = $row[$key];
	 // kill the carriage returns and tabs in the descriptions, they're killing me!
	 $thetext = str_replace("\r",' ',$thetext);
	 $thetext = str_replace("\n",' ',$thetext);
	 $thetext = str_replace("\t",' ',$thetext);
	 // and put the text into the output separated by tabs
	 $therow .= $thetext . $separator;
 }

 // lop off the trailing tab, then append the end of row indicator
 $therow = substr($therow,0,strlen($therow)-1) . $endofrow;

 $filestring .= $therow;
 // grab the next row from the db
 $row =  tep_db_fetch_array($result);
}

#$EXPORT_TIME=time();
$EXPORT_TIME = strftime('%Y%b%d-%H%I');
if ($dltype=="froogle"){
 $EXPORT_TIME = "FroogleEP" . $EXPORT_TIME;
} else {
 $EXPORT_TIME = "EP" . $EXPORT_TIME;
}

// now either stream it to them or put it in the temp directory
if ($download == 'stream'){
 //*******************************
 // STREAM FILE
 //*******************************
 header("Content-type: application/vnd.ms-excel");
 header("Content-disposition: attachment; filename=$EXPORT_TIME.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();
} else {
 //*******************************
 // PUT FILE IN TEMP DIR
 //*******************************
 $tmpfname = DIR_FS_DOCUMENT_ROOT . $tempdir . "$EXPORT_TIME.txt";
 //unlink($tmpfname);
 $fp = fopen( $tmpfname, "w+");
 fwrite($fp, $filestring);
 fclose($fp);
 echo "You can get your file in the Tools/Files under " . $tempdir . "EP" . $EXPORT_TIME . ".txt";
 die();
}
}   // *** END *** download section
?>

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html <?php echo HTML_PARAMS; ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
<title><?php echo TITLE; ?></title>
<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
</head>
<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">
<?php require(DIR_WS_INCLUDES . 'header.php'); ?>

<table border="0" width="100%" cellspacing="2" cellpadding="2">
<tr>
<td width="<?php echo BOX_WIDTH; ?>" valign="top" height="27">
<table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">
<?php require(DIR_WS_INCLUDES . 'column_left.php');?>
</table></td>
<td class="pageHeading" valign="top"><?php
echo "Easy Populate $curver - Default Language : " . $epdlanguage_name . '(' . $epdlanguage_id .')';
?>

<p class="smallText">

<?php

if ($localfile or (is_uploaded_file($usrfl) && $split==0)) {
//*******************************
//*******************************
// UPLOAD AND INSERT FILE
//*******************************
//*******************************

if ($usrfl){
 // move the file to where we can work with it
 $file = tep_get_uploaded_file('usrfl');
 if (is_uploaded_file($file['tmp_name'])) {
	 tep_copy_uploaded_file($file, DIR_FS_DOCUMENT_ROOT . $tempdir);
 }

 echo "<p class=smallText>";
 echo "File uploaded. <br>";
 echo "Temporary filename: " . $usrfl . "<br>";
 echo "User filename: " . $usrfl_name . "<br>";
 echo "Size: " . $usrfl_size . "<br>";

 // get the entire file into an array
 $readed = file(DIR_FS_DOCUMENT_ROOT . $tempdir . $usrfl_name);
}
if ($localfile){
 // move the file to where we can work with it
 $file = tep_get_uploaded_file('usrfl'); 	 $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);

	 $attribute_options_count = 1;
	 //while ($attribute_options = tep_db_fetch_array($attribute_options_values)){
 if (is_uploaded_file($file['tmp_name'])) {
	 tep_copy_uploaded_file($file, DIR_FS_DOCUMENT_ROOT . $tempdir);
 }

 echo "<p class=smallText>";
 echo "Filename: " . $localfile . "<br>";

 // get the entire file into an array
 $readed = file(DIR_FS_DOCUMENT_ROOT . $tempdir . $localfile);
}

// now we string the entire thing together in case there were carriage returns in the data
$newreaded = "";
foreach ($readed as $read){
 $newreaded .= $read;
}

// now newreaded has the entire file together without the carriage returns.
// if for some reason excel put qoutes around our EOREOR, remove them then split into rows
$newreaded = str_replace('"EOREOR"', 'EOREOR', $newreaded);
$readed = explode( $separator . 'EOREOR',$newreaded);


// Now we'll populate the filelayout based on the header row.
$theheaders_array = explode( $separator, $readed[0] ); // explode the first row, it will be our filelayout
$lll = 0;
$filelayout = array();
foreach( $theheaders_array as $header ){
 $cleanheader = str_replace( '"', '', $header);
//	echo "Fileheader was $header<br><br><br>";
 $filelayout[ $cleanheader ] = $lll++; //
}
unset($readed[0]); //  we don't want to process the headers with the data

// now we've got the array broken into parts by the expicit end-of-row marker.
array_walk($readed, 'walk');

}

if (is_uploaded_file($usrfl) && $split==1) {
//*******************************
//*******************************
// UPLOAD AND SPLIT FILE
//*******************************
//*******************************
// move the file to where we can work with it
$file = tep_get_uploaded_file('usrfl');
//echo "Trying to move file...";
if (is_uploaded_file($file['tmp_name'])) {
 tep_copy_uploaded_file($file, DIR_FS_DOCUMENT_ROOT . $tempdir);
}

$infp = fopen(DIR_FS_DOCUMENT_ROOT . $tempdir . $usrfl_name, "r");

//toprow has the field headers
$toprow = fgets($infp,32768);

$filecount = 1;

echo "Creating file EP_Split" . $filecount . ".txt ...  ";
$tmpfname = DIR_FS_DOCUMENT_ROOT . $tempdir . "EP_Split" . $filecount . ".txt";
$fp = fopen( $tmpfname, "w+");
fwrite($fp, $toprow);

$linecount = 0;
$line = fgets($infp,32768);
while ($line){
 // walking the entire file one row at a time
 // but a line is not necessarily a complete row, we need to split on rows that have "EOREOR" at the end
 $line = str_replace('"EOREOR"', 'EOREOR', $line);
 fwrite($fp, $line);
 if (strpos($line, 'EOREOR')){
	 // we found the end of a line of data, store it
	 $linecount++; // increment our line counter
	 if ($linecount >= $maxrecs){
   echo "Added $linecount records and closing file... <Br>";
   $linecount = 0; // reset our line counter
   // close the existing file and open another;
   fclose($fp);
   // increment filecount
   $filecount++;
   echo "Creating file EP_Split" . $filecount . ".txt ...  ";
   $tmpfname = DIR_FS_DOCUMENT_ROOT . $tempdir . "EP_Split" . $filecount . ".txt";
   //Open next file name
   $fp = fopen( $tmpfname, "w+");
   fwrite($fp, $toprow);
	 }
 }
 $line=fgets($infp,32768);
}
echo "Added $linecount records and closing file...<br><br> ";
fclose($fp);
fclose($infp);

echo "You can download your split files in the Tools/Files under /catalog/temp/";

}

?>
     </p>

     <table width="75%" border="2">
       <tr>
         <td width="75%">
          <FORM ENCTYPE="multipart/form-data" ACTION="easypopulate.php?split=0" METHOD=POST>
             <p>
               <div align = "left">
               <p><b>Upload EP File</b></p>
               <p>
                 <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="100000000">
                 <p></p>
                 <input name="usrfl" type="file" size="50">
               <input type="submit" name="buttoninsert" value="Insert into db">
               <br>
               </p>
             </div>

             </form>

          <FORM ENCTYPE="multipart/form-data" ACTION="easypopulate.php?split=1" METHOD=POST>
             <p>
               <div align = "left">
               <p><b>Split EP File</b></p>
               <p>
                 <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000000000">
                 <p></p>
                 <input name="usrfl" type="file" size="50">
               <input type="submit" name="buttonsplit" value="Split file">
               <br>
               </p>
             </div>

            </form>

          <FORM ENCTYPE="multipart/form-data" ACTION="easypopulate.php" METHOD=POST>
             <p>
               <div align = "left">
               <p><b>Import from Temp Dir (<? echo $tempdir; ?>)</b></p>
 <p class="smallText">
 <INPUT TYPE="text" name="localfile" size="50">
                 <input type="submit" name="buttoninsert" value="Insert into db">
                 <br>
               </p>
             </div>

            </form>




 <p><b>Download EP and Froogle Files</b></p>

      <!-- Download file links -  Add your custom fields here -->
  <a href="easypopulate.php?download=stream&dltype=full">Download <b>Complete</b> tab-delimited .txt file to edit</a><br>
  <a href="easypopulate.php?download=stream&dltype=priceqty">Download <b>Model/Price/Qty</b> tab-delimited .txt file to edit</a><br>
  <a href="easypopulate.php?download=stream&dltype=category">Download <b>Model/Category</b> tab-delimited .txt file to edit</a><br>
  <a href="easypopulate.php?download=stream&dltype=froogle">Download <b>Froogle</b> tab-delimited .txt file</a><br>

	 <!-- VJ product attributes begin //-->
<?php
 if ($products_with_attributes == true) {
?>
  <a href="easypopulate.php?download=stream&dltype=attrib">Download <b>Model/Attributes</b> tab-delimited .txt file</a><br>
<?php
 }
?>
	 <!-- VJ product attributes end //-->

 <p><b>Create EP and Froogle Files in Temp Dir (<? echo $tempdir; ?>)</b></p>
  <a href="easypopulate.php?download=tempfile&dltype=full">Create Complete tab-delimited .txt file in temp dir</a><br>
         <a href="easypopulate.php?download=tempfile&dltype=priceqty"">Create Model/Price/Qty tab-delimited .txt file in temp dir</a><br>
         <a href="easypopulate.php?download=tempfile&dltype=category">Create Model/Category tab-delimited .txt file in temp dir</a><br>
  <a href="easypopulate.php?download=tempfile&dltype=froogle">Create Froogle tab-delimited .txt file in temp dir</a><br>

	 <!-- VJ product attributes begin //-->
  <a href="easypopulate.php?download=tempfile&dltype=attrib">Create Model/Attributes tab-delimited .txt file in temp dir</a><br>
	 <!-- VJ product attributes end //-->

  </td>
</tr>
     </table>
   </td>
</tr>
</table>

<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>

<p> </p>
<p> </p><p><br>
</p></body>
</html>

<?php

function ep_get_languages() {
$languages_query = tep_db_query("select languages_id, code from " . TABLE_LANGUAGES . " order by sort_order");
// start array at one, the rest of the code expects it that way
$ll =1;
while ($ep_languages = tep_db_fetch_array($languages_query)) {
 //will be used to return language_id en language code to report in product_name_code instead of product_name_id
 $ep_languages_array[$ll++] = array(
  	 'id' => $ep_languages['languages_id'],
  	 'code' => $ep_languages['code']
  	 );
}
return $ep_languages_array;
};

function tep_get_tax_class_rate($tax_class_id) {
$tax_multiplier = 0;
$tax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " WHERE  tax_class_id = '" . $tax_class_id . "' GROUP BY tax_priority");
if (tep_db_num_rows($tax_query)) {
 while ($tax = tep_db_fetch_array($tax_query)) {
	 $tax_multiplier += $tax['tax_rate'];
 }
}
return $tax_multiplier;
};

function tep_get_tax_title_class_id($tax_class_title) {
$classes_query = tep_db_query("select tax_class_id from " . TABLE_TAX_CLASS . " WHERE tax_class_title = '" . $tax_class_title . "'" );
$tax_class_array = tep_db_fetch_array($classes_query);
$tax_class_id = $tax_class_array['tax_class_id'];
return $tax_class_id;
}

function print_el( $item2 ) {
echo " | " . substr(strip_tags($item2), 0, 10);
};

function print_el1( $item2 ) {
echo sprintf("| %'.4s ", substr(strip_tags($item2), 0, 80));
};
function ep_create_filelayout($dltype){
global $filelayout, $filelayout_count, $filelayout_sql, $langcode, $fileheaders, $max_categories;
// depending on the type of the download the user wanted, create a file layout for it.
$fieldmap = array(); // default to no mapping to change internal field names to external.
switch( $dltype ){
case 'full':
 // The file layout is dynamically made depending on the number of languages
 $iii = 0;
 $filelayout = array(
	 'v_products_model'  => $iii++,
	 'v_products_image'  => $iii++,
	 );

 foreach ($langcode as $key => $lang){
	 $l_id = $lang['id'];
	 // uncomment the head_title, head_desc, and head_keywords to use
	 // Linda's Header Tag Controller 2.0
	 //echo $langcode['id'] . $langcode['code'];
	 $filelayout  = array_merge($filelayout , array(
  	 'v_products_name_' . $l_id  => $iii++,
  	 'v_products_description_' . $l_id	=> $iii++,
  	 'v_products_url_' . $l_id	=> $iii++,
	 //  'v_products_head_title_tag_'.$l_id	=> $iii++,
	 //  'v_products_head_desc_tag_'.$l_id	=> $iii++,
	 //  'v_products_head_keywords_tag_'.$l_id	=> $iii++,
  	 ));
 }


 // uncomment the customer_price and customer_group to support multi-price per product contrib
 
 $filelayout  = array_merge($filelayout , array(
                       'v_products_image'                => $iii++,
                       'v_products_image_med'          => $iii++,
                       'v_products_image_lrg'           => $iii++,
                       'v_products_image_sm_1'            => $iii++,
                       'v_products_image_xl_1'           => $iii++,
                       'v_products_image_sm_2'            => $iii++,
                       'v_products_image_xl_2'           => $iii++,
                       'v_products_image_sm_3'            => $iii++,
                       'v_products_image_xl_3'           => $iii++,
                       'v_products_image_sm_4'            => $iii++,
                       'v_products_image_xl_4'           => $iii++,
                       'v_products_image_sm_5'            => $iii++,
                       'v_products_image_xl_5'           => $iii++,
                       'v_products_image_sm_6'            => $iii++,
                       'v_products_image_xl_6'           => $iii++,
                       'v_products_price'                => $iii++,
                       'v_products_quantity'             => $iii++,
                       'v_products_weight'               => $iii++,
                       #'v_customer_price_1'             => $iii++,
                       #'v_customer_group_id_1'          => $iii++,
                       #'v_customer_price_2'             => $iii++,
                       #'v_customer_group_id_2'          => $iii++,
                       #'v_customer_price_3'             => $iii++,
                       #'v_customer_group_id_3'          => $iii++,
                       #'v_customer_price_4'             => $iii++,
                       #'v_customer_group_id_4'          => $iii++,
                       'v_manufacturers_name'            => $iii++,
                       #'v_products_ship_price'          => $iii++,
                       'v_date_added'                    => $iii++,
                       'v_date_avail'                    => $iii++,
                       ));

   // VJ product attribs begin
    $header_array = array(
	 'v_products_price'  => $iii++,
	 'v_products_weight'  => $iii++,
	 'v_date_avail' 	 => $iii++,
	 'v_date_added' 	 => $iii++,
	 'v_products_quantity'  => $iii++,
	 );

	 $languages = tep_get_languages();

     global $attribute_options_array;

     $attribute_options_count = 1;
     foreach ($attribute_options_array as $attribute_options_values) {
   $key1 = 'v_attribute_options_id_' . $attribute_options_count;
   $header_array[$key1] = $iii++;

       for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
         $l_id = $languages[$i]['id'];

  	 $key2 = 'v_attribute_options_name_' . $attribute_options_count . '_' . $l_id;
  	 $header_array[$key2] = $iii++;
   }

   $attribute_values_query = "select products_options_values_id  from " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$attribute_options_values['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)) {
  	 $key3 = 'v_attribute_values_id_' . $attribute_options_count . '_' . $attribute_values_count;
  	 $header_array[$key3] = $iii++;

  	 $key4 = 'v_attribute_values_price_' . $attribute_options_count . '_' . $attribute_values_count;

Link to comment
Share on other sites

part 2

    	$header_array[$key4] = $iii++;

 

    for ($i=0, $n=sizeof($languages); $i<$n; $i++) {

     $l_id = $languages[$i]['id'];

 

     $key5 = 'v_attribute_values_name_' . $attribute_options_count . '_' . $attribute_values_count . '_' . $l_id;

     $header_array[$key5] = $iii++;

    }

 

    $attribute_values_count++;

   }

 

   $attribute_options_count++;

    }

 

   $header_array['v_manufacturers_name'] = $iii++;

 

   $filelayout = array_merge($filelayout, $header_array);

   // VJ product attribs end

 

 // build the categories name section of the array based on the number of categores the user wants to have

 for($i=1;$i<$max_categories+1;$i++){

  $filelayout = array_merge($filelayout, array('v_categories_name_' . $i => $iii++));

 }

 

 $filelayout = array_merge($filelayout, array(

  'v_tax_class_title'  => $iii++,

  'v_status'   => $iii++,

  ));

 

 $filelayout_sql = "SELECT

  p.products_id as v_products_id,

  p.products_model as v_products_model,

  p.products_image as v_products_image,

  p.products_image_med as v_products_image_med,

  p.products_image_lrg as v_products_image_lrg,

  p.products_image_sm_1 as v_products_image_sm_1,

  p.products_image_xl_1 as v_products_image_xl_1,

  p.products_image_sm_2 as v_products_image_sm_2,

  p.products_image_xl_2 as v_products_image_xl_2,

  p.products_image_sm_3 as v_products_image_sm_3,

  p.products_image_xl_3 as v_products_image_xl_3,

  p.products_image_sm_4 as v_products_image_sm_4,

  p.products_image_xl_4 as v_products_image_xl_4,

  p.products_image_sm_5 as v_products_image_sm_5,

  p.products_image_xl_5 as v_products_image_xl_5,

  p.products_image_sm_6 as v_products_image_sm_6,

  p.products_image_xl_6 as v_products_image_xl_6,

  p.products_price as v_products_price,

  p.products_weight as v_products_weight,

  p.products_date_available as v_date_avail,

  p.products_date_added as v_date_added,

  p.products_tax_class_id as v_tax_class_id,

  p.products_quantity as v_products_quantity,

  p.manufacturers_id as v_manufacturers_id,

  subc.categories_id as v_categories_id,

  p.products_status as v_status

  FROM

  ".TABLE_PRODUCTS." as p,

  ".TABLE_CATEGORIES." as subc,

  ".TABLE_PRODUCTS_TO_CATEGORIES." as ptoc

  WHERE

  p.products_id = ptoc.products_id AND

  ptoc.categories_id = subc.categories_id

  ";

 

 break;

case 'priceqty':

 $iii = 0;

 // uncomment the customer_price and customer_group to support multi-price per product contrib

 $filelayout = array(

  'v_products_model'  => $iii++,

  'v_products_price'  => $iii++,

  'v_products_quantity'  => $iii++,

  #'v_customer_price_1'  => $iii++,

  #'v_customer_group_id_1'  => $iii++,

  #'v_customer_price_2'  => $iii++,

  #'v_customer_group_id_2'  => $iii++,

  #'v_customer_price_3'  => $iii++,

  #'v_customer_group_id_3'  => $iii++,

  #'v_customer_price_4'  => $iii++,

  #'v_customer_group_id_4'  => $iii++,

   );

 $filelayout_sql = "SELECT

  p.products_id as v_products_id,

  p.products_model as v_products_model,

  p.products_price as v_products_price,

  p.products_tax_class_id as v_tax_class_id,

  p.products_quantity as v_products_quantity

  FROM

  ".TABLE_PRODUCTS." as p

  ";

 

 break;

 

case 'category':

 // The file layout is dynamically made depending on the number of languages

 $iii = 0;

 $filelayout = array(

  'v_products_model'  => $iii++,

 );

 

 // build the categories name section of the array based on the number of categores the user wants to have

 for($i=1;$i<$max_categories+1;$i++){

  $filelayout = array_merge($filelayout, array('v_categories_name_' . $i => $iii++));

 }

 

 

 $filelayout_sql = "SELECT

  p.products_id as v_products_id,

  p.products_model as v_products_model,

  subc.categories_id as v_categories_id

  FROM

  ".TABLE_PRODUCTS." as p,

  ".TABLE_CATEGORIES." as subc,

  ".TABLE_PRODUCTS_TO_CATEGORIES." as ptoc  

  WHERE

  p.products_id = ptoc.products_id AND

  ptoc.categories_id = subc.categories_id

  ";

 break;

 

case 'froogle':

 // this is going to be a little interesting because we need

 // a way to map from internal names to external names

 //

 // Before it didn't matter, but with froogle needing particular headers,

 // The file layout is dynamically made depending on the number of languages

 $iii = 0;

 $filelayout = array(

  'v_froogle_products_url_1'   => $iii++,

  );

 //

 // here we need to get the default language and put

 $l_id = 1; // dummy it in for now.

//  foreach ($langcode as $key => $lang){

//   $l_id = $lang['id'];

  $filelayout  = array_merge($filelayout , array(

    'v_froogle_products_name_' . $l_id  => $iii++,

    'v_froogle_products_description_' . $l_id => $iii++,

    ));

//  }

 $filelayout  = array_merge($filelayout , array(

  'v_products_price'  => $iii++,

  'v_products_fullpath_image' => $iii++,

  'v_category_fullpath'  => $iii++,

  'v_froogle_offer_id'  => $iii++,

  'v_froogle_instock'  => $iii++,

  'v_froogle_ shipping'  => $iii++,

  'v_manufacturers_name'  => $iii++,

  'v_froogle_ upc'  => $iii++,

  'v_froogle_color'  => $iii++,

  'v_froogle_size'  => $iii++,

  'v_froogle_quantitylevel' => $iii++,

  'v_froogle_product_id'  => $iii++,

  'v_froogle_manufacturer_id' => $iii++,

  'v_froogle_exp_date'  => $iii++,

  'v_froogle_product_type' => $iii++,

  'v_froogle_delete'  => $iii++,

  'v_froogle_currency'  => $iii++,

   ));

 $iii=0;

 $fileheaders = array(

  'product_url'  => $iii++,

  'name'   => $iii++,

  'description'  => $iii++,

  'price'   => $iii++,

  'image_url'  => $iii++,

  'category'  => $iii++,

  'offer_id'  => $iii++,

  'instock'  => $iii++,

  'shipping'  => $iii++,

  'brand'   => $iii++,

  'upc'   => $iii++,

  'color'   => $iii++,

  'size'   => $iii++,

  'quantity'  => $iii++,

  'product_id'  => $iii++,

  'manufacturer_id' => $iii++,

  'exp_date'  => $iii++,

  'product_type'  => $iii++,

  'delete'  => $iii++,

  'currency'  => $iii++,

  );

 $filelayout_sql = "SELECT

  p.products_id as v_products_id,

  p.products_model as v_products_model,

  p.products_image as v_products_image,

  p.products_image_med as v_products_image_med,

  p.products_image_lrg as v_products_image_lrg,

  p.products_image_sm_1 as v_products_image_sm_1,

  p.products_image_xl_1 as v_products_image_xl_1,

  p.products_image_sm_2 as v_products_image_sm_2,

  p.products_image_xl_2 as v_products_image_xl_2,

  p.products_image_sm_3 as v_products_image_sm_3,

  p.products_image_xl_3 as v_products_image_xl_3,

  p.products_image_sm_4 as v_products_image_sm_4,

  p.products_image_xl_4 as v_products_image_xl_4,

  p.products_image_sm_5 as v_products_image_sm_5,

  p.products_image_xl_5 as v_products_image_xl_5,

  p.products_image_sm_6 as v_products_image_sm_6,

  p.products_image_xl_6 as v_products_image_xl_6,

  p.products_price as v_products_price,

  p.products_weight as v_products_weight,

  p.products_date_added as v_date_avail,

  p.products_tax_class_id as v_tax_class_id,

  p.products_quantity as v_products_quantity,

  p.manufacturers_id as v_manufacturers_id,

  subc.categories_id as v_categories_id

  FROM

  ".TABLE_PRODUCTS." as p,

  ".TABLE_CATEGORIES." as subc,

  ".TABLE_PRODUCTS_TO_CATEGORIES." as ptoc

  WHERE

  p.products_id = ptoc.products_id AND

  ptoc.categories_id = subc.categories_id

  ";

 break;

 

// VJ product attributes begin

case 'attrib':

 $iii = 0;

 $filelayout = array(

  'v_products_model'  => $iii++

  );

 

   $header_array = array();

 

 $languages = tep_get_languages();

 

   global $attribute_options_array;

 

   $attribute_options_count = 1;

   foreach ($attribute_options_array as $attribute_options_values) {

  $key1 = 'v_attribute_options_id_' . $attribute_options_count;

  $header_array[$key1] = $iii++;

 

  for ($i=0, $n=sizeof($languages); $i<$n; $i++) {

   $l_id = $languages[$i]['id'];

 

   $key2 = 'v_attribute_options_name_' . $attribute_options_count . '_' . $l_id;

   $header_array[$key2] = $iii++;

  }

 

  $attribute_values_query = "select products_options_values_id  from " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$attribute_options_values['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)) {

   $key3 = 'v_attribute_values_id_' . $attribute_options_count . '_' . $attribute_values_count;

   $header_array[$key3] = $iii++;

 

   $key4 = 'v_attribute_values_price_' . $attribute_options_count . '_' . $attribute_values_count;

   $header_array[$key4] = $iii++;

 

   for ($i=0, $n=sizeof($languages); $i<$n; $i++) {

    $l_id = $languages[$i]['id'];

 

    $key5 = 'v_attribute_values_name_' . $attribute_options_count . '_' . $attribute_values_count . '_' . $l_id;

    $header_array[$key5] = $iii++;

   }

 

   $attribute_values_count++;

  }

 

  $attribute_options_count++;

   }

 

   $filelayout = array_merge($filelayout, $header_array);

 

 $filelayout_sql = "SELECT

  p.products_id as v_products_id,

  p.products_model as v_products_model

  FROM

  ".TABLE_PRODUCTS." as p

  ";

 

 break;

// VJ product attributes end

}

$filelayout_count = count($filelayout);

 

}

 

 

function walk( $item1 ) {

global $filelayout, $filelayout_count, $modelsize;

global $active, $inactive, $langcode, $default_these, $deleteit, $zero_qty_inactive;

       global $epdlanguage_id, $price_with_tax, $replace_quotes;

global $default_images, $default_image_manufacturer, $default_image_product, $default_image_category;

global $separator, $max_categories;

// first we clean up the row of data

 

// chop blanks from each end

$item1 = ltrim(rtrim($item1));

 

// blow it into an array, splitting on the tabs

$items = explode($separator, $item1);

 

// make sure all non-set things are set to '';

// and strip the quotes from the start and end of the stings.

// escape any special chars for the database.

foreach( $filelayout as $key=> $value){

 $i = $filelayout[$key];

 if (isset($items[$i]) == false) {

  $items[$i]='';

 } else {

  // Check to see if either of the magic_quotes are turned on or off;

  // And apply filtering accordingly.

  if (function_exists('ini_get')) {

   //echo "Getting ready to check magic quotes<br>";

   if (ini_get('magic_quotes_runtime') == 1){

    // The magic_quotes_runtime are on, so lets account for them

    // check if the last character is a quote;

    // if it is, chop off the quotes.

    if (substr($items[$i],-1) == '"'){

     $items[$i] = substr($items[$i],2,strlen($items[$i])-4);

    }

    // now any remaining doubled double quotes should be converted to one doublequote

    $items[$i] = str_replace('\"\"',""",$items[$i]);

    if ($replace_quotes){

     $items[$i] = str_replace('\"',""",$items[$i]);

     $items[$i] = str_replace("\'","'",$items[$i]);

    }

   } else { // no magic_quotes are on

    // check if the last character is a quote;

    // if it is, chop off the 1st and last character of the string.

    if (substr($items[$i],-1) == '"'){

     $items[$i] = substr($items[$i],1,strlen($items[$i])-2);

    }

    // now any remaining doubled double quotes should be converted to one doublequote

    $items[$i] = str_replace('""',""",$items[$i]);

    if ($replace_quotes){

     $items[$i] = str_replace('"',""",$items[$i]);

     $items[$i] = str_replace("'","'",$items[$i]);

    }

   }

  }

 }

}

/*

if ( $items['v_status'] == $deleteit ){

 // they want to delete this product.

 echo "Deleting product " . $items['v_products_model'] . " from the database<br>";

 // Get the ID

 

 // kill in the products_to_categories

 

 // Kill in the products table

 

 return; // we're done deleteing!

}

*/

// now do a query to get the record's current contents

$sql = "SELECT

 p.products_id as v_products_id,

 p.products_model as v_products_model,

 p.products_image as v_products_image,

 p.products_image_med as v_products_image_med,

 p.products_image_lrg as v_products_image_lrg,

 p.products_image_sm_1 as v_products_image_sm_1,

 p.products_image_xl_1 as v_products_image_xl_1,

 p.products_image_sm_2 as v_products_image_sm_2,

 p.products_image_xl_2 as v_products_image_xl_2,

 p.products_image_sm_3 as v_products_image_sm_3,

 p.products_image_xl_3 as v_products_image_xl_3,

 p.products_image_sm_4 as v_products_image_sm_4,

 p.products_image_xl_4 as v_products_image_xl_4,

 p.products_image_sm_5 as v_products_image_sm_5,

 p.products_image_xl_5 as v_products_image_xl_5,

 p.products_image_sm_6 as v_products_image_sm_6,

 p.products_image_xl_6 as v_products_image_xl_6,

 p.products_price as v_products_price,

 p.products_weight as v_products_weight,

 p.products_date_added as v_date_avail,

 p.products_tax_class_id as v_tax_class_id,

 p.products_quantity as v_products_quantity,

 p.manufacturers_id as v_manufacturers_id,

 subc.categories_id as v_categories_id

 FROM

 ".TABLE_PRODUCTS." as p,

 ".TABLE_CATEGORIES." as subc,

 ".TABLE_PRODUCTS_TO_CATEGORIES." as ptoc

 WHERE

 p.products_id = ptoc.products_id AND

 p.products_model = '" . $items[$filelayout['v_products_model']] . "' AND

 ptoc.categories_id = subc.categories_id

 ";

 

$result = tep_db_query($sql);

$row =  tep_db_fetch_array($result);

 

 

while ($row){

 // OK, since we got a row, the item already exists.

 // Let's get all the data we need and fill in all the fields that need to be defaulted to the current values

 // for each language, get the description and set the vals

 foreach ($langcode as $key => $lang){

  //echo "Inside defaulting loop";

  //echo "key is $key<br>";

  //echo "langid is " . $lang['id'] . "<br>";

//   $sql2 = "SELECT products_name, products_description

//    FROM ".TABLE_PRODUCTS_DESCRIPTION."

//    WHERE

//     products_id = " . $row['v_products_id'] . " AND

//     language_id = '" . $lang['id'] . "'

//    ";

  $sql2 = "SELECT *

   FROM ".TABLE_PRODUCTS_DESCRIPTION."

   WHERE

    products_id = " . $row['v_products_id'] . " AND

    language_id = '" . $lang['id'] . "'

   ";

  $result2 = tep_db_query($sql2);

  $row2 =  tep_db_fetch_array($result2);

                       // Need to report from ......_name_1 not ..._name_0

  $row['v_products_name_' . $lang['id']]   = $row2['products_name'];

  $row['v_products_description_' . $lang['id']]  = $row2['products_description'];

  $row['v_products_url_' . $lang['id']]   = $row2['products_url'];

 

  // support for Linda's Header Controller 2.0 here

  if(isset($filelayout['v_products_head_title_tag_' . $lang['id'] ])){

   $row['v_products_head_title_tag_' . $lang['id']]  = $row2['products_head_title_tag'];

   $row['v_products_head_desc_tag_' . $lang['id']]  = $row2['products_head_desc_tag'];

   $row['v_products_head_keywords_tag_' . $lang['id']]  = $row2['products_head_keywords_tag'];

  }

  // end support for Header Controller 2.0

 }

 

 // start with v_categories_id

 // Get the category description

 // set the appropriate variable name

 // if parent_id is not null, then follow it up.

 $thecategory_id = $row['v_categories_id'];

 

 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;

   }

  } else {

    $temprow['v_categories_name_' . $categorylevel] = '';

  }

 }

 // temprow has the old style low to high level categories.

 $newlevel = 1;

 // let's turn them into high to low level categories

 for( $categorylevel=$max_categories+1; $categorylevel>0; $categorylevel--){

  if ($temprow['v_categories_name_' . $categorylevel] != ''){

   $row['v_categories_name_' . $newlevel++] = $temprow['v_categories_name_' . $categorylevel];

  }

 }

 

 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'];

 }

 

 //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 true

 $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']);

 if ($price_with_tax){

  $row['v_products_price'] = round($row['v_products_price'] + ($row['v_products_price'] * $row_tax_multiplier / 100),2);

 }

 

 // now create the internal variables that will be used

 // the $$thisvar is on purpose: it creates a variable named what ever was in $thisvar and sets the value

 foreach ($default_these as $thisvar){

  $$thisvar = $row[$thisvar];

 }

 

 $row =  tep_db_fetch_array($result);

}

 

// this is an important loop.  What it does is go thru all the fields in the incoming file and set the internal vars.

// Internal vars not set here are either set in the loop above for existing records, or not set at all (null values)

// the array values are handled separatly, although they will set variables in this loop, we won't use them.

foreach( $filelayout as $key => $value ){

 $$key = $items[ $value ];

}

 

       // so how to handle these?  we shouldn't built the array unless it's been giving to us.

// The assumption is that if you give us names and descriptions, then you give us name and description for all applicable languages

foreach ($langcode as $lang){

 //echo "Langid is " . $lang['id'] . "<br>";

 $l_id = $lang['id'];

 if (isset($filelayout['v_products_name_' . $l_id ])){

  //we set dynamically the language values

  $v_products_name[$l_id]  = $items[$filelayout['v_products_name_' . $l_id]];

  $v_products_description[$l_id]  = $items[$filelayout['v_products_description_' . $l_id ]];

  $v_products_url[$l_id]   = $items[$filelayout['v_products_url_' . $l_id ]];

  // support for Linda's Header Controller 2.0 here

  if(isset($filelayout['v_products_head_title_tag_' . $l_id])){

   $v_products_head_title_tag[$l_id]  = $items[$filelayout['v_products_head_title_tag_' . $l_id]];

   $v_products_head_desc_tag[$l_id]  = $items[$filelayout['v_products_head_desc_tag_' . $l_id]];

   $v_products_head_keywords_tag[$l_id]  = $items[$filelayout['v_products_head_keywords_tag_' . $l_id]];

  }

  // end support for Header Controller 2.0

 }

}

//elari... we get the tax_clas_id from the tax_title

//on screen will still be displayed the tax_class_title instead of the id....

if ( isset( $v_tax_class_title) ){

 $v_tax_class_id          = tep_get_tax_title_class_id($v_tax_class_title);

}

//we check the tax rate of this tax_class_id

       $row_tax_multiplier = tep_get_tax_class_rate($v_tax_class_id);

 

//And we recalculate price without the included tax...

//Since it seems display is made before, the displayed price will still include tax

//This is same problem for the tax_clas_id that display tax_class_title

if ($price_with_tax){

 $v_products_price        = round( $v_products_price / (1 + ( $row_tax_multiplier * $price_with_tax/100) ), 4);

}

 

// if they give us one category, they give us all 6 categories

unset ($v_categories_name); // default to not set.

if ( isset( $filelayout['v_categories_name_1'] ) ){

 $newlevel = 1;

 for( $categorylevel=6; $categorylevel>0; $categorylevel--){

  if ( $items[$filelayout['v_categories_name_' . $categorylevel]] != ''){

   $v_categories_name[$newlevel++] = $items[$filelayout['v_categories_name_' . $categorylevel]];

  }

 }

 while( $newlevel < $max_categories+1){

  $v_categories_name[$newlevel++] = ''; // default the remaining items to nothing

 }

}

 

if (ltrim(rtrim($v_products_quantity)) == '') {

 $v_products_quantity = 1;

}

if ($v_date_avail == '') {

//  $v_date_avail = "CURRENT_TIMESTAMP";

 $v_date_avail = "NULL";

} else {

 // we put the quotes around it here because we can't put them into the query, because sometimes

 //   we will use the "current_timestamp", which can't have quotes around it.

 $v_date_avail = '"' . $v_date_avail . '"';

}

 

if ($v_date_added == '') {

 $v_date_added = "CURRENT_TIMESTAMP";

} else {

 // we put the quotes around it here because we can't put them into the query, because sometimes

 //   we will use the "current_timestamp", which can't have quotes around it.

 $v_date_added = '"' . $v_date_added . '"';

}

 

 

// default the stock if they spec'd it or if it's blank

$v_db_status = '1'; // default to active

if ($v_status == $inactive){

 // they told us to deactivate this item

 $v_db_status = '0';

}

if ($zero_qty_inactive && $v_products_quantity == 0) {

 // if they said that zero qty products should be deactivated, let's deactivate if the qty is zero

 $v_db_status = '0';

}

 

if ($v_manufacturer_id==''){

 $v_manufacturer_id="NULL";

}

 

if (trim($v_products_image)==''){

 $v_products_image = $default_image_product;

}

 

if (strlen($v_products_model) > $modelsize ){

 echo "<font color='red'>" . strlen($v_products_model) . $v_products_model . "... ERROR! - Too many characters in the model number.<br>

  12 is the maximum on a standard OSC install.<br>

  Your maximum product_model length is set to $modelsize<br>

  You can either shorten your model numbers or increase the size of the field in the database.</font>";

 die();

}

 

// OK, we need to convert the manufacturer's name into id's for the database

if ( isset($v_manufacturers_name) && $v_manufacturers_name != '' ){

 $sql = "SELECT man.manufacturers_id

  FROM ".TABLE_MANUFACTURERS." as man

  WHERE

   man.manufacturers_name = '" . $v_manufacturers_name . "'";

 $result = tep_db_query($sql);

 $row =  tep_db_fetch_array($result);

 if ( $row != '' ){

  foreach( $row as $item ){

   $v_manufacturer_id = $item;

  }

 } else {

  // to add, we need to put stuff in categories and categories_description

  $sql = "SELECT MAX( manufacturers_id) max FROM ".TABLE_MANUFACTURERS;

  $result = tep_db_query($sql);

  $row =  tep_db_fetch_array($result);

  $max_mfg_id = $row['max']+1;

  // default the id if there are no manufacturers yet

  if (!is_numeric($max_mfg_id) ){

   $max_mfg_id=1;

  }

 

  // Uncomment this query if you have an older 2.2 codebase

  /*

  $sql = "INSERT INTO ".TABLE_MANUFACTURERS."(

   manufacturers_id,

   manufacturers_name,

   manufacturers_image

   ) VALUES (

   $max_mfg_id,

   '$v_manufacturers_name',

   '$default_image_manufacturer'

   )";

  */

 

  // Comment this query out if you have an older 2.2 codebase

  $sql = "INSERT INTO ".TABLE_MANUFACTURERS."(

   manufacturers_id,

   manufacturers_name,

   manufacturers_image,

   date_added,

   last_modified

   ) VALUES (

   $max_mfg_id,

   '$v_manufacturers_name',

   '$default_image_manufacturer',

   CURRENT_TIMESTAMP,

   CURRENT_TIMESTAMP

   )";

  $result = tep_db_query($sql);

  $v_manufacturer_id = $max_mfg_id;

 }

}

// if the categories names are set then try to update them

if ( isset($v_categories_name_1)){

 // start from the highest possible category and work our way down from the parent

 $v_categories_id = 0;

 $theparent_id = 0;

 for ( $categorylevel=$max_categories+1; $categorylevel>0; $categorylevel-- ){

  $thiscategoryname = $v_categories_name[$categorylevel];

  if ( $thiscategoryname != ''){

   // we found a category name in this field

 

   // now the subcategory

   $sql = "SELECT cat.categories_id

    FROM ".TABLE_CATEGORIES." as cat,

         ".TABLE_CATEGORIES_DESCRIPTION." as des

    WHERE

     cat.categories_id = des.categories_id AND

     des.language_id = $epdlanguage_id AND

     cat.parent_id = " . $theparent_id . " AND

     des.categories_name = '" . $thiscategoryname . "'";

   $result = tep_db_query($sql);

   $row =  tep_db_fetch_array($result);

   if ( $row != '' ){

    foreach( $row as $item ){

     $thiscategoryid = $item;

    }

   } else {

    // to add, we need to put stuff in categories and categories_description

    $sql = "SELECT MAX( categories_id) max FROM ".TABLE_CATEGORIES;

    $result = tep_db_query($sql);

    $row =  tep_db_fetch_array($result);

    $max_category_id = $row['max']+1;

    if (!is_numeric($max_category_id) ){

     $max_category_id=1;

    }

    $sql = "INSERT INTO ".TABLE_CATEGORIES."(

     categories_id,

     categories_image,

     parent_id,

     sort_order,

     date_added,

     last_modified

     ) VALUES (

     $max_category_id,

     '$default_image_category',

     $theparent_id,

     0,

     CURRENT_TIMESTAMP

     ,CURRENT_TIMESTAMP

     )";

    $result = tep_db_query($sql);

    $sql = "INSERT INTO ".TABLE_CATEGORIES_DESCRIPTION."(

      categories_id,

      language_id,

      categories_name

     ) VALUES (

      $max_category_id,

      '$epdlanguage_id',

      '$thiscategoryname'

     )";

    $result = tep_db_query($sql);

    $thiscategoryid = $max_category_id;

   }

   // the current catid is the next level's parent

   $theparent_id = $thiscategoryid;

   $v_categories_id = $thiscategoryid; // keep setting this, we need the lowest level category ID later

  }

 }

}

 

if ($v_products_model != "") {

 //   products_model exists!

 array_walk($items, 'print_el');

 

 // First we check to see if this is a product in the current db.

 $result = tep_db_query("SELECT products_id FROM ".TABLE_PRODUCTS." WHERE (products_model = '". $v_products_model . "')");

 

 if (tep_db_num_rows($result) == 0)  {

  //   insert into products

 

  $sql = "SHOW TABLE STATUS LIKE '".TABLE_PRODUCTS."'";

  $result = tep_db_query($sql);

  $row =  tep_db_fetch_array($result);

  $max_product_id = $row['Auto_increment'];

  if (!is_numeric($max_product_id) ){

   $max_product_id=1;

  }

  $v_products_id = $max_product_id;

  echo "<font color='green'> !New Product!</font><br>";

 

  $query = "INSERT INTO ".TABLE_PRODUCTS." (

    products_image,

    products_image_med,

    products_image_lrg,

    products_image_sm_1,

    products_image_xl_1,

    products_image_sm_2,

    products_image_xl_2,

    products_image_sm_3,

    products_image_xl_3,

    products_image_sm_4,

    products_image_xl_4,

    products_image_sm_5,

    products_image_xl_5,

    products_image_sm_6,

                   products_image_xl_6,

    products_model,

    products_price,

    products_status,

    products_last_modified,

    products_date_added,

    products_date_available,

    products_tax_class_id,

    products_weight,

    products_quantity,

    manufacturers_id)

     VALUES (

      '$v_products_image',

      '$v_products_image_med',

                           '$v_products_image_lrg',

                           '$v_products_image_sm_1',

                           '$v_products_image_xl_1',

                           '$v_products_image_sm_2',

                           '$v_products_image_xl_2',

                           '$v_products_image_sm_3',

                           '$v_products_image_xl_3',

                           '$v_products_image_sm_4',

                           '$v_products_image_xl_4',

                           '$v_products_image_sm_5',

                           '$v_products_image_xl_5',

                           '$v_products_image_sm_6',

                           '$v_products_image_xl_6',";

 

  // unmcomment these lines if you are running the image mods

  /*

   $query .=  . $v_products_mimage . '", "'

      . $v_products_bimage . '", "'

      . $v_products_subimage1 . '", "'

      . $v_products_bsubimage1 . '", "'

      . $v_products_subimage2 . '", "'

      . $v_products_bsubimage2 . '", "'

      . $v_products_subimage3 . '", "'

      . $v_products_bsubimage3 . '", "'

  */

 

  $query .="    '$v_products_model',

       '$v_products_price',

       '$v_db_status',

       CURRENT_TIMESTAMP,

       $v_date_added,

       $v_date_avail,

       '$v_tax_class_id',

       '$v_products_weight',

       '$v_products_quantity',

       '$v_manufacturer_id')

      ";

   $result = tep_db_query($query);

 } else {

  // existing product, get the id from the query

  // and update the product data

  $row =  tep_db_fetch_array($result);

  $v_products_id = $row['products_id'];

  echo "<font color='black'> Updated</font><br>";

  $row =  tep_db_fetch_array($result);

  $query = 'UPDATE '.TABLE_PRODUCTS.'

    SET

    products_price="'.$v_products_price.

    '" ,products_image="'.$v_products_image.

    '" ,products_image_med="'.$v_products_image_med .

                   '" ,products_image_lrg="'. $v_products_image_lrg .

                   '" ,products_image_sm_1="'.$v_products_image_sm_1 .

                   '" ,products_image_xl_1="'.$v_products_image_xl_1 .

                   '" ,products_image_sm_2="'.$v_products_image_sm_2 .

                   '" ,products_image_xl_2="'.$v_products_image_xl_2 .

                   '" ,products_image_sm_3="'.$v_products_image_sm_3 .

                   '" ,products_image_xl_3="'.$v_products_image_xl_3 .

                   '" ,products_image_sm_4="'.$v_products_image_sm_4 .

                   '" ,products_image_sm_4="'.$v_products_image_xl_4 .

                   '" ,products_image_sm_5="'.$v_products_image_sm_5 .

                   '" ,products_image_xl_5="'.$v_products_image_xl_5 .

                   '" ,products_image_sm_6="'.$v_products_image_sm_6 .

                   '" ,products_image_xl_6="'.$v_products_image_xl_6;

 

  // uncomment these lines if you are running the image mods

/*

   $query .=

    '" ,products_mimage="'.$v_products_mimage.

    '" ,products_bimage="'.$v_products_bimage.

    '" ,products_subimage1="'.$v_products_subimage1.

    '" ,products_bsubimage1="'.$v_products_bsubimage1.

    '" ,products_subimage2="'.$v_products_subimage2.

    '" ,products_bsubimage2="'.$v_products_bsubimage2.

    '" ,products_subimage3="'.$v_products_subimage3.

    '" ,products_bsubimage3="'.$v_products_bsubimage3;

*/

 

  $query .= '", products_weight="'.$v_products_weight .

    '", products_tax_class_id="'.$v_tax_class_id .

    '", products_date_available= ' . $v_date_avail .

    ', products_date_added= ' . $v_date_added .

    ', products_last_modified=CURRENT_TIMESTAMP

    , products_quantity="' . $v_products_quantity .  

    '" ,manufacturers_id=' . $v_manufacturer_id .

    ' , products_status=' . $v_db_status . '

    WHERE

     (products_id = "'. $v_products_id . '")';

 

  $result = tep_db_query($query);

 }

 

 // the following is common in both the updating an existing product and creating a new product

               if ( isset($v_products_name)){

  foreach( $v_products_name as $key => $name){

      if ($name!=''){

    $sql = "SELECT * FROM ".TABLE_PRODUCTS_DESCRIPTION." WHERE

      products_id = $v_products_id AND

      language_id = " . $key;

    $result = tep_db_query($sql);

    if (tep_db_num_rows($result) == 0) {

     // nope, this is a new product description

     $result = tep_db_query($sql);

     $sql =

      "INSERT INTO ".TABLE_PRODUCTS_DESCRIPTION."

       (products_id,

       language_id,

       products_name,

       products_description,

       products_url)

       VALUES (

        '" . $v_products_id . "',

        " . $key . ",

        '" . $name . "',

        '". $v_products_description[$key] . "',

        '". $v_products_url[$key] . "'

        )";

     // support for Linda's Header Controller 2.0

     if (isset($v_products_head_title_tag)){

      // override the sql if we're using Linda's contrib

      $sql =

       "INSERT INTO ".TABLE_PRODUCTS_DESCRIPTION."

        (products_id,

        language_id,

        products_name,

        products_description,

        products_url,

        products_head_title_tag,

        products_head_desc_tag,

        products_head_keywords_tag)

        VALUES (

         '" . $v_products_id . "',

         " . $key . ",

         '" . $name . "',

         '". $v_products_description[$key] . "',

         '". $v_products_url[$key] . "',

         '". $v_products_head_title_tag[$key] . "',

         '". $v_products_head_desc_tag[$key] . "',

         '". $v_products_head_keywords_tag[$key] . "')";

     }

     // end support for Linda's Header Controller 2.0

     $result = tep_db_query($sql);

    } else {

     // already in the description, let's just update it

     $sql =

      "UPDATE ".TABLE_PRODUCTS_DESCRIPTION." SET

       products_name='$name',

       products_description='".$v_products_description[$key] . "',

       products_url='" . $v_products_url[$key] . "'

      WHERE

       products_id = '$v_products_id' AND

       language_id = '$key'";

     // support for Lindas Header Controller 2.0

     if (isset($v_products_head_title_tag)){

      // override the sql if we're using Linda's contrib

      $sql =

       "UPDATE ".TABLE_PRODUCTS_DESCRIPTION." SET

        products_name = '$name',

        products_description = '".$v_products_description[$key] . "',

        products_url = '" . $v_products_url[$key] ."',

        products_head_title_tag = '" . $v_products_head_title_tag[$key] ."',

        products_head_desc_tag = '" . $v_products_head_desc_tag[$key] ."',

        products_head_keywords_tag = '" . $v_products_head_keywords_tag[$key] ."'

       WHERE

        products_id = '$v_products_id' AND

        language_id = '$key'";

     }

     // end support for Linda's Header Controller 2.0

     $result = tep_db_query($sql);

    }

   }

  }

 }

 if (isset($v_categories_id)){

  //find out if this product is listed in the category given

  $result_incategory = tep_db_query('SELECT

     '.TABLE_PRODUCTS_TO_CATEGORIES.'.products_id,

     '.TABLE_PRODUCTS_TO_CATEGORIES.'.categories_id

     FROM

      '.TABLE_PRODUCTS_TO_CATEGORIES.'

     WHERE

     '.TABLE_PRODUCTS_TO_CATEGORIES.'.products_id='.$v_products_id.' AND

     '.TABLE_PRODUCTS_TO_CATEGORIES.'.categories_id='.$v_categories_id);

 

  if (tep_db_num_rows($result_incategory) == 0) {

   // nope, this is a new category for this product

   $res1 = tep_db_query('INSERT INTO '.TABLE_PRODUCTS_TO_CATEGORIES.' (products_id, categories_id)

      VALUES ("' . $v_products_id . '", "' . $v_categories_id . '")');

  } else {

   // already in this category, nothing to do!

  }

 }

 // for the separate prices per customer module

 $ll=1;

 

 if (isset($v_customer_price_1)){

 

  if (($v_customer_group_id_1 == '') AND ($v_customer_price_1 != ''))  {

   echo "<font color=red>ERROR - v_customer_group_id and v_customer_price must occur in pairs</font>";

   die();

  }

  // they spec'd some prices, so clear all existing entries

  $result = tep_db_query('

     DELETE

     FROM

      '.TABLE_PRODUCTS_GROUPS.'

     WHERE

      products_id = ' . $v_products_id

     );

  // and insert the new record

  if ($v_customer_price_1 != ''){

   $result = tep_db_query('

      INSERT INTO

       '.TABLE_PRODUCTS_GROUPS.'

      VALUES

      (

       ' . $v_customer_group_id_1 . ',

       ' . $v_customer_price_1 . ',

       ' . $v_products_id . ',

       ' . $v_products_price .'

       )'

      );

  }

  if ($v_customer_price_2 != ''){

   $result = tep_db_query('

      INSERT INTO

       '.TABLE_PRODUCTS_GROUPS.'

      VALUES

      (

       ' . $v_customer_group_id_2 . ',

       ' . $v_customer_price_2 . ',

       ' . $v_products_id . ',

       ' . $v_products_price . '

       )'

      );

  }

  if ($v_customer_price_3 != ''){

   $result = tep_db_query('

      INSERT INTO

       '.TABLE_PRODUCTS_GROUPS.'

      VALUES

      (

       ' . $v_customer_group_id_3 . ',

       ' . $v_customer_price_3 . ',

       ' . $v_products_id . ',

       ' . $v_products_price . '

       )'

      );

  }

  if ($v_customer_price_4 != ''){

   $result = tep_db_query('

      INSERT INTO

       '.TABLE_PRODUCTS_GROUPS.'

      VALUES

      (

       ' . $v_customer_group_id_4 . ',

       ' . $v_customer_price_4 . ',

       ' . $v_products_id . ',

       ' . $v_products_price . '

       )'

      );

  }

 

 }

 

 // VJ product attribs begin

 if (isset($v_attribute_options_id_1)){

  $attribute_rows = 1; // master row count

 

  $languages = tep_get_languages();

 

  // product options count

  $attribute_options_count = 1;

  $v_attribute_options_id_var = 'v_attribute_options_id_' . $attribute_options_count;

 

  while (isset($$v_attribute_options_id_var) && !empty($$v_attribute_options_id_var)) {

   // remove product attribute options linked to this product before proceeding further

   // this is useful for removing attributes linked to a product

   $attributes_clean_query = "delete from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$v_products_id . "' and options_id = '" . (int)$$v_attribute_options_id_var . "'";

 

   tep_db_query($attributes_clean_query);

 

   $attribute_options_query = "select products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$$v_attribute_options_id_var . "'";

 

   $attribute_options_values = tep_db_query($attribute_options_query);

 

   // option table update begin

   if ($attribute_rows == 1) {

    // insert into options table if no option exists

    if (tep_db_num_rows($attribute_options_values) <= 0) {

     for ($i=0, $n=sizeof($languages); $i<$n; $i++) {

      $lid = $languages[$i]['id'];

 

       $v_attribute_options_name_var = 'v_attribute_options_name_' . $attr

Link to comment
Share on other sites

:thumbsup:  :lol: Soultion to my problems, for all to read.. I hope this helps as this problem took for ever for me to figure out. I am surprised with how many people are asking for help about this.

I added 3 new fields to easy populate, and during an upload the data was being messed up in the database.

 

Thank You Pura Vida!

 

Your solution works perfectly for me. I was thinking that the problem was related to the way easypopulate.php gets and puts data into the database, but at the same time I was thinking it's just getting and putting data into the database.

 

I'm also using the contib New Fields with Easy Populate (4 March 2005) which didn't work until I used your fix.

 

Thank you for taking the time to share your solution.

 

All the best!

Link to comment
Share on other sites

Thank You Pura Vida!

 

Your solution works perfectly for me.

 

 

Sweet. I am so pleased that it helped you. I could not help but feeling I was a complete idiot for not getting it to work and when I asked for help and no one really provided any solution I was sure the problem I was having was so simple that I was stupid.

 

But the fact you read my post and solution let me feel as there are others out there who really were having the same problems as me.

 

Thank you for letting me know this was helpful. I will try my best now to post my solutions on this board.

 

PuraVida

(Pure Life)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...