/** * @inheritdoc */ public function markAsRead(Message &$dialog) { $result = Message::updateAll(['read' => Message::STATUS_READ], ArrayHelper::merge($dialog->getAttributes(['from', 'to']), ['read' => Message::STATUS_UNREAD])); if ($result) { $dialog->read = Message::STATUS_READ; } }
public function watchedSearch($params) { $query = Yii::$app->user->identity->getRecentlyProducts()->select(['{{product}}.*', 'IF(round(sum(product_review.rating) / count(product.reviews_count)) IS NULL, 0, rating) as rating'])->joinWith(['productReviews', 'recentProducts'])->groupBy('{{product}}.id'); $sort = new Sort(['defaultOrder' => ['recent' => SORT_ASC], 'attributes' => ArrayHelper::merge(['recent' => ['asc' => ['recent_product.created_at' => SORT_DESC], 'label' => 'Recently', 'defaultOrder' => SORT_ASC], 'old' => ['asc' => ['recent_product.created_at' => SORT_ASC], 'label' => 'Old', 'defaultOrder' => SORT_ASC]], Product::getSortAttributes())]); $viewSort = new Sort(['sortParam' => 'view', 'attributes' => [Product::VIEW_SORT_LIST, Product::VIEW_SORT_BLOCK]]); $this->load($params); $sortParam = Yii::$app->request->getQueryParam('view'); $dataProvider = new ActiveDataProvider(['query' => $query, 'sort' => $sort, 'pagination' => ['pageSizeParam' => false, 'pageSize' => $sortParam === Product::VIEW_SORT_BLOCK ? self::FAVORITES_PAGINATION_SIZE_BLOCK : self::FAVORITES_PAGINATION_SIZE_LIST]]); Yii::$app->controller->view->params['viewSort'] = $viewSort; Yii::$app->controller->view->params['sort'] = $sort; Yii::$app->controller->view->params['searchModel'] = $this; if (!$this->validate()) { // uncomment the following line if you do not want to return any records when validation fails // $query->where('0=1'); return $dataProvider; } $query->andFilterWhere(['id' => $this->id, 'active' => $this->active, 'reviews_count' => $this->reviews_count, 'brand_id' => $this->brand_id, 'comment_count' => $this->comment_count, 'category_id' => $this->category_id, 'UI' => $this->ui]); $query->andFilterWhere(['like', 'title', $this->title])->andFilterWhere(['like', 'full_description', $this->full_description])->andFilterWhere(['like', 'short_description', $this->short_description])->andFilterWhere(['like', 'description', $this->description])->andFilterWhere(['like', 'ui', $this->ui]); return $dataProvider; }
use common\components\ArrayHelper; use frontend\helpers\String; /* @var $this yii\web\View */ /* @var $products \common\models\Product[] */ /* @var $pagination \yii\data\Pagination */ /* @var $widget \frontend\widgets\ProductsList */ ?> <div class="catalog-list"> <?php foreach ($products as $product) { ?> <div class="catalog-item product"> <div class="catalog-check"><label class="checkbox-style"><input type="checkbox"><i></i> In comparison</label></div> <?php echo WishListIcon::widget(ArrayHelper::merge(['product' => $product], $widget->wishIconOptions)); ?> <div class="catalog-img"><a href="<?php echo $product->getRoute(); ?> "><?php echo Html::img($product->getMainImagePath()); ?> </a></div> <div class="catalog-cont"> <h3><a href="<?php echo $product->getRoute(); ?> "><?php echo $product->title; ?>
/** * Updates an existing Product model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed * @throws ErrorException * @throws Exception * @throws NotFoundHttpException * @throws \yii\base\Exception */ public function actionUpdate($id) { $model = $this->findModel($id); $model->scenario = $model::SCENARIO_UPDATE; $videos = $model->videos; Model::setScenarios($videos, ProductVideo::SCENARIO_PRODUCT_UPDATE); $properties = $model->productProperties; Model::setScenarios($properties, ProductProperty::SCENARIO_PRODUCT_UPDATE); if ($model->load($post = Yii::$app->request->post())) { $oldVideoIds = ArrayHelper::map($videos, 'id', 'id'); $oldPropertyIds = ArrayHelper::map($properties, 'id', 'id'); $videos = Model::createMultiple(ProductVideo::classname(), $videos); $properties = Model::createMultiple(ProductProperty::classname(), $properties); Model::setScenarios($videos, ProductVideo::SCENARIO_PRODUCT_UPDATE); Model::setScenarios($properties, ProductProperty::SCENARIO_PRODUCT_UPDATE); Model::loadMultiple($videos, Yii::$app->request->post()); Model::loadMultiple($properties, Yii::$app->request->post()); $deletedVideoIds = array_diff($oldVideoIds, array_filter(ArrayHelper::map($videos, 'id', 'id'))); $deletedPropertyIds = array_diff($oldPropertyIds, array_filter(ArrayHelper::map($properties, 'id', 'id'))); Model::validateDuplicates($properties, 'property_id'); // ajax validation if (Yii::$app->request->isAjax) { Yii::$app->response->format = Response::FORMAT_JSON; return ArrayHelper::merge(ActiveForm::validate($model), ActiveForm::validateMultiple($properties, false), ActiveForm::validateMultiple($videos)); } if ($model->validate() && Model::validateMultiple($properties) && Model::validateMultiple($videos)) { $transaction = $model->getDb()->beginTransaction(); $oldMainPhoto = $model->getOldAttribute('main_photo'); $model->main_photo = UploadedFile::getInstance($model, 'main_photo'); try { if (!($category = Category::findOne(['id' => $model->category_id]))) { throw new \yii\base\Exception(); } if ($model->main_photo) { if (!$model->save(false)) { throw new ErrorException(); } $model->removeMainPhotoFromFolder($oldMainPhoto); if (!$model->upload()) { throw new \yii\base\Exception(); } } else { $model->setAttribute('main_photo', $oldMainPhoto); if (!$model->save(false)) { throw new \yii\base\Exception(); } } ProductVideo::deleteAll(['id' => $deletedVideoIds]); ProductProperty::deleteAll(['id' => $deletedPropertyIds]); Model::linkAll($model, $properties, 'productProperties'); Model::unsetEmpty($videos, 'video'); Model::linkAll($model, $videos, 'videos'); $model->savePhotos(); $transaction->commit(); Yii::$app->session->setFlash('success', 'Product have been updated.'); return $this->redirect('index'); } catch (Exception $e) { Yii::$app->session->setFlash('error', 'Failed to update product.'); $transaction->rollBack(); return $this->redirect('index'); } } } $model->clearTmpPhotos(); return $this->render('update', ['model' => $model, 'videos' => empty($videos) ? [new ProductVideo()] : $videos, 'properties' => empty($properties) ? [new ProductProperty()] : $properties, 'category' => Category::findOne(['id' => $model->category_id])]); }
<h2>Photos 360</h2> <!-- Photos --> <div class="form-group photos"> <?php echo \kartik\file\FileInput::widget(['id' => 'photo360-upload', 'name' => 'photo360[]', 'options' => ['multiple' => true], 'pluginOptions' => ArrayHelper::merge($model->getPhoto360Config(), ['overwriteInitial' => false, 'showRemove' => false, 'showUpload' => false, 'uploadAsync' => true, 'allowedFileTypes' => ['image'], 'maxFileSize' => 1024, 'uploadUrl' => Url::to(['product/upload-temp-photo360']), 'uploadExtraData' => ['product_id' => $model->isNewRecord ? $model->id : '']])]); ?> </div> <h2>Photos</h2> <!-- Photos --> <div class="form-group photos"> <?php echo \kartik\file\FileInput::widget(['id' => 'photo-upload', 'name' => 'photo[]', 'options' => ['multiple' => true], 'pluginOptions' => ArrayHelper::merge($model->getPhotoConfig(), ['overwriteInitial' => false, 'showRemove' => false, 'showUpload' => false, 'allowedFileTypes' => ['image'], 'maxFileSize' => 1024, 'uploadUrl' => Url::to(['product/upload-temp-photo']), 'uploadExtraData' => ['product_id' => $model->isNewRecord ? $model->id : '']])]); ?> </div> <!-- Videos --> <?php \wbraganca\dynamicform\DynamicFormWidget::begin(['widgetContainer' => 'video_dynamicform_wrapper', 'widgetBody' => '.video-container', 'widgetItem' => '.video-panel-body', 'min' => 1, 'insertButton' => '.add-item', 'deleteButton' => '.video-button-remove ', 'model' => new ProductVideo(), 'formId' => 'product-form', 'formFields' => ['video']]); ?> <div class="container-items"><!-- widgetContainer --> <div class="video-item item panel panel-default"><!-- widgetBody --> <div class="panel-heading"> <h3 class="panel-title pull-left">Videos - please, insert <b>youtube</b> video <b>ID</b> (https://www.youtube.com/watch?v=<b>id_here</b>)</h3> <div class="pull-right"> <button type="button" class="add-item btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button> </div>