Blame view

thread/actions/RecordView.php 2.56 KB
d1f8bd40   Alexey Boroda   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  <?php
  
  namespace thread\actions;
  
  use Yii;
  use yii\base\{
      Action, Exception
  };
  use yii\web\{
      NotFoundHttpException, Response
  };
  
  /**
   * Class RecordView
   *
   * @package thread\actions
   * @author FilamentV <vortex.filament@gmail.com>
   * @copyright (c) 2016, VipDesign
   * @usage
   * public function actions() {
   *      return [
   *          ...
   *          'view' => [
   *              'class' => RecordView::class,
   *              'query' => Model::findOne(),
   *          ],
   *          ...
   *      ];
   * }
   */
  class RecordView extends Action
  {
      /**
       * Base layout
       *
       * @var string
       */
      public $layout = '@app/layouts/base';
  
      /**
       * Base view
       *
       * @var string
       */
      public $view = 'view';
  
      /**
       * Working model class name
       * Model should extends ActiveRecord
       *
       * @var string
       */
      public $modelClass = null;
  
      /**
       * Model method name for receiving data
       *
       * @var string
       */
      public $methodName = null;
  
      /**
       * Access checking
       *
       * @var bool
       */
      public $checkAccess = false;
  
      /**
       * Model
       *
       * @var \yii\db\ActiveRecord
       */
      protected $model = null;
  
      /**
       * @throws Exception
       */
      public function init()
      {
          if ($this->modelClass === null) {
              throw new Exception(__CLASS__ . '::$modelClass must be set.');
          }
          $this->model = new $this->modelClass;
          if ($this->model === null) {
              throw new Exception($this->modelClass . ' must be exists.');
          }
          if (!method_exists($this->model, $this->methodName)) {
              throw new Exception($this->modelClass . '::' . $this->methodName . ' must be exists.');
          }
      }
  
      /**
       * @param $alias
       * @return string
       * @throws NotFoundHttpException
       */
      public function run($alias)
      {
          $ref = new \ReflectionMethod($this->model, $this->methodName);
          $model = $ref->invoke($this->model, $alias);
          if ($model === null) {
              throw new NotFoundHttpException;
          }
          if (Yii::$app->getRequest()->isAjax) {
              Yii::$app->getResponse()->format = Response::FORMAT_JSON;
              return $this->controller->renderPartial($this->view, [
                  'model' => $model,
              ]);
          } else {
              $this->controller->layout = $this->layout;
              //SEO
              Yii::$app->metatag->registerModel($model);
              //SEO
              return $this->controller->render($this->view, [
                  'model' => $model,
              ]);
          }
      }
  }