ZenCart data import - admin/custom menu.php
Jump to navigation
Jump to search
computing: software: ZenCart: importing data: admin/custom menu.php
Overview
This file does the actual import. It contains a number of classes which might later be split off into separate PHP files, as they model particular aspects of the ZenCart data.
Source
<?php // // +----------------------------------------------------------------------+ // |zen-cart Open Source E-commerce | // +----------------------------------------------------------------------+ // | Copyright (c) 2003 The zen-cart developers | // | | // | http://www.zen-cart.com/index.php | // | | // | Portions Copyright (c) 2003 osCommerce | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.0 of the GPL license, | // | that is bundled with this package in the file LICENSE, and is | // | available through the world-wide-web at the following url: | // | http://www.zen-cart.com/license/2_0.txt. | // | If you did not receive a copy of the zen-cart license and are unable | // | to obtain it through the world-wide-web, please send a note to | // | license@zen-cart.com so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // /* 2006-09-17 (wzl) handlers for "Custom" menu. Used modules.php as model. SET values: prod_entry (default): bulk product entry ACTION values: (none): show bulk product entry form check: data is being submitted for preview commit: data is being submitted for final commit (update database) */ require('includes/application_top.php'); define('CUSTOM_MODULE_SET_PROD_ENTRY','prod_entry'); define('CUSTOM_MODULE_SAVE_DATA','save'); define('CUSTOM_MODULE_PROD_DATA_NAME','products'); define('CUSTOM_MODULE_ACT_CHECK','check'); define('CUSTOM_MODULE_ACT_COMMIT','commit'); define('CUSTOM_MODULE_BTN_CHECK','Preview Changes'); define('CUSTOM_MODULE_BTN_COMMIT','COMMIT'); define('URL_ISBN_SEARCH','http://www.abebooks.com/servlet/SearchResults?isbn=<<1>>'); define('CUSTOM_DEFAULT_SUPPLIER','Jubilee'); // when import data supplier field is empty define('CUSTOM_DEFAULT_CATEGORY','Unfiled'); // when imported category field is empty define('TABLE_CUSTOM_IMPORT_PROD',DB_PREFIX.'custom_import_prod'); define('TABLE_CUSTOM_IMPORT_MFGRS',DB_PREFIX.'custom_import_mfgrs'); // new item define('HTML_STATUS_NEW', '<font color="#ff7f00">NEW</font>'); // item is saved in list define('HTML_STATUS_NOTED', '<font color="#7f7f7f"><i>ok</i></font>'); // item found in database define('HTML_STATUS_EXISTS', '<font color="#006600">found</font>'); $set = (isset($_GET['set']) ? $_GET['set'] : ''); $button = (isset($_POST['action']) ? $_POST['action'] : ''); switch ($button) { case CUSTOM_MODULE_BTN_CHECK: $action=CUSTOM_MODULE_ACT_CHECK; break; case CUSTOM_MODULE_BTN_COMMIT: $action=CUSTOM_MODULE_ACT_COMMIT; break; default: $action=''; } /* After page has displayed, this handles the user's input */ switch ($action) { case CUSTOM_MODULE_SAVE_DATA: $doSave = true; // new SQL code for updating products: $sqlUpdateProd = "update " . TABLE_PRODUCTS . " set configuration_value = '" . $value . "' where configuration_key = '" . $key ."'"; break; case 'enter': // showing data entry form, so this stage (data processing) does nothing default: } ?> <!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"> <link rel="stylesheet" type="text/css" href="includes/cssjsmenuhover.css" media="all" id="hoverJS"> <script language="javascript" src="includes/menu.js"></script> <script language="javascript" src="includes/general.js"></script> <script type="text/javascript"> <!-- function init() { cssjsmenu('navbar'); if (document.getElementById) { var kill = document.getElementById('hoverJS'); kill.disabled = true; } } // --> </script> </head> <body onload="init()"> <!-- header //--> <?php require(DIR_WS_INCLUDES . 'header.php'); ?> <!-- header_eof //--> <!-- body //--> This feature is currently being debugged; do not use yet. <i>N. Staddon 2006-10-11</i><br> <!-- SET=<?php echo $set?> ACTION=<?php echo $action?> --> <?php switch ($set) { case CUSTOM_MODULE_SET_PROD_ENTRY: default: switch ($action) { case CUSTOM_MODULE_ACT_CHECK: echo "<b>Previewing entered data:</b>"; ProcessData(false); break; case CUSTOM_MODULE_ACT_COMMIT: echo "<b>Saving entered data:</b>"; $hide_form = 1; ProcessData(true); break; default: } /* DEFAULT: show bulk product entry form check: data is being submitted for preview commit: data is being submitted for final commit (update database) */ // always show data entry form: } if (!$hide_form) { $htmlSep = '<font color="#7f7f7f"><tab></font>'; echo zen_draw_form('prod_entry', CUSTOM_MENU_MODULE); echo '<center><table><tr><td colspan=2>'; echo 'Enter product data here:<br>'; echo '<i>Format is:</i> ' .'<b>ID string</b>'.$htmlSep .'(ignored)'.$htmlSep .'<b>Title</b>'.$htmlSep .'(ignored)'.$htmlSep .'<b>Supplier</b>'.$htmlSep .'<b>Price</b><br>'; echo '<center>'; echo zen_draw_textarea_field(CUSTOM_MODULE_PROD_DATA_NAME, '', '100', '20'); // later on this can use Zen functions for more slickness, but for now this should work: echo '</center></td></tr><tr><td>'; echo '<input type="submit" name="action" value="'.CUSTOM_MODULE_BTN_CHECK.'">'; echo '<input type="submit" name="action" value="'.CUSTOM_MODULE_BTN_COMMIT.'">'; echo '</td><td align=right>'; echo '<input type="reset" value="Undo all edits">'; echo '</td></tr></table></center>'; echo '</form>'; } ?> <!-- body_eof //--> <!-- footer //--> <?php require(DIR_WS_INCLUDES . 'footer.php'); ?> <!-- footer_eof //--> <br> </body> </html> <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); function Pluralize($iQty, $iSing='', $iPlur='s') { if ($iQty == 1) { return $iSing; } else { return $iPlur; } } function ProcessData($iCommit) { $data_raw = $_POST[CUSTOM_MODULE_PROD_DATA_NAME]; $data_lines = explode("\n",$data_raw); echo '<table>'; echo '<tr><th colspan=5></th><th colspan=3 bgcolor="#eeeeee">Data Entry Status</th></tr>'; echo '<tr><th>Catg</th><th>ID</th><th>Title</th><th>Supplier</th><th>Price</th><th bgcolor="#eeeeee">Supplier</th><th bgcolor="#eeeeee">Title</th><th bgcolor="#eeeeee">Category</th></tr><tr>'; $ctrTitlesNew = 0; $ctrTitlesOld = 0; foreach ($data_lines as $data_line) { // create title object for each import line. Title object should do all the lookups and printing and stuff. if ($data_line) { $objTitle = clsTitles::Import($data_line); $ctrSuppFnd = clsSuppliers::Count(); // # of suppliers found $ctrSuppNew = clsSuppliers::CountNew(); // # of *new* suppliers $ctrCatgFnd = clsCategories::Count(); // # of new categories $ctrCatgNew = clsCategories::CountNew(); // # of new categories echo '<tr>'.$objTitle->TableRowCells().'</tr>'; } } if ($ctrSuppNew) { $htmlSuppList = ': '.clsSuppliers::DoListNew('<b>','</b>',', '); $htmlSuppList .= ' OLD: '.clsSuppliers::DoListOld('<b>','</b>',', '); } if ($ctrCatgNew) { $htmlCatgList = ': '.clsCategories::DoListNew('<b>','</b>',', '); $htmlCatgList .= ' OLD: '.clsCategories::DoListOld('<b>','</b>',', '); } echo '</table><hr>'; echo '<big>Processed <b>'.$ctrLines.'</b> lines:</big><ul>' .'<li><b>'.clsTitles::Records()->CountNew().'</b> new titles to add' .'<li><b>'.clsTitles::Records()->CountOld().'</b> titles to update <i>(ignored for now)</i>' .'<li><b>'.$ctrSuppFnd.'</b> supplier'.Pluralize($ctrSuppFnd).' in import, <b>'.$ctrSuppNew.'</b> new'.$htmlSuppList .'<li><b>'.$ctrCatgFnd.'</b> categor'.Pluralize($ctrCatgFnd,'y','ies').' in import, <b>'.$ctrCatgNew.'</b> new'.$htmlCatgList .'</ul>'; echo '<b>Adding suppliers</b>: '.clsSuppliers::Save($iCommit).'<br>'; echo '<b>Adding categories</b>: '.clsCategories::Save($iCommit).'<br>'; echo '<b>Adding titles</b>: '.clsTitles::Save($iCommit).'<br>'; } function MakeKey($iStr) { return preg_replace('/[ -\.,;]*/','',strtolower($iStr)); } /* ===== CLASSES ===== */ class clsRecords { public $List; // actual unique records public $qtyNew; // number of *new* records found during import public $qtyOld; public function Count() { return Count($this->List); } public function CountOld() { if ($this->qtyOld) { return $this->qtyOld; } else { return 0; } } public function CountNew() { if ($this->qtyNew) { return $this->qtyNew; } else { return 0; } } public function AddObject($iName,$iObj) { if (!$this->List[$iName]) { $this->List[$iName] = $iObj; } if ($iObj->isFound) { $this->qtyOld++; } else { $this->qtyNew++; } } public function Exists($iName) { if (is_array($this->List)) { $isSet = isset($this->List[$iName]); return $isSet; } else { return false; } } public function DoListNew($iPfx,$iSfx,$iSep) { foreach ($this->List as $obj) { if (!$obj->isFound) { if ($out) { $out .= $iSep; } $out .= $iPfx.$obj->Name.$iSfx; } } return $out; } public function DoListOld($iPfx,$iSfx,$iSep) { foreach ($this->List as $obj) { if ($obj->isFound) { if ($out) { $out .= $iSep; } $out .= $iPfx.$obj->Name.$iSfx; } } return $out; } } class clsTitles { private static $objRecords; public function Records() { self::InitRecords(); return self::$objRecords; } public function Import($iLine) { $obj = new clsTitle; $obj->ImportLine($iLine); if (!$obj->isCatg) { self::Records()->AddObject($obj->ImportKey,$obj); } return $obj; } public function Save($iCommit) { global $db; $result = '<ul>'; foreach (self::Records()->List as $obj) { $result .= $obj->Save($iCommit); } $result .= '</ul>'; return $result; } public function Count() { return self::Records()->Count(); } public function CountNew() { return self::Records()->CountNew(); } public function DoListNew($iPfx,$iSfx,$iSep) { return self::Records()->DoListNew($iPfx,$iSfx,$iSep); } protected function InitRecords() { if (!isset(self::$objRecords)) { self::$objRecords = new clsRecords; } } } class clsTitle { public $ImportKey; private $intID; public $Name; public $Price; public $Supplier; public $SuppImp; public $Category; public $CatgImp; public $isCatg; // calculated fields public $ISBN; public $ISBN_URL; public $HtmlName; // status fields public $Status; public $isFound; // public static $lstTitles; public function ID() { if (!isset($this->intID)) { $this->UpdateName(); } //echo 'TITLE ID='.$this->intID; return $this->intID; } public function ImportLine($iLine) { global $db; list($ImportKeyRaw,$notUsed,$this->Name,$notUsed,$strSupplierName,$notUsed,$this->Price) = explode("\t",$iLine); //echo 'NAME='.$Name.'<br>'; // Check to see if the title is actually a category record - price is 0, name is empty or contains "classification" $this->isCatg = false; if ($this->Price == 0.0) { if ((!MakeKey($this->Name)) || (eregi('classification',$this->Name))) { $this->isCatg = true; } } if ($this->isCatg) { // for now, we're not really doing anything with category lines $this->HtmlName = '<span style="background-color: #eeeeff;"><i>'.$this->Name.'</i></span>'; } else { // ** Supplier if ($strSupplierName == '') { $strSupplierName = CUSTOM_DEFAULT_SUPPLIER; } $this->SuppImp = clsSuppliers::Import($strSupplierName); $this->Supplier = $this->SuppImp->Supplier; // Parse out the category and title key $listTitleParts = array_reverse(split(':',$ImportKeyRaw)); $this->ImportKey = MakeKey(array_shift($listTitleParts)); $strCatg = array_shift($listTitleParts); // for now, assume just one level of category if (!$strCatg) { $strCatg = CUSTOM_DEFAULT_CATEGORY; } $this->CatgImp = clsCategoryImports::Import($strCatg); $this->Category = $this->CatgImp->Category; //echo 'CATG='.$strCatg.' stored='.$this->Category->Name.'<br>'; $this->UpdateName(); // ** Title: cross-reference import key to title ID $sqlFind = 'SELECT * FROM '.TABLE_CUSTOM_IMPORT_PROD.' WHERE import_key="'.$this->ImportKey.'";'; $qryTitle = $db->Execute($sqlFind); if ($qryTitle->RecordCount()) { $this->isFound = true; $this->Status = HTML_STATUS_EXISTS; $this->ID = $qryTitle->fields['prod_key']; } else { $this->isFound = false; if ($lstTitles[$this->ImportKey]) { $this->Status = HTML_STATUS_NOTED; } else { $this->Status = HTML_STATUS_NEW; // $lstTitles[$this->ImportKey] = $this->ID; // may eventually want to save an object, not just a string } } } } public function UpdateName() { $subject = $this->Name; $pattern = '/ISBN *[0-9\-]*/'; preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); // This operation is unnecessarily complicated, but it is what seems to work: $this->ISBN = trim(preg_replace('/ISBN/','',$matches[0][0])); if ($this->ISBN) { $this->ISBN_URL = preg_replace('/<<1>>/',$this->ISBN,URL_ISBN_SEARCH); $this->HtmlName = '<a href="'.$this->ISBN_URL.'">'.$this->Name.'</a>'; } else { $this->HtmlName = $this->Name; $this->ISBN_URL = ''; } } public function Save($iCommit) { global $db; if ($this->isFound) { // TO DO: write update routine } else { // Check for missing manufacturer: if (!$this->Supplier->ID()) { echo '<b>MISSING SUPPLIER</b> for title "'.$this->Name.'"<br>'; } if (!$this->Category->ID()) { echo '<b>MISSING CATEGORY</b> for title "'.$this->Name.'"<br>'; } // only insert items with a numerically valid price if (is_numeric(trim($this->Price))) { // Theory: MySQL defaults to using the first index as an auto-increment key. We'll see if this works. // Update main PRODUCTS table: $sqlAdd = 'INSERT INTO '.TABLE_PRODUCTS.' (products_status,products_price,products_date_added,manufacturers_id,master_categories_id)' .'VALUES(' .'1,' // products_status (1 = active) .$this->Price.',' // products_price .'NOW(),' // products_date_added .$this->Supplier->ID().',' // manufacturers_id .$this->Category->ID().')'; // master_categories_id $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>main products table status</b>: '.mysql_info(); $this->intID = mysql_insert_id(); $result .= '<li><b>ID</b>: '.$this->intID; } else { $this->intID = 0; } // Update product import table: $sqlAdd = 'INSERT INTO '.TABLE_CUSTOM_IMPORT_PROD.' (import_key,prod_key) VALUES("'.mysql_real_escape_string($this->ImportKey).'",'.$this->ID().')'; $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>products import table status</b>: '.mysql_info(); } // Update PRODUCTS_DESCRIPTION: $sqlAdd = 'INSERT INTO '.TABLE_PRODUCTS_DESCRIPTION.' (products_id,products_name) VALUES('.$this->ID().',"'.mysql_real_escape_string($this->Name).'")'; $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>products description status</b>: '.mysql_info(); } // Update PRODUCT CATEGORIES: $sqlAdd = 'INSERT INTO '.TABLE_PRODUCTS_TO_CATEGORIES.' (products_id,categories_id) VALUES('.$this->ID().','.$this->Category->ID().')'; $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>products description status</b>: '.mysql_info(); } } else { $result = '<li><b>Warning</b>: product ['.$this->Name.'] has no price set ('.$this->Price.'); skipping.'; } return $result; } } public function TableRowCells() { $out = '<td>'.$this->Category->Name.'</td><td>'.$this->ImportKey.'</td><td>'.$this->HtmlName.'</td>'; if ($this->isCatg) { $out .= '<td colspan=5 align=center bgcolor="#eeeeff"><b>category</b> (ignored)</td>'; } else { $out .= '<td>(<b>'.$this->Supplier->ID().'</b>) '.$this->Supplier->Name.'</td><td>'.$this->Price.'</td><td align=center>'.$this->SuppImp->Status.'</td><td align=center>'.$this->Status.'</td><td>'.$this->CatgImp->Status.'</td>'; } return $out; } } class clsSuppliers { private static $Records; public function Import($iName) { self::InitRecords(); $objSuppImp = new clsSupplierImport; if (self::$Records->List[$iName]) { // supplier has already been seen this session $objSupp = self::$Records->List[$iName]; // retrieve existing supplier record $objSuppImp->ImportOld($objSupp); // attach it to supplier import record for this import } else { // new supplier for this session $objSuppImp->ImportNew($iName); self::$Records->AddObject($iName,$objSuppImp->Supplier); // self::$Records->List[$iName] = $objSuppImp->Supplier; // if (!$objSuppImp->Supplier->isFound) { // $this->Records->qtyNew++; // } } return $objSuppImp; } // save list of (new) suppliers to database public function Save($iCommit) { global $db; $result = '<ul>'; foreach (self::$Records->List as $obj) { if (!$obj->isFound) { if ($strValues) { $strValues .= ','; } $strValues .= '("'.mysql_real_escape_string($obj->Name).'",NOW())'; } } if ($strValues) { $sqlAdd = 'INSERT INTO '.TABLE_MANUFACTURERS.' (manufacturers_name, date_added) VALUES'.$strValues; $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>status</b>: '.mysql_info(); } } $result .= '</ul>'; return $result; } public function Count() { self::InitRecords(); return self::$Records->Count(); } public function CountNew() { self::InitRecords(); return self::$Records->CountNew(); } public function DoListNew($iPfx,$iSfx,$iSep) { self::InitRecords(); return self::$Records->DoListNew($iPfx,$iSfx,$iSep); } public function DoListOld($iPfx,$iSfx,$iSep) { self::InitRecords(); return self::$Records->DoListOld($iPfx,$iSfx,$iSep); } protected function InitRecords() { if (!isset(self::$Records)) { self::$Records = new clsRecords; } } } class clsSupplier { private $intID; public $Name; public $Key; public $isFound; public function Init($iName) { global $db; $this->Name = $iName; $this->UpdateName(); } public function Init_fromID($iID) { global $db; $this->intID = $iID; $sqlFind = 'SELECT * FROM '.TABLE_MANUFACTURERS.' WHERE manufacturers_id="'.$iID.'";'; $qryFind = $db->Execute($sqlFind); $this->isFound = $qryFind->RecordCount(); if ($this->isFound) { $this->Name = $qryFind->fields['manufacturers_name']; } } private function UpdateName() { global $db; $sqlFind = 'SELECT * FROM '.TABLE_MANUFACTURERS.' WHERE manufacturers_name="'.$this->Name.'";'; $qryFind = $db->Execute($sqlFind); $this->isFound = $qryFind->RecordCount(); if ($this->isFound) { $this->intID = $qryFind->fields['manufacturers_id']; } else { // not found in main list, so check aliases $sqlFind = 'SELECT * FROM '.TABLE_CUSTOM_IMPORT_MFGRS.' WHERE LCASE(import_alias)="'.mysql_real_escape_string(strtolower($this->Name)).'";'; $qryFind = $db->Execute($sqlFind); $this->isFound = $qryFind->RecordCount(); if ($this->isFound) { $this->Init_fromID($qryFind->fields['id_mfgr']); } } } public function ID() { if ($this->intID) { $this->UpdateName(); } return $this->intID; } } class clsSupplierImport { public $Supplier; // points to supplier data public $Status; // indicates status of this particular import of that data // Supplier record has already been created, so use it: public function ImportOld($iObj) { $this->Supplier = $iObj; $this->Status = HTML_STATUS_NOTED; } // Supplier record needs to be created: public function ImportNew($iName) { global $db; $this->Supplier = new clsSupplier; $this->Supplier->Init($iName); if ($this->Supplier->isFound) { $this->Status = HTML_STATUS_EXISTS; } else { $this->Status = HTML_STATUS_NEW; } } } /* ===== CATEGORIES ===== */ class clsCategories { private static $Records; public function Create($iName) { // This function is only called if category has not been seen before in this run global $db; $objNew = new clsCategory; self::InitRecords(); $objNew->Init($iName); self::$Records->AddObject($iName,$objNew); /* self::$Records->List[$iName] = $objNew; if (!$objNew->isFound) { self::$Records->qtyNew++; } */ return $objNew; } // add any new categories to database public function Save($iCommit) { foreach (self::$Records->List as $obj) { if (!$obj->isFound) { $sqlOut .= $obj->Save($iCommit); } } return $sqlOut; } public function GetObject($ID) { self::InitRecords(); return self::$Records->List[$ID]; } public function Count() { self::InitRecords(); return self::$Records->Count(); } public function CountNew() { self::InitRecords(); return self::$Records->CountNew(); } public function Exists($iName) { self::InitRecords(); return self::$Records->Exists($iName); } public function DoListNew($iPfx,$iSfx,$iSep) { self::InitRecords(); return self::$Records->DoListNew($iPfx,$iSfx,$iSep); } public function DoListOld($iPfx,$iSfx,$iSep) { self::InitRecords(); return self::$Records->DoListOld($iPfx,$iSfx,$iSep); } protected function InitRecords() { if (!isset(self::$Records)) { self::$Records = new clsRecords; } } } class clsCategory { private $intID; public $Name; public $ImportKey; // status public $isFound; public function Init($iName) { global $db; //echo 'storing 2:'.$iName.' '; $this->Name = $iName; $this->ImportKey = MakeKey($iName); $this->UpdateName(); } private function UpdateName() { global $db; $sqlFind = 'SELECT * FROM '.TABLE_CATEGORIES_DESCRIPTION.' WHERE categories_name="'.$this->Name.'"'; $qryFind = $db->Execute($sqlFind); $this->isFound = $qryFind->RecordCount(); $this->intID = $qryFind->fields['categories_id']; } public function ID() { if (!$this->intID) { $this->UpdateName(); } return $this->intID; } public function Save($iCommit) { global $db; $result = '<ul>'; $sqlAdd = 'INSERT INTO '.TABLE_CATEGORIES.' (date_added) VALUES(NOW())'; $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>status</b>: '.mysql_info(); $idNew = mysql_insert_id(); $result .= '<li><b>ID</b>: '.$idNew; } else { $idNew = '?'; } $sqlAdd = 'INSERT INTO '.TABLE_CATEGORIES_DESCRIPTION.' (categories_id,categories_name) VALUES(' .$idNew.',"'.mysql_real_escape_string($this->Name).'");'; $result .= '<li><b>SQL</b>: '.$sqlAdd; if ($iCommit) { $db->Execute($sqlAdd); $result .= '<li><b>status</b>: '.mysql_info(); } $result .= '</ul>'; return $result; } } class clsCategoryImports { public function Import($iName) { $objImport = new clsCategoryImport; $objImport->Import($iName); return $objImport; } } class clsCategoryImport { public $Category; public $Status; public function Import($iName) { // echo 'storing 1:'.$iName.' '; if (clsCategories::Exists($iName)) { //echo 'EXISTS '; $this->Category = clsCategories::GetObject($iName); $this->Status = HTML_STATUS_NOTED; } else { //echo '*NEW* '; $this->Category = clsCategories::Create($iName); if ($this->Category->isFound) { $this->Status = HTML_STATUS_EXISTS; } else { $this->Status = HTML_STATUS_NEW; } } } } ?>