0

Like for example, I have the following code

if ($result == 1) {
    foreach ($records as $record) {
        $request_date = $record['date'];
        $request_starttime = $record['start_time'];
        echo $request_date . " " . $request_starttime;
    }
    throw new UserException("Unfortunately, this slot is already booked,please check another slot");
} else {
    //do something else
}

Here exception is showing fine, but the echo code before that in the block is not displaying on the page.

How I can achieve this?

The result of print_r($slots)

Array
(
    [0] => 2018-12-12 12:45:00
)
Array
(
    [0] => 2018-12-12 12:45:00
    [1] => 2018-12-12 13:00:00
)
Array
(
    [0] => 2018-12-12 12:45:00
    [1] => 2018-12-12 13:00:00
    [2] => 2018-12-12 13:15:00
)
Array
(
    [0] => 2018-12-12 12:45:00
    [1] => 2018-12-12 13:00:00
    [2] => 2018-12-12 13:15:00
    [3] => 2018-12-12 13:30:00
)

I have added the print_r($slots) just before the throw new userException line.

The more detailed code block is like this:

foreach ($order_item as $key => $value) {
                $order = new OrderItem();
                $class_info = ClassDuration::find()->where(['id' => $value['id']])->one();

                $end_date = date('Y-m-d', strtotime($model->create_date));

                //$p_price = $value['price'];

                $order->cd_id = $value['id'];
                $order->user_id = $UserId;
                $order->location_id = $value['location_id'];
                $order->instructor_id = $value['instructor_id'];
                                $order->date = $value['date1'];
                $order->start_time = $value['starttime'];
                $order->end_time = date("h:i",strtotime($value['endtime']));

                //$order->price = $p_price * $value['q'];
                $order->order_id = $model->id;
                                $instructor=$value['instructor_id'];
                                $date=$value['date1'];
                                $starttime =$value['starttime'];


                                $query = Yii::$app->db->createCommand("SELECT IF(EXISTS(SELECT * FROM `order_item` WHERE `instructor_id`='$instructor' and `date` = '$date'  AND `start_time` = '$starttime'), 1, 0)");
                                $query1 = Yii::$app->db->createCommand("SELECT * FROM `order_item` WHERE exists(select * FROM dual where `instructor_id`='$instructor' and `date` = '$date'  AND `start_time` = '$starttime')");
              $records=$query1->queryAll();
              $result=$query->queryScalar();
              //var_dump($result);exit;

              if ($result == 1) {
              foreach ($records as $record) {
              $request_date = $record['date'];
              $request_starttime = $record['start_time'];
              $slots[] = $request_date . " " . $request_starttime;

              }
                                print_r($slots);
                                $userMessage = "Unfortunately, this slot is already booked,please check another slot." . implode("<br />", $slots);
                                //throw new UserException($userMessage);   
                                //echo $userMessage;

                                }else{

                //$order->save();
                                }
                // $grand_total = $grand_total + $order->price;
                $ttl_dis = $ttl_dis;

            }
5
  • 2
    the exception will appear each time after the foreach() that you have inside the condition $result==1, not sure what you are doing here. how do you determine that the slot is not available ? and no text other than the mentioned as the exception text will be displayed Commented Dec 2, 2018 at 15:55
  • Hi Omer, I have two sql queries one is, which returns all the matching records for the classes being booked if exists and the second is it just returns 1 or 0 if record exist or not. Commented Dec 2, 2018 at 15:57
  • if $result==1 that is confirmed by the sql query before that. so the execption and the foreach part to show which slots already booked after the time customer added to cart and before he actually places the order. Commented Dec 2, 2018 at 16:00
  • just out of curiosity why do you have 2 queries for the same thing , why not get the sizeof() the first query's result set, which returns all the matching records for the classes being booked to determine if the slot is booked, other than that, you have those slots that are already booked inside the $records if i am getting you correctly and you want to display those slots along with the exception ? Commented Dec 2, 2018 at 16:02
  • Assuming there are no style rules on your page that would prohibit the text from displaying, it stands to reason that $records is empty, if the echo isn't showing anything. To get a better reading of the problem, you'll probably want to substitute the echo for an error_log(), keeping the same string. Commented Dec 2, 2018 at 16:09

1 Answer 1

3

You are trying to list the slots that are retrieved as already booked by another user inside $records, as the part of the text that you are showing in the exception, if that is correct then the exception will not allow you to show any other text except the one mentioned inside the exception message you should append the text with the exception message and then you can display it along with the message.

if ($result == 1) {
    foreach ($records as $record) {
        $request_date = $record['date'];
        $request_starttime = $record['start_time'];
        $slots[] = $request_date . " " . $request_starttime;
    }
    $userMessage = "Unfortunately, this slot is already booked,please check another slot." . implode("<br />", $slots);
    throw new UserException($userMessage);
} else {
    //do something else
}

Update

you should check for the slots before you save anything in the model and redirect to the view see the below code i added an extra function to checkSlots()

public function actionCheckout() {

    if( Yii::$app->user->isGuest ){
        return $this->redirect(['/site/login-popup']);
    }

    $session = Yii::$app->session;
    $model = new Order();
    //$profile = UserProfile::findOne(24);//(['id' => 27])->all();//->where(['id'=>Yii::$app->user->identity->id])->one();
    $user = User::findOne(['id' => Yii::$app->user->identity->id]);
    $profile = UserProfile::findOne(['user_id' => Yii::$app->user->identity->id]);
    $billinginfo = UserBillingInfo::findOne(['user_id' => Yii::$app->user->identity->id]);
    $userchildren = UserChildren::findOne(['user_id' => Yii::$app->user->identity->id]);
    $modelsKids = $user->kids;
    //var_dump($modelsKids);exit;
    //Customer::findOne(10);
    // var_dump($profile->zipcode);exit;
    $model->status = "unpaid";
    $model->first_name = Yii::$app->user->identity->first_name;
    $model->last_name = Yii::$app->user->identity->last_name;
    $model->mobile = Yii::$app->user->identity->phone;
    $model->email = Yii::$app->user->identity->email;
    $model->address = isset($profile->street1) ? $profile->street1 : '';
    $model->city = isset($profile->city) ? $profile->city : '';
    $model->state = isset($profile->state) ? $profile->state : '';
    $model->post_code = isset($profile->zipcode) ? $profile->zipcode : '';



    $pp = new PaypalPayment();

    $st = Yii::$app->getTable;
    $site_name = $st->settings('general', 'site_name');

    if( Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()) ){
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

    //$order_item = \Yii::$app->getRequest()->getCookies()->getValue('order_item');
    $order_item = $session['value'];

    if( count($order_item) <= 0 ){
        return $this->goHome();
    }

    $total = 0;

    for( $x = 0; $x < count($order_item); $x++ ){

        // $cart_p_p = $order_item[$x]['price'];
        // $total = $total + $cart_p_p * $order_item[$x]['q'];
    }

    if( Yii::$app->user->isGuest ){
        return $this->render('checkout', [
                    'model' => $model,
        ]);
    }


    $UserId = Yii::$app->user->identity->id;

    //check if all slots are available
    $allSlotsAvailable = $this->checkSlots($order_item);

    if( $model->load(Yii::$app->request->post()) && $allSlotsAvailable ){
        $user = User::findOne(['id' => Yii::$app->user->identity->id]);

        $profile = UserProfile::findOne(['user_id' => $user]);
        if( !empty($UserProfile) ){
            $profile = UserProfile::findOne(['user_id' => $user]);
        } else{
            $profile = new UserProfile();
        }

        $model->order_number = date('ymdhis');

        $model->create_date = date('Y-m-d H:i:s');
        $model->status = 1;
        $model->create_by = $UserId;
        // $model->order_amount = $total;
        //var_dump($_REQUEST);
        $user->phone = $_REQUEST['Order']['mobile'];
        $user->first_name = $_REQUEST['Order']['first_name'];
        $user->last_name = $_REQUEST['Order']['last_name'];
        $profile->user_id = $user->id;
        $profile->mobile = $_REQUEST['Order']['mobile'];
        $profile->street1 = $_REQUEST['Order']['address'];
        $profile->city = $_REQUEST['Order']['city'];
        $profile->state = $_REQUEST['Order']['state'];
        $profile->zipcode = $_REQUEST['Order']['post_code'];
        $profile->save(false);

        if( !empty($_REQUEST['Order']['kids']) ){
            $model->kids = serialize($_REQUEST['Order']['kids']);
        }
        $model->save();
        $user->save();

        $model->orderUpdate($model->id, 1, NULL);

        $grand_total = 0;
        $ttl_dis = 0;



        foreach( $order_item as $key => $value ){
            $order = new OrderItem();
            $class_info = ClassDuration::find()->where(['id' => $value['id']])->one();

            $end_date = date('Y-m-d', strtotime($model->create_date));

            //$p_price = $value['price'];

            $order->cd_id = $value['id'];
            $order->user_id = $UserId;
            $order->location_id = $value['location_id'];
            $order->instructor_id = $value['instructor_id'];
            $order->date = $value['date1'];
            $order->start_time = $value['starttime'];
            $order->end_time = date("h:i", strtotime($value['endtime']));

            //$order->price = $p_price * $value['q'];
            $order->order_id = $model->id;

            $order->save();

            // $grand_total = $grand_total + $order->price;
            $ttl_dis = $ttl_dis;
        }



        $model->order_amount = $grand_total;

        $model->save();


        $session->remove('date1');
        $session->remove('time1');

        Yii::$app->session->setFlash('orderPlaced');



        $link = '#';



        if( $model->payment_method == 'paypal' ){

            $new_array = $order_item;

            $pp->addMultipleItems($new_array);

            return $pp->getCheckoutForm($model->id);
        } elseif( $model->payment_method == 'invoice' ){

            $content = $this->renderPartial('_invoice', ['model' => $model]);
            //var_dump($content);
            $filename = 'web/customer-invoice/invoice' . $model->id . '.pdf';

            $pdf = new Pdf(['format' => Pdf::FORMAT_A4]);
            $mpdf = $pdf->api;
            $stylesheet = file_get_contents('themes/common/css/print/invoice.css');
            $mpdf->WriteHTML($stylesheet, 1);
            $mpdf->WriteHtml($content);
            $mpdf->Output($filename, 'F');

            $from_email = $st->settings('email', 'from_email');
            $from_name = $st->settings('email', 'from_name');

            $user = User::findOne($UserId);

            $to = $user['email'];

            $email_template = $st->email_template(10);

            \Yii::$app->mailer->compose('template', ['id' => 10, 'user_id' => $UserId,
                        'email_template' => $email_template,
                        'model' => $model,
                        'link' => $link])
                    ->setFrom([$from_email => $from_name])
                    ->setTo($to)
                    ->setSubject($email_template['subject'] . ' ' . $site_name)
                    ->attach($filename)
                    ->send();
        } elseif( $model->payment_method == 'booking' ){
            $admin = User::find()->select('email')->where(['user_role' => 'admin'])->asArray()->all();
            $admin = ArrayHelper::getColumn($admin, 'email');


            $content = $this->renderPartial('_booking', ['model' => $model]);
            //  var_dump($content);
            $filename = 'web/customer-booking/booking' . $model->id . '.pdf';

            $pdf = new Pdf(['format' => Pdf::FORMAT_A4]);
            $mpdf = $pdf->api;
            $stylesheet = file_get_contents('themes/common/css/print/invoice.css');
            $mpdf->WriteHTML($stylesheet, 1);
            $mpdf->WriteHtml($content);
            $mpdf->Output($filename, 'F');

            $from_email = $st->settings('email', 'from_email');
            $from_name = $st->settings('email', 'from_name');

            $user = User::findOne($UserId);
            $orderid = Order::find(['created_by' => $user->id])->select('id')->orderBy('create_date DESC')->one();
            $instructor_id = OrderItem::find()->select('instructor_id')->where(['order_id' => $orderid])->distinct();
            $Instructor = User::findOne($instructor_id);
            // var_dump($instructor_id);exit;
            // $admin = ArrayHelper::getColumn($admin, 'email');

            $to = $user['email'];
            $instructor_email = $Instructor['email'];
            $admin[] = $to;
            $admin[] = $instructor_email;
            //  $to .= $Instructor['email'];

            $email_template = $st->email_template(10);

            \Yii::$app->mailer->compose('template', ['id' => 10, 'user_id' => $UserId,
                        'email_template' => $email_template,
                        'model' => $model,
                        'link' => $link])
                    ->setFrom([$from_email => $from_name])
                    ->setTo($admin)
                    ->setSubject($email_template['subject'] . ' ' . $site_name)
                    ->attach($filename)
                    ->send();
        }

        //Yii::$app->response->cookies->remove('order_item');
        unset($session['value']);

        return $this->redirect(Yii::getAlias('@web') . '/order/view?id=' . $model->id);
        //return $this->redirect('result');
    } else{
        return $this->render('checkout', [
                    'model' => $model,
                        //  'modelsKids' => (empty($modelsKids)) ? [new UserChildren] : $modelsKids,
        ]);
    }
}

private function checkSlots($order_items) {
    $slots = [];
    foreach( $order_items as $item ){
        $instructor = $item['instructor_id'];
        $date = $item['date1'];
        $starttime = $item['starttime'];

        $query = Yii::$app->db->createCommand("SELECT IF(EXISTS(SELECT * FROM `order_item` WHERE `instructor_id`='$instructor' and `date` = '$date'  AND `start_time` = '$starttime'), 1, 0)");
        $result = $query->queryScalar();
        if( $result == 1 ){
            $slots[] = $date . " " . $starttime;
        }
    }

    if( sizeof($slots) ){
        Yii::$app->session->setFlash('error', "Unfortunately, this slot is already booked,please check another slot<br />".implode("<br />", $slots));
        return false;
    } else{
        return true;
    }
}

in the function checkSlots($order_items) you will see that I have removed one of your queries

$query1 = Yii::$app->db->createCommand("SELECT * FROM `order_item` WHERE exists(select * FROM dual where `instructor_id`='$instructor' and `date` = '$date'  AND `start_time` = '$starttime')"); 

as its un-necessary to retrieve the records for the same date and start_time that you are querying with, and just use the result from the first query and add the date and start time to the $slots and once all records are checked and if there are any reserved slots the method returns false and the view will be displayed along with the flash message that will show all those slots that are reserved.

Sign up to request clarification or add additional context in comments.

15 Comments

Hi Omer I don't know, but it is showing only the first slot in the exception block. but if I just echo $userMessage it shows all the message with some repetitions though.
@Joshi it works correctly for me and displays all the slots that are inside the $slots array , you might need to check the UserException that you are using i used simple \Exception()
i just checked and it works correctly with the UserException too
Hmm. what I am doing wrong then? strange. what else I must check Omer?
well try changing the $slots = $request_date . " " . $request_starttime; to $slots. = $request_date . " " . $request_starttime."<br />";
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.