<?php
/**
* СодеÑÐ¶Ð¸Ñ ÐºÐ»Ð°ÑÑ Basket
*
* @package energine
* @subpackage shop
* @author dr.Pavka
* @copyright ColoCall 2006
* @version $Id: Basket.class.php,v 1.7 2007/12/17 14:24:29 pavka Exp $
*/
//require_once('core/framework/DBWorker.class.php');
//require_once('core/modules/shop/components/Discounts.class.php');
//require_once('core/modules/shop/components/CurrencyConverter.class.php');
/**
* ÐоÑзина Ñ Ð²ÑбÑаннÑми пÑодÑкÑами
*
* @package energine
* @subpackage shop
*/
class Basket extends DBWorker {
/**
* @access private
* @static
* @var Basket единÑй Ð´Ð»Ñ Ð²Ñей ÑиÑÑÐµÐ¼Ñ ÑкземплÑÑ ÐºÐ»Ð°ÑÑа Basket
*/
private static $instance;
/**
* ÐÐ¼Ñ ÑаблиÑÑ ÑодеÑжаÑей даннÑе коÑзинÑ
*
* @var string
* @access private
*/
private $tableName;
/**
* ÐденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкого ÑеанÑа
*
* @var int
* @access private
*/
private $id;
/**
* СодеÑжание коÑзинÑ
*
* @var array
* @access private
*/
private $contents = array();
/**
* @access private
* @var Discounts Ñкидки
*/
private $discounts;
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа
*
* @access public
*/
public function __construct() {
parent::__construct();
$this->tableName = 'shop_basket';
$this->id = UserSession::getInstance()->getID();
$this->discounts = Discounts::getInstance();
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÐµÐ´Ð¸Ð½Ñй Ð´Ð»Ñ Ð²Ñей ÑиÑÑÐµÐ¼Ñ ÑкземплÑÑ ÐºÐ»Ð°ÑÑа UserSession.
*
* @access public
* @static
* @return Basket
*/
public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new Basket;
}
return self::$instance;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¸Ð¼Ñ ÑаблиÑÑ
*
* @return string
* @access protected
*/
protected function getTableName() {
return $this->tableName;
}
/**
* Ðобавление ÑоваÑа в коÑзинÑ
*
* @param int иденÑиÑикаÑÐ¾Ñ Ð¿ÑодÑкÑа
* @param int колиÑеÑÑво позиÑий
* @return void
* @access public
*/
public function put($productID, $productCount = 1) {
$this->dbh->modifyRequest(
'INSERT INTO '.$this->getTableName().' (product_id, session_id, basket_count) VALUES (%s, %s, %s) '.
'ON DUPLICATE KEY UPDATE basket_count=basket_count+1',
$productID,
$this->id,
$productCount
);
}
/**
* ÐеÑеÑÑиÑÑÐ²Ð°ÐµÑ ÑоваÑÑ Ð² коÑзине
*
* @param array
* @return void
* @access public
*/
public function recount($contents) {
if(is_array($contents))
foreach ($_POST['recount'] as $productID => $productCount) {
$this->update($productID, $productCount);
}
}
/**
* ÐзменÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво позиÑий пÑодÑкÑа
*
* @param int иденÑиÑикаÑÐ¾Ñ Ð¿ÑодÑкÑа
* @param int колиÑеÑÑво позиÑий
* @return void
* @access public
*/
public function update($productID, $productCount) {
$this->dbh->modify(QAL::UPDATE , $this->getTableName(), array('basket_count' => $productCount), array('session_id'=>$this->id, 'product_id'=>$productID));
}
/**
* УдалÑÐµÑ ÑÐ¾Ð²Ð°Ñ Ð¸Ð· коÑзинÑ
*
* @param int иденÑиÑикаÑÐ¾Ñ Ð¿ÑодÑкÑа
* @return void
* @access public
*/
public function takeOut($productID) {
$this->dbh->modify(QAL::DELETE, $this->getTableName(), null, array('session_id'=>$this->id, 'basket_id'=>$productID));
}
/**
* ÐÑиÑÐ°ÐµÑ ÐºÐ¾ÑзинÑ
*
* @return void
* @access public
*/
public function purify() {
$this->dbh->modify(QAL::DELETE, $this->getTableName(), null, array('session_id'=>$this->id));
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑÑммаÑнÑÑ ÑÑоимоÑÑÑ ÑоваÑов в коÑзине Ñ ÑÑеÑом Ñкидки.
*
* @return float
* @access public
*/
public function getTotal($withDiscount = false) {
$contents = $this->getContents(false);
$summ = 0;
if(is_array($contents)) {
foreach ($contents as $row) {
if ($withDiscount) {
$summ += $this->discounts->calculateCost($row['product_summ']);
}
else {
//inspect($row['product_summ']);
$summ += $row['product_summ'];
}
}
}
$converter = CurrencyConverter::getInstance();
$HRNID = $converter->getCurrent();
return $converter->format($converter->convert($summ, $HRNID, $contents[0]['curr_id']), $HRNID);
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑодеÑжимое коÑзинÑ
*
* @param bool
* @return array
* @access public
* @see QAL::select()
*/
public function getContents($formattedOutput = true) {
$result = $this->dbh->selectRequest(
'SELECT main.*, pt.product_name, ext.product_price, ext.product_price*main.basket_count as product_summ, ext.product_price * (1 - dscnt.dscnt_percent / 100) AS product_summ_with_discount, ext.curr_id, product.product_segment '.
'FROM '.$this->getTableName().' main '.
'LEFT JOIN shop_products product ON product.product_id = main.product_id '.
'LEFT JOIN shop_products_translation pt ON pt.product_id = main.product_id '.
'LEFT JOIN shop_product_external_properties ext ON ext.product_code = product.product_code '.
'LEFT JOIN shop_discounts dscnt ON dscnt.group_id = '.$this->discounts->getDefaultGroup().' '.
'WHERE pt.lang_id = %s AND session_id = %s',
Language::getInstance()->getCurrent(),
$this->id
);
if (is_array($result)) {
if($formattedOutput) $result = array_map(array($this, 'prepare'), $result);
$this->contents = $result;
}
else {
$this->contents = false;
}
return $this->contents;
}
/**
* ÐбÑабоÑка коÑзинÑ
*
* @return array
* @access private
*/
private function prepare($row) {
$converter = CurrencyConverter::getInstance();
$HRNID = $converter->getCurrent();
$row['product_price'] = $converter->format($converter->convert($row['product_price'], $HRNID, $row['curr_id']),$HRNID);
$row['product_summ'] = $converter->format($converter->convert($row['product_summ'], $HRNID, $row['curr_id']),$HRNID);
return $row;
}
}