20 class Order extends CActiveRecord
34 public static function model($className=__CLASS__)
55 array(
'ordered',
'numerical',
'integerOnly'=>
true),
56 array(
'shipping_info, payment_info',
'length',
'max'=>1024),
57 array(
'user_id',
'length',
'max'=>10),
60 array(
'id, ordered, user_id, tmp_user_id, shipping_info, payment_info',
'safe',
'on'=>
'search'),
61 array(
'verifyCode',
'captcha',
'allowEmpty'=>!Yii::app()->user->isGuest || !CCaptcha::checkRequirements() || !Yii::app()->getModule(
'shoppingcart')->captchaEnabled,
'captchaAction' =>
'/shoppingcart/shoppingcart/captcha'),
73 'order_items' => array(self::HAS_MANY,
'Item',
'order_id'),
83 'condition'=>
'ordered='.self::ORDERED,
86 'condition'=>
'ordered='.self::PROCESS,
110 public static function getOrder($id_only =
false){
112 $user_id = self::getUser(
true);
113 if($user_id ===
false){
116 $cacheId = self::getOrderCacheId($user_id);
117 if (!($model = Yii::app()->cache->get($cacheId,
false))) {
118 $model =
self::model()->process()->find(
'user_id=:user_id',array(
':user_id' =>$user_id));
119 if (!isset($model)) {
121 $model->user_id = $user_id;
124 Yii::app()->cache->set($cacheId, $model, Yii::app()->getModule(
'shoppingcart')->cacheTime);
127 return $id_only? $model->id: $model;
134 public static function getUser($id_only =
false)
136 $user_id = Yii::app()->user->getState(
'user_id', null);
137 $cacheId = self::getUserCacheId($user_id);
138 if (!(isset($user_id) && $user = Yii::app()->cache->get($cacheId,
false))) {
140 if (!isset($user_id) && isset(Yii::app()->user->id)) {
141 $user =
TmpUser::model()->with(
'order')->find(
't.parent_user_id=:parent_user_id AND order.ordered=:process',
142 array(
':parent_user_id'=>Yii::app()->user->id,
':process'=>Order::PROCESS));
144 if (!isset($user_id) && !isset($user)) {
145 $user_id = (string)Yii::app()->request->cookies[
'user_id'];
147 if (isset($user_id) && !isset($user)) {
151 if(self::getItemIsAdded()){
153 if(isset(Yii::app()->user->id)){
154 $user->parent_user_id = Yii::app()->user->id;
157 Yii::app()->user->setState(
'user_id', $user->id);
158 if (!headers_sent()) {
159 $cookie =
new CHttpCookie(
'user_id', $user->id);
160 $cookie->expire = time()+60 * Yii::app()->getModule(
'shoppingcart')->max_lifetime;
161 $cookie->domain=Yii::app()->getModule(
'shoppingcart')->cookie_domain;
162 Yii::app()->request->cookies[
'user_id'] = $cookie;
168 if (isset(Yii::app()->user->id) && !isset($user->parent_user_id)) {
169 $user->parent_user_id = Yii::app()->user->id;
170 $user->save(
false, array(
'parent_user_id'));
173 $cacheId = self::getUserCacheId($user->id);
174 Yii::app()->cache->set($cacheId, $user, Yii::app()->getModule(
'shoppingcart')->cacheTime);
177 return $id_only? $user->id: $user;
183 public static function getItemIsAdded(){
184 return (Yii::app()->controller->id ===
'item'
185 && Yii::app()->controller->action->id ===
'add')
186 || Yii::app()->controller->id ===
'phpunit';
193 public static function getUserCacheId($user_id){
194 $cache_id = $user_id;
195 if (isset(Yii::app()->user->id)) {
196 $cache_id .= Yii::app()->user->id;
198 return "customer_" . md5($cache_id);
205 public static function getOrderCacheId($user_id){
206 return 'order_' . md5($user_id);
213 public static function getOrderItemsCacheId($user_id){
214 return 'order_items_' . md5($user_id);
220 public static function flushOrder(){
221 $user_id = self::getUser(
true);
223 self::getOrderCacheId($user_id),
224 self::getOrderItemsCacheId($user_id)
226 foreach ($idsToFlush as $cacheId) {
227 Yii::app()->cache->delete($cacheId);
239 $criteria=
new CDbCriteria;
241 $criteria->compare(
'id',$this->
id,
true);
242 $criteria->compare(
'ordered',$this->ordered);
243 $criteria->compare(
'user_id',$this->user_id,
true);
244 $criteria->compare(
'shipping_info',$this->shipping_info,
true);
245 $criteria->compare(
'payment_info',$this->order_info,
true);
247 return new CActiveDataProvider($this, array(
248 'criteria'=>$criteria,
260 $max_lifetime = Yii::app()->getModule(
'shoppingcart')->max_lifetime;
262 $connection = Yii::app()->db;
265 Yii::beginProfile(
'garbageCollector');
267 $ordersToRemove = $command=$connection
269 "SELECT ProcessOrder.id AS order_id,
270 ProcessOrder.user_id,
271 IF((DATE_ADD(IFNULL(MAX(Item.ordered_at),ProcessOrder.started_at), INTERVAL :max_lifetime MINUTE) < NOW()) , TRUE , FALSE) AS order_to_remove,
272 IF((COUNT(OrderedOrder.id) < 1) , TRUE, FALSE) AS user_to_remove
273 FROM {{order}} AS ProcessOrder
274 LEFT JOIN {{item}} AS Item
275 ON ProcessOrder.id = Item.order_id
276 LEFT JOIN {{order}} AS OrderedOrder
277 ON ProcessOrder.user_id = OrderedOrder.user_id AND OrderedOrder.ordered = :ordered
278 WHERE ProcessOrder.ordered=:process GROUP BY ProcessOrder.id
279 HAVING order_to_remove = TRUE")
281 ':max_lifetime' => $max_lifetime,
282 ':ordered' => Order::ORDERED,
283 ':process' => Order::PROCESS
288 foreach($ordersToRemove as $order){
289 $orderIds[] = $order[
'order_id'];
290 if($order[
'user_to_remove']){
291 $userIds[] = $order[
'user_id'];
294 $orderIds = array_unique($orderIds);
295 $userIds = array_unique($userIds);
297 if(count($orderIds)){
298 $criteria=
new CDbCriteria;
299 $criteria->addInCondition(
'order_id', $orderIds);
303 if(count($orderIds)){
304 $criteria=
new CDbCriteria;
305 $criteria->addInCondition(
'id', $orderIds);
309 if(count($orderIds)){
310 $criteria=
new CDbCriteria;
311 $criteria->addInCondition(
'id', $userIds);
314 Yii::endProfile(
'garbageCollector');
323 $user_id = self::getUser(
true);
324 $cacheId = self::getOrderItemsCacheId($user_id);
325 if (!($data = Yii::app()->cache->get($cacheId,
false))) {
326 $data = $this->order_items;
327 Yii::app()->cache->set($cacheId, $data, Yii::app()->getModule(
'shoppingcart')->cacheTime);