Commit ddc5878206349d0410f48f43a91e80c00734fb96
Merge remote-tracking branch 'origin/master'
Showing
16 changed files
with
858 additions
and
219 deletions
Show diff stats
.gitignore
1 | +<?php | |
2 | + | |
3 | +namespace backend\controllers; | |
4 | + | |
5 | +use Yii; | |
6 | +use backend\models\Log; | |
7 | +use backend\models\LogSearch; | |
8 | +use backend\components\base\BaseController; | |
9 | +use yii\web\NotFoundHttpException; | |
10 | +use yii\filters\VerbFilter; | |
11 | + | |
12 | +/** | |
13 | + * LogController implements the CRUD actions for Log model. | |
14 | + */ | |
15 | +class LogController extends BaseController | |
16 | +{ | |
17 | + public $layout = "/column"; | |
18 | + | |
19 | + public function behaviors() | |
20 | + { | |
21 | + return [ | |
22 | + 'verbs' => [ | |
23 | + 'class' => VerbFilter::className(), | |
24 | + 'actions' => [ | |
25 | + 'delete' => ['post'], | |
26 | + ], | |
27 | + ], | |
28 | + ]; | |
29 | + } | |
30 | + | |
31 | + /** | |
32 | + * Lists all Log models. | |
33 | + * @return mixed | |
34 | + */ | |
35 | + public function actionIndex() | |
36 | + { | |
37 | + $searchModel = new LogSearch(); | |
38 | + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |
39 | + | |
40 | + return $this->render('index', [ | |
41 | + 'searchModel' => $searchModel, | |
42 | + 'dataProvider' => $dataProvider, | |
43 | + ]); | |
44 | + } | |
45 | + | |
46 | + /** | |
47 | + * Displays a single Log model. | |
48 | + * @param string $id | |
49 | + * @return mixed | |
50 | + */ | |
51 | + public function actionView($id) | |
52 | + { | |
53 | + return $this->render('view', [ | |
54 | + 'model' => $this->findModel($id), | |
55 | + ]); | |
56 | + } | |
57 | + | |
58 | + /** | |
59 | + * Creates a new Log model. | |
60 | + * If creation is successful, the browser will be redirected to the 'view' page. | |
61 | + * @return mixed | |
62 | + */ | |
63 | + public function actionCreate() | |
64 | + { | |
65 | + $model = new Log(); | |
66 | + | |
67 | + if ($model->load(Yii::$app->request->post()) && $model->save()) { | |
68 | + return $this->redirect(['view', 'id' => $model->id]); | |
69 | + } else { | |
70 | + return $this->render('create', [ | |
71 | + 'model' => $model, | |
72 | + ]); | |
73 | + } | |
74 | + } | |
75 | + | |
76 | + /** | |
77 | + * Updates an existing Log model. | |
78 | + * If update is successful, the browser will be redirected to the 'view' page. | |
79 | + * @param string $id | |
80 | + * @return mixed | |
81 | + */ | |
82 | + public function actionUpdate($id) | |
83 | + { | |
84 | + $model = $this->findModel($id); | |
85 | + | |
86 | + if ($model->load(Yii::$app->request->post()) && $model->save()) { | |
87 | + return $this->redirect(['view', 'id' => $model->id]); | |
88 | + } else { | |
89 | + return $this->render('update', [ | |
90 | + 'model' => $model, | |
91 | + ]); | |
92 | + } | |
93 | + } | |
94 | + | |
95 | + /** | |
96 | + * Deletes an existing Log model. | |
97 | + * If deletion is successful, the browser will be redirected to the 'index' page. | |
98 | + * @param string $id | |
99 | + * @return mixed | |
100 | + */ | |
101 | + public function actionDelete($id) | |
102 | + { | |
103 | + $this->findModel($id)->delete(); | |
104 | + | |
105 | + return $this->redirect(['index']); | |
106 | + } | |
107 | + | |
108 | + /** | |
109 | + * Finds the Log model based on its primary key value. | |
110 | + * If the model is not found, a 404 HTTP exception will be thrown. | |
111 | + * @param string $id | |
112 | + * @return Log the loaded model | |
113 | + * @throws NotFoundHttpException if the model cannot be found | |
114 | + */ | |
115 | + protected function findModel($id) | |
116 | + { | |
117 | + if (($model = Log::findOne($id)) !== null) { | |
118 | + return $model; | |
119 | + } else { | |
120 | + throw new NotFoundHttpException('The requested page does not exist.'); | |
121 | + } | |
122 | + } | |
123 | +} | ... | ... |
backend/controllers/ParserController.php
... | ... | @@ -237,11 +237,12 @@ class ParserController extends BaseController |
237 | 237 | |
238 | 238 | } |
239 | 239 | |
240 | + $controller = new \console\controllers\ParserController( 'parse-prices', $this->module ); | |
241 | + $controller->actionSaveMailAttachments(); | |
242 | + $controller->actionParsePrices(); | |
243 | + | |
240 | 244 | Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' ); |
241 | 245 | $this->redirect('server-files'); |
242 | - | |
243 | -// $csv = new \console\controllers\ParserController( 'parse-csv', $this->module ); | |
244 | -// $csv->actionParseCsv(); | |
245 | 246 | } |
246 | 247 | |
247 | 248 | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace backend\models; | |
4 | + | |
5 | +use Yii; | |
6 | + | |
7 | +/** | |
8 | + * This is the model class for table "w_log". | |
9 | + * | |
10 | + * @property string $id | |
11 | + * @property integer $error | |
12 | + * @property string $record_type | |
13 | + * @property string $time_start | |
14 | + * @property string $importer_id | |
15 | + * @property string $time_end | |
16 | + * @property string $log_msg | |
17 | + * @property string $file_name | |
18 | + */ | |
19 | +class Log extends \backend\components\base\BaseActiveRecord | |
20 | +{ | |
21 | + /** | |
22 | + * @inheritdoc | |
23 | + */ | |
24 | + public static function tableName() | |
25 | + { | |
26 | + return 'w_log'; | |
27 | + } | |
28 | + | |
29 | + /** | |
30 | + * @inheritdoc | |
31 | + */ | |
32 | + public function rules() | |
33 | + { | |
34 | + return [ | |
35 | + [['error', 'record_type', 'importer_id'], 'integer'], | |
36 | + [['time_start', 'time_end'], 'safe'], | |
37 | + [['importer_id'], 'required'], | |
38 | + [['log_msg'], 'string'], | |
39 | + [['file_name'], 'string', 'max' => 100] | |
40 | + ]; | |
41 | + } | |
42 | + | |
43 | + public function getImporter() | |
44 | + { | |
45 | + return Importers::findOne( $this->importer_id )->name; | |
46 | + } | |
47 | + | |
48 | + /** | |
49 | + * @inheritdoc | |
50 | + */ | |
51 | + public function attributeLabels() | |
52 | + { | |
53 | + return [ | |
54 | + 'id' => 'ID', | |
55 | + 'error' => 'Статус', | |
56 | + 'record_type' => 'Тип загрузки', | |
57 | + 'time_start' => 'Начало загрузки', | |
58 | + 'importer_id' => 'ID поставщика', | |
59 | + 'importer' => 'Файл поставщика', | |
60 | + 'time_end' => 'Конец загрузки', | |
61 | + 'log_msg' => 'Лог', | |
62 | + 'file_name' => 'Загружаемый файл', | |
63 | + ]; | |
64 | + } | |
65 | +} | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace backend\models; | |
4 | + | |
5 | +use Yii; | |
6 | +use yii\base\Model; | |
7 | +use yii\data\ActiveDataProvider; | |
8 | +use backend\models\Log; | |
9 | + | |
10 | +/** | |
11 | + * LogSearch represents the model behind the search form about `backend\models\Log`. | |
12 | + */ | |
13 | +class LogSearch extends Log | |
14 | +{ | |
15 | + public $date_to; | |
16 | + /** | |
17 | + * @inheritdoc | |
18 | + */ | |
19 | + public function rules() | |
20 | + { | |
21 | + return [ | |
22 | + [['id', 'error', 'record_type', 'importer_id'], 'integer'], | |
23 | + [['time_start','date_to', 'time_end', 'file_name'], 'safe'], | |
24 | + ]; | |
25 | + } | |
26 | + | |
27 | + /** | |
28 | + * @inheritdoc | |
29 | + */ | |
30 | + public function scenarios() | |
31 | + { | |
32 | + // bypass scenarios() implementation in the parent class | |
33 | + return Model::scenarios(); | |
34 | + } | |
35 | + | |
36 | + /** | |
37 | + * Creates data provider instance with search query applied | |
38 | + * | |
39 | + * @param array $params | |
40 | + * | |
41 | + * @return ActiveDataProvider | |
42 | + */ | |
43 | + public function search($params) | |
44 | + { | |
45 | + $query = Log::find(); | |
46 | + | |
47 | + $dataProvider = new ActiveDataProvider([ | |
48 | + 'query' => $query, | |
49 | + ]); | |
50 | + | |
51 | + $this->load($params); | |
52 | + | |
53 | + if (!$this->validate()) { | |
54 | + // uncomment the following line if you do not want to return any records when validation fails | |
55 | + // $query->where('0=1'); | |
56 | + return $dataProvider; | |
57 | + } | |
58 | + | |
59 | + $query->andFilterWhere([ | |
60 | + 'error' => $this->error, | |
61 | + 'record_type' => $this->record_type, | |
62 | + 'importer_id' => $this->importer_id, | |
63 | + ]); | |
64 | + | |
65 | +// $query->andFilterWhere(['like', 'log_msg', $this->log_msg]) | |
66 | +// ->andFilterWhere(['like', 'file_name', $this->file_name]); | |
67 | + | |
68 | + // отбор по дате | |
69 | + if( !empty( $this->time_start ) || !empty( $this->date_to ) ){ | |
70 | + $date_from = \Yii::$app->converter->convertTo( 'timestamp', $this->time_start ); | |
71 | + // в БД time_start хранится в timestamp, а не в строке unixtimestamp, поэтому нужно преобразовать в mysql timestamp | |
72 | + $date_from = date('Y-m-d H:i:s', $date_from); | |
73 | + | |
74 | + $date_to = \Yii::$app->converter->convertTo( 'timestamp', $this->date_to, ['begin_of_the_day' => false] ); | |
75 | + $date_to = date('Y-m-d H:i:s', $date_to); | |
76 | + | |
77 | + $query->andFilterWhere([ | |
78 | + 'between', 'time_start', $date_from, $date_to | |
79 | + ]); | |
80 | + } | |
81 | + // всегда сортируем по дате | |
82 | + $query->orderBy('time_start DESC'); | |
83 | + | |
84 | + return $dataProvider; | |
85 | + } | |
86 | +} | ... | ... |
backend/views/cart/index.php
backend/views/layouts/column.php
... | ... | @@ -289,6 +289,7 @@ $this->beginContent('@app/views/layouts/main.php'); |
289 | 289 | ['label' => "Прайс файлы", 'url' => ['#'], 'items' => [ |
290 | 290 | ['label' => 'Файлы на сервере', 'url' => ['parser/server-files']], |
291 | 291 | ['label' => 'Загрузить файл на сервер', 'url' => ['parser/index', 'mode' => 1]], |
292 | + ['label' => 'Журнал загрузок', 'url' => ['log/index']], | |
292 | 293 | ['label' => 'Ручная загрузка', 'url' => ['parser/index']], |
293 | 294 | ['label' => 'Проверка прайс файлов', 'url' => ['check-price/index']], |
294 | 295 | ['label' => 'Управление префиксами', 'url' => ['importers-prefix/index']], | ... | ... |
1 | +<?php | |
2 | + | |
3 | +use yii\helpers\Html; | |
4 | +use yii\widgets\ActiveForm; | |
5 | + | |
6 | +/* @var $this yii\web\View */ | |
7 | +/* @var $model backend\models\Log */ | |
8 | +/* @var $form yii\widgets\ActiveForm */ | |
9 | +?> | |
10 | + | |
11 | +<div class="log-form"> | |
12 | + | |
13 | + <?php $form = ActiveForm::begin(); ?> | |
14 | + | |
15 | + <?= $form->field($model, 'error')->textInput() ?> | |
16 | + | |
17 | + <?= $form->field($model, 'record_type')->textInput(['maxlength' => true]) ?> | |
18 | + | |
19 | + <?= $form->field($model, 'time_start')->textInput() ?> | |
20 | + | |
21 | + <?= $form->field($model, 'importer_id')->textInput(['maxlength' => true]) ?> | |
22 | + | |
23 | + <?= $form->field($model, 'time_end')->textInput() ?> | |
24 | + | |
25 | + <?= $form->field($model, 'log_msg')->textInput(['maxlength' => true]) ?> | |
26 | + | |
27 | + <?= $form->field($model, 'file_name')->textInput(['maxlength' => true]) ?> | |
28 | + | |
29 | + <div class="form-group"> | |
30 | + <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | |
31 | + </div> | |
32 | + | |
33 | + <?php ActiveForm::end(); ?> | |
34 | + | |
35 | +</div> | ... | ... |
1 | +<?php | |
2 | + | |
3 | +use yii\helpers\Html; | |
4 | +use yii\widgets\ActiveForm; | |
5 | + | |
6 | +/* @var $this yii\web\View */ | |
7 | +/* @var $model backend\models\LogSearch */ | |
8 | +/* @var $form yii\widgets\ActiveForm */ | |
9 | +?> | |
10 | + | |
11 | +<div class="log-search"> | |
12 | + | |
13 | + <?php $form = ActiveForm::begin([ | |
14 | + 'action' => ['index'], | |
15 | + 'method' => 'get', | |
16 | + ]); ?> | |
17 | + | |
18 | + <?= $form->field($model, 'id') ?> | |
19 | + | |
20 | + <?= $form->field($model, 'error') ?> | |
21 | + | |
22 | + <?= $form->field($model, 'record_type') ?> | |
23 | + | |
24 | + <?php //$form->field($model, 'time_start') ?> | |
25 | + | |
26 | + <?= $form->field($model, 'importer_id') ?> | |
27 | + | |
28 | + <?php // echo $form->field($model, 'time_end') ?> | |
29 | + | |
30 | + <?php // echo $form->field($model, 'log_msg') ?> | |
31 | + | |
32 | + <?php // echo $form->field($model, 'file_name') ?> | |
33 | + | |
34 | + <div class="form-group"> | |
35 | + <?= Html::submitButton(Yii::t('app', 'Search'), ['class' => 'btn btn-primary']) ?> | |
36 | + <?= Html::resetButton(Yii::t('app', 'Reset'), ['class' => 'btn btn-default']) ?> | |
37 | + </div> | |
38 | + | |
39 | + <?php ActiveForm::end(); ?> | |
40 | + | |
41 | +</div> | ... | ... |
1 | +<?php | |
2 | + | |
3 | +use yii\helpers\Html; | |
4 | +use yii\grid\GridView; | |
5 | +use kartik\date\DatePicker; | |
6 | + | |
7 | +/* @var $this yii\web\View */ | |
8 | +/* @var $searchModel backend\models\LogSearch */ | |
9 | +/* @var $dataProvider yii\data\ActiveDataProvider */ | |
10 | + | |
11 | +$this->title = Yii::t('app', 'Журнал загрузок'); | |
12 | +$this->params['breadcrumbs'][] = $this->title; | |
13 | +?> | |
14 | +<div class="log-index"> | |
15 | + | |
16 | + <h1><?= Html::encode($this->title) ?></h1> | |
17 | + <?php // echo $this->render('_search', ['model' => $searchModel]); ?> | |
18 | + | |
19 | + | |
20 | + <?= GridView::widget([ | |
21 | + 'dataProvider' => $dataProvider, | |
22 | + 'filterModel' => $searchModel, | |
23 | + 'columns' => [ | |
24 | + ['class' => 'yii\grid\SerialColumn'], | |
25 | + 'log_msg:ntext', | |
26 | + ['attribute' =>'record_type', | |
27 | + 'value' => function( $model ) { | |
28 | + $value = 'Почта'; | |
29 | + if ( $model->record_type == 1 ) { | |
30 | + $value = 'Фон'; | |
31 | + } | |
32 | + return $value; | |
33 | + }, | |
34 | + 'filter' => [ 1 => 'Фон' , 2 => 'Почта' ] | |
35 | + ], | |
36 | + ['attribute' => 'time_start', | |
37 | + 'filter' => DatePicker::widget([ | |
38 | + 'model' =>$searchModel, | |
39 | + 'language' =>'ru', | |
40 | + 'size' =>'xs', | |
41 | + 'separator' =>'по', | |
42 | + 'type' => DatePicker::TYPE_RANGE, | |
43 | + 'value2'=> date('dd-M-yyyy'), | |
44 | + 'attribute' => 'time_start', | |
45 | + 'attribute2' => 'date_to', | |
46 | + ]), | |
47 | + ], | |
48 | + ['attribute' => 'importer_id', | |
49 | + 'label' => 'Файл поставщика', | |
50 | + 'value' => function( $model ) { | |
51 | + return $model->importer; | |
52 | + }, | |
53 | + ], | |
54 | + | |
55 | + ['attribute' => 'error', | |
56 | + 'value' => function( $model ) { | |
57 | + $value = 'Успешно'; | |
58 | + if ($model->error) { | |
59 | + $value = 'C ошибкой'; | |
60 | + } | |
61 | + return $value; | |
62 | + }, | |
63 | + 'filter' => [ 'Успешно' ,'C ошибкой' ] | |
64 | + ], | |
65 | + ['class' => 'yii\grid\ActionColumn', | |
66 | + 'template' => '{view}'], | |
67 | + ], | |
68 | + ]); ?> | |
69 | + | |
70 | +</div> | ... | ... |
1 | +<?php | |
2 | + | |
3 | +use yii\helpers\Html; | |
4 | +use yii\widgets\DetailView; | |
5 | + | |
6 | +/* @var $this yii\web\View */ | |
7 | +/* @var $model common\models\Currency */ | |
8 | + | |
9 | +$this->title = "Лог загрузки файла"; | |
10 | +$this->params['breadcrumbs'][] = ['label' => 'Currencies', 'url' => ['index']]; | |
11 | +$this->params['breadcrumbs'][] = $this->title; | |
12 | +?> | |
13 | +<div class="log-view"> | |
14 | + | |
15 | + <h3><?= Html::encode($this->title) ?></h3> | |
16 | + | |
17 | + <?= DetailView::widget([ | |
18 | + 'model' => $model, | |
19 | + 'attributes' => [ | |
20 | + ['attribute' => 'error', | |
21 | + 'value' => $model->error ? 'C ошибкой' : 'Успешно', | |
22 | + ], | |
23 | + ['attribute' =>'record_type', | |
24 | + 'value' => $model->record_type == 1 ? 'Фоновая (ручная) загрузка' : 'Загрузка из вложений в почту', | |
25 | + ], | |
26 | + 'importer_id', | |
27 | + 'time_start', | |
28 | + 'time_end', | |
29 | + 'file_name', | |
30 | + 'log_msg', | |
31 | + ], | |
32 | + ]) ?> | |
33 | + | |
34 | +</div> | ... | ... |
common/config/bootstrap.php
... | ... | @@ -6,4 +6,5 @@ Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console'); |
6 | 6 | Yii::setAlias('auto_upload', dirname(dirname(__DIR__)) . '/storage/parser_data/auto'); |
7 | 7 | Yii::setAlias('manual_upload', dirname(dirname(__DIR__)) . '/storage/parser_data/manual'); |
8 | 8 | Yii::setAlias('temp_upload', dirname(dirname(__DIR__)) . '/storage/parser_data/temp'); |
9 | +Yii::setAlias('mail_upload', dirname(dirname(__DIR__)) . '/storage/parser_data/mail'); | |
9 | 10 | Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage'); | ... | ... |
composer.lock
... | ... | @@ -580,16 +580,16 @@ |
580 | 580 | }, |
581 | 581 | { |
582 | 582 | "name": "guzzlehttp/guzzle", |
583 | - "version": "6.1.0", | |
583 | + "version": "6.1.1", | |
584 | 584 | "source": { |
585 | 585 | "type": "git", |
586 | 586 | "url": "https://github.com/guzzle/guzzle.git", |
587 | - "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81" | |
587 | + "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c" | |
588 | 588 | }, |
589 | 589 | "dist": { |
590 | 590 | "type": "zip", |
591 | - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/66fd14b4d0b8f2389eaf37c5458608c7cb793a81", | |
592 | - "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81", | |
591 | + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c6851d6e48f63b69357cbfa55bca116448140e0c", | |
592 | + "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c", | |
593 | 593 | "shasum": "" |
594 | 594 | }, |
595 | 595 | "require": { |
... | ... | @@ -638,7 +638,7 @@ |
638 | 638 | "rest", |
639 | 639 | "web service" |
640 | 640 | ], |
641 | - "time": "2015-09-08 17:36:26" | |
641 | + "time": "2015-11-23 00:47:50" | |
642 | 642 | }, |
643 | 643 | { |
644 | 644 | "name": "guzzlehttp/promises", |
... | ... | @@ -994,16 +994,16 @@ |
994 | 994 | }, |
995 | 995 | { |
996 | 996 | "name": "kartik-v/yii2-krajee-base", |
997 | - "version": "v1.7.7", | |
997 | + "version": "v1.7.9", | |
998 | 998 | "source": { |
999 | 999 | "type": "git", |
1000 | 1000 | "url": "https://github.com/kartik-v/yii2-krajee-base.git", |
1001 | - "reference": "c0adff9d9762f4fd3bf0e7cd0000fcab0bf00f19" | |
1001 | + "reference": "6f10fd0a0bfccd729764c65fa65eb4ccf2cbade9" | |
1002 | 1002 | }, |
1003 | 1003 | "dist": { |
1004 | 1004 | "type": "zip", |
1005 | - "url": "https://api.github.com/repos/kartik-v/yii2-krajee-base/zipball/c0adff9d9762f4fd3bf0e7cd0000fcab0bf00f19", | |
1006 | - "reference": "c0adff9d9762f4fd3bf0e7cd0000fcab0bf00f19", | |
1005 | + "url": "https://api.github.com/repos/kartik-v/yii2-krajee-base/zipball/6f10fd0a0bfccd729764c65fa65eb4ccf2cbade9", | |
1006 | + "reference": "6f10fd0a0bfccd729764c65fa65eb4ccf2cbade9", | |
1007 | 1007 | "shasum": "" |
1008 | 1008 | }, |
1009 | 1009 | "require": { |
... | ... | @@ -1036,7 +1036,7 @@ |
1036 | 1036 | "widget", |
1037 | 1037 | "yii2" |
1038 | 1038 | ], |
1039 | - "time": "2015-06-16 05:19:57" | |
1039 | + "time": "2015-11-25 07:03:35" | |
1040 | 1040 | }, |
1041 | 1041 | { |
1042 | 1042 | "name": "kartik-v/yii2-widget-datepicker", |
... | ... | @@ -1650,16 +1650,16 @@ |
1650 | 1650 | }, |
1651 | 1651 | { |
1652 | 1652 | "name": "phpunit/phpunit", |
1653 | - "version": "4.8.18", | |
1653 | + "version": "4.8.19", | |
1654 | 1654 | "source": { |
1655 | 1655 | "type": "git", |
1656 | 1656 | "url": "https://github.com/sebastianbergmann/phpunit.git", |
1657 | - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3" | |
1657 | + "reference": "b2caaf8947aba5e002d42126723e9d69795f32b4" | |
1658 | 1658 | }, |
1659 | 1659 | "dist": { |
1660 | 1660 | "type": "zip", |
1661 | - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", | |
1662 | - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", | |
1661 | + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b2caaf8947aba5e002d42126723e9d69795f32b4", | |
1662 | + "reference": "b2caaf8947aba5e002d42126723e9d69795f32b4", | |
1663 | 1663 | "shasum": "" |
1664 | 1664 | }, |
1665 | 1665 | "require": { |
... | ... | @@ -1718,7 +1718,7 @@ |
1718 | 1718 | "testing", |
1719 | 1719 | "xunit" |
1720 | 1720 | ], |
1721 | - "time": "2015-11-11 11:32:49" | |
1721 | + "time": "2015-11-30 08:18:59" | |
1722 | 1722 | }, |
1723 | 1723 | { |
1724 | 1724 | "name": "phpunit/phpunit-mock-objects", |
... | ... | @@ -1943,16 +1943,16 @@ |
1943 | 1943 | }, |
1944 | 1944 | { |
1945 | 1945 | "name": "sebastian/environment", |
1946 | - "version": "1.3.2", | |
1946 | + "version": "1.3.3", | |
1947 | 1947 | "source": { |
1948 | 1948 | "type": "git", |
1949 | 1949 | "url": "https://github.com/sebastianbergmann/environment.git", |
1950 | - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" | |
1950 | + "reference": "6e7133793a8e5a5714a551a8324337374be209df" | |
1951 | 1951 | }, |
1952 | 1952 | "dist": { |
1953 | 1953 | "type": "zip", |
1954 | - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", | |
1955 | - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", | |
1954 | + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e7133793a8e5a5714a551a8324337374be209df", | |
1955 | + "reference": "6e7133793a8e5a5714a551a8324337374be209df", | |
1956 | 1956 | "shasum": "" |
1957 | 1957 | }, |
1958 | 1958 | "require": { |
... | ... | @@ -1989,7 +1989,7 @@ |
1989 | 1989 | "environment", |
1990 | 1990 | "hhvm" |
1991 | 1991 | ], |
1992 | - "time": "2015-08-03 06:14:51" | |
1992 | + "time": "2015-12-02 08:37:27" | |
1993 | 1993 | }, |
1994 | 1994 | { |
1995 | 1995 | "name": "sebastian/exporter", |
... | ... | @@ -2251,25 +2251,25 @@ |
2251 | 2251 | }, |
2252 | 2252 | { |
2253 | 2253 | "name": "symfony/browser-kit", |
2254 | - "version": "v2.7.6", | |
2254 | + "version": "v2.8.0", | |
2255 | 2255 | "source": { |
2256 | 2256 | "type": "git", |
2257 | 2257 | "url": "https://github.com/symfony/browser-kit.git", |
2258 | - "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367" | |
2258 | + "reference": "589f32fe4f43155ea303d505171634c45f15e876" | |
2259 | 2259 | }, |
2260 | 2260 | "dist": { |
2261 | 2261 | "type": "zip", |
2262 | - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/07d664a052572ccc28eb2ab7dbbe82155b1ad367", | |
2263 | - "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367", | |
2262 | + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/589f32fe4f43155ea303d505171634c45f15e876", | |
2263 | + "reference": "589f32fe4f43155ea303d505171634c45f15e876", | |
2264 | 2264 | "shasum": "" |
2265 | 2265 | }, |
2266 | 2266 | "require": { |
2267 | 2267 | "php": ">=5.3.9", |
2268 | - "symfony/dom-crawler": "~2.0,>=2.0.5" | |
2268 | + "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0" | |
2269 | 2269 | }, |
2270 | 2270 | "require-dev": { |
2271 | - "symfony/css-selector": "~2.0,>=2.0.5", | |
2272 | - "symfony/process": "~2.3.34|~2.7,>=2.7.6" | |
2271 | + "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0", | |
2272 | + "symfony/process": "~2.3.34|~2.7,>=2.7.6|~3.0.0" | |
2273 | 2273 | }, |
2274 | 2274 | "suggest": { |
2275 | 2275 | "symfony/process": "" |
... | ... | @@ -2277,13 +2277,16 @@ |
2277 | 2277 | "type": "library", |
2278 | 2278 | "extra": { |
2279 | 2279 | "branch-alias": { |
2280 | - "dev-master": "2.7-dev" | |
2280 | + "dev-master": "2.8-dev" | |
2281 | 2281 | } |
2282 | 2282 | }, |
2283 | 2283 | "autoload": { |
2284 | 2284 | "psr-4": { |
2285 | 2285 | "Symfony\\Component\\BrowserKit\\": "" |
2286 | - } | |
2286 | + }, | |
2287 | + "exclude-from-classmap": [ | |
2288 | + "/Tests/" | |
2289 | + ] | |
2287 | 2290 | }, |
2288 | 2291 | "notification-url": "https://packagist.org/downloads/", |
2289 | 2292 | "license": [ |
... | ... | @@ -2301,29 +2304,30 @@ |
2301 | 2304 | ], |
2302 | 2305 | "description": "Symfony BrowserKit Component", |
2303 | 2306 | "homepage": "https://symfony.com", |
2304 | - "time": "2015-10-23 14:47:27" | |
2307 | + "time": "2015-11-02 20:29:24" | |
2305 | 2308 | }, |
2306 | 2309 | { |
2307 | 2310 | "name": "symfony/console", |
2308 | - "version": "v2.7.6", | |
2311 | + "version": "v2.8.0", | |
2309 | 2312 | "source": { |
2310 | 2313 | "type": "git", |
2311 | 2314 | "url": "https://github.com/symfony/console.git", |
2312 | - "reference": "5efd632294c8320ea52492db22292ff853a43766" | |
2315 | + "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41" | |
2313 | 2316 | }, |
2314 | 2317 | "dist": { |
2315 | 2318 | "type": "zip", |
2316 | - "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", | |
2317 | - "reference": "5efd632294c8320ea52492db22292ff853a43766", | |
2319 | + "url": "https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41", | |
2320 | + "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41", | |
2318 | 2321 | "shasum": "" |
2319 | 2322 | }, |
2320 | 2323 | "require": { |
2321 | - "php": ">=5.3.9" | |
2324 | + "php": ">=5.3.9", | |
2325 | + "symfony/polyfill-mbstring": "~1.0" | |
2322 | 2326 | }, |
2323 | 2327 | "require-dev": { |
2324 | 2328 | "psr/log": "~1.0", |
2325 | - "symfony/event-dispatcher": "~2.1", | |
2326 | - "symfony/process": "~2.1" | |
2329 | + "symfony/event-dispatcher": "~2.1|~3.0.0", | |
2330 | + "symfony/process": "~2.1|~3.0.0" | |
2327 | 2331 | }, |
2328 | 2332 | "suggest": { |
2329 | 2333 | "psr/log": "For using the console logger", |
... | ... | @@ -2333,13 +2337,16 @@ |
2333 | 2337 | "type": "library", |
2334 | 2338 | "extra": { |
2335 | 2339 | "branch-alias": { |
2336 | - "dev-master": "2.7-dev" | |
2340 | + "dev-master": "2.8-dev" | |
2337 | 2341 | } |
2338 | 2342 | }, |
2339 | 2343 | "autoload": { |
2340 | 2344 | "psr-4": { |
2341 | 2345 | "Symfony\\Component\\Console\\": "" |
2342 | - } | |
2346 | + }, | |
2347 | + "exclude-from-classmap": [ | |
2348 | + "/Tests/" | |
2349 | + ] | |
2343 | 2350 | }, |
2344 | 2351 | "notification-url": "https://packagist.org/downloads/", |
2345 | 2352 | "license": [ |
... | ... | @@ -2357,20 +2364,20 @@ |
2357 | 2364 | ], |
2358 | 2365 | "description": "Symfony Console Component", |
2359 | 2366 | "homepage": "https://symfony.com", |
2360 | - "time": "2015-10-20 14:38:46" | |
2367 | + "time": "2015-11-30 12:35:10" | |
2361 | 2368 | }, |
2362 | 2369 | { |
2363 | 2370 | "name": "symfony/css-selector", |
2364 | - "version": "v2.7.6", | |
2371 | + "version": "v2.8.0", | |
2365 | 2372 | "source": { |
2366 | 2373 | "type": "git", |
2367 | 2374 | "url": "https://github.com/symfony/css-selector.git", |
2368 | - "reference": "e1b865b26be4a56d22a8dee398375044a80c865b" | |
2375 | + "reference": "b600fec37c0efca08046d481d79e7eabc07108ff" | |
2369 | 2376 | }, |
2370 | 2377 | "dist": { |
2371 | 2378 | "type": "zip", |
2372 | - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b", | |
2373 | - "reference": "e1b865b26be4a56d22a8dee398375044a80c865b", | |
2379 | + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b600fec37c0efca08046d481d79e7eabc07108ff", | |
2380 | + "reference": "b600fec37c0efca08046d481d79e7eabc07108ff", | |
2374 | 2381 | "shasum": "" |
2375 | 2382 | }, |
2376 | 2383 | "require": { |
... | ... | @@ -2379,13 +2386,16 @@ |
2379 | 2386 | "type": "library", |
2380 | 2387 | "extra": { |
2381 | 2388 | "branch-alias": { |
2382 | - "dev-master": "2.7-dev" | |
2389 | + "dev-master": "2.8-dev" | |
2383 | 2390 | } |
2384 | 2391 | }, |
2385 | 2392 | "autoload": { |
2386 | 2393 | "psr-4": { |
2387 | 2394 | "Symfony\\Component\\CssSelector\\": "" |
2388 | - } | |
2395 | + }, | |
2396 | + "exclude-from-classmap": [ | |
2397 | + "/Tests/" | |
2398 | + ] | |
2389 | 2399 | }, |
2390 | 2400 | "notification-url": "https://packagist.org/downloads/", |
2391 | 2401 | "license": [ |
... | ... | @@ -2407,27 +2417,28 @@ |
2407 | 2417 | ], |
2408 | 2418 | "description": "Symfony CssSelector Component", |
2409 | 2419 | "homepage": "https://symfony.com", |
2410 | - "time": "2015-10-11 09:39:48" | |
2420 | + "time": "2015-10-30 20:15:42" | |
2411 | 2421 | }, |
2412 | 2422 | { |
2413 | 2423 | "name": "symfony/dom-crawler", |
2414 | - "version": "v2.7.6", | |
2424 | + "version": "v2.8.0", | |
2415 | 2425 | "source": { |
2416 | 2426 | "type": "git", |
2417 | 2427 | "url": "https://github.com/symfony/dom-crawler.git", |
2418 | - "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612" | |
2428 | + "reference": "740c98235f5b6e2b0b13df2fb97c7a1c7d1a18fc" | |
2419 | 2429 | }, |
2420 | 2430 | "dist": { |
2421 | 2431 | "type": "zip", |
2422 | - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5fef7d8b80d8f9992df99d8ee283f420484c9612", | |
2423 | - "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612", | |
2432 | + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/740c98235f5b6e2b0b13df2fb97c7a1c7d1a18fc", | |
2433 | + "reference": "740c98235f5b6e2b0b13df2fb97c7a1c7d1a18fc", | |
2424 | 2434 | "shasum": "" |
2425 | 2435 | }, |
2426 | 2436 | "require": { |
2427 | - "php": ">=5.3.9" | |
2437 | + "php": ">=5.3.9", | |
2438 | + "symfony/polyfill-mbstring": "~1.0" | |
2428 | 2439 | }, |
2429 | 2440 | "require-dev": { |
2430 | - "symfony/css-selector": "~2.3" | |
2441 | + "symfony/css-selector": "~2.8|~3.0.0" | |
2431 | 2442 | }, |
2432 | 2443 | "suggest": { |
2433 | 2444 | "symfony/css-selector": "" |
... | ... | @@ -2435,13 +2446,16 @@ |
2435 | 2446 | "type": "library", |
2436 | 2447 | "extra": { |
2437 | 2448 | "branch-alias": { |
2438 | - "dev-master": "2.7-dev" | |
2449 | + "dev-master": "2.8-dev" | |
2439 | 2450 | } |
2440 | 2451 | }, |
2441 | 2452 | "autoload": { |
2442 | 2453 | "psr-4": { |
2443 | 2454 | "Symfony\\Component\\DomCrawler\\": "" |
2444 | - } | |
2455 | + }, | |
2456 | + "exclude-from-classmap": [ | |
2457 | + "/Tests/" | |
2458 | + ] | |
2445 | 2459 | }, |
2446 | 2460 | "notification-url": "https://packagist.org/downloads/", |
2447 | 2461 | "license": [ |
... | ... | @@ -2459,20 +2473,20 @@ |
2459 | 2473 | ], |
2460 | 2474 | "description": "Symfony DomCrawler Component", |
2461 | 2475 | "homepage": "https://symfony.com", |
2462 | - "time": "2015-10-11 09:39:48" | |
2476 | + "time": "2015-11-02 20:29:39" | |
2463 | 2477 | }, |
2464 | 2478 | { |
2465 | 2479 | "name": "symfony/event-dispatcher", |
2466 | - "version": "v2.7.6", | |
2480 | + "version": "v2.8.0", | |
2467 | 2481 | "source": { |
2468 | 2482 | "type": "git", |
2469 | 2483 | "url": "https://github.com/symfony/event-dispatcher.git", |
2470 | - "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8" | |
2484 | + "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc" | |
2471 | 2485 | }, |
2472 | 2486 | "dist": { |
2473 | 2487 | "type": "zip", |
2474 | - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8", | |
2475 | - "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8", | |
2488 | + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a5eb815363c0388e83247e7e9853e5dbc14999cc", | |
2489 | + "reference": "a5eb815363c0388e83247e7e9853e5dbc14999cc", | |
2476 | 2490 | "shasum": "" |
2477 | 2491 | }, |
2478 | 2492 | "require": { |
... | ... | @@ -2480,10 +2494,10 @@ |
2480 | 2494 | }, |
2481 | 2495 | "require-dev": { |
2482 | 2496 | "psr/log": "~1.0", |
2483 | - "symfony/config": "~2.0,>=2.0.5", | |
2484 | - "symfony/dependency-injection": "~2.6", | |
2485 | - "symfony/expression-language": "~2.6", | |
2486 | - "symfony/stopwatch": "~2.3" | |
2497 | + "symfony/config": "~2.0,>=2.0.5|~3.0.0", | |
2498 | + "symfony/dependency-injection": "~2.6|~3.0.0", | |
2499 | + "symfony/expression-language": "~2.6|~3.0.0", | |
2500 | + "symfony/stopwatch": "~2.3|~3.0.0" | |
2487 | 2501 | }, |
2488 | 2502 | "suggest": { |
2489 | 2503 | "symfony/dependency-injection": "", |
... | ... | @@ -2492,13 +2506,16 @@ |
2492 | 2506 | "type": "library", |
2493 | 2507 | "extra": { |
2494 | 2508 | "branch-alias": { |
2495 | - "dev-master": "2.7-dev" | |
2509 | + "dev-master": "2.8-dev" | |
2496 | 2510 | } |
2497 | 2511 | }, |
2498 | 2512 | "autoload": { |
2499 | 2513 | "psr-4": { |
2500 | 2514 | "Symfony\\Component\\EventDispatcher\\": "" |
2501 | - } | |
2515 | + }, | |
2516 | + "exclude-from-classmap": [ | |
2517 | + "/Tests/" | |
2518 | + ] | |
2502 | 2519 | }, |
2503 | 2520 | "notification-url": "https://packagist.org/downloads/", |
2504 | 2521 | "license": [ |
... | ... | @@ -2516,20 +2533,20 @@ |
2516 | 2533 | ], |
2517 | 2534 | "description": "Symfony EventDispatcher Component", |
2518 | 2535 | "homepage": "https://symfony.com", |
2519 | - "time": "2015-10-11 09:39:48" | |
2536 | + "time": "2015-10-30 20:15:42" | |
2520 | 2537 | }, |
2521 | 2538 | { |
2522 | 2539 | "name": "symfony/finder", |
2523 | - "version": "v2.7.6", | |
2540 | + "version": "v2.8.0", | |
2524 | 2541 | "source": { |
2525 | 2542 | "type": "git", |
2526 | 2543 | "url": "https://github.com/symfony/finder.git", |
2527 | - "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d" | |
2544 | + "reference": "ead9b07af4ba77b6507bee697396a5c79e633f08" | |
2528 | 2545 | }, |
2529 | 2546 | "dist": { |
2530 | 2547 | "type": "zip", |
2531 | - "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", | |
2532 | - "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", | |
2548 | + "url": "https://api.github.com/repos/symfony/finder/zipball/ead9b07af4ba77b6507bee697396a5c79e633f08", | |
2549 | + "reference": "ead9b07af4ba77b6507bee697396a5c79e633f08", | |
2533 | 2550 | "shasum": "" |
2534 | 2551 | }, |
2535 | 2552 | "require": { |
... | ... | @@ -2538,13 +2555,16 @@ |
2538 | 2555 | "type": "library", |
2539 | 2556 | "extra": { |
2540 | 2557 | "branch-alias": { |
2541 | - "dev-master": "2.7-dev" | |
2558 | + "dev-master": "2.8-dev" | |
2542 | 2559 | } |
2543 | 2560 | }, |
2544 | 2561 | "autoload": { |
2545 | 2562 | "psr-4": { |
2546 | 2563 | "Symfony\\Component\\Finder\\": "" |
2547 | - } | |
2564 | + }, | |
2565 | + "exclude-from-classmap": [ | |
2566 | + "/Tests/" | |
2567 | + ] | |
2548 | 2568 | }, |
2549 | 2569 | "notification-url": "https://packagist.org/downloads/", |
2550 | 2570 | "license": [ |
... | ... | @@ -2562,20 +2582,76 @@ |
2562 | 2582 | ], |
2563 | 2583 | "description": "Symfony Finder Component", |
2564 | 2584 | "homepage": "https://symfony.com", |
2565 | - "time": "2015-10-11 09:39:48" | |
2585 | + "time": "2015-10-30 20:15:42" | |
2586 | + }, | |
2587 | + { | |
2588 | + "name": "symfony/polyfill-mbstring", | |
2589 | + "version": "v1.0.0", | |
2590 | + "source": { | |
2591 | + "type": "git", | |
2592 | + "url": "https://github.com/symfony/polyfill-mbstring.git", | |
2593 | + "reference": "0b6a8940385311a24e060ec1fe35680e17c74497" | |
2594 | + }, | |
2595 | + "dist": { | |
2596 | + "type": "zip", | |
2597 | + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0b6a8940385311a24e060ec1fe35680e17c74497", | |
2598 | + "reference": "0b6a8940385311a24e060ec1fe35680e17c74497", | |
2599 | + "shasum": "" | |
2600 | + }, | |
2601 | + "require": { | |
2602 | + "php": ">=5.3.3" | |
2603 | + }, | |
2604 | + "type": "library", | |
2605 | + "extra": { | |
2606 | + "branch-alias": { | |
2607 | + "dev-master": "1.0-dev" | |
2608 | + } | |
2609 | + }, | |
2610 | + "autoload": { | |
2611 | + "psr-4": { | |
2612 | + "Symfony\\Polyfill\\Mbstring\\": "" | |
2613 | + }, | |
2614 | + "files": [ | |
2615 | + "bootstrap.php" | |
2616 | + ] | |
2617 | + }, | |
2618 | + "notification-url": "https://packagist.org/downloads/", | |
2619 | + "license": [ | |
2620 | + "MIT" | |
2621 | + ], | |
2622 | + "authors": [ | |
2623 | + { | |
2624 | + "name": "Nicolas Grekas", | |
2625 | + "email": "p@tchwork.com" | |
2626 | + }, | |
2627 | + { | |
2628 | + "name": "Symfony Community", | |
2629 | + "homepage": "https://symfony.com/contributors" | |
2630 | + } | |
2631 | + ], | |
2632 | + "description": "Symfony polyfill for the Mbstring extension", | |
2633 | + "homepage": "https://symfony.com", | |
2634 | + "keywords": [ | |
2635 | + "compatibility", | |
2636 | + "mbstring", | |
2637 | + "polyfill", | |
2638 | + "portable", | |
2639 | + "shim" | |
2640 | + ], | |
2641 | + "time": "2015-11-04 20:28:58" | |
2566 | 2642 | }, |
2567 | 2643 | { |
2568 | 2644 | "name": "symfony/yaml", |
2569 | - "version": "v2.7.6", | |
2645 | + "version": "v2.8.0", | |
2570 | 2646 | "source": { |
2571 | 2647 | "type": "git", |
2572 | 2648 | "url": "https://github.com/symfony/yaml.git", |
2573 | - "reference": "eca9019c88fbe250164affd107bc8057771f3f4d" | |
2649 | + "reference": "f79824187de95064a2f5038904c4d7f0227fedb5" | |
2574 | 2650 | }, |
2575 | 2651 | "dist": { |
2576 | 2652 | "type": "zip", |
2577 | - "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d", | |
2578 | - "reference": "eca9019c88fbe250164affd107bc8057771f3f4d", | |
2653 | + "url": "https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5", | |
2654 | + "reference": "f79824187de95064a2f5038904c4d7f0227fedb5", | |
2579 | 2655 | "shasum": "" |
2580 | 2656 | }, |
2581 | 2657 | "require": { |
... | ... | @@ -2584,13 +2660,16 @@ |
2584 | 2660 | "type": "library", |
2585 | 2661 | "extra": { |
2586 | 2662 | "branch-alias": { |
2587 | - "dev-master": "2.7-dev" | |
2663 | + "dev-master": "2.8-dev" | |
2588 | 2664 | } |
2589 | 2665 | }, |
2590 | 2666 | "autoload": { |
2591 | 2667 | "psr-4": { |
2592 | 2668 | "Symfony\\Component\\Yaml\\": "" |
2593 | - } | |
2669 | + }, | |
2670 | + "exclude-from-classmap": [ | |
2671 | + "/Tests/" | |
2672 | + ] | |
2594 | 2673 | }, |
2595 | 2674 | "notification-url": "https://packagist.org/downloads/", |
2596 | 2675 | "license": [ |
... | ... | @@ -2608,7 +2687,7 @@ |
2608 | 2687 | ], |
2609 | 2688 | "description": "Symfony Yaml Component", |
2610 | 2689 | "homepage": "https://symfony.com", |
2611 | - "time": "2015-10-11 09:39:48" | |
2690 | + "time": "2015-11-30 12:35:10" | |
2612 | 2691 | }, |
2613 | 2692 | { |
2614 | 2693 | "name": "yiisoft/yii2", | ... | ... |
console/controllers/ParserController.php
1 | 1 | <?php |
2 | 2 | namespace console\controllers; |
3 | 3 | |
4 | +use backend\models\Log; | |
4 | 5 | use common\components\archives\ArchiveCreator; |
5 | 6 | use common\components\CustomVarDamp; |
6 | 7 | use common\components\mail\ImapMailReader; |
... | ... | @@ -11,115 +12,26 @@ use common\components\PriceWriter; |
11 | 12 | use backend\models\ImportersFiles; |
12 | 13 | use backend\models\Importers; |
13 | 14 | use yii\base\ErrorException; |
15 | +use yii\helpers\Html; | |
14 | 16 | |
15 | 17 | class ParserController extends Controller |
16 | 18 | { |
17 | - public function actionParseCsv() | |
18 | - { | |
19 | - \Yii::info('Начало загрузки файлов прайсов csv', 'parser'); | |
20 | - foreach (glob(\Yii::getAlias('@auto_upload') . '/*.csv') as $file_path) { | |
21 | - $file_name = basename($file_path, ".csv"); | |
22 | - \Yii::info("Обработка файла - $file_path", 'parser'); | |
23 | - $importer_id = ImportersFiles::findOne(['id' => $file_name])->importer_id; | |
24 | - $current_importer = Importers::findOne(['id' => $importer_id]); | |
25 | - $keys = $current_importer->keys; | |
26 | - $mult_array = $current_importer->multiply; | |
27 | - | |
28 | - // получим настройки ценообразования и передадим их отдельно в конвертер | |
29 | - $sign = ''; | |
30 | - $multiplier = ''; | |
31 | - extract( $mult_array ); | |
32 | - | |
33 | - | |
34 | - $config = ['record_id' => $file_name, | |
35 | - 'importer_id' => $importer_id, | |
36 | - 'parser_config' => ['keys' => $keys, | |
37 | - 'converter_conf' => | |
38 | - ['sign' => $sign, | |
39 | - 'multiplier' => $multiplier], | |
40 | - 'mode' => 'console'] | |
41 | - ]; | |
42 | - if ( $this->parseFileConsole( $file_path, $config ) ) { | |
43 | - unlink(\Yii::getAlias('@temp_upload') . '/' . $file_name . '.csv'); | |
44 | - \Yii::info("Загрузка файла - $file_path успешно завершена", 'parser'); | |
45 | - } else { | |
46 | - \Yii::error("Загрузка файла - $file_path завершена с ошибкой", 'parser'); | |
47 | - } | |
48 | - //при любом завершении скрипта файл с очереди автозагрузки нужно удалить | |
49 | - unlink(\Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv'); | |
50 | - } | |
51 | - | |
52 | - } | |
53 | - | |
54 | - | |
55 | - protected function parseFileConsole( $file_path, $configuration ){ | |
56 | - | |
57 | - if( !file_exists( $file_path ) ) | |
58 | - throw new ErrorException("$file_path - файл не найден!"); | |
59 | - | |
60 | - $parser_config = []; | |
61 | - if ( isset( $configuration['parser_config'] ) ) { | |
62 | - $parser_config = $configuration['parser_config']; | |
63 | - } | |
64 | - $data = \Yii::$app->multiparser->parse( $file_path, $parser_config ); | |
65 | - if ( ! $data ) { | |
66 | - throw new ErrorException("Ошибка обработки файла прайса!"); | |
67 | - } | |
68 | - | |
69 | - $writer = new PriceWriter(); | |
70 | - $writer->setConfiguration( $configuration ); | |
71 | - $writer->setData( $data ); | |
72 | - $writer->setMode( 1 ); //console-режим | |
19 | + protected $start_time; | |
73 | 20 | |
74 | - $writer->writePriceToDB(); | |
75 | - if ( $writer->hasValidationError() ) { | |
76 | - \Yii::error( $writer->getValidatedMsg(), 'parser' ); | |
77 | - }else{ | |
78 | - \Yii::info( $writer->getValidatedMsg(), 'parser' ); | |
79 | - } | |
21 | + public function actionParsePrices() | |
22 | + { | |
23 | + $this->start_time = date('Y-m-d H:i:s'); | |
80 | 24 | |
25 | + $path_arr = [ | |
26 | + ['mode' => 1, 'path' => \Yii::getAlias('@auto_upload')], | |
27 | + ['mode' => 2, 'path' => \Yii::getAlias('@mail_upload')], | |
28 | + ]; | |
81 | 29 | |
82 | - return true; | |
30 | + $this->parseCsvFiles($path_arr); | |
31 | + $this->parseXmlFiles($path_arr); | |
83 | 32 | |
84 | 33 | } |
85 | 34 | |
86 | - public function actionParseXml () | |
87 | - { | |
88 | - \Yii::info('Начало загрузки файлов прайсов xml', 'parser'); | |
89 | - foreach (glob(\Yii::getAlias('@auto_upload') . '/*.xml') as $file_path) { | |
90 | - $file_name = basename($file_path, ".xml"); | |
91 | - \Yii::info("Обработка файла - $file_path", 'parser'); | |
92 | - | |
93 | - $files_model = new ImportersFiles(); | |
94 | - // id поставщика всегда = 1 - Склад | |
95 | - $files_model->importer_id = 1; | |
96 | - try { | |
97 | - $files_model->save(); | |
98 | - } catch (ErrorException $e) { | |
99 | - throw $e; | |
100 | - } | |
101 | - // получим id только что записанной записи | |
102 | - $record_id = $files_model->find() | |
103 | - ->where(['importer_id' => $files_model->importer_id]) | |
104 | - ->orderBy(['id' => SORT_DESC]) | |
105 | - ->one() | |
106 | - ->id; | |
107 | - | |
108 | - $config = ['record_id' => $record_id, | |
109 | - 'importer_id' => 1, | |
110 | - 'parser_config' => [ | |
111 | - 'mode' => 'console'] | |
112 | - ]; | |
113 | - | |
114 | - if ($this->parseFileConsole($file_path, $config)) { | |
115 | - //unlink(\Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml'); | |
116 | - \Yii::info("Загрузка файла - $file_path успешно завершена", 'parser'); | |
117 | - } else { | |
118 | - \Yii::error("Загрузка файла - $file_path завершена с ошибкой", 'parser'); | |
119 | - } | |
120 | - } | |
121 | - } | |
122 | - | |
123 | 35 | public function actionTest() |
124 | 36 | { |
125 | 37 | Console::output('It is working'); |
... | ... | @@ -134,13 +46,13 @@ class ParserController extends Controller |
134 | 46 | // получим разделитель для файлов поставщика |
135 | 47 | $importer_id_prefix = ImportersFiles::FILES_PREFIX; |
136 | 48 | // подключимся к ящику |
137 | - $mail_reader = new ImapMailReader( '{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000' ); | |
49 | + $mail_reader = new ImapMailReader('{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000'); | |
138 | 50 | |
139 | 51 | // 1. получим все вложения |
140 | 52 | \Yii::info('Начало сохранения файлов почты', 'mail'); |
141 | - $files = $this->getMailAttachments( $mail_reader, $importer_id_prefix ); | |
53 | + $files = $this->getMailAttachments($mail_reader, $importer_id_prefix); | |
142 | 54 | |
143 | - if ( !$files ) { | |
55 | + if (!$files) { | |
144 | 56 | // нет файлов в ящиках (не было вложений в письмах) |
145 | 57 | \Yii::warning('Вложений не найдено', 'mail'); |
146 | 58 | return; |
... | ... | @@ -148,43 +60,187 @@ class ParserController extends Controller |
148 | 60 | |
149 | 61 | // 2. если в вложениях есть архивы - распакуем их и дополним итоговый массив |
150 | 62 | \Yii::info('Запуск распаковки архивов...', 'mail'); |
151 | - $this->UnpackFiles( $files ); | |
63 | + $this->UnpackFiles($files); | |
152 | 64 | |
153 | 65 | |
154 | 66 | // 3. переименуем, зарегистрируем прайсы и перенесем извлеченные файлы |
155 | 67 | // укажем папку куда нужно перенести все извлеченные вложения |
156 | 68 | \Yii::info('Запуск перемещения и регистрации прайсов...', 'mail'); |
157 | - $new_destination = \Yii::getAlias('@auto_upload') . '/'; | |
69 | + $new_destination = \Yii::getAlias('@mail_upload') . '/'; | |
70 | + | |
71 | + $this->registerAndReplaceFiles($files, $new_destination); | |
72 | + | |
73 | + | |
74 | + } | |
158 | 75 | |
159 | - $this->registerAndReplaceFiles( $files, $new_destination ); | |
76 | + protected function parseCsvFiles($path_arr) | |
77 | + { | |
78 | + \Yii::info('Начало загрузки файлов прайсов csv', 'parser'); | |
79 | + foreach ($path_arr as $path_config) { | |
80 | + foreach (glob($path_config['path'] . '/*.csv') as $file_path) { | |
81 | + $file_name = basename($file_path, ".csv"); | |
82 | + \Yii::info("Обработка файла - $file_path", 'parser'); | |
83 | + $importer_id = ImportersFiles::findOne(['id' => $file_name])->importer_id; | |
84 | + $current_importer = Importers::findOne(['id' => $importer_id]); | |
85 | + $keys = $current_importer->keys; | |
86 | + $mult_array = $current_importer->multiply; | |
87 | + | |
88 | + // получим настройки ценообразования и передадим их отдельно в конвертер | |
89 | + $sign = ''; | |
90 | + $multiplier = ''; | |
91 | + extract($mult_array); | |
92 | + | |
93 | + $config = [ | |
94 | + 'record_id' => $file_name, | |
95 | + 'importer_id' => $importer_id, | |
96 | + 'mode' => $path_config['mode'], | |
97 | + 'parser_config' => ['keys' => $keys, | |
98 | + 'converter_conf' => | |
99 | + ['sign' => $sign, | |
100 | + 'multiplier' => $multiplier], | |
101 | + 'mode' => 'console'] | |
102 | + ]; | |
103 | + | |
104 | + if ($this->parseFile($file_path, $config)) { | |
105 | + $temp_file = \Yii::getAlias('@temp_upload') . '/' . $file_name . '.csv'; | |
106 | + if( file_exists( $temp_file ) ) | |
107 | + unlink($temp_file); | |
108 | + | |
109 | + \Yii::info("Загрузка файла - $file_path успешно завершена", 'parser'); | |
110 | + } else { | |
111 | + \Yii::error("Загрузка файла - $file_path завершена с ошибкой", 'parser'); | |
112 | + } | |
113 | + //при любом завершении скрипта файл с очереди автозагрузки нужно удалить | |
114 | + $auto_file = $path_config['path'] . '/' . $file_name . '.csv'; | |
115 | + if( file_exists( $auto_file ) ) | |
116 | + unlink($auto_file); | |
117 | + } | |
118 | + } | |
119 | + } | |
160 | 120 | |
121 | + protected function parseXmlFiles($path_arr) | |
122 | + { | |
123 | + \Yii::info('Начало загрузки файлов прайсов xml', 'parser'); | |
124 | + foreach ($path_arr as $path_config) { | |
125 | + foreach (glob($path_config['path'] . '/*.xml') as $file_path) { | |
126 | + $file_name = basename($file_path, ".xml"); | |
127 | + \Yii::info("Обработка файла - $file_path", 'parser'); | |
128 | + | |
129 | + $files_model = new ImportersFiles(); | |
130 | + // id поставщика всегда = 1 - Склад | |
131 | + $files_model->importer_id = 1; | |
132 | + try { | |
133 | + $files_model->save(); | |
134 | + } catch (ErrorException $e) { | |
135 | + throw $e; | |
136 | + } | |
137 | + // получим id только что записанной записи | |
138 | + $record_id = $files_model->find() | |
139 | + ->where(['importer_id' => $files_model->importer_id]) | |
140 | + ->orderBy(['id' => SORT_DESC]) | |
141 | + ->one() | |
142 | + ->id; | |
143 | + | |
144 | + $config = ['record_id' => $record_id, | |
145 | + 'importer_id' => 1, | |
146 | + 'mode' => $path_config['mode'], | |
147 | + 'parser_config' => [ | |
148 | + 'mode' => 'console'] | |
149 | + ]; | |
150 | + | |
151 | + if ($this->parseFile($file_path, $config)) { | |
152 | + \Yii::info("Загрузка файла - $file_path успешно завершена", 'parser'); | |
153 | + } else { | |
154 | + \Yii::error("Загрузка файла - $file_path завершена с ошибкой", 'parser'); | |
155 | + } | |
161 | 156 | |
157 | + $auto_file = $path_config['path'] . '/' . $file_name . '.xml'; | |
158 | + if( file_exists( $auto_file ) ) | |
159 | + unlink($auto_file); | |
160 | + } | |
161 | + } | |
162 | 162 | } |
163 | 163 | |
164 | - private function getMailAttachments ($mail_reader, $importer_id_prefix = '') | |
164 | + protected function parseFile($file_path, $configuration) | |
165 | + { | |
166 | + // регистрация в лог | |
167 | + $log_model = new Log(); | |
168 | + $log_model->importer_id = $configuration['importer_id']; | |
169 | + $log_model->time_start = $this->start_time; | |
170 | + $log_model->file_name = $file_path; | |
171 | + $mode = $configuration['mode']; | |
172 | + unset($configuration['mode']); | |
173 | + $log_model->record_type = $mode; | |
174 | + | |
175 | + $log_msg = ''; | |
176 | + $has_error = true; | |
177 | + | |
178 | + if (!file_exists($file_path)){ | |
179 | + $log_msg = "$file_path - файл не найден!"; | |
180 | + } else { | |
181 | + $parser_config = []; | |
182 | + if (isset($configuration['parser_config'])) { | |
183 | + $parser_config = $configuration['parser_config']; | |
184 | + } | |
185 | + $data = \Yii::$app->multiparser->parse($file_path, $parser_config); | |
186 | + if (!$data) { | |
187 | + $log_msg = "Ошибка обработки файла прайса. Парсер вернул пустой массив"; | |
188 | + } else { | |
189 | + try { | |
190 | + $writer = new PriceWriter(); | |
191 | + $writer->setMode($mode); | |
192 | + $writer->setConfiguration($configuration); | |
193 | + $writer->setData($data); | |
194 | + | |
195 | + $writer->writePriceToDB(); | |
196 | + $error = $writer->hasValidationError(); | |
197 | + $log_msg = strip_tags( $writer->getValidatedMsg() ); | |
198 | + if ( $error ) { | |
199 | + \Yii::error($log_msg, 'parser'); | |
200 | + } else { | |
201 | + \Yii::info($log_msg, 'parser'); | |
202 | + } | |
203 | + } catch (\Exception $e) { | |
204 | + $log_msg = $e->getMessage(); | |
205 | + } | |
206 | + } | |
207 | + } | |
208 | + | |
209 | + $log_model->error = (int) $error; | |
210 | + $log_model->log_msg = $log_msg; | |
211 | + // запишем данные в лог | |
212 | + $log_model->save(); | |
213 | + | |
214 | + | |
215 | + | |
216 | + return true; | |
217 | + | |
218 | + } | |
219 | + | |
220 | + private function getMailAttachments($mail_reader, $importer_id_prefix = '') | |
165 | 221 | { |
166 | 222 | // получим все внутренние ящики (по ярлыкам) |
167 | 223 | $mailboxes = $mail_reader->getListMailboxes(); |
168 | - // очистим массив в котором в итоге окажуться все файлы вложений, а также распакованные файлы из архивов | |
224 | + // очистим массив в котором в итоге окажутся все файлы вложений, а также распакованные файлы из архивов | |
169 | 225 | $files = []; |
170 | - foreach ( $mailboxes as $custom_label ) { | |
226 | + foreach ($mailboxes as $custom_label) { | |
171 | 227 | // получим поставщика исходя из маски ярлыка |
172 | - $importer_id = ImportersFiles::getIdFromMailBox( $mail_reader->getHostname(), $custom_label ); | |
228 | + $importer_id = ImportersFiles::getIdFromMailBox($mail_reader->getHostname(), $custom_label); | |
173 | 229 | |
174 | 230 | // читаем письма конкретного ярлыка |
175 | - $mail_reader->reOpen( $custom_label ); | |
231 | + $mail_reader->reOpen($custom_label); | |
176 | 232 | // создадим сейвер вложений для данного ярлыка (ящика) |
177 | - $saver = new MailAttachmentsSaver( $mail_reader ); | |
233 | + $saver = new MailAttachmentsSaver($mail_reader); | |
178 | 234 | // если данный ярлык содержит id поставщика, то все вложения нужно промаркировать (в начало файла добавить id поставщика + разделитель $importer_id_prefix) |
179 | - if ( $importer_id ) { | |
180 | - $saver->setFileNamePrefix( $importer_id . $importer_id_prefix ); | |
235 | + if ($importer_id) { | |
236 | + $saver->setFileNamePrefix($importer_id . $importer_id_prefix); | |
181 | 237 | // $importer_id = ''; |
182 | 238 | } |
183 | 239 | // сохраняем вложения |
184 | - if( $saver->saveAttachmentsTo(\Yii::getAlias('@temp_upload'), 'UNSEEN') ){ | |
240 | + if ($saver->saveAttachmentsTo(\Yii::getAlias('@temp_upload'), 'UNSEEN')) { | |
185 | 241 | // закидываем вытащенные файлы в наш итоговый массив |
186 | - $files = array_merge( $files, $saver->getSavedFilesArr() ); | |
187 | - }else{ | |
242 | + $files = array_merge($files, $saver->getSavedFilesArr()); | |
243 | + } else { | |
188 | 244 | // ящик не имеет писем с вложениями |
189 | 245 | continue; |
190 | 246 | } |
... | ... | @@ -193,7 +249,7 @@ class ParserController extends Controller |
193 | 249 | return $files; |
194 | 250 | } |
195 | 251 | |
196 | - private function UnpackFiles ( &$files, $importer_id_prefix = '') | |
252 | + private function UnpackFiles(&$files, $importer_id_prefix = '') | |
197 | 253 | { |
198 | 254 | // если в вложениях встречаются архивы - распакуем |
199 | 255 | // иициируем фабрику архиваторов |
... | ... | @@ -201,13 +257,13 @@ class ParserController extends Controller |
201 | 257 | // получим все расширения которые поддерживает фабрика |
202 | 258 | $arch_extensions = $arch_creator->getHandleExtension(); |
203 | 259 | // выбираем только те файлы которые мы можем распаковать |
204 | - $arch_files = array_intersect( $files , $arch_extensions ); | |
260 | + $arch_files = array_intersect($files, $arch_extensions); | |
205 | 261 | foreach ($arch_files as $arch_name => $arch_ext) { |
206 | 262 | // создаем конкретный архиватор по расширению |
207 | - $arch_reader = $arch_creator->create( $arch_name, $arch_ext ); | |
263 | + $arch_reader = $arch_creator->create($arch_name, $arch_ext); | |
208 | 264 | // определим ид поставщика по имени файла |
209 | 265 | $importer_id = ImportersFiles::getIdFromFileName($arch_name); |
210 | - if( $importer_id ){ | |
266 | + if ($importer_id) { | |
211 | 267 | // если файл архива содержит поставщика (на предыдущих этапах мы его туда записали) |
212 | 268 | // то нужно все вложенные файлы также промаркировать |
213 | 269 | $arch_reader->setFileNamePrefix($importer_id . $importer_id_prefix); |
... | ... | @@ -217,42 +273,42 @@ class ParserController extends Controller |
217 | 273 | // распаковываем файлы |
218 | 274 | $arch_reader->extractTo(\Yii::getAlias('@temp_upload') . '/'); |
219 | 275 | // убираем файл архива из итогового массива |
220 | - unset( $files[$arch_name] ); | |
276 | + unset($files[$arch_name]); | |
221 | 277 | // удаляем файл архива |
222 | 278 | unlink($arch_name); |
223 | 279 | // добавляем распакованные файлы к итоговому массиву |
224 | - $files = array_merge( $files, $arch_reader->getExtractedFiles()); | |
280 | + $files = array_merge($files, $arch_reader->getExtractedFiles()); | |
225 | 281 | } |
226 | 282 | |
227 | 283 | } |
228 | 284 | |
229 | - private function registerAndReplaceFiles ( &$files, $new_destination ) | |
285 | + private function registerAndReplaceFiles(&$files, $new_destination) | |
230 | 286 | { |
231 | - foreach ( $files as $name => $ext ) { | |
287 | + foreach ($files as $name => $ext) { | |
232 | 288 | // имена файлов для расширения csv нужно поменять, |
233 | 289 | // для остальных оставляем оригинальные имена вложений (плюс ид поставщика если письмо от поставщика) |
234 | - $file_name = pathinfo( $name, PATHINFO_BASENAME ); | |
235 | - if( $ext == 'csv' ){ | |
290 | + $file_name = pathinfo($name, PATHINFO_BASENAME); | |
291 | + if ($ext == 'csv') { | |
236 | 292 | // определим ид поставщика по имени файла |
237 | - $importer_id = ImportersFiles::getIdFromFileName( basename( $name ) );; | |
293 | + $importer_id = ImportersFiles::getIdFromFileName(basename($name));; | |
238 | 294 | |
239 | 295 | // зарегистрируем прайс |
240 | - if ( $importer_id ) { | |
296 | + if ($importer_id) { | |
241 | 297 | $files_model = new ImportersFiles(); |
242 | 298 | $files_model->importer_id = $importer_id; |
243 | 299 | if ($files_model->save()) { |
244 | 300 | // имя файла переименуем на id записи |
245 | 301 | $file_name = \Yii::$app->db->getLastInsertID() . '.csv'; |
246 | 302 | |
247 | - } else{ | |
303 | + } else { | |
248 | 304 | |
249 | 305 | $files_model->throwStringErrorException(); |
250 | 306 | } |
251 | 307 | } |
252 | 308 | } |
253 | - if( rename( $name, $new_destination . $file_name ) ){ | |
309 | + if (rename($name, $new_destination . $file_name)) { | |
254 | 310 | \Yii::info("Вложение {$name} сохранено", 'mail'); |
255 | - } else{ | |
311 | + } else { | |
256 | 312 | new \ErrorException("Нет возможности переписать файл {$name}"); |
257 | 313 | } |
258 | 314 | } | ... | ... |
1 | +<?php | |
2 | + | |
3 | +use yii\db\Schema; | |
4 | +use yii\db\Migration; | |
5 | + | |
6 | +class m151203_134605_addLogTable extends Migration | |
7 | +{ | |
8 | + public function up() | |
9 | + { | |
10 | + $table = <<< MySQL | |
11 | + CREATE TABLE `w_log` ( | |
12 | + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, | |
13 | + `error` BOOL NOT NULL DEFAULT FALSE, | |
14 | + `record_type` int(1) unsigned NOT NULL DEFAULT 1, | |
15 | + `time_start` timestamp NULL DEFAULT NULL, | |
16 | + `importer_id` int(6) unsigned NOT NULL, | |
17 | + `time_end` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
18 | + `log_msg` MEDIUMTEXT, | |
19 | + `file_name` VARCHAR(100), | |
20 | + PRIMARY KEY (`id`), | |
21 | + KEY `record_type` (`error`,`record_type`), | |
22 | + KEY `time_start` (`time_start`) | |
23 | + ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; | |
24 | +MySQL; | |
25 | + | |
26 | + $this->execute($table); | |
27 | + } | |
28 | + | |
29 | + public function down() | |
30 | + { | |
31 | + // вернем все как было | |
32 | + $drop_table = 'drop table if exists w_log'; | |
33 | + | |
34 | + $this->execute($drop_table); | |
35 | + | |
36 | + } | |
37 | + | |
38 | + /* | |
39 | + // Use safeUp/safeDown to run migration code within a transaction | |
40 | + public function safeUp() | |
41 | + { | |
42 | + } | |
43 | + | |
44 | + public function safeDown() | |
45 | + { | |
46 | + } | |
47 | + */ | |
48 | +} | ... | ... |
test.html deleted
1 | -yii\web\Cookie Object ( [name] => _frontendUser [value] => [1,"admin",2592000] [domain] => [expire] => 1451578203 [path] => / [secure] => [httpOnly] => 1 ) 1 | |
2 | -yii\web\Cookie Object ( [name] => _frontendUser [value] => [4201,"wwww",2592000] [domain] => [expire] => 1451578282 [path] => / [secure] => [httpOnly] => 1 ) 1 | |
3 | 0 | \ No newline at end of file |