Created
October 10, 2017 09:53
-
-
Save andku83/22ac0fdd6847df5010a3b8845718e7a0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace backend\controllers; | |
use backend\models\ExcelExportForm; | |
use backend\models\ExcelImportForm; | |
use backend\models\File; | |
use backend\models\search\ProductSearch; | |
use common\models\Product; | |
use moonland\phpexcel\Excel; | |
use Yii; | |
use yii\helpers\ArrayHelper; | |
use yii\web\Controller; | |
use yii\web\UploadedFile; | |
/** | |
* Class ExcelController | |
* @package backend\controllers | |
*/ | |
class ExcelController extends Controller | |
{ | |
/** | |
* @return string|\yii\web\Response | |
*/ | |
public function actionIndex() | |
{ | |
$searchModel = new ProductSearch(); | |
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |
$excelExportForm = new ExcelExportForm(); | |
if (Yii::$app->request->isPost && $excelExportForm->load(Yii::$app->request->post())){ | |
$exportAttributes = $excelExportForm->getExportAttributes(); | |
$file = new File(['fileName' => 'product-export-'.date('Y-m-d-H-i-s').'.xls']); | |
$result = Excel::export([ | |
'savePath' => $file->path, | |
'fileName' => $file->fileName, | |
'format' => 'Excel5', | |
'asAttachment' => false, | |
'models' => $searchModel->queryExport(Yii::$app->request->queryParams, array_keys($exportAttributes)) | |
->asArray()->all(), | |
'columns' => $exportAttributes, //without header working, because the header will be get label from attribute label. | |
'headers' => $exportAttributes, | |
]); | |
if ($result) { | |
$this->setFlash('alert-success', 'File was successfully created'); | |
return $this->redirect(['files']); | |
} else { | |
$this->setFlash('alert-danger', 'Error occurred'); | |
return $this->refresh(); | |
} | |
} | |
return $this->render('index', [ | |
'searchModel' => $searchModel, | |
'dataProvider' => $dataProvider, | |
'excelExportForm' => $excelExportForm, | |
]); | |
} | |
/** | |
* @return string|\yii\web\Response | |
*/ | |
public function actionImport() | |
{ | |
$model = new ExcelImportForm(); | |
if ($model->load(Yii::$app->request->post())) { | |
$model->file = UploadedFile::getInstance($model, 'file'); | |
$file = new File(['fileName' => 'product-import-'.date('Y-m-d-H-i-s').'.xls']); | |
$model->filePath = $file->path . $file->fileName; | |
if ($model->upload()) { | |
$this->setFlash('alert-success', 'File was successfully loaded'); | |
$data = Excel::import([ | |
'fileName' => $model->filePath, | |
// 'format' => 'Excel5', | |
// 'setFirstRecordAsKeys' => true, | |
]); | |
$data = ArrayHelper::index($data['fileName'], 'part_numb'); | |
$part_numbs = ArrayHelper::getColumn($data, 'part_numb'); | |
if($data && key_exists('brand_id', current($data))){ | |
foreach (Product::find()->byPartNumb($part_numbs)->each(200) as $product){ | |
/* @var $product Product */ | |
if(isset($data[$product->part_numb]) && $data[$product->part_numb]['brand_id'] == $product->brand_id){ | |
$product->setScenario(Product::SCENARIO_EXPORT); | |
$product->setAttributes($data[$product->part_numb]); | |
$product->save(false); | |
} | |
} | |
if (!empty($product)){ | |
$product->invalidateTagDependency(); | |
} | |
Yii::warning([ | |
'user' => Yii::$app->user->identity->username . ' ' . Yii::$app->user->identity->email, | |
'update_products' => implode(', ',$part_numbs) | |
], 'import-products'); | |
} | |
$this->setFlash('alert-success', 'File was successfully loaded and importing'); | |
} else { | |
$this->setFlash('alert-danger', 'Error occurred'); | |
} | |
} | |
return $this->render('import', ['model' => $model]); | |
} | |
/** | |
* @return string | |
*/ | |
public function actionFiles() | |
{ | |
$csv = new File(); | |
return $this->render('files', [ | |
'scroll' => $csv->scroll(), | |
]); | |
} | |
/** | |
* @param string $name | |
* @return \yii\web\Response | |
*/ | |
public function actionDelete($name) | |
{ | |
$csv = new File; | |
if ($csv->delete($name)) { | |
$this->setFlash('alert-success', 'File was successfully deleted'); | |
} else { | |
$this->setFlash('alert-danger', 'Error occurred'); | |
} | |
return $this->redirect(['excel/files']); | |
} | |
/** | |
* @param $class | |
* @param $message | |
*/ | |
protected function setFlash($class, $message) | |
{ | |
Yii::$app->session->setFlash('alert', [ | |
'body'=> Yii::t('backend', $message), | |
'options'=>['class'=>$class] | |
]); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment