Documentation TYPO3 par Ameos

class.tx_ttproducts.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00067 require_once(PATH_tslib."class.tslib_pibase.php");
00068 require_once(PATH_t3lib."class.t3lib_parsehtml.php");
00069 
00070 class tx_ttproducts extends tslib_pibase {
00071         var $cObj;              // The backReference to the mother cObj object set at call time
00072 
00073         var $searchFieldList="title,note,itemnumber";
00074 
00075                 // Internal
00076         var $pid_list="";
00077         var $uid_list="";                                       // List of existing uid's from the basket, set by initBasket()
00078         var $categories=array();                        // Is initialized with the categories of the shopping system
00079         var $pageArray=array();                         // Is initialized with an array of the pages in the pid-list
00080         var $orderRecord = array();                     // Will hold the order record if fetched.
00081 
00082 
00083                 // Internal: init():
00084         var $templateCode="";                           // In init(), set to the content of the templateFile. Used by default in getBasket()
00085 
00086                 // Internal: initBasket():
00087         var $basket=array();                            // initBasket() sets this array based on the registered items
00088         var $basketExtra;                                       // initBasket() uses this for additional information like the current payment/shipping methods
00089         var $recs = Array();                            // in initBasket this is set to the recs-array of fe_user.
00090         var $personInfo;                                        // Set by initBasket to the billing address
00091         var $deliveryInfo;                                      // Set by initBasket to the delivery address
00092 
00093                 // Internal: Arrays from getBasket() function
00094         var $calculatedBasket;                          // - The basked elements, how many (quantity, count) and the price and total
00095         var $calculatedSums_tax;                        // - Sums of goods, shipping, payment and total amount WITH TAX included
00096         var $calculatedSums_no_tax;                     // - Sums of goods, shipping, payment and total amount WITHOUT TAX
00097 
00098         var $config=array();
00099         var $conf=array();
00100         var $tt_product_single="";
00101         var $globalMarkerArray=array();
00102         var $externalCObject="";
00103 
00104 
00108         function main_products($content,$conf)  {
00109                 $GLOBALS["TSFE"]->set_no_cache();
00110 
00111                 // *************************************
00112                 // *** getting configuration values:
00113                 // *************************************
00114 
00115                         // getting configuration values:
00116                 $this->conf=$conf;
00117                 $this->config["code"] = strtolower(trim($this->cObj->stdWrap($this->conf["code"],$this->conf["code."])));
00118                 $this->config["limit"] = t3lib_div::intInRange($this->conf["limit"],0,1000);
00119                 $this->config["limit"] = $this->config["limit"] ? $this->config["limit"] : 50;
00120 
00121                 $this->config["pid_list"] = trim($this->cObj->stdWrap($this->conf["pid_list"],$this->conf["pid_list."]));
00122                 $this->config["pid_list"] = $this->config["pid_list"] ? $this->config["pid_list"] : $GLOBALS["TSFE"]->id;
00123 
00124                 $this->config["recursive"] = $this->cObj->stdWrap($this->conf["recursive"],$this->conf["recursive."]);
00125                 $this->config["storeRootPid"] = $this->conf["PIDstoreRoot"] ? $this->conf["PIDstoreRoot"] : $GLOBALS["TSFE"]->tmpl->rootLine[0][uid];
00126 
00127                         //extend standard search fields with user setup
00128                 $this->searchFieldList = trim($this->conf["stdSearchFieldExt"]) ? implode(",", array_unique(t3lib_div::trimExplode(",",$this->searchFieldList.",".trim($this->conf["stdSearchFieldExt"]),1))) : $this->searchFieldList;
00129 
00130                         // If the current record should be displayed.
00131                 $this->config["displayCurrentRecord"] = $this->conf["displayCurrentRecord"];
00132                 if ($this->config["displayCurrentRecord"])      {
00133                         $this->config["code"]="SINGLE";
00134                         $this->tt_product_single = true;
00135                 } else {
00136                         $this->tt_product_single = t3lib_div::_GET("tt_products");
00137                 }
00138 
00139                         // template file is fetched. The whole template file from which the various subpart are extracted.
00140                 $this->templateCode = $this->cObj->fileResource($this->conf["templateFile"]);
00141 
00142                         // globally substituted markers, fonts and colors.
00143                 $splitMark = md5(microtime());
00144                 $globalMarkerArray=array();
00145                 list($globalMarkerArray["###GW1B###"],$globalMarkerArray["###GW1E###"]) = explode($splitMark,$this->cObj->stdWrap($splitMark,$this->conf["wrap1."]));
00146                 list($globalMarkerArray["###GW2B###"],$globalMarkerArray["###GW2E###"]) = explode($splitMark,$this->cObj->stdWrap($splitMark,$this->conf["wrap2."]));
00147                 $globalMarkerArray["###GC1###"] = $this->cObj->stdWrap($this->conf["color1"],$this->conf["color1."]);
00148                 $globalMarkerArray["###GC2###"] = $this->cObj->stdWrap($this->conf["color2"],$this->conf["color2."]);
00149                 $globalMarkerArray["###GC3###"] = $this->cObj->stdWrap($this->conf["color3"],$this->conf["color3."]);
00150 
00151                         // Substitute Global Marker Array
00152                 $this->templateCode= $this->cObj->substituteMarkerArrayCached($this->templateCode, $globalMarkerArray);
00153 
00154 
00155                         // This cObject may be used to call a function which manipulates the shopping basket based on settings in an external order system. The output is included in the top of the order (HTML) on the basket-page.
00156                 $this->externalCObject = $this->getExternalCObject("externalProcessing");
00157 
00158                         // Initializes object
00159                 $this->setPidlist($this->config["pid_list"]);                           // The list of pid's we're operation on. All tt_products records must be in the pidlist in order to be selected.
00160                 $this->TAXpercentage = doubleval($this->conf["TAXpercentage"]);         // Set the TAX percentage.
00161                 $this->globalMarkerArray = $globalMarkerArray;
00162                 $this->initCategories();
00163                 $this->initBasket($GLOBALS["TSFE"]->fe_user->getKey("ses","recs"));     // Must do this to initialize the basket...
00164 
00165 
00166                 // *************************************
00167                 // *** Listing items:
00168                 // *************************************
00169 
00170                 $codes=t3lib_div::trimExplode(",", $this->config["code"]?$this->config["code"]:$this->conf["defaultCode"],1);
00171                 if (!count($codes))     $codes=array("");
00172                 while(list(,$theCode)=each($codes))     {
00173                         $theCode = (string)strtoupper(trim($theCode));
00174 
00175                         //      debug($theCode);
00176                         switch($theCode)        {
00177                                 case "TRACKING":
00178                                         $content.=$this->products_tracking($theCode);
00179                                 break;
00180                                 case "BASKET":
00181                                 case "PAYMENT":
00182                                 case "FINALIZE":
00183                                 case "INFO":
00184                                         $content.=$this->products_basket($theCode);
00185                                 break;
00186                                 case "SEARCH":
00187                                 case "SINGLE":
00188                                 case "LIST":
00189                                         $content.=$this->products_display($theCode);
00190                                 break;
00191                                 default:
00192                                         $langKey = strtoupper($GLOBALS["TSFE"]->config["config"]["language"]);
00193                                         $helpTemplate = $this->cObj->fileResource("EXT:tt_products/pi/products_help.tmpl");
00194 
00195                                                 // Get language version
00196                                         $helpTemplate_lang="";
00197                                         if ($langKey)   {$helpTemplate_lang = $this->cObj->getSubpart($helpTemplate,"###TEMPLATE_".$langKey."###");}
00198                                         $helpTemplate = $helpTemplate_lang ? $helpTemplate_lang : $this->cObj->getSubpart($helpTemplate,"###TEMPLATE_DEFAULT###");
00199 
00200                                                 // Markers and substitution:
00201                                         $markerArray["###CODE###"] = $theCode;
00202                                         $content.=$this->cObj->substituteMarkerArray($helpTemplate,$markerArray);
00203                                 break;
00204                         }
00205                 }
00206                 return $content;
00207         }
00208 
00212         function getExternalCObject($mConfKey)  {
00213                 if ($this->conf[$mConfKey] && $this->conf[$mConfKey."."])       {
00214                         $this->cObj->regObj = &$this;
00215                         return $this->cObj->cObjGetSingle($this->conf[$mConfKey],$this->conf[$mConfKey."."],"/".$mConfKey."/")."";
00216                 }
00217         }
00218 
00222         function products_tracking($theCode)    {
00223                 $admin = $this->shopAdmin();
00224                 if (t3lib_div::_GP("tracking") || $admin)       {               // Tracking number must be set
00225                         $orderRow = $this->getOrderRecord("",t3lib_div::_GP("tracking"));
00226                         if (is_array($orderRow) || $admin)      {               // If order is associated with tracking id.
00227                                 if (!is_array($orderRow))       $orderRow=array("uid"=>0);
00228                                 $content = $this->getTrackingInformation($orderRow,$this->templateCode);
00229                         } else {        // ... else output error page
00230                                 $content=$this->cObj->getSubpart($this->templateCode,$this->spMarker("###TRACKING_WRONG_NUMBER###"));
00231                                 if (!$GLOBALS["TSFE"]->beUserLogin)     {$content = $this->cObj->substituteSubpart($content,"###ADMIN_CONTROL###","");}
00232                         }
00233                 } else {        // No tracking number - show form with tracking number
00234                         $content=$this->cObj->getSubpart($this->templateCode,$this->spMarker("###TRACKING_ENTER_NUMBER###"));
00235                         if (!$GLOBALS["TSFE"]->beUserLogin)     {$content = $this->cObj->substituteSubpart($content,"###ADMIN_CONTROL###","");}
00236                 }
00237                 $markerArray=array();
00238                 $markerArray["###FORM_URL###"] = $this->getLinkUrl();   // Add FORM_URL to globalMarkerArray, linking to self.
00239                 $content= $this->cObj->substituteMarkerArray($content, $markerArray);
00240 
00241                 return $content;
00242         }
00243 
00247         function products_basket($theCode)      {
00248                 $this->setPidlist($this->config["storeRootPid"]);       // Set list of page id's to the storeRootPid.
00249                 $this->initRecursive(999);              // This add's all subpart ids to the pid_list based on the rootPid set in previous line
00250                 $this->generatePageArray();             // Creates an array with page titles from the internal pid_list. Used for the display of category titles.
00251 
00252                 if (count($this->basket))       {       // If there is content in the shopping basket, we are going display some basket code
00253                                 // prepare action
00254                         $activity="";
00255                         if (t3lib_div::_GP("products_info"))    {
00256                                 $activity="products_info";
00257                         } elseif (t3lib_div::_GP("products_payment"))   {
00258                                 $activity="products_payment";
00259                         } elseif (t3lib_div::_GP("products_finalize"))  {
00260                                 $activity="products_finalize";
00261                         }
00262 
00263                         if ($theCode=="INFO")   {
00264                                 $activity="products_info";
00265                         } elseif ($theCode=="PAYMENT")  {
00266                                 $activity="products_payment";
00267                         } elseif ($theCode=="FINALIZE") {
00268                                 $activity="products_finalize";
00269                         }
00270 
00271 //                      debug($activity);
00272                                 // perform action
00273                         switch($activity)       {
00274                                 case "products_info":
00275                                         $this->load_noLinkExtCobj();
00276                                         $content.=$this->getBasket("###BASKET_INFO_TEMPLATE###");
00277                                 break;
00278                                 case "products_payment":
00279                                         $this->load_noLinkExtCobj();
00280                                         if ($this->checkRequired())     {
00281                                                 $this->mapPersonIntoToDelivery();
00282                                                 $content=$this->getBasket("###BASKET_PAYMENT_TEMPLATE###");
00283                                         } else {        // If not all required info-fields are filled in, this is shown instead:
00284                                                 $content.=$this->cObj->getSubpart($this->templateCode,$this->spMarker("###BASKET_REQUIRED_INFO_MISSING###"));
00285                                                 $content = $this->cObj->substituteMarkerArray($content, $this->addURLMarkers(array()));
00286                                         }
00287                                 break;
00288                                 case "products_finalize":
00289                                         if ($this->checkRequired())     {
00290                                                 $this->load_noLinkExtCobj();
00291                                                 $this->mapPersonIntoToDelivery();
00292                                                 $handleScript = $GLOBALS["TSFE"]->tmpl->getFileName($this->basketExtra["payment."]["handleScript"]);
00293                                                 if ($handleScript)      {
00294                                                         $content = $this->includeHandleScript($handleScript,$this->basketExtra["payment."]["handleScript."]);
00295                                                 } else {
00296                                                         $orderUid = $this->getBlankOrderUid();
00297                                                         $content=$this->getBasket("###BASKET_ORDERCONFIRMATION_TEMPLATE###");
00298                                                         $this->finalizeOrder($orderUid);        // Important: finalizeOrder MUST come after the call of prodObj->getBasket, because this function, getBasket, calculates the order! And that information is used in the finalize-function
00299                                                 }
00300                                         } else {        // If not all required info-fields are filled in, this is shown instead:
00301                                                 $content.=$this->cObj->getSubpart($this->templateCode,$this->spMarker("###BASKET_REQUIRED_INFO_MISSING###"));
00302                                                 $content = $this->cObj->substituteMarkerArray($content, $this->addURLMarkers(array()));
00303                                         }
00304                                 break;
00305                                 default:
00306                                         $content.=$this->getBasket();
00307                                 break;
00308                         }
00309                 } else {
00310                         $content.=$this->cObj->getSubpart($this->templateCode,$this->spMarker("###BASKET_TEMPLATE_EMPTY###"));
00311                 }
00312                 $markerArray=array();
00313                 $markerArray["###EXTERNAL_COBJECT###"] = $this->externalCObject;        // adding extra preprocessing CObject
00314                 $content= $this->cObj->substituteMarkerArray($content, $markerArray);
00315 
00316                 return $content;
00317         }
00318         function load_noLinkExtCobj()   {
00319                 if ($this->conf["externalProcessing_final"] || is_array($this->conf["externalProcessing_final."]))      {       // If there is given another cObject for the final order confirmation template!
00320                         $this->externalCObject = $this->getExternalCObject("externalProcessing_final");
00321                 }
00322         }
00323 
00327         function spMarker($subpartMarker)       {
00328                 $sPBody = substr($subpartMarker,3,-3);
00329                 $altSPM = "";
00330                 if (isset($this->conf["altMainMarkers."]))      {
00331                         $altSPM = trim($this->cObj->stdWrap($this->conf["altMainMarkers."][$sPBody],$this->conf["altMainMarkers."][$sPBody."."]));
00332                         $GLOBALS["TT"]->setTSlogMessage("Using alternative subpart marker for '".$subpartMarker."': ".$altSPM,1);
00333                 }
00334                 return $altSPM ? $altSPM : $subpartMarker;
00335         }
00336 
00340         function products_display($theCode)     {
00341                 $formUrl = $this->getLinkUrl($this->conf["PIDbasket"]);
00342                 if ($this->tt_product_single)   {
00343         // List single product:
00344                                 // performing query:
00345                         $this->setPidlist($this->config["storeRootPid"]);
00346                         $this->initRecursive(999);
00347                         $this->generatePageArray();
00348 
00349                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tt_products', 'uid='.intval($this->tt_product_single).' AND pid IN ('.$this->pid_list.')'.$this->cObj->enableFields('tt_products'));
00350 
00351                         if($this->config["displayCurrentRecord"] || $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))         {
00352                                         // Get the subpart code
00353                                 $item ="";
00354                                 if ($this->config["displayCurrentRecord"])      {
00355                                         $row=$this->cObj->data;
00356                                         $item = trim($this->cObj->getSubpart($this->templateCode,$this->spMarker("###ITEM_SINGLE_DISPLAY_RECORDINSERT###")));
00357                                 }
00358                                 $catTitle= $this->pageArray[$row["pid"]]["title"].($row["category"]?"/".$this->categories[$row["category"]]:"");
00359                                 if (!$item)     {$item = $this->cObj->getSubpart($this->templateCode,$this->spMarker("###ITEM_SINGLE_DISPLAY###"));}
00360 
00361                                         // Fill marker arrays
00362                                 $wrappedSubpartArray=array();
00363                                 $wrappedSubpartArray["###LINK_ITEM###"]= array('<A href="'.$this->getLinkUrl(t3lib_div::_GP("backPID")).'">','</A>');
00364 
00365                                 $markerArray = $this->getItemMarkerArray ($row,$catTitle,10);
00366                                 $markerArray["###FORM_NAME###"]="item_".$this->tt_product_single;
00367                                 $markerArray["###FORM_URL###"]=$formUrl;
00368 
00369                                         // Substitute
00370                                 $content= $this->cObj->substituteMarkerArrayCached($item,$markerArray,array(),$wrappedSubpartArray);
00371                         }
00372                 } elseif ($theCode=="SINGLE") {
00373                         $content.="Wrong parameters, GET/POST var 'tt_products' was missing.";
00374                 } else {
00375                         $content="";
00376         // List products:
00377                         $where="";
00378                         if ($theCode=="SEARCH") {
00379                                         // Get search subpart
00380                                 $t["search"] = $this->cObj->getSubpart($this->templateCode,$this->spMarker("###ITEM_SEARCH###"));
00381                                         // Substitute a few markers
00382                                 $out=$t["search"];
00383                                 $out=$this->cObj->substituteMarker($out, "###FORM_URL###", $this->getLinkUrl($this->conf["PIDsearch"]));
00384                                 $out=$this->cObj->substituteMarker($out, "###SWORDS###", htmlspecialchars(t3lib_div::_GP("swords")));
00385                                         // Add to content
00386                                 $content.=$out;
00387                                 if (t3lib_div::_GP("swords"))   {
00388                                         $where = $this->searchWhere(trim(t3lib_div::_GP("swords")));
00389                                 }
00390                         }
00391                         $begin_at=t3lib_div::intInRange(t3lib_div::_GP("begin_at"),0,100000);
00392                         if (($theCode!="SEARCH" && !t3lib_div::_GP("swords")) || $where)        {
00393 
00394                                 $this->initRecursive($this->config["recursive"]);
00395                                 $this->generatePageArray();
00396 
00397                                         // Get products
00398                                 $selectConf = Array();
00399                                 $selectConf["pidInList"] = $this->pid_list;
00400                                 $selectConf["where"] = "1=1 ".$where;
00401 
00402                                         // performing query to count all products (we need to know it for browsing):
00403                                 $selectConf["selectFields"] = 'count(*)';
00404                                 $res = $this->cObj->exec_getQuery("tt_products",$selectConf);
00405                                 $row = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
00406                                 $productsCount = $row[0];
00407 
00408                                         // range check to current productsCount
00409                                 $begin_at = t3lib_div::intInRange(($begin_at >= $productsCount)?($productsCount-$this->config["limit"]):$begin_at,0);
00410 
00411                                         // performing query for display:
00412                                 $selectConf['orderBy'] = 'pid,category,title';
00413                                 $selectConf['selectFields'] = '*';
00414                                 $selectConf['max'] = ($this->config['limit']+1);
00415                                 $selectConf['begin'] = $begin_at;
00416 
00417                                 $res = $this->cObj->exec_getQuery('tt_products',$selectConf);
00418 
00419                                 $productsArray=array();
00420                                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))               {
00421                                         $productsArray[$row["pid"]][]=$row;
00422                                 }
00423 
00424                                         // Getting various subparts we're going to use here:
00425                                 $t["listFrameWork"] = $this->cObj->getSubpart($this->templateCode,$this->spMarker("###ITEM_LIST_TEMPLATE###"));
00426                                 $t["categoryTitle"] = $this->cObj->getSubpart($t["listFrameWork"],"###ITEM_CATEGORY###");
00427                                 $t["itemFrameWork"] = $this->cObj->getSubpart($t["listFrameWork"],"###ITEM_LIST###");
00428                                 $t["item"] = $this->cObj->getSubpart($t["itemFrameWork"],"###ITEM_SINGLE###");
00429 
00430                                 $pageArr=explode(",",$this->pid_list);
00431                                 $currentP="";
00432                                 $out="";
00433                                 $iCount=0;
00434                                 $more=0;                // If set during this loop, the next-item is drawn
00435                                 while(list(,$v)=each($pageArr)) {
00436                                         if (is_array($productsArray[$v]))       {
00437                                                 reset($productsArray[$v]);
00438                                                 $itemsOut="";
00439                                                 while(list(,$row)=each($productsArray[$v]))     {
00440                                                         $iCount++;
00441                                                         if ($iCount>$this->config["limit"])     {
00442                                                                 $more=1;
00443                                                                 break;
00444                                                         }
00445 
00446 
00447                                                                 // Print Category Title
00448                                                         if ($row["pid"]."_".$row["category"]!=$currentP)        {
00449                                                                 if ($itemsOut)  {
00450                                                                         $out.=$this->cObj->substituteSubpart($t["itemFrameWork"], "###ITEM_SINGLE###", $itemsOut);
00451                                                                 }
00452                                                                 $itemsOut="";                   // Clear the item-code var
00453 
00454                                                                 $currentP = $row["pid"]."_".$row["category"];
00455                                                                 if ($where || $this->conf["displayListCatHeader"])      {
00456                                                                         $markerArray=array();
00457                                                                         $catTitle= $this->pageArray[$row["pid"]]["title"].($row["category"]?"/".$this->categories[$row["category"]]:"");
00458                                                                         $this->cObj->setCurrentVal($catTitle);
00459                                                                         $markerArray["###CATEGORY_TITLE###"]=$this->cObj->cObjGetSingle($this->conf["categoryHeader"],$this->conf["categoryHeader."], "categoryHeader");
00460                                                                         $out.= $this->cObj->substituteMarkerArray($t["categoryTitle"], $markerArray);
00461                                                                 }
00462                                                         }
00463 
00464                                                                 // Print Item Title
00465                                                         $wrappedSubpartArray=array();
00466                                                         $wrappedSubpartArray["###LINK_ITEM###"]= array('<A href="'.$this->getLinkUrl($this->conf["PIDitemDisplay"]).'&tt_products='.$row["uid"].'">','</A>');
00467                                                         $markerArray = $this->getItemMarkerArray ($row,$catTitle,1,"listImage");
00468                                                         $markerArray["###FORM_URL###"]=$formUrl; // Applied later as well.
00469                                                         $markerArray["###FORM_NAME###"]="item_".$iCount;
00470                                                         $itemsOut.= $this->cObj->substituteMarkerArrayCached($t["item"],$markerArray,array(),$wrappedSubpartArray);
00471                                                 }
00472                                                 if ($itemsOut)  {
00473                                                         $out.=$this->cObj->substituteMarkerArrayCached($t["itemFrameWork"], array(), array("###ITEM_SINGLE###"=>$itemsOut));
00474                                                 }
00475                                         }
00476                                 }
00477                         }
00478                         if ($out)       {
00479                                 // next / prev:
00480                                 $url = $this->getLinkUrl("","begin_at");
00481                                         // Reset:
00482                                 $subpartArray=array();
00483                                 $wrappedSubpartArray=array();
00484                                 $markerArray=array();
00485 
00486                                 if ($more)      {
00487                                         $next = ($begin_at+$this->config["limit"] > $productsCount) ? $productsCount-$this->config["limit"] : $begin_at+$this->config["limit"];
00488                                         $wrappedSubpartArray["###LINK_NEXT###"]=array('<A href="'.$url.'&begin_at='.$next.'">','</A>');
00489                                 } else {
00490                                         $subpartArray["###LINK_NEXT###"]="";
00491                                 }
00492                                 if ($begin_at)  {
00493                                         $prev = ($begin_at-$this->config["limit"] < 0) ? 0 : $begin_at-$this->config["limit"];
00494                                         $wrappedSubpartArray["###LINK_PREV###"]=array('<A href="'.$url.'&begin_at='.$prev.'">','</A>');
00495                                 } else {
00496                                         $subpartArray["###LINK_PREV###"]="";
00497                                 }
00498                                 if ($productsCount > $this->config["limit"] )   { // there is more than one page, so let's browse
00499                                         $wrappedSubpartArray["###LINK_BROWSE###"]=array('',''); // <- this could be done better I think, or not?
00500                                         $markerArray["###BROWSE_LINKS###"]="";
00501                                         for ($i = 0 ; $i < ($productsCount/$this->config["limit"]); $i++)       {
00502                                                 if (($begin_at >= $i*$this->config["limit"]) && ($begin_at < $i*$this->config["limit"]+$this->config["limit"]))         {
00503                                                         $markerArray["###BROWSE_LINKS###"].= ' <b>'.(string)($i+1).'</b> ';
00504                                                         //      you may use this if you want to link to the current page also
00505                                                         //      $markerArray["###BROWSE_LINKS###"].= ' <A href="'.$url.'&begin_at='.(string)($i * $this->config["limit"]).'"><b>'.(string)($i+1).'</b></A> ';
00506                                                 } else {
00507                                                         $markerArray["###BROWSE_LINKS###"].= ' <A href="'.$url.'&begin_at='.(string)($i * $this->config["limit"]).'">'.(string)($i+1).'</A> ';
00508                                                 }
00509                                         }
00510                                 } else {
00511                                         $subpartArray["###LINK_BROWSE###"]="";
00512                                 }
00513 
00514                                 $subpartArray["###ITEM_CATEGORY_AND_ITEMS###"]=$out;
00515                                 $markerArray["###FORM_URL###"]=$formUrl;      // Applied it here also...
00516                                 $markerArray["###ITEMS_SELECT_COUNT###"]=$productsCount;
00517 
00518                                 $content.= $this->cObj->substituteMarkerArrayCached($t["listFrameWork"],$markerArray,$subpartArray,$wrappedSubpartArray);
00519                         } elseif ($where)       {
00520                                 $content.=$this->cObj->getSubpart($this->templateCode,$this->spMarker("###ITEM_SEARCH_EMPTY###"));
00521                         }
00522                 }
00523                 return $content;
00524         }
00525 
00529         function setPidlist($pid_list)  {
00530                 $this->pid_list = $pid_list;
00531         }
00532 
00536         function initRecursive($recursive)      {
00537                 if ($recursive) {               // get pid-list if recursivity is enabled
00538                         $pid_list_arr = explode(",",$this->pid_list);
00539                         $this->pid_list="";
00540                         while(list(,$val)=each($pid_list_arr))  {
00541                                 $this->pid_list.=$val.",".$this->cObj->getTreeList($val,intval($recursive));
00542                         }
00543                         $this->pid_list = ereg_replace(",$","",$this->pid_list);
00544                 }
00545         }
00546 
00550         function initCategories()       {
00551                         // Fetching catagories:
00552                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tt_products_cat', '1=1'.$this->cObj->enableFields('tt_products_cat'));
00553                 $this->categories = array();
00554                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))       {
00555                         $this->categories[$row["uid"]] = $row["title"];
00556                 }
00557         }
00558 
00562         function generatePageArray()    {
00563                         // Get pages (for category titles)
00564                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title,uid', 'pages', 'uid IN ('.$this->pid_list.')');
00565                 $this->pageArray = array();
00566                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))               {
00567                         $this->pageArray[$row["uid"]] = $row;
00568                 }
00569         }
00570 
00576         function initBasket($basket)    {
00577                 $this->recs = $basket;  // Sets it internally
00578                 $this->basket=array();
00579                 $uidArr=array();
00580                 if (is_array($basket["tt_products"]))   {
00581                         reset($basket["tt_products"]);
00582                         while(list($uid,$count)=each($basket["tt_products"]))   {
00583                                 if (t3lib_div::testInt($uid))   {
00584                                         $count=t3lib_div::intInRange($count,0,100000);
00585                                         if ($count)     {
00586                                                 $this->basket[$uid]=$count;
00587                                                 $uidArr[]=$uid;
00588                                         }
00589                                 }
00590                         }
00591                 }
00592                 $this->uid_list=implode($uidArr,",");
00593                 $this->setBasketExtras($basket);
00594 
00595                 $this->personInfo = $basket["personinfo"];
00596                 $this->deliveryInfo = $basket["delivery"];
00597                 if ($GLOBALS["TSFE"]->loginUser && (!$this->personInfo || $this->conf["lockLoginUserInfo"]))    {
00598                         $address = implode(chr(10),t3lib_div::trimExplode(chr(10),
00599                                 $GLOBALS["TSFE"]->fe_user->user["address"].chr(10).
00600                                 $GLOBALS["TSFE"]->fe_user->user["zip"]." ".$GLOBALS["TSFE"]->fe_user->user["city"].chr(10).
00601                                 $GLOBALS["TSFE"]->fe_user->user["country"]
00602                                 ,1)
00603                         );
00604 
00605                         $this->personInfo["name"] = $GLOBALS["TSFE"]->fe_user->user["name"];
00606                         $this->personInfo["address"] = $address;
00607                         $this->personInfo["email"] = $GLOBALS["TSFE"]->fe_user->user["email"];
00608                         $this->personInfo["telephone"] = $GLOBALS["TSFE"]->fe_user->user["telephone"];
00609                         $this->personInfo["fax"] = $GLOBALS["TSFE"]->fe_user->user["fax"];
00610                 }
00611         }
00612 
00616         function checkExtraAvailable($name,$key)        {
00617                 if (is_array($this->conf[$name."."][$key."."]) && (!isset($this->conf[$name."."][$key."."]["show"]) || $this->conf[$name."."][$key."."]["show"]))       {
00618                         return true;
00619                 }
00620         }
00621 
00625         function setBasketExtras($basket)       {
00626                         // shipping
00627                 ksort($this->conf["shipping."]);
00628                 reset($this->conf["shipping."]);
00629                 $k=intval($basket["tt_products"]["shipping"]);
00630                 if (!$this->checkExtraAvailable("shipping",$k)) {
00631                         $k=intval(key($this->cleanConfArr($this->conf["shipping."],1)));
00632                 }
00633                 $this->basketExtra["shipping"] = $k;
00634                 $this->basketExtra["shipping."] = $this->conf["shipping."][$k."."];
00635                 $excludePayment = trim($this->basketExtra["shipping."]["excludePayment"]);
00636 
00637                         // payment
00638                 if ($excludePayment)    {
00639                         $exclArr = t3lib_div::intExplode(",",$excludePayment);
00640                         while(list(,$theVal)=each($exclArr))    {
00641                                 unset($this->conf["payment."][$theVal]);
00642                                 unset($this->conf["payment."][$theVal."."]);
00643                         }
00644                 }
00645 
00646                 ksort($this->conf["payment."]);
00647                 reset($this->conf["payment."]);
00648                 $k=intval($basket["tt_products"]["payment"]);
00649                 if (!$this->checkExtraAvailable("payment",$k))  {
00650                         $k=intval(key($this->cleanConfArr($this->conf["payment."],1)));
00651                 }
00652                 $this->basketExtra["payment"] = $k;
00653                 $this->basketExtra["payment."] = $this->conf["payment."][$k."."];
00654 
00655 //              debug($this->basketExtra);
00656 //              debug($this->conf);
00657         }
00658 
00662         function getClearBasketRecord() {
00663                         // Returns a basket-record cleared of tt_product items
00664                 unset($this->recs["tt_products"]);
00665                 return ($this->recs);
00666         }
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674         // **************************
00675         // ORDER related functions
00676         // **************************
00677 
00684         function createOrder()  {
00685                 $newId = 0;
00686                 $pid = intval($this->conf["PID_sys_products_orders"]);
00687                 if (!$pid)      $pid = intval($GLOBALS["TSFE"]->id);
00688                 if ($GLOBALS["TSFE"]->sys_page->getPage_noCheck ($pid)) {
00689                         $advanceUid = 0;
00690                         if ($this->conf["advanceOrderNumberWithInteger"])       {
00691                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'sys_products_orders', '', '', 'uid DESC', '1');
00692                                 list($prevUid) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
00693 
00694                                 $rndParts = explode(",",$this->conf["advanceOrderNumberWithInteger"]);
00695                                 $advanceUid = $prevUid+t3lib_div::intInRange(rand(intval($rndParts[0]),intval($rndParts[1])),1);
00696                         }
00697 
00698                         $insertFields = array(
00699                                 'pid' => $pid,
00700                                 'tstamp' => time(),
00701                                 'crdate' => time(),
00702                                 'deleted' => 1
00703                         );
00704                         if ($advanceUid > 0)    {
00705                                 $insertFields['uid'] = $advanceUid;
00706                         }
00707 
00708                         $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_products_orders', $insertFields);
00709 
00710                         $newId = $GLOBALS['TYPO3_DB']->sql_insert_id();
00711                 }
00712                 return $newId;
00713         }
00714 
00722         function getBlankOrderUid()     {
00723                 $orderUid = intval($this->recs["tt_products"]["orderUid"]);
00724                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'sys_products_orders', 'uid='.intval($orderUid).' AND deleted!=0 AND status=0');   // Checks if record exists, is marked deleted (all blank orders are deleted by default) and is not finished.
00725                 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res))  {
00726                         $orderUid = $this->createOrder();
00727                         $this->recs["tt_products"]["orderUid"] = $orderUid;
00728                         $this->recs["tt_products"]["orderDate"] = time();
00729                         $this->recs["tt_products"]["orderTrackingNo"] = $this->getOrderNumber($orderUid)."-".strtolower(substr(md5(uniqid(time())),0,6));
00730                         $GLOBALS["TSFE"]->fe_user->setKey("ses","recs",$this->recs);
00731                 }
00732                 return $orderUid;
00733         }
00734 
00739         function getOrderRecord($orderUid,$tracking='') {
00740                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_products_orders', ($tracking ? 'tracking_code='.$GLOBALS['TYPO3_DB']->fullQuoteStr($tracking, 'sys_products_orders') : 'uid='.intval($orderUid)).' AND deleted=0');
00741                 return $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00742         }
00743 
00748         function getOrderNumber($orderUid)      {
00749                 return substr($this->conf["orderNumberPrefix"],0,10).$orderUid;
00750         }
00751 
00761         function finalizeOrder($orderUid,$mainMarkerArray=array())      {
00762                         // Fix delivery address
00763                 $this->mapPersonIntoToDelivery();       // This maps the billing address into the blank fields of the delivery address
00764                 $mainMarkerArray["###EXTERNAL_COBJECT###"] = $this->externalCObject."";
00765                 $orderConfirmationHTML=trim($this->getBasket("###BASKET_ORDERCONFIRMATION_TEMPLATE###","",$mainMarkerArray));           // Getting the template subpart for the order confirmation!
00766 
00767                         // Saving order data
00768                 $fieldsArray=array();
00769                 $fieldsArray["note"]=$this->deliveryInfo["note"];
00770                 $fieldsArray["name"]=$this->deliveryInfo["name"];
00771                 $fieldsArray["telephone"]=$this->deliveryInfo["telephone"];
00772                 $fieldsArray["email"]=$this->deliveryInfo["email"];
00773                 $fieldsArray["email_notify"]=  $this->conf["email_notify_default"];             // Email notification is set here. Default email address is delivery email contact
00774 
00775                         // can be changed after order is set.
00776                 $fieldsArray["payment"]=$this->basketExtra["payment"].": ".$this->basketExtra["payment."]["title"];
00777                 $fieldsArray["shipping"]=$this->basketExtra["shipping"].": ".$this->basketExtra["shipping."]["title"];
00778                 $fieldsArray["amount"]=$this->calculatedSums_tax["total"];
00779                 $fieldsArray["status"]=1;       // This means, "Order confirmed on website, next step: confirm from shop that order is received"
00780 
00781                                 // Default status_log entry
00782                 $status_log=array();
00783                 $status_log[] = array(
00784                         "time" => time(),
00785                         "info" => $this->conf["statusCodes."][$fieldsArray["status"]],
00786                         "status" => $fieldsArray["status"],
00787                         "comment" => $this->deliveryInfo["note"]
00788                 );
00789                 $fieldsArray["status_log"]=serialize($status_log);
00790 
00791                         // Order Data serialized
00792                 $fieldsArray["orderData"]=serialize(array(
00793                                 "html_output"                   => $orderConfirmationHTML,
00794                                 "deliveryInfo"                  => $this->deliveryInfo,
00795                                 "personInfo"                    => $this->personInfo,
00796                                 "calculatedBasket"              =>      $this->calculatedBasket,
00797                                 "calculatedSum_tax"             =>      $this->calculatedSums_tax,
00798                                 "calculatedSums_no_tax" =>      $this->calculatedSums_no_tax
00799                 ));
00800 
00801                         // Setting tstamp, deleted and tracking code
00802                 $fieldsArray["tstamp"]=time();
00803                 $fieldsArray["deleted"]=0;
00804                 $fieldsArray["tracking_code"]=$this->recs["tt_products"]["orderTrackingNo"];
00805 
00806                         // Saving the order record
00807                 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('sys_products_orders', 'uid='.intval($orderUid), $fieldsArray);
00808 
00809                         // Fetching the orderRecord by selecing the newly saved one...
00810                 $this->orderRecord = $this->getOrderRecord($orderUid);
00811 
00812 
00813                         // Creates M-M relations for the products with tt_products table. Isn't really used yet, but later will be used to display stock-status by looking up how many items are already ordered.
00814                         // First: delete any existing. Shouldn't be any
00815                 $GLOBALS['TYPO3_DB']->exec_DELETEquery('sys_products_orders_mm_tt_products', 'sys_products_orders_uid='.intval($orderUid));
00816 
00817                         // Second: Insert a new relation for each ordered item
00818                 reset($this->calculatedBasket);
00819                 while(list(,$itemInfo)=each($this->calculatedBasket))   {
00820                         $insertFields = array(
00821                                 'sys_products_orders_uid' => $orderUid,
00822                                 'sys_products_orders_qty' => intval($itemInfo['count']),
00823                                 'tt_products_uid' => intval($itemInfo['rec']['uid'])
00824                         );
00825                         $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_products_orders_mm_tt_products', $insertFields);
00826                 }
00827 
00828                         // Sends order emails:
00829                 $headers=array();
00830                 if ($this->conf["orderEmail_from"])     {$headers[]="FROM: ".$this->conf["orderEmail_fromName"]." <".$this->conf["orderEmail_from"].">";}
00831 
00832                 $recipients = $this->conf["orderEmail_to"];
00833                 $recipients.=",".$this->deliveryInfo["email"];
00834                 $recipients=t3lib_div::trimExplode(",",$recipients,1);
00835 
00836                 if (count($recipients)) {       // If any recipients, then compile and send the mail.
00837                         $emailContent=trim($this->getBasket("###EMAIL_PLAINTEXT_TEMPLATE###"));
00838                         if ($emailContent)      {               // If there is plain text content - which is required!!
00839                                 $parts = split(chr(10),$emailContent,2);                // First line is subject
00840                                 $subject=trim($parts[0]);
00841                                 $plain_message=trim($parts[1]);
00842 
00843 
00844                                 $cls  = t3lib_div::makeInstanceClassName("tt_products_htmlmail");
00845                                 if (class_exists($cls) && $this->conf["orderEmail_htmlmail"])   {       // If htmlmail lib is included, then generate a nice HTML-email
00846                                         $HTMLmailShell=$this->cObj->getSubpart($this->templateCode,"###EMAIL_HTML_SHELL###");
00847                                         $HTMLmailContent=$this->cObj->substituteMarker($HTMLmailShell,"###HTML_BODY###",$orderConfirmationHTML);
00848                                         $HTMLmailContent=$this->cObj->substituteMarkerArray($HTMLmailContent, $this->globalMarkerArray);
00849 
00850 
00851                                                 // Remove image tags to products:
00852                                         if ($this->conf["orderEmail_htmlmail."]["removeImagesWithPrefix"])      {
00853                                                 $parser = t3lib_div::makeInstance("t3lib_parsehtml");
00854                                                 $htmlMailParts = $parser->splitTags("img",$HTMLmailContent);
00855 
00856                                                 reset($htmlMailParts);
00857                                                 while(list($kkk,$vvv)=each($htmlMailParts))     {
00858                                                         if ($kkk%2)     {
00859                                                                 list($attrib) = $parser->get_tag_attributes($vvv);
00860                                                                 if (t3lib_div::isFirstPartOfStr($attrib["src"],$this->conf["orderEmail_htmlmail."]["removeImagesWithPrefix"]))  {
00861 #debug($htmlMailParts[$kkk]);
00862                                                                         $htmlMailParts[$kkk]="";
00863                                                                 }
00864                                                         }
00865                                                 }
00866                                                 $HTMLmailContent=implode("",$htmlMailParts);
00867                                         }
00868 
00869                                         $V = array (
00870                                                 "from_email" => $this->conf["orderEmail_from"],
00871                                                 "from_name" => $this->conf["orderEmail_fromName"]
00872                                         );
00873 
00874                                         $Typo3_htmlmail = t3lib_div::makeInstance("tt_products_htmlmail");
00875                                         $Typo3_htmlmail->useBase64();
00876                                         $Typo3_htmlmail->start(implode($recipients,","), $subject, $plain_message, $HTMLmailContent, $V);
00877 //echo $HTMLmailContent;
00878 //                                              debug($Typo3_htmlmail->message);
00879 //                                              debug($Typo3_htmlmail->recipient);
00880 //                                              debug($Typo3_htmlmail->theParts);
00881                                                 $Typo3_htmlmail->sendtheMail();
00882 
00883                                                 //debug($HTMLmailContent);
00884                                 } else {                // ... else just plain text...
00885                                         $GLOBALS["TSFE"]->plainMailEncoded(implode($recipients,","), $subject, $plain_message, implode($headers,chr(10)));
00886                                 }
00887                         }
00888                 }
00889 
00890                         // Empties the shopping basket!
00891                 $GLOBALS["TSFE"]->fe_user->setKey("ses","recs",$this->getClearBasketRecord());
00892 
00893                         // This cObject may be used to call a function which clears settings in an external order system.
00894                         // The output is NOT included anywhere
00895                 $this->getExternalCObject("externalFinalizing");
00896         }
00897 
00898 
00899 
00900 
00901 
00902 
00903         // **************************
00904         // Utility functions
00905         // **************************
00906 
00907 
00911         function getPrice($price,$tax=1)        {
00912                 $taxFactor = 1+$this->TAXpercentage/100;
00913                 $taxIncluded = $this->conf["TAXincluded"];
00914                 if ($tax)       {
00915                         if ($taxIncluded)       {       // If the configuration says that prices in the database is with tax included
00916                                 return doubleval($price);
00917                         } else {
00918                                 return doubleval($price)*$taxFactor;
00919                         }
00920                 } else {
00921                         if ($taxIncluded)       {       // If the configuration says that prices in the database is with tax included
00922                                 return doubleval($price)/$taxFactor;
00923                         } else {
00924                                 return doubleval($price);
00925                         }
00926                 }
00927         }
00928 
00932         function searchWhere($sw)       {
00933                 $where=$this->cObj->searchWhere($sw, $this->searchFieldList, 'tt_products');
00934                 return $where;
00935         }
00936 
00940         function getLinkUrl($id="",$excludeList="")     {
00941                 $queryString=array();
00942                 $queryString["id"] = ($id ? $id : $GLOBALS["TSFE"]->id);
00943                 $queryString["type"]= $GLOBALS["TSFE"]->type ? 'type='.$GLOBALS["TSFE"]->type : "";
00944                 $queryString["backPID"]= 'backPID='.$GLOBALS["TSFE"]->id;
00945                 $queryString["begin_at"]= t3lib_div::_GP("begin_at") ? 'begin_at='.t3lib_div::_GP("begin_at") : "";
00946                 $queryString["swords"]= t3lib_div::_GP("swords") ? "swords=".rawurlencode(t3lib_div::_GP("swords")) : "";
00947 
00948                 reset($queryString);
00949                 while(list($key,$val)=each($queryString))       {
00950                         if (!$val || ($excludeList && t3lib_div::inList($excludeList,$key)))    {
00951                                 unset($queryString[$key]);
00952                         }
00953                 }
00954                 return $GLOBALS["TSFE"]->absRefPrefix.'index.php?'.implode($queryString,"&");
00955         }
00956 
00960         function priceFormat($double)   {
00961                 return number_format($double,intval($this->conf["priceDec"]),$this->conf["priceDecPoint"],$this->conf["priceThousandPoint"]);
00962         }
00963 
00967         function mapPersonIntoToDelivery()      {
00968                 $infoFields = explode(",","name,address,telephone,fax,email,company,city,zip,state,country");
00969                 while(list(,$fName)=each($infoFields))  {
00970                         if (!trim($this->deliveryInfo[$fName])) {
00971                                 $this->deliveryInfo[$fName] = $this->personInfo[$fName];
00972                         }
00973                 }
00974         }
00975 
00979         function checkRequired()        {
00980                 $flag=1;
00981                 if (trim($this->conf["requiredInfoFields"]))    {
00982                         $infoFields = t3lib_div::trimExplode(",",$this->conf["requiredInfoFields"]);
00983                         while(list(,$fName)=each($infoFields))  {
00984                                 if (!trim($this->personInfo[$fName]))   {
00985                                         $flag=0;
00986                                         break;
00987                                 }
00988                         }
00989                 }
00990                 return $flag;
00991         }
00992 
00996         function includeCalcScript($calcScript,$conf)   {
00997                 include($calcScript);
00998         }
00999 
01003         function includeHandleScript($handleScript,$conf)       {
01004                 include($handleScript);
01005                 return $content;
01006         }
01007 
01008 
01009 
01010 
01011 
01012 
01013 
01014         // **************************
01015         // Template marker substitution
01016         // **************************
01017 
01021         function getItemMarkerArray ($row,$catTitle, $imageNum=0, $imageRenderObj="image")      {
01022                         // Returns a markerArray ready for substitution with information for the tt_producst record, $row
01023                 $markerArray=array();
01024                         // Get image
01025                 $theImgCode="";
01026                 $imgs = explode(",",$row["image"]);
01027                 $val = $imgs[0];
01028                 while(list($c,$val)=each($imgs))        {
01029                         if ($c==$imageNum)      break;
01030                         if ($val)       {
01031                                 $this->conf[$imageRenderObj."."]["file"] = "uploads/pics/".$val;
01032                         } else {
01033                                 $this->conf[$imageRenderObj."."]["file"] = $this->conf["noImageAvailable"];
01034                         }
01035                         $theImgCode.=$this->cObj->IMAGE($this->conf[$imageRenderObj."."]);
01036                 }
01037                         // Subst. fields
01038                 $markerArray["###PRODUCT_TITLE###"] = $row["title"];
01039                 $markerArray["###PRODUCT_NOTE###"] = nl2br($row["note"]);
01040                 if (is_array($this->conf["parseFunc."]))        {
01041                         $markerArray["###PRODUCT_NOTE###"] = $this->cObj->parseFunc($markerArray["###PRODUCT_NOTE###"],$this->conf["parseFunc."]);
01042                 }
01043                 $markerArray["###PRODUCT_ITEMNUMBER###"] = $row["itemnumber"];
01044                 $markerArray["###PRODUCT_IMAGE###"] = $theImgCode;
01045                 $markerArray["###PRICE_TAX###"] = $this->priceFormat($this->getPrice($row["price"]));
01046                 $markerArray["###PRICE_NO_TAX###"] = $this->priceFormat($this->getPrice($row["price"],0));
01047                 $markerArray["###PRODUCT_INSTOCK###"] = $row["inStock"];
01048 
01049                 $markerArray["###CATEGORY_TITLE###"] = $catTitle;
01050 
01051                 $markerArray["###FIELD_NAME###"]="recs[tt_products][".$row["uid"]."]";
01052                 $markerArray["###FIELD_QTY###"]= $this->basket[$row["uid"]] ? $this->basket[$row["uid"]] : "";
01053 
01054                 if ($this->conf["itemMarkerArrayFunc"]) {
01055                         $markerArray = $this->userProcess("itemMarkerArrayFunc",$markerArray);
01056                 }
01057 
01058                 return $markerArray;
01059         }
01060 
01064         function userProcess($mConfKey,$passVar)        {
01065                 if ($this->conf[$mConfKey])     {
01066                         $funcConf = $this->conf[$mConfKey."."];
01067                         $funcConf["parentObj"]=&$this;
01068                         $passVar = $GLOBALS["TSFE"]->cObj->callUserFunction($this->conf[$mConfKey], $funcConf, $passVar);
01069                 }
01070                 return $passVar;
01071         }
01072 
01076         function addURLMarkers($markerArray)    {
01077                         // Add's URL-markers to the $markerArray and returns it
01078                 $markerArray["###FORM_URL###"] = $this->getLinkUrl($this->conf["PIDbasket"]);
01079                 $markerArray["###FORM_URL_INFO###"] = $this->getLinkUrl($this->conf["PIDinfo"] ? $this->conf["PIDinfo"] : $this->conf["PIDbasket"]);
01080                 $markerArray["###FORM_URL_FINALIZE###"] = $this->getLinkUrl($this->conf["PIDfinalize"] ? $this->conf["PIDfinalize"] : $this->conf["PIDbasket"]);
01081                 $markerArray["###FORM_URL_THANKS###"] = $this->getLinkUrl($this->conf["PIDthanks"] ? $this->conf["PIDthanks"] : $this->conf["PIDbasket"]);
01082                 $markerArray["###FORM_URL_TARGET###"] = "_self";
01083 //              debug($this->basketExtra["payment."]);
01084                 if ($this->basketExtra["payment."]["handleURL"])        {       // This handleURL is called instead of the THANKS-url in order to let handleScript process the information if payment by credit card or so.
01085                         $markerArray["###FORM_URL_THANKS###"] = $this->basketExtra["payment."]["handleURL"];
01086                 }
01087                 if ($this->basketExtra["payment."]["handleTarget"])     {       // Alternative target
01088                         $markerArray["###FORM_URL_TARGET###"] = $this->basketExtra["payment."]["handleTarget"];
01089                 }
01090                 return $markerArray;
01091         }
01092 
01096         function generateRadioSelect($key)      {
01097                         /*
01098                          The conf-array for the payment/shipping configuration has numeric keys for the elements
01099                          But there are also these properties:
01100 
01101                                 .radio          [boolean]       Enables radiobuttons instead of the default, selector-boxes
01102                                 .wrap           [string]        <select>|</select> - wrap for the selectorboxes.  Only if .radio is false. See default value below
01103                                 .template       [string]        Template string for the display of radiobuttons.  Only if .radio is true. See default below
01104 
01105                          */
01106                 $type=$this->conf[$key."."]["radio"];
01107                 $active = $this->basketExtra[$key];
01108                 $confArr = $this->cleanConfArr($this->conf[$key."."]);
01109                 $out="";
01110 
01111                 $template = $this->conf[$key."."]["template"] ? $this->conf[$key."."]["template"] : '<nobr>###IMAGE### <input type="radio" name="recs[tt_products]['.$key.']" onClick="submit()" value="###VALUE###"###CHECKED###> ###TITLE###</nobr><BR>';
01112                 $wrap = $this->conf[$key."."]["wrap"] ? $this->conf[$key."."]["wrap"] :'<select name="recs[tt_products]['.$key.']" onChange="submit()">|</select>';
01113 
01114                 while(list($key,$val)=each($confArr))   {
01115                         if ($val["show"] || !isset($val["show"]))       {
01116                                 if ($type)      {       // radio
01117                                         $markerArray=array();
01118                                         $markerArray["###VALUE###"]=intval($key);
01119                                         $markerArray["###CHECKED###"]=(intval($key)==$active?" checked":"");
01120                                         $markerArray["###TITLE###"]=$val["title"];
01121                                         $markerArray["###IMAGE###"]=$this->cObj->IMAGE($val["image."]);
01122                                         $out.=$this->cObj->substituteMarkerArrayCached($template, $markerArray);
01123                                 } else {
01124                                         $out.='<option value="'.intval($key).'"'.(intval($key)==$active?" selected":"").'>'.htmlspecialchars($val["title"]).'</option>';
01125                                 }
01126                         }
01127                 }
01128                 if (!$type)     {
01129                         $out=$this->cObj->wrap($out,$wrap);
01130                 }
01131                 return $out;
01132         }
01133         function cleanConfArr($confArr,$checkShow=0)    {
01134                 $outArr=array();
01135                 if (is_array($confArr)) {
01136                         reset($confArr);
01137                         while(list($key,$val)=each($confArr))   {
01138                                 if (!t3lib_div::testInt($key) && intval($key) && is_array($val) && (!$checkShow || $val["show"] || !isset($val["show"])))       {
01139                                         $outArr[intval($key)]=$val;
01140                                 }
01141                         }
01142                 }
01143                 ksort($outArr);
01144                 reset($outArr);
01145                 return $outArr;
01146         }
01150         function getBasket($subpartMarker="###BASKET_TEMPLATE###", $templateCode="", $mainMarkerArray=array())  {
01151                         /*
01152                                 Very central function in the library.
01153                                 By default it extracts the subpart, ###BASKET_TEMPLATE###, from the $templateCode (if given, else the default $this->templateCode)
01154                                 and substitutes a lot of fields and subparts.
01155                                 Any pre-preparred fields can be set in $mainMarkerArray, which is substituted in the subpart before the item-and-categories part is substituted.
01156 
01157                                 This function also calculates the internal arrays
01158 
01159                                 $this->calculatedBasket         - The basked elements, how many (quantity, count) and the price and total
01160                                 $this->calculatedSums_tax               - Sums of goods, shipping, payment and total amount WITH TAX included
01161                                 $this->calculatedSums_no_tax    - Sums of goods, shipping, payment and total amount WITHOUT TAX
01162 
01163                                 ... which holds the total amount, the final list of products and the price of payment and shipping!!
01164 
01165                         */
01166 
01167                 $templateCode = $templateCode ? $templateCode : $this->templateCode;
01168                 $this->calculatedBasket = array();              // array that holds the final list of items, shipping and payment + total amounts
01169 
01170                         // Get the products from the uid_list (initialized by the initBasket function)
01171                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tt_products', 'uid IN ('.$this->uid_list.') AND pid IN ('.$this->pid_list.')'.$this->cObj->enableFields('tt_products'));
01172                 $productsArray = array();
01173                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))               {
01174                         $productsArray[$row["pid"]][] = $row;           // Fills this array with the product records. Reason: Sorting them by category (based on the page, they reside on)
01175                 }
01176 
01177 
01178                         // Getting subparts from the template code.
01179                 $t=array();
01180                         // If there is a specific section for the billing address if user is logged in (used because the address may then be hardcoded from the database
01181                 $t["basketFrameWork"] = $this->cObj->getSubpart($templateCode,$this->spMarker($subpartMarker));
01182                 if (trim($this->cObj->getSubpart($t["basketFrameWork"],"###BILLING_ADDRESS_LOGIN###"))) {
01183                         if ($GLOBALS["TSFE"]->loginUser)        {
01184                                 $t["basketFrameWork"] = $this->cObj->substituteSubpart($t["basketFrameWork"], "###BILLING_ADDRESS###", "");
01185                         } else {
01186                                 $t["basketFrameWork"] = $this->cObj->substituteSubpart($t["basketFrameWork"], "###BILLING_ADDRESS_LOGIN###", "");
01187                         }
01188                 }
01189 
01190                 $t["categoryTitle"] = $this->cObj->getSubpart($t["basketFrameWork"],"###ITEM_CATEGORY###");
01191                 $t["itemFrameWork"] = $this->cObj->getSubpart($t["basketFrameWork"],"###ITEM_LIST###");
01192                 $t["item"] = $this->cObj->getSubpart($t["itemFrameWork"],"###ITEM_SINGLE###");
01193 
01194                 $pageArr=explode(",",$this->pid_list);
01195                 $currentP="";
01196                 $out="";
01197 
01198                         // Initialize traversing the items in the basket
01199                 $this->calculatedSums_tax=array();
01200                 $this->calculatedSums_no_tax=array();
01201 
01202                 while(list(,$v)=each($pageArr)) {
01203                         if (is_array($productsArray[$v]))       {
01204                                 reset($productsArray[$v]);
01205                                 $itemsOut="";
01206                                 while(list(,$row)=each($productsArray[$v]))     {
01207                                                 // Print Category Title
01208                                         if ($row["pid"]."_".$row["category"]!=$currentP)        {
01209                                                 if ($itemsOut)  {
01210                                                         $out.=$this->cObj->substituteSubpart($t["itemFrameWork"], "###ITEM_SINGLE###", $itemsOut);
01211                                                 }
01212                                                 $itemsOut="";                   // Clear the item-code var
01213                                                 $currentP = $row["pid"]."_".$row["category"];
01214                                                 if ($this->conf["displayBasketCatHeader"])      {
01215                                                         $markerArray=array();
01216                                                         $catTitle= $this->pageArray[$row["pid"]]["title"].($row["category"]?"/".$this->categories[$row["category"]]:"");
01217                                                         $this->cObj->setCurrentVal($catTitle);
01218                                                         $markerArray["###CATEGORY_TITLE###"]=$this->cObj->cObjGetSingle($this->conf["categoryHeader"],$this->conf["categoryHeader."], "categoryHeader");
01219                                                         $out.= $this->cObj->substituteMarkerArray($t["categoryTitle"], $markerArray);
01220                                                 }
01221                                         }
01222 
01223                                                 // Fill marker arrays
01224                                         $wrappedSubpartArray=array();
01225                                         $markerArray = $this->getItemMarkerArray ($row,$catTitle,1,"basketImage");
01226 
01227                                         $calculatedBasketItem = array(
01228                                                 "priceTax" => $this->getPrice($row["price"]),
01229                                                 "priceNoTax" => $this->getPrice($row["price"],0),
01230                                                 "count" => intval($this->basket[$row["uid"]]),
01231                                                 "rec" => $row
01232                                         );
01233                                         $calculatedBasketItem["totalTax"] = $calculatedBasketItem["priceTax"]*$calculatedBasketItem["count"];
01234                                         $calculatedBasketItem["totalNoTax"] = $calculatedBasketItem["priceNoTax"]*$calculatedBasketItem["count"];
01235                                         $markerArray["###PRICE_TOTAL_TAX###"]=$this->priceFormat($calculatedBasketItem["totalTax"]);
01236                                         $markerArray["###PRICE_TOTAL_NO_TAX###"]=$this->priceFormat($calculatedBasketItem["totalNoTax"]);
01237 
01238                                         $wrappedSubpartArray["###LINK_ITEM###"]=array('<A href="'.$this->getLinkUrl($this->conf["PIDitemDisplay"]).'&tt_products='.$row["uid"].'">','</A>');
01239                                                 // Substitute
01240                                         $itemsOut.= $this->cObj->substituteMarkerArrayCached($t["item"],$markerArray,array(),$wrappedSubpartArray);
01241 
01242                                         $this->calculatedSums_tax["goodstotal"]+= $calculatedBasketItem["totalTax"];
01243                                         $this->calculatedSums_no_tax["goodstotal"]+= $calculatedBasketItem["totalNoTax"];
01244                                         $this->calculatedBasket[] = $calculatedBasketItem;
01245                                 }
01246                                 if ($itemsOut)  {
01247                                         $out.=$this->cObj->substituteSubpart($t["itemFrameWork"], "###ITEM_SINGLE###", $itemsOut);
01248                                 }
01249                         }
01250                 }
01251 
01252                         // Initializing the markerArray for the rest of the template
01253                 $markerArray=$mainMarkerArray;
01254 
01255                         // This is the total for the goods in the basket.
01256                 $markerArray["###PRICE_GOODSTOTAL_TAX###"] = $this->priceFormat($this->calculatedSums_tax["goodstotal"]);
01257                 $markerArray["###PRICE_GOODSTOTAL_NO_TAX###"] = $this->priceFormat($this->calculatedSums_no_tax["goodstotal"]);
01258 
01259 
01260                         // Shipping
01261                 $this->calculatedSums_tax["shipping"]=doubleVal($this->basketExtra["shipping."]["priceTax"]);
01262                 $this->calculatedSums_no_tax["shipping"]=doubleVal($this->basketExtra["shipping."]["priceNoTax"]);
01263                 $perc = doubleVal($this->basketExtra["shipping."]["percentOfGoodstotal"]);
01264                 if ($perc)      {
01265                         $this->calculatedSums_tax["shipping"]+= $this->calculatedSums_tax["goodstotal"]/100*$perc;
01266                         $this->calculatedSums_no_tax["shipping"]+= $this->calculatedSums_no_tax["goodstotal"]/100*$perc;
01267                 }
01268                 if ($this->basketExtra["shipping."]["calculationScript"])       {
01269                         $calcScript = $GLOBALS["TSFE"]->tmpl->getFileName($this->basketExtra["shipping."]["calculationScript"]);
01270                         if ($calcScript)        {
01271                                 $this->includeCalcScript($calcScript,$this->basketExtra["shipping."]["calculationScript."]);
01272                         }
01273                 }
01274 
01275                 $markerArray["###PRICE_SHIPPING_PERCENT###"] = $perc;
01276                 $markerArray["###PRICE_SHIPPING_TAX###"] = $this->priceFormat($this->calculatedSums_tax["shipping"]);
01277                 $markerArray["###PRICE_SHIPPING_NO_TAX###"] = $this->priceFormat($this->calculatedSums_no_tax["shipping"]);
01278 
01279                 $markerArray["###SHIPPING_SELECTOR###"] = $this->generateRadioSelect("shipping");
01280                 $markerArray["###SHIPPING_IMAGE###"] = $this->cObj->IMAGE($this->basketExtra["shipping."]["image."]);
01281                 $markerArray["###SHIPPING_TITLE###"] = $this->basketExtra["shipping."]["title"];
01282 
01283 
01284                         // Payment
01285                 $this->calculatedSums_tax["payment"]=doubleVal($this->basketExtra["payment."]["priceTax"]);
01286                 $this->calculatedSums_no_tax["payment"]=doubleVal($this->basketExtra["payment."]["priceNoTax"]);
01287                 $perc = doubleVal($this->basketExtra["payment."]["percentOfGoodstotal"]);
01288                 if ($perc)      {
01289                         $this->calculatedSums_tax["payment"]+= $this->calculatedSums_tax["goodstotal"]/100*$perc;
01290                         $this->calculatedSums_no_tax["payment"]+= $this->calculatedSums_no_tax["goodstotal"]/100*$perc;
01291                 }
01292                 if ($this->basketExtra["payment."]["calculationScript"])        {
01293                         $calcScript = $GLOBALS["TSFE"]->tmpl->getFileName($this->basketExtra["payment."]["calculationScript"]);
01294                         if ($calcScript)        {
01295                                 $this->includeCalcScript($calcScript,$this->basketExtra["payment."]["calculationScript."]);
01296                         }
01297                 }
01298 
01299                 $markerArray["###PRICE_PAYMENT_PERCENT###"] = $perc;
01300                 $markerArray["###PRICE_PAYMENT_TAX###"] = $this->priceFormat($this->calculatedSums_tax["payment"]);
01301                 $markerArray["###PRICE_PAYMENT_NO_TAX###"] = $this->priceFormat($this->calculatedSums_no_tax["payment"]);
01302 
01303                 $markerArray["###PAYMENT_SELECTOR###"] = $this->generateRadioSelect("payment");
01304                 $markerArray["###PAYMENT_IMAGE###"] = $this->cObj->IMAGE($this->basketExtra["payment."]["image."]);
01305                 $markerArray["###PAYMENT_TITLE###"] = $this->basketExtra["payment."]["title"];
01306 
01307 
01308                         // This is the total for everything
01309                 $this->calculatedSums_tax["total"] = $this->calculatedSums_tax["goodstotal"];
01310                 $this->calculatedSums_tax["total"]+= $this->calculatedSums_tax["payment"];
01311                 $this->calculatedSums_tax["total"]+= $this->calculatedSums_tax["shipping"];
01312 
01313                 $this->calculatedSums_no_tax["total"] = $this->calculatedSums_no_tax["goodstotal"];
01314                 $this->calculatedSums_no_tax["total"]+= $this->calculatedSums_no_tax["payment"];
01315                 $this->calculatedSums_no_tax["total"]+= $this->calculatedSums_no_tax["shipping"];
01316 
01317                 $markerArray["###PRICE_TOTAL_TAX###"] = $this->priceFormat($this->calculatedSums_tax["total"]);
01318                 $markerArray["###PRICE_TOTAL_NO_TAX###"] = $this->priceFormat($this->calculatedSums_no_tax["total"]);
01319 
01320 
01321                         // Personal and delivery info:
01322                 $infoFields = explode(",","name,address,telephone,fax,email,company,city,zip,state,country");           // Fields...
01323                 while(list(,$fName)=each($infoFields))  {
01324                         $markerArray["###PERSON_".strtoupper($fName)."###"] = $this->personInfo[$fName];
01325                         $markerArray["###DELIVERY_".strtoupper($fName)."###"] = $this->deliveryInfo[$fName];
01326                 }
01327                         // Markers for use if you want to output line-broken address information
01328                 $markerArray["###PERSON_ADDRESS_DISPLAY###"] = nl2br($markerArray["###PERSON_ADDRESS###"]);
01329                 $markerArray["###DELIVERY_ADDRESS_DISPLAY###"] = nl2br($markerArray["###DELIVERY_ADDRESS###"]);
01330                         // Delivery note.
01331                 $markerArray["###DELIVERY_NOTE###"] = $this->deliveryInfo["note"];
01332                 $markerArray["###DELIVERY_NOTE_DISPLAY###"] = nl2br($markerArray["###DELIVERY_NOTE###"]);
01333 
01334 
01335                         // Order:       NOTE: Data exist only if the getBlankOrderUid() has been called. Therefore this field in the template should be used only when an order has been established
01336                 $markerArray["###ORDER_UID###"] = $this->getOrderNumber($this->recs["tt_products"]["orderUid"]);
01337                 $markerArray["###ORDER_DATE###"] = $this->cObj->stdWrap($this->recs["tt_products"]["orderDate"],$this->conf["orderDate_stdWrap."]);
01338                 $markerArray["###ORDER_TRACKING_NO###"] = $this->recs["tt_products"]["orderTrackingNo"];
01339 
01340                         // Fe users:
01341                 $markerArray["###FE_USER_USERNAME###"] = $GLOBALS["TSFE"]->fe_user->user["username"];
01342                 $markerArray["###FE_USER_UID###"] = $GLOBALS["TSFE"]->fe_user->user["uid"];
01343 
01344                         // URL
01345                 $markerArray = $this->addURLMarkers($markerArray);
01346                 $subpartArray = array();
01347                 $wrappedSubpartArray = array();
01348 
01349                         // Final substitution:
01350                 if (!$GLOBALS["TSFE"]->loginUser)       {               // Remove section for FE_USERs only, if there are no fe_user
01351                         $subpartArray["###FE_USER_SECTION###"]="";
01352                 }
01353                 $bFrameWork = $t["basketFrameWork"];
01354 //              debug(array($bFrameWork));
01355 //              debug($this->basketExtra["payment"]);
01356                 $subpartArray["###MESSAGE_SHIPPING###"] = $this->cObj->substituteMarkerArrayCached($this->cObj->getSubpart($bFrameWork,"###MESSAGE_SHIPPING_".$this->basketExtra["shipping"]."###"),$markerArray);
01357                 $subpartArray["###MESSAGE_PAYMENT###"] = $this->cObj->substituteMarkerArrayCached($this->cObj->getSubpart($bFrameWork,"###MESSAGE_PAYMENT_".$this->basketExtra["payment"]."###"),$markerArray);
01358 
01359                 $bFrameWork=$this->cObj->substituteMarkerArrayCached($t["basketFrameWork"],$markerArray,$subpartArray,$wrappedSubpartArray);
01360 
01361                         // substitute the main subpart with the rendered content.
01362                 $out=$this->cObj->substituteSubpart($bFrameWork, "###ITEM_CATEGORY_AND_ITEMS###", $out);
01363                 return $out;
01364         }
01365 
01366 
01367 
01368 
01369 
01370 
01371 
01372 
01373 
01374         // **************************
01375         // tracking information
01376         // **************************
01377 
01381         function shopAdmin()    {
01382                 $admin=0;
01383                 if ($GLOBALS["TSFE"]->beUserLogin)      {
01384                         if (t3lib_div::_GP("update_code")==$this->conf["update_code"])  {
01385                                 $admin= 1;              // Means that the administrator of the website is authenticated.
01386                         }
01387                 }
01388                 return $admin;
01389         }
01390 
01394         function getTrackingInformation($orderRow, $templateCode)       {
01395                         /*
01396 
01397 
01398 
01399                                         Tracking information display and maintenance.
01400 
01401                                         status-values are
01402                                         0:      Blank order
01403                                         1:      Order confirmed at website
01404                                         ...
01405                                         50-59:  User messages, may be updated by the ordinary users.
01406                                         100-:   Order finalized.
01407 
01408 
01409                                         All status values can be altered only if you're logged in as a BE-user and if you know the correct code (setup as .update_code in TypoScript config)
01410                         */
01411 
01412                 $admin = $this->shopAdmin();
01413 
01414                 if ($orderRow["uid"])   {
01415                                 // Initialize update of status...
01416                         $fieldsArray = array();
01417                         $orderRecord = t3lib_div::_GP("orderRecord");
01418                         if (isset($orderRecord["email_notify"]))        {
01419                                 $fieldsArray["email_notify"]=$orderRecord["email_notify"];
01420                                 $orderRow["email_notify"] = $fieldsArray["email_notify"];
01421                         }
01422                         if (isset($orderRecord["email"]))       {
01423                                 $fieldsArray["email"]=$orderRecord["email"];
01424                                 $orderRow["email"] = $fieldsArray["email"];
01425                         }
01426 
01427                         if (is_array($orderRecord["status"]))   {
01428                                 $status_log = unserialize($orderRow["status_log"]);
01429                                 reset($orderRecord["status"]);
01430                                 $update=0;
01431                                 while(list(,$val)=each($orderRecord["status"])) {
01432                                         if ($admin || ($val>=50 && $val<59))    {// Numbers 50-59 are usermessages.
01433                                                 $status_log_element = array(
01434                                                         "time" => time(),
01435                                                         "info" => $this->conf["statusCodes."][$val],
01436                                                         "status" => $val,
01437                                                         "comment" => $orderRecord["status_comment"]
01438                                                 );
01439                                                 if ($orderRow["email"] && $orderRow["email_notify"])    {
01440                                                         $this->sendNotifyEmail($orderRow["email"], $status_log_element, t3lib_div::_GP("tracking"), $this->getOrderNumber($orderRow["uid"]),$templateCode);
01441                                                 }
01442                                                 $status_log[] = $status_log_element;
01443                                                 $update=1;
01444                                         }
01445                                 }
01446                                 if ($update)    {
01447                                         $fieldsArray["status_log"]=serialize($status_log);
01448                                         $fieldsArray["status"]=$status_log_element["status"];
01449                                         if ($fieldsArray["status"] >= 100)      {
01450 
01451                                                         // Deletes any M-M relations between the tt_products table and the order.
01452                                                         // In the future this should maybe also automatically count down the stock number of the product records. Else it doesn't make sense.
01453                                                 $GLOBALS['TYPO3_DB']->exec_DELETEquery('sys_products_orders_mm_tt_products', 'sys_products_orders_uid='.intval($orderRow['uid']));
01454                                         }
01455                                 }
01456                         }
01457 
01458                         if (count($fieldsArray))        {               // If any items in the field array, save them
01459                                 $fieldsArray["tstamp"] = time();
01460 
01461                                 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('sys_products_orders', 'uid='.intval($orderRow["uid"]), $fieldsArray);
01462 
01463                                 $orderRow = $this->getOrderRecord($orderRow["uid"]);
01464                         }
01465                 }
01466 
01467 
01468 
01469 
01470                         // Getting the template stuff and initialize order data.
01471                 $content=$this->cObj->getSubpart($templateCode,"###TRACKING_DISPLAY_INFO###");
01472                 $status_log = unserialize($orderRow["status_log"]);
01473                 $orderData = unserialize($orderRow["orderData"]);
01474 
01475                         // Status:
01476                 $STATUS_ITEM=$this->cObj->getSubpart($content,"###STATUS_ITEM###");
01477                 $STATUS_ITEM_c="";
01478                 if (is_array($status_log))      {
01479                         reset($status_log);
01480                         while(list($k,$v)=each($status_log))    {
01481                                 $markerArray=Array();
01482                                 $markerArray["###ORDER_STATUS_TIME###"]=$this->cObj->stdWrap($v["time"],$this->conf["statusDate_stdWrap."]);
01483                                 $markerArray["###ORDER_STATUS###"]=$v["status"];
01484                                 $markerArray["###ORDER_STATUS_INFO###"]=$v["info"];
01485                                 $markerArray["###ORDER_STATUS_COMMENT###"]=nl2br($v["comment"]);
01486 
01487                                 $STATUS_ITEM_c.=$this->cObj->substituteMarkerArrayCached($STATUS_ITEM, $markerArray);
01488                         }
01489                 }
01490 
01491                 $subpartArray=array();
01492                 $subpartArray["###STATUS_ITEM###"]=$STATUS_ITEM_c;
01493 
01494 
01495 
01496 
01497                 $markerArray=Array();
01498 
01499                         // Display admin-interface if access.
01500                 if (!$GLOBALS["TSFE"]->beUserLogin)     {
01501                         $subpartArray["###ADMIN_CONTROL###"]="";
01502                 } elseif ($admin) {
01503                         $subpartArray["###ADMIN_CONTROL_DENY###"]="";
01504                 } else {
01505                         $subpartArray["###ADMIN_CONTROL_OK###"]="";
01506                 }
01507                 if ($GLOBALS["TSFE"]->beUserLogin)      {
01508                                 // Status admin:
01509                         if (is_array($this->conf["statusCodes."]))      {
01510                                 reset($this->conf["statusCodes."]);
01511                                 while(list($k,$v)=each($this->conf["statusCodes."]))    {
01512                                         if ($k!=1)      {
01513                                                 $markerArray["###STATUS_OPTIONS###"].='<option value="'.$k.'">'.htmlspecialchars($k.": ".$v).'</option>';
01514                                         }
01515                                 }
01516                         }
01517 
01518                                 // Get unprocessed orders.
01519                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,name,tracking_code,amount', 'sys_products_orders', 'NOT deleted AND status!=0 AND status<100', '', 'crdate');
01520                         while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))       {
01521                                 $markerArray["###OTHER_ORDERS_OPTIONS###"].='<option value="'.$row["tracking_code"].'">'.htmlspecialchars($this->getOrderNumber($row["uid"]).": ".$row["name"]." (".$this->priceFormat($row["amount"])." ".$this->conf["currencySymbol"].")").'</option>';
01522                         }
01523                 }
01524 
01525 
01526                         // Final things
01527                 $markerArray["###ORDER_HTML_OUTPUT###"] = $orderData["html_output"];            // The save order-information in HTML-format
01528                 $markerArray["###FIELD_EMAIL_NOTIFY###"] = $orderRow["email_notify"] ? " checked" : "";
01529                 $markerArray["###FIELD_EMAIL###"] = $orderRow["email"];
01530                 $markerArray["###ORDER_UID###"] = $this->getOrderNumber($orderRow["uid"]);
01531                 $markerArray["###ORDER_DATE###"] = $this->cObj->stdWrap($orderRow["crdate"],$this->conf["orderDate_stdWrap."]);
01532                 $markerArray["###TRACKING_NUMBER###"] = t3lib_div::_GP("tracking");
01533                 $markerArray["###UPDATE_CODE###"] = t3lib_div::_GP("update_code");
01534 
01535                 $content= $this->cObj->substituteMarkerArrayCached($content, $markerArray, $subpartArray);
01536                 return $content;
01537         }
01538 
01542         function sendNotifyEmail($recipient, $v, $tracking, $uid, $templateCode)        {
01543                         // Notification email
01544                 $headers=array();
01545                 if ($this->conf["orderEmail_from"])     {$headers[]="FROM: ".$this->conf["orderEmail_fromName"]." <".$this->conf["orderEmail_from"].">";}
01546 
01547                 $recipients = $recipient;
01548                 $recipients=t3lib_div::trimExplode(",",$recipients,1);
01549 
01550                 if (count($recipients)) {       // If any recipients, then compile and send the mail.
01551                         $emailContent=trim($this->cObj->getSubpart($templateCode,"###TRACKING_EMAILNOTIFY_TEMPLATE###"));
01552                         if ($emailContent)      {               // If there is plain text content - which is required!!
01553 
01554                                 $markerArray["###ORDER_STATUS_TIME###"]=$this->cObj->stdWrap($v["time"],$this->conf["statusDate_stdWrap."]);
01555                                 $markerArray["###ORDER_STATUS###"]=$v["status"];
01556                                 $markerArray["###ORDER_STATUS_INFO###"]=$v["info"];
01557                                 $markerArray["###ORDER_STATUS_COMMENT###"]=$v["comment"];
01558 
01559                                 $markerArray["###ORDER_TRACKING_NO###"]=$tracking;
01560                                 $markerArray["###ORDER_UID###"]=$uid;
01561 
01562                                 $emailContent=$this->cObj->substituteMarkerArrayCached($emailContent, $markerArray);
01563 
01564                                 $parts = split(chr(10),$emailContent,2);
01565                                 $subject=trim($parts[0]);
01566                                 $plain_message=trim($parts[1]);
01567 //                              debug(array($plain_message));
01568 
01569                                 $GLOBALS["TSFE"]->plainMailEncoded(implode($recipients,","), $subject, $plain_message, implode($headers,chr(10)));
01570 //                              debug($recipients);
01571                         }
01572                 }
01573         }
01574 }
01575 
01576 
01577 
01578 if (defined("TYPO3_MODE") && $TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/tt_products/pi/class.tx_ttproducts.php"])      {
01579         include_once($TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/tt_products/pi/class.tx_ttproducts.php"]);
01580 }
01581 
01582 
01583 ?>


Généré par Les spécialistes TYPO3 avec  doxygen 1.4.6