'div', 'view' => 'list-comment', 'class' => 'test-class', ]; /** * @var array Options sent to success part */ public $success_options = [ 'tag' => 'div', 'content' => NULL, 'class' => 'test-class-success', ]; /** * @var array Options sent to form part */ public $form_options = [ 'tag' => 'div', 'view' => 'form-comment', 'class' => 'test-class-form', ]; /** * @var bool Indicates whether any successful action happened */ protected $isSuccess = false; public $success_text = 'Comment successfully added'; /** * @var string $model Model, to which comments attached */ public $model; /** * @var integer $model_id Model id, to which comments attached */ public $model_id; /** * @var string Template of the widget. You may use {success}, {form}, {list} * to render particular parts. You are also able to use common HTML here. */ public $template = "{success}\n{form}\n{list}"; /** * @var array Widget options */ public $options = [ ]; /** * @var \yii\data\DataProviderInterface Data provider of comments */ public $dataProvider; /** * @inheritdoc */ public function init() { parent::init(); \common\modules\comment\assets\CommentAsset::register($this->view); if(is_string($this->comment_class)) { $this->comment_class = new $this->comment_class($this->class_options); } else { throw new \yii\base\InvalidConfigException(__CLASS__ . '->comment_class must be defined as object full class name string.'); } if(!empty( $this->rating_class ) && is_string($this->rating_class)) { $this->rating_class = new $this->rating_class($this->rating_options); } elseif(!empty( $this->rating_class )) { throw new \yii\base\InvalidConfigException(__CLASS__ . '->rating_class must be defined as object full class name string.'); } $this->comment_class->model = $this->model; $this->comment_class->model_id = $this->model_id; $this->createDataProvider(); $this->process(); ob_start(); } /** * @inheritdoc * @return string */ public function run() { $content = ob_get_clean(); $this->createParts(); return $this->renderWidget(); } public function createParts() { if($this->display_comment_success && $this->isSuccess) { $tag = ArrayHelper::remove($this->success_options, 'tag', 'div'); if(is_callable($this->success_options[ 'content' ])) { $result = call_user_func(ArrayHelper::remove($this->success_options, 'content'), $this->success_text); } elseif($this->success_options[ 'content' ] != NULL) { $result = Html::encode(ArrayHelper::remove($this->success_options, 'content', $this->success_text)); } else { $result = Html::encode($this->success_text); } $this->parts[ 'success' ] = Html::tag($tag, $result, $this->success_options); unset( $tag, $result ); } if($this->display_comment_list) { $tag = ArrayHelper::remove($this->list_options, 'tag', 'div'); $view = ArrayHelper::remove($this->list_options, 'view'); $this->parts[ 'list' ] = Html::tag($tag, $this->renderItems($view), $this->list_options); } if($this->display_comment_form && $this->comment_class->checkCreate()) { $tag = ArrayHelper::remove($this->form_options, 'tag', 'div'); $view = ArrayHelper::remove($this->form_options, 'view'); $this->parts[ 'form' ] = Html::tag($tag, $this->renderForm($view), $this->form_options); } } public function createDataProvider() { $this->dataProvider = new \yii\data\ActiveDataProvider([ 'query' => $this->comment_class->getComments($this->model, $this->model_id), 'pagination' => [ 'pageSize' => 10, ], ]); } public function renderItems($view) { if(empty( $view )) { throw new \yii\base\InvalidConfigException("list_options[view] must be set"); } return $this->render($view, [ 'dataProvider' => $this->dataProvider ]); } public function renderForm($view) { if(empty( $view )) { throw new \yii\base\InvalidConfigException("form_options[view] must be set"); } if($this->comment_class->guestComment || !empty(\Yii::$app->user->identity)) { return $this->render($view, [ 'model' => $this->comment_class, 'rating' => $this->rating_class, 'user' => \Yii::$app->user->identity, 'dataProvider' => $this->dataProvider, ]); } else { return ''; } } public function renderWidget() { $template = $this->template; $parts = $this->parts; $options = $this->options; $template = preg_replace('/{success}/', ArrayHelper::remove($parts, 'success', ''), $template); $template = preg_replace('/{list}/', ArrayHelper::remove($parts, 'list', ''), $template); $template = preg_replace('/{form}/', ArrayHelper::remove($parts, 'form', ''), $template); $tag = ArrayHelper::remove($options, 'tag', 'div'); return Html::tag($tag, $template, $options); } public function process() { $data = \Yii::$app->request->post(); if($this->comment_class->load($data) && $this->comment_class->postComment()) { if(is_object($this->rating_class) && $this->comment_class->rating->load($data) && $this->comment_class->rating->save()) { $this->isSuccess = true; } } } }