BannerService.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. /**
  3. * Author: lf
  4. * Blog: https://blog.feehi.com
  5. * Email: job@feehi.com
  6. * Created at: 2020-01-30 18:41
  7. */
  8. namespace common\services;
  9. use Yii;
  10. use backend\models\form\BannerForm;
  11. use backend\models\form\BannerTypeForm;
  12. use backend\models\search\OptionsSearch;
  13. use common\helpers\Util;
  14. use common\libs\Constants;
  15. use common\models\Options;
  16. use yii\data\ArrayDataProvider;
  17. use yii\helpers\ArrayHelper;
  18. use yii\web\NotFoundHttpException;
  19. class BannerService extends Service implements BannerServiceInterface
  20. {
  21. public function getSearchModel(array $options = [])
  22. {
  23. return new OptionsSearch(['type' => Options::TYPE_BANNER]);
  24. }
  25. public function getModel($id, array $options = [])
  26. {
  27. return BannerTypeForm::find()->where(['id' => $id, 'type' => Options::TYPE_BANNER])->one();
  28. }
  29. public function newModel(array $options = [])
  30. {
  31. return new BannerTypeForm();
  32. }
  33. public function newBannerModel($id)
  34. {
  35. $model = $this->getDetail($id);
  36. return new BannerForm(['id'=>$model->id, 'tips'=>$model->tips]);
  37. }
  38. public function getBannerList($id)
  39. {
  40. $banners = $this->getBanners($id);
  41. return [
  42. 'dataProvider' => new ArrayDataProvider([
  43. 'allModels' => $banners,
  44. ])
  45. ];
  46. }
  47. public function getBannerDetail($id, $sign)
  48. {
  49. $banners = $this->getBanners($id);
  50. foreach ($banners as $banner){
  51. if( $banner->sign === $sign ){
  52. return $banner;
  53. }
  54. }
  55. throw new NotFoundHttpException("Not found banner id " . $id . " sign " . $sign);
  56. }
  57. public function updateBanner($id, $sign, array $postData = [])
  58. {
  59. /** @var BannerForm $banner */
  60. $banner = $this->getBannerDetail($id, $sign);
  61. if( $banner->load($postData) && $banner->validate() ){
  62. $model = Options::findOne($id);
  63. $newBanners = [];
  64. $banners = $this->getBanners($id);
  65. foreach ($banners as $b){
  66. /** @var BannerForm $b */
  67. if( $b->sign === $sign ){
  68. Util::handleModelSingleFileUpload($b, 'img', false, '@uploads/setting/banner/');
  69. $banner->img = $b->img;
  70. $newBanners[] = $banner->getValue();
  71. }else {
  72. $newBanners[] = $b->getValue();
  73. }
  74. }
  75. $model->value = json_encode($newBanners);
  76. if( $model->save() ){
  77. return true;
  78. }else{
  79. return $model;
  80. }
  81. }else{
  82. return $banner;
  83. }
  84. }
  85. public function createBanner($id, array $postData = [])
  86. {
  87. /** @var BannerForm $banner */
  88. $banner = $this->newBannerModel($id);
  89. if ($banner->load($postData) && $banner->validate()) {
  90. $model = Options::findOne($id);
  91. $banners = $this->getBanners($id);
  92. Util::handleModelSingleFileUpload($banner, 'img', true, '@uploads/setting/banner/');
  93. $banners[] = $banner->getValue();
  94. $model->value = json_encode($banners);
  95. if ($model->save()) {
  96. return true;
  97. } else {
  98. return $model;
  99. }
  100. } else {
  101. return $banner;
  102. }
  103. }
  104. public function sortBanner($id, $sign, $sort)
  105. {
  106. $newBanners = [];
  107. $banners = $this->getBanners($id);
  108. foreach ($banners as $key => $banner) {
  109. /** @var BannerForm $banner */
  110. if ($banner->sign === $sign) {
  111. $banner->sort = $sort;
  112. }
  113. $newBanners[] = $banner->getValue();
  114. }
  115. $model = Options::findOne($id);
  116. $model->value = json_encode($banners);
  117. if ($model->save()) {
  118. return true;
  119. } else {
  120. return $model;
  121. }
  122. }
  123. public function deleteBanner($id, $sign)
  124. {
  125. $newBanners = [];
  126. $banners = $this->getBanners($id);
  127. foreach ($banners as $banner) {
  128. /** @var BannerForm $banner */
  129. if ($banner->sign === $sign) {
  130. if( !empty( $banner->img ) ){
  131. Util::deleteThumbnails(Yii::getAlias('@frontend/web') . $banner->img, [], true);
  132. }
  133. continue;
  134. }
  135. $newBanners[] = $banner->getValue();
  136. }
  137. $model = Options::findOne($id);
  138. $model->value = json_encode($newBanners);
  139. if ($model->save()) {
  140. return true;
  141. } else {
  142. return $model;
  143. }
  144. }
  145. private function getBanners($id)
  146. {
  147. $model = options::findOne(['type' => Options::TYPE_BANNER, 'id' => $id]);
  148. if( $model === null ){
  149. throw new NotFoundHttpException("Not exists banner " . $id);
  150. }
  151. $items = json_decode($model->value, true);
  152. $formModel = $this->newBannerModel($id);
  153. $banners = [];
  154. ArrayHelper::multisort($items, 'sort');
  155. foreach ($items as $item){
  156. $form = clone $formModel;
  157. $form->setAttributes($item);
  158. $form->setOldAttributes($item);
  159. $banners[] = $form;
  160. }
  161. return $banners;
  162. }
  163. public function getBannersByAdType($type)
  164. {
  165. $model = Options::findOne(['type' => Options::TYPE_BANNER, 'name'=>$type]);
  166. if( $model == null ) throw new NotFoundHttpException("None banner type named " . $type);
  167. if( $model->value == '' ) $model->value = '[]';
  168. $banners = json_decode($model->value, true);
  169. ArrayHelper::multisort($banners, 'sort');
  170. /** @var $cdn \feehi\cdn\TargetInterface */
  171. $cdn = Yii::$app->get('cdn');
  172. foreach ($banners as $k => &$banner){
  173. if( $banner['status'] == Constants::Status_Disable ) unset($banners[$k]);
  174. $banner['img'] = $cdn->getCdnUrl($banner['img']);
  175. }
  176. return $banners;
  177. }
  178. }