|
|
Line 8: |
Line 8: |
| ==Code - store.php== | | ==Code - store.php== |
| <php><?php | | <php><?php |
− | # PURPOSE: vbz class library | + | # PURPOSE: vbz page generator |
| + | # VERSION: /topics/ |
| | | |
− | define('kfpHostAcctRoot','/hsphere/local/home/hypertwi/');
| + | // CONSTANTS |
− | define('kfpMediaWiki',kfpHostAcctRoot.'wiki.vbz.net/');
| + | // -- KF = boolean flag |
− | define('kEmbeddedPagePrefix','embed:');
| + | // -- KS = string |
− | | + | // -- KWP = web path (URL including protocol) |
− | require('datamgr.php');
| + | // -- KFP = file path |
− | if (KF_USE_WIKI) {
| + | // -- KRP = relative path |
− | define(KW_WIKI_ROOT,'http://wiki.vbz.net/');
| + | $fltStart = microtime(true); |
− | include('extract.php');
| + | // debugging activation |
− | }
| + | define('KDO_DEBUG',0); |
− | | + | define('KDO_DEBUG_STACK',0); |
− | define('EN_PGTYPE_NOTFND',-1); // requested item (supp/dept/title) not found | + | // debugging options |
− | define('EN_PGTYPE_HOME',1); // catalog home page | + | define('KDO_DEBUG_HTML',1); |
− | define('EN_PGTYPE_SUPP',2); // supplier page | + | define('KDO_DEBUG_IMMED',1); |
− | define('EN_PGTYPE_DEPT',3); // department page, or possibly title for keyless dept | + | define('KDO_DEBUG_DARK',0); |
− | define('EN_PGTYPE_TITLE',4); // title page | + | define('KF_USE_WIKI',true); |
− | | + | // 2008-06-07 force absolute URL for cart until we fix the domain-cookie problem |
− | $imgSize['th'] = 'thumbnail';
| + | define('KF_CART_ABSOLUTE',true); |
− | $imgSize['sm'] = 'small';
| |
− | $imgSize['big'] = 'large';
| |
− | $imgSize['huge'] = 'huge';
| |
− | $imgSize['zoom'] = 'detail';
| |
− | | |
− | $intCallDepth = 0;
| |
− | | |
− | // CALCULATED GLOBALS
| |
− | $fpTools = '/tools';
| |
− | $fpPages = '';
| |
− | $fwpAbsPages = 'http://'.KS_PAGE_SERVER.$fpPages;
| |
− | $fwpAbsTools = 'http://'.KS_TOOLS_SERVER.$fpTools;
| |
− | $fwpCart = $fwpAbsPages.'/cart/';
| |
− | $strCurServer = $_ENV['SERVER_NAME'];
| |
− | | |
− | // SET UP DEPENDENT VALUES
| |
| /* | | /* |
− | if ($strCurServer != KS_TOOLS_SERVER) {
| + | GET CONNECTED TO LIBRARIES |
− | $fpTools = $fwpAbsTools;
| |
− | $fpPages = $fwpAbsPages;
| |
− | }
| |
| */ | | */ |
− | $fwpLogo = $fpTools.'/img/logos/v/';
| |
− |
| |
− |
| |
− | function InitData($iSpec) {
| |
− | global $objFactory,$objDataMgr;
| |
− |
| |
− | $objDb = new clsDatabase($iSpec);
| |
− | $objFactory = new clsFactory($objDb);
| |
− | $objDataMgr = new clsDataMgr($objDb,'data_tables','data_procs','v_data_flow','data_log');
| |
− | return $objDb;
| |
− | }
| |
− |
| |
− | class clsFactory {
| |
− | protected $objDB;
| |
− | private $objPages;
| |
− | private $objSupps;
| |
− | private $objDepts;
| |
− | private $objTitles;
| |
− | private $objTitlesExt;
| |
− | private $objItems;
| |
− | private $objItTyps;
| |
− | private $objImages;
| |
− | private $objStkItems;
| |
− | private $objTopics;
| |
− |
| |
− | public function __construct($iDB) {
| |
− | $this->objDB = $iDB;
| |
− | }
| |
− | // generic functions
| |
− | public function DB() {
| |
− | return $this->objDB;
| |
− | }
| |
− | public function Table($iName) {
| |
− | return new clsDataTable($this->objDB,$iName);
| |
− | }
| |
− | public function Query($iSQL) {
| |
− | return new clsDataQuery($this->objDB,$iSQL);
| |
− | }
| |
− | // table-specific functions
| |
− | public function Pages() {
| |
− | if (!is_object($this->objPages)) {
| |
− | $this->objPages = new clsCatPages($this->objDB);
| |
− | }
| |
− | return $this->objPages;
| |
− | }
| |
− | public function Suppliers() {
| |
− | if (!is_object($this->objSupps)) {
| |
− | $this->objSupps = new clsSuppliers($this->objDB);
| |
− | }
| |
− | return $this->objSupps;
| |
− | }
| |
− | public function Depts() {
| |
− | if (!is_object($this->objDepts)) {
| |
− | $this->objDepts = new clsDepts($this->objDB);
| |
− | }
| |
− | return $this->objDepts;
| |
− | }
| |
− | public function Titles() {
| |
− | if (!is_object($this->objTitles)) {
| |
− | $this->objTitles = new clsTitles($this->objDB);
| |
− | }
| |
− | return $this->objTitles;
| |
− | }
| |
− | public function TitlesExt() {
| |
− | if (!is_object($this->objTitlesExt)) {
| |
− | $this->objTitlesExt = new clsTitlesExt($this->objDB);
| |
− | }
| |
− | return $this->objTitlesExt;
| |
− | }
| |
− | public function Items() {
| |
− | if (!is_object($this->objItems)) {
| |
− | $this->objItems = new clsItems($this->objDB);
| |
− | }
| |
− | return $this->objItems;
| |
− | }
| |
− | public function ItTyps() {
| |
− | if (!is_object($this->objItTyps)) {
| |
− | $this->objItTyps = new clsItTyps($this->objDB);
| |
− | }
| |
− | return $this->objItTyps;
| |
− | }
| |
− | public function Images() {
| |
− | if (!is_object($this->objImages)) {
| |
− | $this->objImages = new clsImages($this->objDB);
| |
− | }
| |
− | return $this->objImages;
| |
− | }
| |
− | public function StkItems() {
| |
− | if (!is_object($this->objStkItems)) {
| |
− | $this->objStkItems = new clsStkItems($this->objDB);
| |
− | }
| |
− | return $this->objStkItems;
| |
− | }
| |
− | public function Topics() {
| |
− | if (!is_object($this->objTopics)) {
| |
− | $this->objTopics = new clsTopics($this->objDB);
| |
− | }
| |
− | return $this->objTopics;
| |
− | }
| |
− | public function Table_noID($iName) {
| |
− | return new clsDataTable_noID($objDb,$iName);
| |
− | }
| |
− | }
| |
− |
| |
− | class clsList {
| |
− | public $List;
| |
| | | |
− | public function Add($iName, $iValue=NULL) {
| + | require('../local.php'); |
− | $objItem = new clsListItem($iName,$iValue);
| + | require('site.php'); |
− | $this->List[] = $objItem;
| + | $strLibs .= ':'.KFP_WIKI.':'.KFP_WIKI.'includes/'; |
− | return $objItem;
| + | ini_set('include_path',$strLibs); |
− | }
| + | require('store.php'); |
− | public function Output($iPfx, $iSep, $iSfx) {
| |
− | if (is_array($this->List)) {
| |
− | foreach ($this->List as $objItem) {
| |
− | if (is_null($objItem->value)) {
| |
− | $out .= $iPfx.$iSep.$objItem->name.$iSfx;
| |
− | } else {
| |
− | $out .= $iPfx.$objItem->name.$iSep.$objItem->value.$iSfx;
| |
− | }
| |
− | }
| |
− | }
| |
− | return $out;
| |
− | }
| |
− | }
| |
− | class clsListItem {
| |
− | public $name;
| |
− | public $value;
| |
| | | |
− | public function __construct($iName, $iValue=NULL) {
| + | // PROCESS PAGE REQUEST |
− | $this->name = $iName;
| + | $page_uri = $_ENV['REQUEST_URI']; |
− | $this->value = $iValue;
| + | // prepare data objects |
− | }
| + | InitData(KS_DB_VBZCART); |
− | }
| + | //$objFactory = new clsFactory_Carts($objFactory->DB()); // this is an ugly kluge |
− | | + | // clsFactory can be done away with when the data.php and carts.php are rewritten to use a single class for each type |
− | /* =================== | + | // - static methods for the whole-table functions, regular methods for individual rows |
− | CLASS: clsPage
| |
− | PURPOSE: Handles display of different page types
| |
− | */
| |
− | class clsPage {
| |
− | // query
| |
− | protected $strReq; // requested page
| |
− | // page definition
| |
− | protected $strAbbr; // page's abbreviation for wiki embedding lookups (if blank, suppress embedding)
| |
− | protected $strName; // short title: {item name} (goes into html title, prefixed with store name)
| |
− | protected $strTitle; // longer, descriptive title: {"item name" by Supplier} (goes at top of page)
| |
− | protected $strSheet; // name of style sheet to use (without the .css)
| |
− | protected $strTitleContext; // context of short title, in HTML: {Supplier: Department:} (goes above title, in small print)
| |
− | protected $strHdrXtra; // any extra stuff (HTML) for the header
| |
− | protected $strSideXtra; // any extra stuff for the sidebar
| |
− | protected $lstTop; // stuff listed at the top of the sidebar
| |
− | // calculated fields
| |
− | protected $strCalcTitle;
| |
− | protected $strContText;
| |
− | // flags set by wiki contents
| |
− | protected $hideImgs;
| |
− | /* OLD
| |
− | // query parsing
| |
− | public $CatNum;
| |
− | // status
| |
− | var $enPgType;
| |
− | /**/
| |
− | public function __construct() {
| |
− | $this->lstTop = new clsList();
| |
− | }
| |
− | | |
− | public function GetQuery() {
| |
− | // ACTION: Retrieves request from URL and parses it
| |
− | $this->strSheet = 'browse'; // default
| |
− | $strReq = $_SERVER['PATH_INFO'];
| |
− | $this->strReq = $strReq;
| |
− | // $pathinfo = $_SERVER['REQUEST_URI'];
| |
− | if (strrpos($strReq,'/')+1 < strlen($strReq)) {
| |
− | $strRedir = KWP_CAT_REL.substr($strReq,1).'/';
| |
− | header('Location: '.$strRedir);
| |
− | exit; // retry with new URL
| |
− | }
| |
− | $this->ParseQuery();
| |
− | }
| |
− | public function ParseQuery() {
| |
− | // This is essentially an abstract function
| |
− | // Define any additional parsing of the query (store member vars etc.)
| |
− | | |
− | // global $objFactory;
| |
− | | |
− | // $strReq = $this->strReq;
| |
− | | |
− | | |
− | // $this->objCatPage = $objFactory->Pages()->GetItem_byKey($strReq); | |
− | //print 'REQ='.$strReq.' ABBR='.$this->objCatPage->AB;
| |
− | }
| |
− | // DIFFERENT TYPES OF PAGES
| |
− | protected function DoNotFound() {
| |
− | // $this->Setup('','Unknown Title','unknown title in catalog','browse','Tomb of the...');
| |
− | $this->strAbbr = '';
| |
− | $this->strTitle = 'Unknown Page';
| |
− | $this->strName = 'unknown title in catalog';
| |
− | $this->strTitleContext = 'Tomb of the...';
| |
− | $this->strHdrXtra = '';
| |
− | $this->strSideXtra = '<dt><b>Cat #</b>: '.$this->strReq;
| |
− | }
| |
− | // UTILITY
| |
− | protected function AddText($iText) {
| |
− | $this->strContText .= $iText;
| |
− | }
| |
− | | |
− | // PAGE COMPONENTS
| |
− | // -- HEADER COMPONENTS
| |
− | protected function DoPreamble() {
| |
− | # Framework
| |
− | $this->DoHeader();
| |
− | $this->DoSidebar();
| |
− | $this->DoWikiContent();
| |
− | }
| |
− | protected function DoPostamble() {
| |
− | global $didPage,$fltStart,$strPageAbbr;
| |
− | print '<div style="clear: both;" align=right>';
| |
− | $this->DoSepBar();
| |
− | print '<table width=100%><tr><td><small>'.$txtFooter.'</small></td><td align=right><small><i>';
| |
− | $fltExecTime = microtime(true)-$fltStart;
| |
− | $dat = getrusage();
| |
− | $fltUserTime = $dat["ru_utime.tv_usec"]/1000000;
| |
− | $strServer = $_SERVER['SERVER_SOFTWARE'];
| |
− | print $strServer.' .. ';
| |
− | print 'PHP '.phpversion().' .. Generated in <b>'.$fltUserTime.'</b> seconds (script execution '.$fltExecTime.' sec.) .. ';
| |
− | if ($strPageAbbr) {
| |
− | print 'wiki: <a href="'.KWP_WIKI_ROOT.kEmbeddedPagePrefix.$strPageAbbr.'">'.$strPageAbbr.'</a> .. ';
| |
− | }
| |
− | print date('Y-m-d H:i:s');
| |
− | print '</i></small></td></tr></table>';
| |
− | print '</i></small></div></body></html>';
| |
− | $didPage = true;
| |
− | }
| |
− | private function DoWikiContent() {
| |
− | # WIKI CONTENTS
| |
− | # $txtPage = GetEmbedPage('cat');
| |
− | if (KF_USE_WIKI) {
| |
− | $txtWiki = GetWikiPage($this->strAbbr);
| |
− | if ($txtWiki) {
| |
− | if (strpos($txtWiki,'__NOIMG__') != -1) {
| |
− | $txtWiki = str_replace('__NOIMG__','',$txtWiki);
| |
− | $this->hideImgs = true;
| |
− | }
| |
− | }
| |
− | if ($txtWiki) {
| |
− | // print '<span class=main>'.$txtPage.'</span><br>';
| |
− | print '<table class=main><tr><td>'.$txtWiki.'</td></tr></table>';
| |
− | }
| |
− | }
| |
− | }
| |
− | protected function DoSidebar() {
| |
− | global $fpTools,$objDataMgr;
| |
− | // later: these will be pulled from the [stats] table
| |
− | if ($objDataMgr->dtNewest) {
| |
− | $timeSidebarBuild=$objDataMgr->dtNewest;
| |
− | }
| |
− | $statsQtyTitlesAvail = 2245;
| |
− | $statsQtyStockPieces = 1395;
| |
− | $statsQtyStockItems = 753;
| |
− | $statsQtyArtists = 136;
| |
− | $statsQtyTopics = 1048;
| |
− | | |
− | print '<table align=left background="'.$fpTools.'/img/bg/lines/" cellpadding=3 bgcolor="#000000"><tr><td>';
| |
− | ?>
| |
− | <table bgcolor="#ffffff" cellpadding=5><tr><td class=xxmenu>
| |
− | <table border=0 class=menu-title width="100%"><tr><td class=menu-title><a href="/">Home</a></td></tr></table>
| |
− | <span class=menu-text><dl>
| |
− | <?php
| |
− | /*
| |
− | <span class=menu-text><p style="background: #eeeeee;"><dl>
| |
− | */
| |
− | echo $this->lstTop->Output('<dt><b>','</b>: ','');
| |
− | // echo '</p></span></dl>';
| |
− | echo '</dl>';
| |
− | if ($this->strSideXtra) {
| |
− | echo '<dl style="background: #eeeeee;">'.$this->strSideXtra.'</dl>';
| |
− | }
| |
− | echo '<form action="/search/">';
| |
− | echo 'Search '.$statsQtyTitlesAvail.' items:<br>';
| |
− | ?>
| |
− | <input size=10 name=search><input type=submit value="Go"><br>
| |
− | <small><a href="/search/">advanced</a></small>
| |
− | </form>
| |
− | <b>Indexes</b>
| |
− | <br> ...<a href="/cat/"><b>C</b>atalog <b>H</b>ome</a>
| |
− | <?php
| |
− | | |
− | print '<br> ...<a href="/stock/" title="'.$statsQtyStockPieces.' pieces, '.$statsQtyStockItems.'. items"><b>S</b>tock</a> ('.$statsQtyStockPieces.')';
| |
− | print '<br> ...<a href="/artists/" title="'.$statsQtyArtists.'.artists"><b>A</b>rtists</a> ('.$statsQtyArtists.')';
| |
− | print '<br> ...<a href="/topics/" title="'.$statsQtyTopics.'.topics"><b>T</b>opics</a> ('.$statsQtyTopics.')';
| |
− | print '<p>';
| |
− | print '[[ <a href="'.KWP_WIKI.'/" title="vbz wiki homepage"><b>wiki</b></a> ]]<br>';
| |
− | print '-- [[ <a href="'.KWP_WIKI.'/help" title="help-related pages on the wiki"><b>Help</b></a> ]]<br>';
| |
− | print '-- [[ <a href="'.KWP_WIKI.'/about" title="about vbz.net (probably more than you want to know)"><b>About</b></a> ]]<br>';
| |
− | print '-- [[ <a href="'.KWP_WIKI.'/contact" title="contact vbz.net (several different methods)"><b>Contact</b></a> ]]<br>';
| |
− | print '<p>';
| |
− | print '<a href="/email/" title="web form for sending us email">email form</a><br>';
| |
− | print '<a href="/cart/" title="your shopping cart">shopping cart</a><p>';
| |
− | # == END Sidebar B ==
| |
− | print '<table background="'.$fpTools.'/img/bg/hdr/" width="100%"><tr><td>';
| |
− | print '<table width="100%"><tr><td valign=top class=menu-status>Updated:</td><td>';
| |
− | print '<td align=right class=menu-status><b>'.$timeSidebarBuild.'</b>';
| |
− | print '</td></tr></table>';
| |
− | print '</td></tr></table></span></td></tr></table></td></tr></table>';
| |
− | }
| |
− | private function DoSepBar() {
| |
− | global $fpTools;
| |
− | | |
− | print '<img src="'.$fpTools.'/img/bg/hlines/" alt="-----" width="100%">';
| |
− | }
| |
− | private function ToolbarItem($iURL,$iIcon,$iTitle,$iAlt) {
| |
− | global $fpTools;
| |
− | return '<a href="'.$iURL.'"><img border=0 src="'.$fpTools.'/img/icons/'.$iIcon.'.050pxh.png" title="'.$iTitle.'" alt="'.$iAlt.'"></a>';
| |
− | }
| |
− | protected function DoToolbar() {
| |
− | global $fpPages,$fwpCart;
| |
− | print $this->ToolbarItem($fpPages.'/','home',KS_STORE_NAME.' home page','home page');
| |
− | print $this->ToolbarItem($fpPages.'/search/','search','search page','search page');
| |
− | print $this->ToolbarItem($fwpCart,'cart','shopping cart','shopping cart');
| |
− | print $this->ToolbarItem(KWP_WIKI.'/help','help','help!','help');
| |
− | }
| |
− | // -- HEADER
| |
− | protected function DoHeader() {
| |
− | global $fpTools, $fwpLogo,$strPageAbbr;;
| |
− | | |
− | $strPageAbbr = $this->strAbbr;
| |
− | $this->strCalcTitle = KS_STORE_NAME.' - '.$this->strName;
| |
− | $htmlHead = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
| |
− | $htmlHead .= '<html><head><title>'.$this->strCalcTitle.'</title>';
| |
− | if ($this->strSheet) {
| |
− | $htmlHead .= '<link rel="StyleSheet" href="'.$fpTools.'/styles/'.$this->strSheet.'.css">';
| |
− | }
| |
− | # remove any quotes from $pageName:
| |
− | $htmlName = str_replace('"','"',$this->strName);
| |
− | if ($htmlName) {
| |
− | $htmlName = ': '.$htmlName;
| |
− | }
| |
− | $htmlHead .= '<meta name=description content="'.KS_STORE_NAME_META.$htmlName.'">';
| |
− | $htmlHead .= '</head>';
| |
− | print $htmlHead;
| |
− | ?><body
| |
− | bgcolor=000044
| |
− | TEXT=CCFFFF
| |
− | LINK=33FF33
| |
− | VLINK=33CCFF
| |
− | ALINK=FFCC00
| |
− | TOPMARGIN=0
| |
− | LEFTMARGIN=0
| |
− | MARGINWIDTH=0
| |
− | MARGINHEIGHT=0
| |
− | >
| |
− | <?
| |
− | // begin content header
| |
− | print '<table width="100%" background="'.$fpTools.'/img/bg/lines/" cellpadding=5 bgcolor=000000><tr><td>';
| |
− | print '<table width="100%" class=hdr cellpadding=2><tr>';
| |
− | // === LEFT HEADER: Title ===
| |
− | print '<td>';
| |
− | print '<a href="'.KWP_HOME_ABS.'"><img align=left border=0 src="'.$fwpLogo.'" title="'.KS_STORE_NAME.' home" alt="'.KS_SMALL_LOGO_ALT.'"></a>';
| |
− | if ($this->strTitleContext) {
| |
− | print '<span class=pretitle><b><a href="/">'.KS_STORE_NAME.'</a></b>: '.$this->strTitleContext.'</span><br>';
| |
− | }
| |
− | print '<span class=page-title>'.$this->strTitle.'</span></td>';
| |
− | // === END LEFT HEADER ===
| |
− | | |
− | // === RIGHT HEADER: nav icons ===
| |
− | print '<td align=right>';
| |
− | $this->DoToolbar();
| |
− | print '</td>';
| |
− | // === END RIGHT HEADER ===
| |
− | ?>
| |
− | </tr></table>
| |
− | </td></tr></table>
| |
− | <!-- end html header -->
| |
− | <?
| |
− | }
| |
− | }
| |
− | | |
− | class clsPageCat extends clsPage {
| |
− | private $objCatPage; // object for identifying page to display
| |
− | | |
− | public function ParseQuery() {
| |
− | global $objFactory;
| |
− | | |
− | $strReq = $this->strReq;
| |
− | $this->objCatPage = $objFactory->Pages()->GetItem_byKey($strReq);
| |
− | //print 'REQ='.$strReq.' ABBR='.$this->objCatPage->AB;
| |
− | }
| |
− | | |
− | public function DoRequest() {
| |
− | if ($this->strReq) {
| |
− | if (is_object($this->objCatPage)) {
| |
− | switch ($this->objCatPage->Type) {
| |
− | case 'S':
| |
− | $this->DoCatSupp();
| |
− | break;
| |
− | case 'D':
| |
− | $this->DoCatDept();
| |
− | break;
| |
− | case 'T':
| |
− | $this->DoCatTitle();
| |
− | break;
| |
− | case 'I':
| |
− | $doRawHTML = TRUE;
| |
− | $this->DoCatImage();
| |
− | break;
| |
− | }
| |
− | } else {
| |
− | $this->DoNotFound();
| |
− | }
| |
− | } else {
| |
− | $this->DoCatHome();
| |
− | }
| |
− | if ($doRawHTML) {
| |
− | echo $this->strContText;
| |
− | } else {
| |
− | $this->DoPreamble(); // everything before the contents
| |
− | echo $this->strContText;
| |
− | $this->DoPostamble(); // everything after the contents
| |
− | }
| |
− | }
| |
− | // SIDEBAR INFO for different types of pages
| |
− | private function DoCatIndicia() {
| |
− | $this->lstTop->Add('Section','<a href="'.KWP_CAT_REL.'">by supplier</a>');
| |
− | }
| |
− | private function DoSuppIndicia($iSupp,$isFinal=true) {
| |
− | $this->DoCatIndicia();
| |
− | if ($isFinal) {
| |
− | $this->lstTop->Add('Supplier',$iSupp->Name);
| |
− | $this->lstTop->Add('<a href="'.KWP_WIKI_ROOT.$iSupp->Name.'">more info</a>');
| |
− | } else {
| |
− | $this->lstTop->Add('Supplier',$iSupp->Link());
| |
− | }
| |
− | }
| |
− | private function DoDeptIndicia($iDept,$isFinal=true) {
| |
− | $this->DoSuppIndicia($iDept->Supplier(),false);
| |
− | if ($isFinal) {
| |
− | $this->lstTop->Add('Dept.',$iDept->Name);
| |
− | } else {
| |
− | $this->lstTop->Add('Dept.',$iDept->LinkName());
| |
− | }
| |
− | }
| |
− | private function DoTitleIndicia($iTitle) {
| |
− | $this->DoDeptIndicia($iTitle->Dept(),false);
| |
− | $this->lstTop->Add('Title',$iTitle->Name);
| |
− | $this->lstTop->Add(' - catalog #',$iTitle->CatNum());
| |
− | }
| |
− | | |
− | | |
− | private function DoCatHome() {
| |
− | global $objFactory;
| |
− | | |
− | $objSuppTbl = $objFactory->Suppliers();
| |
− | // $this->Setup('cat','Catalog Home','Catalog main page','browse','hello and welcome to the...');
| |
− | $this->DoCatIndicia();
| |
− | $this->strAbbr = 'cat';
| |
− | $this->strTitle = 'Catalog Home';
| |
− | $this->strName = 'Catalog main page';
| |
− | $this->strTitleContext = 'hello and welcome to the...';
| |
− | $this->AddText($objSuppTbl->DoHomePage());
| |
− | }
| |
− | private function DoCatSupp() {
| |
− | global $objFactory;
| |
− | CallEnter('clsPage.DoCatSupp()');
| |
− | | |
− | $objSuppTbl = $objFactory->Suppliers();
| |
− | $objSupp = $objSuppTbl->GetItem($this->objCatPage->ID_Row);
| |
− | assert(is_object($objSupp));
| |
− | $strSuppName = $objSupp->GetValue('Name');
| |
− | | |
− | $this->DoSuppIndicia($objSupp);
| |
− | $this->strAbbr = 'supp:'.strtoupper($this->CatKey);
| |
− | $this->strTitle = $strSuppName;
| |
− | $this->strName = 'listing for '.$strSuppName;
| |
− | $this->strTitleContext = '<a href="'.KWP_CAT_REL.'">Suppliers</a>: <b>'.$strSuppName.'</b>:';
| |
− | $this->AddText($objSupp->DoPage());
| |
− | | |
− | CallExit('clsPage.DoCatSupp()');
| |
− | }
| |
− | private function DoCatDept() {
| |
− | global $objFactory;
| |
− | CallEnter('clsPage.DoCatDept()');
| |
− | | |
− | $objDeptTbl = $objFactory->Depts();
| |
− | $objDept = $objDeptTbl->GetItem($this->objCatPage->ID_Row);
| |
− | assert(is_object($objDept));
| |
− | $objSupp = $objDept->Supplier();
| |
− | assert(is_object($objSupp));
| |
− | $strDeptName = $objDept->Name;
| |
− | $strSuppName = $objSupp->Name;
| |
− | $strDeptLink = $objDept->LinkName();
| |
− | $strSuppLink = $objSupp->Link();
| |
− | | |
− | $this->DoDeptIndicia($objDept);
| |
− | $this->strAbbr = 'dept:'.strtoupper($this->CatNum);
| |
− | $this->strTitle = $strSuppName;
| |
− | $this->strName = $strDeptName.' dept. of '.$strSuppName;
| |
− | $this->strTitleContext = 'items <a href="'.KWP_CAT_REL.'">supplied</a> by '.$strSuppLink.'\'s <b>'.$strDeptName.'</b> department:';
| |
− | $this->AddText($objDept->DoPage());
| |
− | CallExit('clsPage.DoCatDept()');
| |
− | }
| |
− | private function DoCatTitle() {
| |
− | global $objFactory;
| |
− | CallEnter('clsPage.DoCatTitle()');
| |
− | | |
− | $strCatNum = $this->CatNum;
| |
− | $objTitleTbl = $objFactory->Titles();
| |
− | | |
− | $objTitle = $objTitleTbl->GetItem($this->objCatPage->ID_Row);
| |
− | assert(is_object($objTitle));
| |
− | $objDept = $objTitle->Dept();
| |
− | assert(is_object($objDept));
| |
− | $objSupp = $objDept->Supplier();
| |
− | assert(is_object($objSupp));
| |
− | $strTitleName = $objTitle->Name;
| |
− | | |
− | $this->DoTitleIndicia($objTitle);
| |
− | | |
− | // $this->strAbbr = 'title:'.strtoupper($strCatNum);
| |
− | $this->strAbbr = 'title:'.$objTitle->CatNum();
| |
− | //print 'ABBR='.$this->strAbbr;
| |
− | $this->strTitle = $strTitleName;
| |
− | $this->strName = $strCatNum.' "'.$strTitleName.'" from '.$objSupp->Name;
| |
− | $this->strTitleContext =
| |
− | 'items <a href="'.KWP_CAT_REL.
| |
− | '">supplied</a> by '.$objSupp->Link().'\'s '.
| |
− | $objDept->LinkName().' department:';
| |
− | $objTitle->hideImgs = $this->hideImgs;
| |
− | $this->AddText($objTitle->DoPage());
| |
− | CallExit('clsPage.DoCatTitle()');
| |
− | }
| |
− | private function DoCatImage() {
| |
− | global $objFactory;
| |
− | CallEnter('clsPage.DoCatImage()');
| |
− | $objImageTbl = $objFactory->Images();
| |
− | $objImage = $objImageTbl->GetItem($this->objCatPage->ID_Row);
| |
− | $objImage->DoPage();
| |
− | CallExit('clsPage.DoCatImage()');
| |
− | }
| |
− | }
| |
− | | |
− | class clsPageTopic extends clsPage {
| |
− | public function DoRequest() {
| |
− | global $objFactory;
| |
− | | |
− | $strReq = $this->strReq;
| |
− | if (is_numeric($strReq)) {
| |
− | $idTopic = (int)$strReq;
| |
− | $objTopic = $objFactory->Topics()->GetItem($idTopic);
| |
− | $this->strAbbr = 'topic.'.$objTopic->WebName();
| |
− | $this->strTitle = 'Topic Index';
| |
− | $this->strName = 'catalog topic index';
| |
− | $this->AddText($objTopic->DoPage());
| |
− | } else {
| |
− | $this->strAbbr = 'topics';
| |
− | $this->strTitle = 'Topic Index';
| |
− | $this->strName = 'catalog topic index';
| |
− | $this->AddText($objFactory->Topics()->DoIndex());
| |
− | }
| |
− | $this->DoPreamble(); // everything before the contents
| |
− | echo '<span class=main>'.$this->strContText.'</span>';
| |
− | $this->DoPostamble(); // everything after the contents
| |
− | }
| |
− | }
| |
− | | |
− | class clsPageOutput {
| |
− | public $out;
| |
− | private $isOdd;
| |
− | public $inTbl;
| |
− | | |
− | function __construct() {
| |
− | $this->out = '';
| |
− | $this->isOdd = false;
| |
− | $this->inTbl = 0;
| |
− | }
| |
− | function Clear() {
| |
− | $this->out = '';
| |
− | }
| |
− | function AddText($iText) {
| |
− | $this->out .= $iText;
| |
− | }
| |
− | function SectionHdr($iTitle) {
| |
− | $this->out .= '<p class=main><big>'.$iTitle.'</big></p>';
| |
− | return $this->out;
| |
− | }
| |
− | function StartTable($iTitle) {
| |
− | if ($iTitle) {
| |
− | $this->SectionHdr($iTitle);
| |
− | $this->out .= '<table>';
| |
− | $this->inTbl++;
| |
− | }
| |
− | }
| |
− | function RowStart($iClass='') {
| |
− | if ($iAttr) {
| |
− | $this->out .= '<tr class="'.$iAttr.'">';
| |
− | } else {
| |
− | $this->out .= '<tr>';
| |
− | }
| |
− | }
| |
− | function RowStop() {
| |
− | $this->out .= '</tr>';
| |
− | $this->isOdd = !$this->isOdd;
| |
− | }
| |
− | function ColAdd($iText) {
| |
− | if ($this->isOdd) {
| |
− | $cellOpen = '<td class=catalog-stripe valign=top>';
| |
− | } else {
| |
− | $cellOpen = '<td class=catalog valign=top>';
| |
− | }
| |
− | $this->out .= $cellOpen.$iText.'</td>';
| |
− | }
| |
− | function EndTable() {
| |
− | if ($this->inTbl) {
| |
− | $this->out .= '</table>';
| |
− | $this->inTbl--;
| |
− | }
| |
− | return $this->out;
| |
− | }
| |
− | function ShowTitles($iHdrText,$iList,$objNoImgSect) {
| |
− | foreach ($iList as $i => $objTitle) {
| |
− | $objImgs = $objTitle->ListImages('th');
| |
− | $currMinPrice = $objTitle->currMinPrice;
| |
− | $currMaxPrice = $objTitle->currMaxPrice;
| |
− | $strPrice = DataCurr($currMinPrice);
| |
− | if ($currMinPrice != $currMaxPrice) {
| |
− | $strPrice .= '-'.DataCurr($currMaxPrice);
| |
− | }
| |
− | if ($objImgs->RowCount()) {
| |
− | $cntImgs++;
| |
− | $strTitleTag = '"'.$objTitle->Name.'" ('.$objTitle->CatNum.')';
| |
− | $strTitleLink = $objTitle->Link();
| |
− | while ($objImgs->HasData()) {
| |
− | $strImgTag = $strTitleTag.' - '.$strPrice;
| |
− | if ($objTitle->qtyInStock) {
| |
− | $strImgTag .= ' - '.$objTitle->qtyInStock.' in stock';
| |
− | }
| |
− | $outImgs .= $strTitleLink.'<img class="thumb" src="'.KWP_IMG_MERCH.'/'.$objImgs->GetValue('Spec').'" title="'.$strImgTag.'"></a>';
| |
− | $objImgs->NextRow();
| |
− | }
| |
− | } else {
| |
− | if (!$objNoImgSect->inTbl) {
| |
− | $objNoImgSect->StartTable('titles without images:');
| |
− | $objNoImgSect->AddText('<tr class=main><th>Cat. #</th><th>Title</th><th>Price<br>Range</th><th>to<br>order</th><th>status</th></tr>');
| |
− | }
| |
− | $objNoImgSect->RowStart();
| |
− | $objNoImgSect->ColAdd('<b>'.$objTitle->CatNum.'</b>');
| |
− | $objNoImgSect->ColAdd($objTitle->Name);
| |
− | $objNoImgSect->ColAdd($strPrice);
| |
− | $objNoImgSect->ColAdd('<b>[</b>'.$objTitle->Link().'order</a><b>]</b>');
| |
− | $qtyInStock = $objTitle->GetValue('qtyInStock');
| |
− | if ($qtyInStock) {
| |
− | $strStock = '<b>'.$qtyInStock.'</b> in stock';
| |
− | $objNoImgSect->ColAdd($strStock);
| |
− | if ($objTitle->GetValue('cntInPrint') == 0) {
| |
− | $objNoImgSect->ColAdd('OUT OF PRINT!');
| |
− | }
| |
− | } else {
| |
− | $objNoImgSect->ColAdd('<a title="explanation..." href="'.KWP_WIKI.'/Available_but_not_in_stock">available, not in stock</a>');
| |
− | // Debugging:
| |
− | // $objNoImgSect->ColAdd('ID_Title='.$objTitle->ID.' ID_ItTyp='.$objTitle->idItTyp);
| |
− | }
| |
− | $objNoImgSect->RowStop();
| |
− | }
| |
− | }
| |
− | if ($cntImgs) {
| |
− | $this->SectionHdr($iHdrText);
| |
− | $this->AddText($outImgs);
| |
− | }
| |
− | return $this->out;
| |
− | }
| |
− | function ShowImgUnavail() {
| |
− | $this->out .= '<table background="/tools/img/bg/lines/" bgcolor="000000" cellpadding="5"><tbody><tr><td><table class="hdr" cellpadding="2"><tbody><tr><td align="center"><span class="page-title">No Images<br>Available<br></span>for this item<br><b>:-(</b></td></tr></tbody></table></td></tr></tbody></table>';
| |
− | return $this->out;
| |
− | }
| |
− | }
| |
− | | |
− | /* ===========================
| |
− | *** CATALOG DATA CLASSES ***
| |
− | */
| |
− | | |
− | class clsCatPages extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | parent::__construct($iDB,'cat_pages','AB');
| |
− | }
| |
− | protected function _newItem() {
| |
− | return new clsCatPage($this);
| |
− | }
| |
− | public function GetItem_byKey($iKey) {
| |
− | global $objDataMgr;
| |
− | | |
− | CallEnter('clsCatPages.GetItem_byKey('.$iKey.')');
| |
− | $strKey = trim($iKey,'/');
| |
− | $strKey = str_replace('-','/',$strKey);
| |
− | $sqlCatKey = $this->objDB->SafeParam($strKey);
| |
− | // $sql = 'SELECT * FROM '.$this->strName.' WHERE CatKey="'.$sqlCatKey.'"';
| |
− | $objDataMgr->Update($this->Name(),'clsCatPages.GetItem_byKey('.$iKey.')');
| |
− | $objItem = $this->GetData('Path="'.$sqlCatKey.'"');
| |
− | // $objRec = $this->objDB->Query($sql);
| |
− | DumpValue('objItem NumRows',$objItem->Res->num_rows);
| |
− | CallExit('clsCatPages.GetItem_byKey('.$iKey.') -> Page '.$this->strAbbr);
| |
− | return $objItem;
| |
− | }
| |
− | }
| |
− | class clsCatPage extends clsDataItem {
| |
− | public $AB;
| |
− | public $Type;
| |
− | public $ID_Row;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsCatPage.LoadResults()');
| |
− | parent::LoadResults();
| |
− | $this->AB = $this->GetValue('AB');
| |
− | $this->Type = $this->GetValue('Type');
| |
− | $this->ID_Row = $this->GetValue('ID_Row');
| |
− | assert($this->AB);
| |
− | CallExit('clsCatPage.LoadResults()');
| |
− | }
| |
− | }
| |
− | | |
− | class clsSuppliers extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | parent::__construct($iDB,'suppliers');
| |
− | }
| |
− | protected function _newItem() {
| |
− | return new clsSupplier($this);
| |
− | }
| |
− | /*
| |
− | public function GetItem($iID) {
| |
− | CallEnter('clsSuppliers.GetItem('.$iID.')');
| |
− | $objItem = parent::GetItem($iID,$objItem);
| |
− | CallExit('clsSuppliers.GetItem('.$iID.')');
| |
− | return $objItem;
| |
− | }
| |
− | /**/
| |
− | public function GetItem_byKey($iKey) {
| |
− | CallEnter('clsSuppliers.GetItem_byKey('.$iKey.')');
| |
− | $sqlCatKey = $this->objDB->SafeParam($iKey);
| |
− | // $sql = 'SELECT * FROM '.$this->strName.' WHERE CatKey="'.$sqlCatKey.'"';
| |
− | $objItem = $this->GetData('CatKey="'.$sqlCatKey.'"');
| |
− | // $objRec = $this->objDB->Query($sql);
| |
− | CallExit('clsSuppliers.GetItem_byKey('.$iKey.') -> new supplier');
| |
− | return $objItem;
| |
− | }
| |
− | public function DoHomePage() {
| |
− | global $objDataMgr;
| |
− | | |
− | $sql = 'SELECT * FROM _supplier_ittyps ORDER BY Name, ItemCount DESC';
| |
− | $objRec = new clsDataItem($this);
| |
− | $objDataMgr->Update('_supplier_ittyps','clsSuppliers.DoHomePage()');
| |
− | $objRec->Query($sql);
| |
− | if ($objRec->RowCount()) {
| |
− | $objTbl = new clsPageOutput;
| |
− | $objTbl->StartTable('Suppliers');
| |
− | while ($objRec->HasData()) {
| |
− | $strKey = $objRec->GetValue('CatKey');
| |
− | if ($strKey != $strKeyLast) {
| |
− | $strKeyLast = $strKey;
| |
− | $strKeyLink = strtolower($strKey).'/';
| |
− | if ($outCell) {
| |
− | $objTbl->ColAdd($outCell);
| |
− | $objTbl->RowStop();
| |
− | $outCell = '';
| |
− | }
| |
− | $objTbl->RowStart();
| |
− | $objTbl->ColAdd('<b><a href="'.$strKeyLink.'">'.$objRec->GetValue('Name').'</a></b>');
| |
− | $isFirst = true;
| |
− | }
| |
− | if ($isFirst) {
| |
− | $isFirst = false;
| |
− | } else {
| |
− | $outCell .= ', ';
| |
− | }
| |
− | $outCell .= ' <b>'.$objRec->GetValue('ItemCount').'</b> '.$objRec->GetValue('ItemType');
| |
− | $objRec->NextRow();
| |
− | }
| |
− | $objTbl->ColAdd($outCell);
| |
− | $objTbl->RowStop();
| |
− | $out .= $objTbl->EndTable();
| |
− | }
| |
− | return $out;
| |
− | }
| |
− | }
| |
− | | |
− | class clsSupplier extends clsDataItem {
| |
− | public $ID;
| |
− | public $Name;
| |
− | public $CatKey;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsSupplier.LoadResults()');
| |
− | parent::LoadResults();
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->Name = $this->GetValue('Name');
| |
− | $this->CatKey = $this->GetValue('CatKey');
| |
− | assert($this->ID);
| |
− | CallExit('clsSupplier.LoadResults()');
| |
− | }
| |
− | public function DoPage() {
| |
− | global $objFactory,$objDataMgr;
| |
− | | |
− | CallEnter('clsSupplier.DoPage()');
| |
− | assert($this->ID);
| |
− | // first, check how many departments supplier has:
| |
− | $objDeptTbl = $objFactory->Depts();
| |
− | $objDepts = new clsDept($objDeptTbl);
| |
− | $sql = 'SELECT * FROM _depts WHERE (cntForSale>0) AND (ID_Supp='.$this->ID.')';
| |
− | $objDataMgr->Update('_depts','clsSupplier.DoPage() for '.$this->CatKey);
| |
− | $objDepts->Query($sql);
| |
− | if ($objDepts->RowCount() == 1) {
| |
− | // if there's only one department, display that instead of a department listing
| |
− | $out = $objDepts->DoPage();
| |
− | } else {
| |
− | $sql = 'SELECT * FROM _supplier_ittyps WHERE ID='.$this->ID.' ORDER BY Name, ItemCount DESC';
| |
− | $objDataMgr->Update('_supplier_ittyps','clsSupplier.DoPage() for '.$this->CatKey);
| |
− | $objItTyps = new clsDataItem($this->Table);
| |
− | $objItTyps->Query($sql);
| |
− | $isFirst = true;
| |
− | $out .= '<span class=catalog-summary>';
| |
− | while ($objItTyps->HasData()) {
| |
− | if ($isFirst) {
| |
− | $isFirst = false;
| |
− | } else {
| |
− | $out .= ', ';
| |
− | }
| |
− | $out .= ' <b>'.$objItTyps->GetValue('ItemCount').'</b> '.$objItTyps->GetValue('ItemType');
| |
− | $objItTyps->NextRow();
| |
− | }
| |
− | $out .= '</span>';
| |
− | $out .= $objDeptTbl->DoListing_forSupp($this->ID);
| |
− | }
| |
− | | |
− | CallExit('clsSupplier.DoPage()');
| |
− | return $out;
| |
− | }
| |
− | public function Link() {
| |
− | $out = '<a href="'.$this->URL().'">'.$this->Name.'</a>';
| |
− | return $out;
| |
− | }
| |
− | public function URL() {
| |
− | return KWP_CAT_REL.strtolower($this->CatKey).'/';
| |
− | }
| |
− | }
| |
− | class clsDepts extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | parent::__construct($iDB,'depts');
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsDepts._newItem()');
| |
− | return new clsDept($this);
| |
− | }
| |
− | public function DoListing_forSupp($iSuppID) {
| |
− | CallEnter('clsDepts.DoListing_forSupp('.$iSuppID.')');
| |
− | | |
− | $out .= '<p class=main><big>Departments:</big></p><table>';
| |
− | $objDepts = $this->GetData('ID_Supplier='.$iSuppID,'Name');
| |
− | $isFirst = true;
| |
− | | |
− | while ($objDepts->HasData()) {
| |
− | $outDept = $objDepts->DoListing();
| |
− | if ($outDept) { // only show departments with something in them
| |
− | if ($isOdd) {
| |
− | $cellOpen = '<td class=catalog-stripe valign=top>';
| |
− | } else {
| |
− | $cellOpen = '<td class=catalog valign=top>';
| |
− | }
| |
− | $keyDept = $objDepts->PageKey();
| |
− | $out .= '<tr>'.$cellOpen.'<a href="'.strtolower($keyDept).'/">'.$objDepts->Name.'</a></td>';
| |
− | $isOdd = !$isOdd;
| |
− | $out .= $cellOpen.$outDept.'</td></tr>';
| |
− | }
| |
− | $objDepts->NextRow();
| |
− | }
| |
− | $out .= '</table>';
| |
− | CallExit('clsDepts.DoListing_forSupp()');
| |
− | return $out;
| |
− | /**/
| |
− | }
| |
− | public function GetItem_byCatPage($iCatPage) {
| |
− | global $objDataMgr;
| |
− | | |
− | CallEnter('clsDepts.GetItem_byCatPage('.$iCatPage.')');
| |
− | assert(is_object($this->objDB));
| |
− | $sqlCatPage = strtolower(str_replace('.','/',$iCatPage));
| |
− | $sqlCatPage = $this->objDB->SafeParam($sqlCatPage);
| |
− | $sql = 'SELECT * FROM _depts WHERE CatWeb_Dept="'.$sqlCatPage.'"';
| |
− | $objRec = new clsDataItem($this);
| |
− | $objDataMgr->Update('_depts','clsDepts.GetItem_byCatPage('.$iCatPage.')');
| |
− | $objRec->Query($sql);
| |
− | if ($objRec->HasData()) {
| |
− | assert($objRec->RowCount() == 1);
| |
− | $idDept = $objRec->GetValue('ID');
| |
− | $objDept = $this->GetData('ID='.$idDept);
| |
− | assert($objDept);
| |
− | return $objDept;
| |
− | } else {
| |
− | return NULL;
| |
− | }
| |
− | CallExit('clsDepts.GetItem_byCatPage()');
| |
− | }
| |
− | }
| |
− | class clsDept extends clsDataItem {
| |
− | public $ID;
| |
− | public $Name;
| |
− | public $CatKey;
| |
− | public $PageKey;
| |
− | public $idSupp;
| |
− | public $isActive;
| |
− | // object cache
| |
− | private $objSupp;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsDept.LoadResults()');
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->Name = $this->GetValue('Name');
| |
− | $this->CatKey = $this->GetValue('CatKey');
| |
− | $this->PageKey = $this->GetValue('PageKey');
| |
− | $this->idSupp = $this->GetValue('ID_Supplier');
| |
− | $this->isActive = $this->GetValue('isActive');
| |
− | $objSupp = NULL;
| |
− | assert($this->ID);
| |
− | CallExit('clsDept.LoadResults()');
| |
− | }
| |
− | public function Supplier() {
| |
− | global $objFactory;
| |
− | | |
− | if (is_object($this->objSupp)) {
| |
− | return $this->objSupp;
| |
− | } else {
| |
− | if ($this->idSupp) {
| |
− | $this->objSupp = $objFactory->Suppliers()->GetItem($this->idSupp);
| |
− | return $this->objSupp;
| |
− | } else {
| |
− | return NULL;
| |
− | }
| |
− | }
| |
− | }
| |
− | public function PageKey() {
| |
− | if ($this->PageKey) {
| |
− | return $this->PageKey;
| |
− | } else {
| |
− | return $this->CatKey;
| |
− | }
| |
− | }
| |
− | protected function GetDeptData() {
| |
− | global $objDataMgr;
| |
− | | |
− | // $sql = 'SELECT * FROM _dept_ittyps WHERE (ID_Dept='.$this->ID.') AND cntForSale ORDER BY cntInPrint DESC';
| |
− | $sql = 'SELECT * FROM qryItTypsDepts_ItTyps WHERE (ID_Dept='.$this->ID.') ORDER BY cntInPrint DESC';
| |
− | $objItTyps = new clsTitleIttyp($this->Table);
| |
− | $objDataMgr->Update('_dept_ittyps','clsDept.DoListing() for ID='.$this->ID);
| |
− | $objItTyps->Query($sql);
| |
− | return $objItTyps;
| |
− | }
| |
− | public function DoListing() {
| |
− | // PURPOSE: Print this department's information as part of department list
| |
− | | |
− | assert($this->ID);
| |
− | $objItTyps = $this->GetDeptData();
| |
− | | |
− | $isFirst = true;
| |
− | while ($objItTyps->HasData()) {
| |
− | if ($isFirst) {
| |
− | $isFirst = false;
| |
− | } else {
| |
− | $out .= ', ';
| |
− | }
| |
− | $cntInPrint = $objItTyps->cntInPrint;
| |
− | $qtyInStock = $objItTyps->qtyInStock;
| |
− | // TO FIX: This is wrong. Need cntForSale field
| |
− | $cntAvail = $cntInPrint + $qtyInStock;
| |
− | if ($cntAvail == 1) {
| |
− | $strName = $objItTyps->ItTypNameSng;
| |
− | } else {
| |
− | $strName = $objItTyps->ItTypNamePlr;
| |
− | }
| |
− | $out .= ' <b>'.$cntAvail.'</b> '.$strName;
| |
− | $objItTyps->NextRow();
| |
− | }
| |
− | return $out;
| |
− | }
| |
− | public function DoPage() {
| |
− | // PURPOSE: Print page for current department | |
− | // ACTION:
| |
− | // * Iterates through item types available for this department.
| |
− | // * For each item type, prints header and then a list of titles.
| |
− | global $objDataMgr;
| |
− | | |
− | assert($this->ID);
| |
− | $idDept = $this->ID;
| |
− | $objSection = new clsPageOutput();
| |
− | $objItTyps = $this->GetDeptData();
| |
− | $objTitles = new clsTitleExt($this->Table);
| |
− | // $objTitles = new clsDataItem($this->Table); TRY THIS NEXT
| |
− | $objNoImgSect = new clsPageOutput();
| |
− | while ($objItTyps->HasData()) {
| |
− | $cntInPrint = $objItTyps->cntInPrint;
| |
− | $qtyInStock = $objItTyps->qtyInStock;
| |
− | // TO FIX: This is wrong. Need cntForSale field
| |
− | $cntAvail = $cntInPrint + $qtyInStock;
| |
− | if ($cntAvail) {
| |
− | $cntSections++;
| |
− | $idItTyp = $objItTyps->ID_ItTyp;
| |
− | // $objSection->SectionHdr();
| |
− | // $sql = 'SELECT *, ID_Title AS ID, TitleName AS Name FROM _title_ittyps WHERE ((cntForSale) AND (ID_ItTyp='.$idItTyp.') AND (ID_Dept='.$idDept.'));';
| |
− | $sql = 'SELECT t.ID_Title AS ID, t.* FROM qryTitles_ItTyps_Titles AS t WHERE (ID_ItTyp='.$idItTyp.') AND (ID_Dept='.$idDept.');';
| |
− | // $objDataMgr->Update('_title_ittyps','clsDept.DoPage() for ID_ItTyp='.$idItTyp.', ID_Dept='.$idDept);
| |
− | $objTitles->Query($sql);
| |
− | $idTitle = $objTitles->ID;
| |
− | // $idTitle = $objTitles->GetValue('ID_Title');
| |
− | // $objTitles->ID = $idTitle;
| |
− |
| |
− | if ($objTitles->HasData()) {
| |
− | while ($objTitles->HasData()) {
| |
− | $objTitle = clone $objTitles; // get a copy with current values
| |
− | $objTitle->Res = NULL;
| |
− | $lstTitles[] = $objTitle; // save it in a list
| |
− | $objTitles->NextRow();
| |
− | }
| |
− | assert(is_array($lstTitles));
| |
− | | |
− | // We've generated the list of titles for this section; now display the section header and titles:
| |
− | | |
− | // $out .= $objSection->ShowTitles($objItTyps->ItTypNamePlr.':',$lstTitles,$objNoImgSect);
| |
− | $out .= $objSection->ShowTitles($objItTyps->GetValue('ItTyp_Plr').':',$lstTitles,$objNoImgSect);
| |
− | } else {
| |
− | echo 'ERROR: No titles found! SQL='.$sql;
| |
− | }
| |
− | unset($lstTitles);
| |
− | $objSection->Clear();
| |
− | } else {
| |
− | $out .= '<span class=main>Small coding error: this line should never happen.</span>'; // TO DO: log an error
| |
− | }
| |
− | $objItTyps->NextRow();
| |
− | }
| |
− | if (!$cntSections) {
| |
− | $out .= '<span class=main>This department appears to have been emptied of all leftover stock. (Eventually there will be a way to see what items used to be here.)</span>';
| |
− | }
| |
− | if ($objNoImgSect->inTbl) {
| |
− | $objNoImgSect->EndTable();
| |
− | $objSection->AddText($objNoImgSect->out);
| |
− | $objSection->EndTable();
| |
− | $out .= $objSection->out;
| |
− | }
| |
− | return $out;
| |
− | }
| |
− | public function LinkName() {
| |
− | $strURL = $this->Supplier()->URL();
| |
− | if ($this->PageKey) {
| |
− | $strURL .= strtolower($this->PageKey).'/';
| |
− | }
| |
− | // return '<a href="'.KWP_CAT_REL.$strURL.'">'.$this->Name.'</a>';
| |
− | return '<a href="'.$strURL.'">'.$this->Name.'</a>';
| |
− | }
| |
− | }
| |
− | | |
− | class clsTitles extends clsDataTable {
| |
− | public function __construct($iDB,$iTable='titles') {
| |
− | parent::__construct($iDB,$iTable);
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsTitles._newItem()');
| |
− | return new clsTitle($this);
| |
− | }
| |
− | public function GetItem_byCatNum($iCatNum) {
| |
− | global $objDataMgr;
| |
− | | |
− | CallEnter('clsTitles.GetItem_byCatNum('.$iCatNum.')');
| |
− | assert(is_object($this->objDB));
| |
− | $sqlCatNum = strtoupper(str_replace('.','-',$iCatNum));
| |
− | $sqlCatNum = $this->objDB->SafeParam($sqlCatNum);
| |
− | $sql = 'SELECT * FROM v_titles WHERE CatNum="'.$sqlCatNum.'"';
| |
− | $objTitle = new clsTitleExt($this);
| |
− | // make sure _titles (part of v_titles) is up-to-date
| |
− | $objDataMgr->Update('_titles','GetItem_byCatNum('.$iCatNum.')');
| |
− | // get data from v_titles
| |
− | $objTitle->Query($sql);
| |
− | $idTitle = $objTitle->ID;
| |
− | if ($objTitle->RowCount()) {
| |
− | assert($idTitle);
| |
− | $sql = 'SELECT * FROM titles WHERE ID='.$idTitle;
| |
− | $objTitle->dontLoadBasic = true;
| |
− | $objTitle->Query($sql);
| |
− | CallExit('clsTitles.GetItem_byCatNum() -> ok');
| |
− | return $objTitle;
| |
− | } else {
| |
− | CallExit('clsTitles.GetItem_byCatNum() -> NULL');
| |
− | return NULL;
| |
− | }
| |
− | }
| |
− | }
| |
− | class clsTitle extends clsDataItem {
| |
− | public $ID;
| |
− | public $Name;
| |
− | public $CatKey;
| |
− | public $idDept;
| |
− | // object cache
| |
− | private $objDept;
| |
− | // options
| |
− | public $hideImgs;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsTitle.LoadResults()');
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->Name = $this->GetValue('Name');
| |
− | $this->CatKey = $this->GetValue('CatKey');
| |
− | $this->idDept = $this->GetValue('ID_Dept');
| |
− | assert($this->ID);
| |
− | CallExit('clsTitle.LoadResults()');
| |
− | }
| |
− | protected function LoadResStandard() {
| |
− | }
| |
− | protected function LoadResExtended() {
| |
− | // extended fields
| |
− | }
| |
− | public function Dept() {
| |
− | global $objFactory;
| |
− | | |
− | if (is_object($this->objDept)) {
| |
− | return $this->objDept;
| |
− | } else {
| |
− | if ($this->idDept) {
| |
− | $objDept = $objFactory->Depts()->GetItem($this->idDept);
| |
− | $this->objDept = $objDept;
| |
− | assert(is_object($objDept));
| |
− | return $objDept;
| |
− | } else {
| |
− | return NULL;
| |
− | }
| |
− | }
| |
− | }
| |
− | public function DoPage() {
| |
− | global $objFactory,$objDataMgr;
| |
− | | |
− | $idTitle = $this->ID;
| |
− | assert($idTitle);
| |
− | $objSection = new clsPageOutput();
| |
− | // show small-size images
| |
− | if (!$this->hideImgs) {
| |
− | $objImgs = $this->ListImages('sm');
| |
− | if ($objImgs->HasData()) {
| |
− | while ($objImgs->HasData()) {
| |
− | $strImgTag = $objImgs->GetValue('AttrDispl');
| |
− | $urlRel = $objImgs->GetValue('Spec');
| |
− | $idImg = $objImgs->ID;
| |
− | $strImg = '<img src="'.KWP_IMG_MERCH.$urlRel.'"';
| |
− | if ($strImgTag) {
| |
− | $strImg .= ' title="'.$strImgTag.'"';
| |
− | }
| |
− | $strImg .= '>';
| |
− | $objImgBig = $objImgs->ImgForSize('big');
| |
− | if (is_object($objImgBig)) {
| |
− | if ($objImgBig->HasData()) {
| |
− | $strImg = $objImgBig->Href().$strImg.'</a>';
| |
− | }
| |
− | }
| |
− | $objSection->AddText($strImg);
| |
− | $objImgs->NextRow();
| |
− | }
| |
− | } else {
| |
− | $objSection->ShowImgUnavail();
| |
− | }
| |
− | }
| |
− | // now list available items as table
| |
− | // $sql = 'SELECT * FROM _title_ittyps WHERE (ID_Title='.$idTitle.') AND cntForSale ORDER BY IFNULL(ItTypSort,"ZZ")';
| |
− | $sql = 'SELECT * FROM qryTitles_ItTyps_ItTyps WHERE (ID_Title='.$idTitle.') ORDER BY ItTyp_Sort IS NULL, ItTyp_Sort';
| |
− | // echo '<!-- SQL for grouping: '.$sql.' -->';
| |
− | $objTypes = new clsTitleIttyp($this->Table);
| |
− | // $objDataMgr->Update('_title_ittyps','clsTitle.DoPage()');
| |
− | $objTypes->Query($sql); // list of all item types available for this title
| |
− | if ($objTypes->HasRows()) {
| |
− | // $objSection->AddText('<br>Found '.$objTypes->RowCount().' item(s):');
| |
− | if (KF_CART_ABSOLUTE) {
| |
− | $urlCart = KWP_CART_ABS;
| |
− | } else {
| |
− | $urlCart = KWP_CART_REL;
| |
− | }
| |
− | $objSection->AddText('<form method=post action="'.$urlCart.'"><input type=hidden name=from value=browse-multi>');
| |
− | | |
− | $flagDisplayTogether = false; // hard-coded for now
| |
− | | |
− | while ($objTypes->HasData()) {
| |
− | $idItTyp = $objTypes->ID_ItTyp;
| |
− | assert($idItTyp);
| |
− | $sql = '(ID_Title='.$idTitle.') AND (ID_ItTyp='.$idItTyp.')';
| |
− | // $strGrpCode = $objTypes->GetValue('GrpCode');
| |
− | // $strGrpDescr = $objTypes->GetValue('GrpDescr');
| |
− | $objItems = $objFactory->Items()->GetData($sql,'GrpSort,GrpDescr,ItOpt_Sort');
| |
− | assert($objItems->HasData());
| |
− | $idItType = 0;
| |
− | // $txtLine = '<tr class=typeHdr><td colspan=3><b>'.$objTypes->Ittyp()->Name().'</b>:</td></tr>';
| |
− | | |
− | $txtLine = '<tr class=typeHdr><td colspan=3><b>'.$objTypes->GetValue('ItTyp_Plr').'</b>:</td></tr>';
| |
− | | |
− | if ($flagDisplayTogether) {
| |
− | // displaying all items in a single listing
| |
− | $txtBoth .= $txtLine;
| |
− | } else {
| |
− | // set flags to determine which stock-status sections to show
| |
− | $cntInStock = $objTypes->cntInStock;
| |
− | $cntForSale = $objTypes->cntForSale;
| |
− | $cntOutStock = $cntForSale - $cntInStock;
| |
− | // DEBUG:
| |
− | //$objSection->AddText("<!--\n\nfor sale: $cntForSale .. in stock: $cntInStock .. outta stock: $cntOutStock\n\n-->");
| |
− | if ($cntInStock > 0) {
| |
− | $txtInStock .= $txtLine;
| |
− | }
| |
− | if ($cntOutStock > 0) {
| |
− | $txtOutStock .= $txtLine;
| |
− | }
| |
− | }
| |
− | | |
− | // iterate through items for this type:
| |
− | $strGrpLast = '';
| |
− | while ($objItems->HasData()) {
| |
− | $strGrp = $objItems->GetValue('GrpDescr');
| |
− | if ($strGrp != $strGrpLast) {
| |
− | $strGrpLast = $strGrp;
| |
− | $strGrpCode = $objItems->GetValue('GrpCode');
| |
− | $out = '<tr class="group">';
| |
− | $out .= '<td colspan=5> — '.$strGrp;
| |
− | if ($strGrpCode) {
| |
− | $out .= ' <font color=#666666>(<font color=#666699>'.$strGrpCode.'</font>)</font>';
| |
− | }
| |
− | $out .= '</td>';
| |
− | $out .= '</tr>';
| |
− | // this should probably be a subroutine...
| |
− | if ($flagDisplayTogether) {
| |
− | $txtBoth .= $out;
| |
− | } else {
| |
− | if ($objItems->qtyInStock > 0) {
| |
− | $txtInStock .= $out;
| |
− | }
| |
− | if ($objItems->qtyInStock == 0) {
| |
− | $txtOutStock .= $out;
| |
− | }
| |
− | }
| |
− | }
| |
− | if ($objItems->isForSale) {
| |
− | $txtLine = $objItems->Print_TableRow();
| |
− | | |
− | if ($flagDisplayTogether) {
| |
− | $txtBoth .= $txtLine;
| |
− | } else {
| |
− | if ($objItems->qtyInStock > 0) {
| |
− | $txtInStock .= $txtLine;
| |
− | }
| |
− | if ($objItems->qtyInStock == 0) {
| |
− | $txtOutStock .= $txtLine;
| |
− | }
| |
− | }
| |
− | }
| |
− | $objItems->NextRow();
| |
− | }
| |
− | $objTypes->NextRow();
| |
− | }
| |
− | | |
− | // DO the actual display of the accumulated text
| |
− | | |
− | $txtTblOpen = '<table class=main><tbody>';
| |
− | $txtTblHdr = '<tr><th align=left>Option</th><th>Status</th><th align=right class=title-price>Price</th><th align=center class=orderQty>Order<br>Qty.</th><th><i>list<br>price</th></tr>';
| |
− | $txtTblFtr = '<tr><td colspan="4" align="right"><input value="Add to Cart" type="submit"></td></tr>';
| |
− | $txtTblShut = '</tbody></table>';
| |
− | | |
− | if ($flagDisplayTogether) {
| |
− | // Display in-stock and backordered items together
| |
− | $objSection->AddText($txtTblOpen);
| |
− | $objSection->AddText($txtTblHdr);
| |
− | $objSection->AddText($txtBoth);
| |
− | $objSection->AddText($txtTblFtr);
| |
− | $objSection->AddText($txtTblShut);
| |
− | } else {
| |
− | if ($txtInStock != '') {
| |
− | $txtClause = Pluralize($cntInStock,'This item is','These items are');
| |
− | $objSection->AddText($txtTblOpen);
| |
− | $objSection->AddText('<tr class=inStock><td colspan=5>'.$txtClause.' in stock:</td></tr>');
| |
− | $objSection->AddText($txtTblHdr);
| |
− | $objSection->AddText($txtInStock);
| |
− | $objSection->AddText($txtTblFtr);
| |
− | $objSection->AddText($txtTblShut);
| |
− | }
| |
− | if ($txtOutStock != '') {
| |
− | if ($txtInStock != '') {
| |
− | $objSection->AddText('<p>');
| |
− | }
| |
− | $txtClause = Pluralize($cntOutStock,'This item is','These items are');
| |
− | $objSection->AddText($txtTblOpen);
| |
− | $objSection->AddText('<tr><td colspan=5>'.$txtClause.' <a href='.'"http://wiki.vbz.net/Available_but_not_in_stock"><b>not in stock</b></a>');
| |
− | $txtClause = Pluralize($cntOutStock,'it','them');
| |
− | $objSection->AddText(', but we can (probably) <a href='.'"http://wiki.vbz.net/Shipping_Policies">get '.$txtClause.'</a>:</td></tr>');
| |
− | $objSection->AddText($txtTblHdr);
| |
− | $objSection->AddText($txtOutStock);
| |
− | $objSection->AddText($txtTblFtr);
| |
− | $objSection->AddText($txtTblShut);
| |
− | } /**/
| |
− | }
| |
− | // $objSection->AddText('<tr><td colspan="4" align="right"><input value="Add to Cart" type="submit"></td></tr></tbody></table></form>');
| |
− | $objSection->AddText('</form>');
| |
− | } else {
| |
− | $objSection->SectionHdr('This title is currently unavailable');
| |
− | }
| |
− | return $objSection->out;
| |
− | }
| |
− | public function ListImages($iSize) {
| |
− | global $objFactory;
| |
− | | |
− | $objImgs = $objFactory->Images()->GetData('(ID_Title='.$this->ID.') AND (Ab_Size="'.$iSize.'")','AttrSort');
| |
− | return $objImgs;
| |
− | }
| |
− | public function CatNum($iSep='-') {
| |
− | $objDept = $this->Dept();
| |
− | $objSupp = $objDept->Supplier();
| |
− | $strDeptKey = $objDept->CatKey;
| |
− | $strOut = $objSupp->CatKey;
| |
− | if ($strDeptKey) {
| |
− | $strOut .= $iSep.$strDeptKey;
| |
− | }
| |
− | $strOut .= $iSep.$this->CatKey;
| |
− | return strtoupper($strOut);
| |
− | }
| |
− | public function Link() {
| |
− | $strRel = $this->CatNum('/');
| |
− | return '<a href="'.$strURL.'">';
| |
− | }
| |
− | public function LinkName() {
| |
− | return $this->Link().$this->Name.'</a>';
| |
− | }
| |
− | }
| |
− | // extended Title data from v_titles
| |
− | class clsTitlesExt extends clsTitles {
| |
− | public function __construct($iDB,$iTable='v_titles') {
| |
− | parent::__construct($iDB,$iTable);
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsTitlesExt._newItem()');
| |
− | return new clsTitleExt($this);
| |
− | }
| |
− | }
| |
− | // this encapsulates [_titles] instead of [titles]
| |
− | class clsTitleExt extends clsTitle {
| |
− | public $CatNum;
| |
− | public $CatWeb;
| |
− | public $curMinPrice;
| |
− | public $curMaxPrice;
| |
− | public $idItTyp;
| |
− | public $qtyInStock;
| |
− | // action flags
| |
− | public $dontLoadBasic;
| |
− | protected function LoadResults() {
| |
− | CallEnter('clsTitleExt.LoadResults()');
| |
− | if (!$this->dontLoadBasic) {
| |
− | parent::LoadResults();
| |
− | }
| |
− | | |
− | $this->CatNum = $this->GetValue('CatNum');
| |
− | $this->CatWeb = $this->GetValue('CatWeb');
| |
− | $this->currMinPrice = $this->GetValue('currMinPrice');
| |
− | $this->currMaxPrice = $this->GetValue('currMaxPrice');
| |
− | $this->idItTyp = $this->GetValue('ID_ItTyp');
| |
− | $this->qtyInStock = $this->GetValue('qtyInStock');
| |
− | | |
− | CallExit('clsTitle.LoadResults()');
| |
− | }
| |
− | public function Link() {
| |
− | $out = '<a class="thumb" href="'.$this->URL().'">';
| |
− | return $out;
| |
− | }
| |
− | public function URL() {
| |
− | return KWP_CAT_REL.$this->CatWeb.'/';
| |
− | }
| |
− | }
| |
− | /* -------------------- *\
| |
− | TITLE/ITTYP hybrid
| |
− | \* -------------------- */
| |
− | class clsTitleIttyp extends clsDataItem_noID {
| |
− | public $ID_ItTyp;
| |
− | public $ID_Dept;
| |
− | public $cntForSale;
| |
− | public $cntInPrint;
| |
− | public $cntInStock;
| |
− | public $qtyInStock;
| |
− | public $ItTypNameSng;
| |
− | public $ItTypNamePlr;
| |
− | // object cache
| |
− | private $objIttyp;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsTitleIttyp.LoadResults()');
| |
− | $idItTyp = $this->GetValue('ID_ItTyp');
| |
− | if ($idItTyp != $this->ID_ItTyp) {
| |
− | $this->ID_ItTyp = $this->GetValue('ID_ItTyp');
| |
− | $this->objIttyp = NULL;
| |
− | }
| |
− | $this->ID_Title = $this->GetValue('ID_Title');
| |
− | $this->ID_Dept = $this->GetValue('ID_Dept');
| |
− | $this->cntForSale = $this->GetValue('cntForSale');
| |
− | $this->cntInPrint = $this->GetValue('cntInPrint');
| |
− | $this->cntInStock = $this->GetValue('cntInStock');
| |
− | $this->qtyInStock = $this->GetValue('qtyInStock');
| |
− | $this->ItTypNameSng = $this->GetValue('ItTypNameSng');
| |
− | $this->ItTypNamePlr = $this->GetValue('ItTypNamePlr');
| |
− | if ($this->ID_ItTyp) { } else {
| |
− | echo 'ERROR: ID_ItTyp has no value! data = ';
| |
− | DumpArray($this->Row,TRUE);
| |
− | }
| |
− | CallExit('clsTitleIttyp.LoadResults()');
| |
− | }
| |
− | public function Ittyp() {
| |
− | global $objFactory;
| |
− | | |
− | if (is_null($this->objIttyp)) {
| |
− | $this->objIttyp = $objFactory->ItTyps()->GetItem($this->ID_ItTyp);
| |
− | }
| |
− | return $this->objIttyp;
| |
− | }
| |
− | }
| |
− | /* -------------------- *\
| |
− | ITEM classes
| |
− | \* -------------------- */
| |
− | class clsItems extends clsDataTable {
| |
− | public function __construct($iDB,$iTable='cat_items') {
| |
− | global $objDataMgr;
| |
− | $objDataMgr->Update('cat_items','clsItems()');
| |
− | parent::__construct($iDB,$iTable);
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsTitles._newItem()');
| |
− | return new clsItem($this);
| |
− | }
| |
− | }
| |
− | class clsItem extends clsDataItem { | |
− | // NOTE: "in stock" always refers to stock for sale, not stock which has already been purchased
| |
− | public $CatNum;
| |
− | public $isForSale;
| |
− | public $isInPrint;
| |
− | public $qtyInStock;
| |
− | public $idTitle;
| |
− | public $idItTyp;
| |
− | public $idItOpt;
| |
− | public $ItOptDescr;
| |
− | public $PriceSell;
| |
− | public $PriceList;
| |
− | // object cache | |
− | private $objTitle;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsItem.LoadResults()');
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->CatNum = $this->GetValue('CatNum');
| |
− | $this->isForSale = $this->GetValue('isForSale');
| |
− | $this->isInPrint = $this->GetValue('isInPrint');
| |
− | $this->qtyInStock = $this->GetValue('qtyInStock');
| |
− | $this->idTitle = $this->GetValue('ID_Title');
| |
− | $this->idItTyp = $this->GetValue('ID_ItTyp');
| |
− | $this->idItOpt = $this->GetValue('ID_ItOpt');
| |
− | $this->ItOptDescr = $this->GetValue('ItOpt_Descr');
| |
− | $this->PriceSell = $this->GetValue('PriceSell');
| |
− | $this->PriceList = $this->GetValue('PriceList');
| |
− | assert($this->ID);
| |
− | CallExit('clsItem.LoadResults()');
| |
− | }
| |
− | public function Print_TableRow() {
| |
− | // ASSUMES: This item is ForSale, so isForSale = true and (qtyForSale>0 || isInPrint) = true
| |
− | $qtyInStock = $this->QtyInStock(true);
| |
− | if ($qtyInStock) {
| |
− | $strClass = 'inStock';
| |
− | $strStock = $qtyInStock.' in stock';
| |
− | } else {
| |
− | $strClass = 'noStock';
| |
− | }
| |
− | $out = '<tr class='.$strClass.'><!-- ID='.$this->ID.' -->';
| |
− | $out .= '<td> '.$this->ItOptDescr;
| |
− | if ($this->isInPrint) {
| |
− | if ($qtyInStock) {
| |
− | $strStatus = $strStock.'; more available';
| |
− | } else {
| |
− | $strStatus = '<a title="explanation..." href="'.KWP_WIKI.'/Available_but_not_in_stock">available, not in stock</a>';
| |
− | }
| |
− | } else {
| |
− | $strStatus = '<b>'.$strStock.'</b> - <i>out of print!</i>';
| |
− | }
| |
− | $out .= '<td>'.$strStatus.'</td>';
| |
− | $out .= '<td>'.DataCurr($this->PriceSell).'</td>';
| |
− | $out .= '<td>'.'<input size=3 name="qty-'.$this->CatNum.'"></td>';
| |
− | if ($this->PriceList) {
| |
− | $out .= '<td><i>'.DataCurr($this->PriceList).'</i></td>';
| |
− | }
| |
− | $out .= '</tr>';
| |
− | return $out;
| |
− | }
| |
− | public function QtyInStock($iNeedQty) {
| |
− | // DEPRECATED
| |
− | // Originally, this field might have contained a "-1" to indicate
| |
− | // that some items were in stock but the number hadn't been
| |
− | // calculated. We're not doing that anymore.
| |
− | /*
| |
− | if (is_null($this->qtyInStock)) {
| |
− | $doFigure = true;
| |
− | } else {
| |
− | if ($this->qtyInStock == -1) {
| |
− | if ($iNeedQty) {
| |
− | $doFigure = true;
| |
− | }
| |
− | }
| |
− | }
| |
− | if ($doFigure) {
| |
− | $this->DoFigureStock();
| |
− | }
| |
− | */
| |
− | return $this->qtyInStock;
| |
− | }
| |
− | public function Title() {
| |
− | global $objFactory;
| |
− | | |
− | $doLoad = TRUE;
| |
− | if (is_object($this->objTitle)) {
| |
− | if ($this->objTitle == $this->idTitle) {
| |
− | $doLoad = FALSE;
| |
− | }
| |
− | }
| |
− | if ($doLoad) {
| |
− | $this->objTitle = $objFactory->Titles()->GetItem($this->idTitle);
| |
− | }
| |
− | return $this->objTitle;
| |
− | }
| |
− | public function StoreLink() {
| |
− | /*
| |
− | RETURNS: HTML suitable for use within the store
| |
− | NOTE: Since the store doesn't yet have pages for each item,
| |
− | this returns the store's Title link
| |
− | */
| |
− | return $this->Title-Link();
| |
− | }
| |
− | public function AdminLink() {
| |
− | return '<a href="item='.$this->ID.'">';
| |
− | }
| |
− | /*
| |
− | private function DoFigureStock() {
| |
− | global $objFactory;
| |
− | | |
− | $qtyInStock = $objFactory->StkItems()->QtyInStock_forItem($this->ID);
| |
− | // assert(!is_null($qtyInStock));
| |
− | // $sql = 'UPDATE cat_items SET qtyInStock='.$qtyInStock.' WHERE ID='.$this->ID;
| |
− | assert(is_object($this->Table));
| |
− | assert(is_object($this->Table->DB()));
| |
− | $this->Table->DB()->Exec($sql);
| |
− | $this->qtyInStock = $qtyInStock;
| |
− | }
| |
− | */
| |
− | }
| |
− | class clsItemsExt extends clsItems {
| |
− | public function __construct($iDB,$iTable='v_items') {
| |
− | parent::__construct($iDB,$iTable);
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsItemsExt._newItem()');
| |
− | return new clsItemExt($this);
| |
− | }
| |
− | }
| |
− | class clsItemExt extends clsItem {
| |
− | public $OptSort;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsItemExt.LoadResults()');
| |
− | parent::LoadResults();
| |
− | | |
− | $this->OptSort = $this->GetValue('OptSort');
| |
− | $this->CatWeb = $this->GetValue('CatWeb');
| |
− | $this->currMinPrice = $this->GetValue('currMinPrice');
| |
− | $this->currMaxPrice = $this->GetValue('currMaxPrice');
| |
− | $this->idItTyp = $this->GetValue('ID_ItTyp');
| |
− | $this->qtyInStock = $this->GetValue('qtyInStock');
| |
− | | |
− | CallExit('clsItemExt.LoadResults()');
| |
− | }
| |
− | }
| |
− | | |
− | /* -------------------- *\
| |
− | ITEM TYPE classes
| |
− | \* -------------------- */
| |
− | class clsItTyps extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | global $objDataMgr;
| |
− | $objDataMgr->Update('cat_ittyps','clsItems()');
| |
− | parent::__construct($iDB,'cat_ittyps');
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsItTyps._newItem()');
| |
− | return new clsItTyp($this);
| |
− | }
| |
− | }
| |
− | class clsItTyp extends clsDataItem {
| |
− | public $ID;
| |
− | public $NameSng;
| |
− | public $NamePlr;
| |
− | // public $cntInPrint;
| |
− | // public $qtyInStock;
| |
− | // public $usePrefix;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsItTyp.LoadResults()');
| |
− | /*
| |
− | if ($this->usePrefix) {
| |
− | $this->ID = $this->GetValue('ID_ItTyp');
| |
− | $this->NameSng = $this->GetValue('ItTypNameSng');
| |
− | $this->NamePlr = $this->GetValue('ItTypNamePlr');
| |
− | $this->cntInPrint = $this->GetValue('cntInPrint');
| |
− | } else {
| |
− | /**/
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->NameSng = $this->GetValue('NameSng');
| |
− | $this->NamePlr = $this->GetValue('NamePlr');
| |
− | // }
| |
− | assert($this->ID);
| |
− | CallExit('clsItTyp.LoadResults()');
| |
− | }
| |
− | public function Name($iCount=-1) {
| |
− | if ($iCount == -1) {
| |
− | $iCount = $this->cntInPrint;
| |
− | }
| |
− | if ($iCount == 1) {
| |
− | return $this->NameSng;
| |
− | } else {
| |
− | return $this->NamePlr;
| |
− | }
| |
− | }
| |
− | }
| |
− | /* -------------------- *\
| |
− | STOCK ITEM classes
| |
− | \* -------------------- */
| |
− | class clsStkItems extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | parent::__construct($iDB,'stk_items');
| |
− | }
| |
− | public function QtyInStock_forItem($iItemID) {
| |
− | $sql = 'SELECT SUM(s.Qty) AS Qty FROM stk_items AS s LEFT JOIN stk_bins AS sb ON s.ID_Bin=sb.ID WHERE (s.ID_Item='.$iItemID.') AND (s.WhenRemoved IS NULL) AND (sb.WhenVoided IS NULL) AND (sb.isForSale) GROUP BY s.ID_Item';
| |
− | // ** TO DO: maybe this can use a view or one of the calculated tables now?
| |
− | | |
− | $objStock = new clsDataItem($this);
| |
− | $objStock->Query($sql);
| |
− | if ($objStock->HasData()) {
| |
− | if ($objStock->RowCount()) {
| |
− | assert($objStock->RowCount() == 1);
| |
− | return $objStock->GetValue('Qty');
| |
− | }
| |
− | }
| |
− | }
| |
− | /*
| |
− | protected function _newItem() {
| |
− | CallStep('clsStkItems._newItem()');
| |
− | return new clsStkItem($this);
| |
− | }
| |
− | */
| |
− | }
| |
− | /* -------------------- *\
| |
− | IMAGE classes
| |
− | \* -------------------- */
| |
− | class clsImages extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | parent::__construct($iDB,'cat_images');
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsImages._newItem()');
| |
− | return new clsImage($this);
| |
− | }
| |
− | }
| |
− | class clsImage extends clsDataItem {
| |
− | public $idTitle;
| |
− | public $Ab_Size;
| |
− | public $AttrFldr;
| |
− | public $Spec;
| |
− | // object cache
| |
− | private $objTitle;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsImage.LoadResults()');
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->idTitle = $this->GetValue('ID_Title');
| |
− | $this->AbSize = $this->GetValue('Ab_Size');
| |
− | $this->AttrFldr = $this->GetValue('AttrFldr');
| |
− | $this->AttrDispl = $this->GetValue('AttrDispl');
| |
− | $this->Spec = $this->GetValue('Spec');
| |
− | assert($this->ID);
| |
− | CallExit('clsImage.LoadResults()');
| |
− | }
| |
− | public function ImgForSize($iSize) {
| |
− | // ACTION: Get the image with the same title and attribute but with the given size
| |
− | if ($this->AttrFldr) {
| |
− | $sqlAttr = '="'.$this->AttrFldr.'"';
| |
− | } else {
| |
− | $sqlAttr = ' IS NULL';
| |
− | }
| |
− | $sql = 'SELECT * FROM cat_images WHERE (ID_Title='.$this->idTitle.') AND (AttrFldr'.$sqlAttr.') AND (Ab_Size="'.$iSize.'");';
| |
− | $objImgOut = new clsImage($this->Table);
| |
− | $objImgOut->Query($sql);
| |
− | return $objImgOut;
| |
− | }
| |
− | public function Title() {
| |
− | global $objFactory;
| |
− | | |
− | if (!is_object($this->objTitle)) {
| |
− | $objTitleTbl = $objFactory->TitlesExt();
| |
− | $this->objTitle = $objTitleTbl->GetItem($this->idTitle);
| |
− | }
| |
− | return $this->objTitle;
| |
− | }
| |
− | public function DoPage() {
| |
− | global $objFactory;
| |
− | | |
− | $objTitle = $this->Title();
| |
− | $strCatNum = $objTitle->CatNum;
| |
− | $strTitle = $objTitle->Name;
| |
− | $htmlTitle = KS_STORE_NAME.' - '.$strCatNum.' “'.$strTitle.'”';
| |
− | echo '<html><head><title>'.$htmlTitle.'</title></head>';
| |
− | echo '<body
| |
− | bgcolor=000044
| |
− | TEXT=CCFFFF
| |
− | LINK=33FF33
| |
− | VLINK=33CCFF
| |
− | ALINK=FFCC00
| |
− | TOPMARGIN=0
| |
− | LEFTMARGIN=0
| |
− | MARGINWIDTH=0
| |
− | MARGINHEIGHT=0
| |
− | >';
| |
− | echo '<center>';
| |
− | echo '<big>'.$strTitle.'</big><br>';
| |
− | | |
− | // show list of available image sizes (except th and sm)
| |
− | $objImgs = $this->ListImages_sameAttr();
| |
− | if ($objImgs->HasData()) {
| |
− | $strImgCount = 0;
| |
− | while ($objImgs->HasData()) {
| |
− | $strImgType = $objImgs->AbSize;
| |
− | if (($strImgType != 'th') && ($strImgType != 'sm')) {
| |
− | $strImgCount++;
| |
− | $strImgTag = $imgSize[$strImgType];
| |
− | if ($strOut) {
| |
− | $strOut .= ' .. ';
| |
− | }
| |
− | $strOut .= $strImgTag;
| |
− | }
| |
− | $objImgs->NextRow();
| |
− | }
| |
− | if ($strImgCount > 1) {
| |
− | echo $strOut.'<br>';
| |
− | }
| |
− | }
| |
− | // show list of available images for this title at this size
| |
− | $objImgs = $this->ListImages_sameSize();
| |
− | if ($objImgs->HasData()) {
| |
− | $strImgCount = 0;
| |
− | $strOut .= '';
| |
− | if ($objImgs->HasData()) {
| |
− | while ($objImgs->HasData()) {
| |
− | $strImgFldr = $objImgs->AttrFldr;
| |
− | $strImgDescr = $objImgs->AttrDispl;
| |
− | $strImgCount++;
| |
− | if ($strOut) {
| |
− | $strOut .= ' .. ';
| |
− | }
| |
− | if ($objImgs->ID == $this->ID) {
| |
− | $strOut .= '<b>'.$strImgDescr.'</b>';
| |
− | } else {
| |
− | $strOut .= $objImgs->Href(TRUE).$strImgDescr.'</a>';
| |
− | }
| |
− | $objImgs->NextRow();
| |
− | }
| |
− | if ($strImgCount > 1) {
| |
− | echo $strOut.'<br>';
| |
− | }
| |
− | }
| |
− | }
| |
− | echo $objTitle->Link().'ordering page</a><br>';
| |
− | echo $this->ImgSrc();
| |
− | echo '</body></html>';
| |
− | }
| |
− | public function ListImages_sameAttr() {
| |
− | if ($this->AttrFldr) {
| |
− | $sqlFilt = '(ID_Title='.$this->idTitle.') AND (AttrFldr="'.$this->AttrFldr.'")';
| |
− | } else {
| |
− | $sqlFilt = '(ID_Title='.$this->idTitle.')';
| |
− | }
| |
− | $objImgOut = $this->Table->GetData($sqlFilt);
| |
− | return $objImgOut;
| |
− | }
| |
− | public function ListImages_sameSize() {
| |
− | $sqlFilt = '(ID_Title='.$this->idTitle.') AND (Ab_Size="'.$this->AbSize.'")';
| |
− | $objImgOut = $this->Table->GetData($sqlFilt);
| |
− | return $objImgOut;
| |
− | }
| |
− | public function Href($iAbs=false) {
| |
− | if ($iAbs) {
| |
− | $strFldr = $this->Title()->URL();
| |
− | }
| |
− | $strFldr .= $this->AttrFldr;
| |
− | if ($strFldr) {
| |
− | $strFldr .= '-';
| |
− | }
| |
− | $strFldr .= $this->AbSize;
| |
− | return '<a href="'.$strFldr.'/">';
| |
− | }
| |
− | public function ImgSrc() {
| |
− | return '<img src="'.KWP_IMG_MERCH.$this->Spec.'">';
| |
− | }
| |
− | }
| |
− | | |
− | /* ------------------ *\
| |
− | CATALOG BROWSING
| |
− | \* ------------------ */
| |
− | class clsTopics extends clsDataTable {
| |
− | public function __construct($iDB) {
| |
− | parent::__construct($iDB,'brs_topics');
| |
− | }
| |
− | protected function _newItem() {
| |
− | CallStep('clsTopics._newItem()');
| |
− | return new clsTopic($this);
| |
− | }
| |
− | public function DoIndex() {
| |
− | global $objFactory,$objDataMgr;
| |
− | | |
− | CallEnter('clsTopics.DoIndex()');
| |
− | $objSection = new clsPageOutput();
| |
− | | |
− | $objTopics = $this->GetData('ID_Parent IS NULL','Sort,Name,NameTree');
| |
− | while ($objTopics->HasData()) {
| |
− | if ($isFirst) {
| |
− | $isFirst = false;
| |
− | $objSection->SectionHdr('Root Topics');
| |
− | } else {
| |
− | $objSection->AddText($objTopics->Name.'<br>');
| |
− | }
| |
− | $objTopics->NextRow();
| |
− | }
| |
− | | |
− | CallExit('clsTopic.DoIndex()');
| |
− | return $objSection->out;
| |
− | }
| |
− | }
| |
− | class clsTopic extends clsDataItem {
| |
− | public $ID_Parent;
| |
− | public $Name;
| |
− | public $NameTree;
| |
− | public $NameFull;
| |
− | public $Variants;
| |
− | public $Mispeled;
| |
− | | |
− | protected function LoadResults() {
| |
− | CallEnter('clsTopic.LoadResults()');
| |
− | $this->ID = $this->GetValue('ID');
| |
− | $this->ID_Parent = $this->GetValue('ID_Parent');
| |
− | $this->Name = $this->GetValue('Name');
| |
− | $this->NameTree = $this->GetValue('NameTree');
| |
− | $this->NameFull = $this->GetValue('NameFull');
| |
− | $this->Variants = $this->GetValue('Variants');
| |
− | $this->Mispeled = $this->GetValue('Mispeled');
| |
− | assert($this->ID);
| |
− | CallExit('clsTopic.LoadResults()');
| |
− | }
| |
− | | |
− | public function DoPage() {
| |
− | global $objFactory,$objDataMgr;
| |
− | | |
− | CallEnter('clsTopic.DoPage()');
| |
− | assert($this->ID);
| |
− | $objSection = new clsPageOutput();
| |
− | | |
− | $objTbl = $objFactory->Table_noID('brs_titles_x_topics');
| |
− | $objTitles = $objTbl->GetData('ID_Topic='.$this->ID);
| |
− | while ($objTitles->HasData()) {
| |
− | if ($isFirst) {
| |
− | $isFirst = false;
| |
− | $objSection->SectionHdr('Titles');
| |
− | } else {
| |
− | $objSection->AddText($objTitles->Name.'<br>');
| |
− | }
| |
− | $objTitles->NextRow();
| |
− | }
| |
− | | |
− | CallExit('clsTopic.DoPage()');
| |
− | return $out;
| |
− | }
| |
− | public function WebName() {
| |
− | return sprintf(KS_FMT_TOPICID,$this->ID);
| |
− | }
| |
− | }
| |
| | | |
− | /* ==================== *\ | + | // process the request |
− | UTILITY FUNCTIONS
| + | $objPage = new clsPageCat(); |
− | \* ==================== */
| + | $objPage->GetQuery(); |
| + | $objPage->DoRequest(); |
| | | |
− | function DataCents($iCents,$iPfx='$') {
| + | if (!$didPage) { |
− | $out = $iPfx.sprintf("%01.2f",$iCents/100);
| + | // $objPage->Init('','Unknown page','something is messed up','browse','Houston, we have a problem...'); |
− | return $out;
| + | // $objPage->DoError(); |
| } | | } |
− | function DataCurr($iCurr,$iPfx='$') {
| + | if (KDO_DEBUG) { |
− | $out = $iPfx.sprintf("%01.2f",$iCurr);
| + | print "DEBUG:<p>".$debug; |
− | return $out;
| |
| } | | } |
− | function DataDate($iDate) {
| + | </php> |
− | if (is_string($iDate)) {
| |
− | $objDate = new DateTime($iDate);
| |
− | // if ($iDate == 0) {
| |
− | // $out = '';
| |
− | // } else {
| |
− | // $out = date('Y-m-d',$iDate);
| |
− | $out = $objDate->format('Y-m-d');
| |
− | } else {
| |
− | $out = '';
| |
− | }
| |
− | return $out;
| |
− | }</php>
| |