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 |