Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

276 lines
9.2KB

  1. <?php
  2. /**
  3. * Copyright distrib (2018)
  4. *
  5. * contact@opendistrib.net
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace producer\controllers;
  38. use common\forms\ContactForm;
  39. use common\helpers\GlobalParam;
  40. use common\logic\Feature\Feature\Feature;
  41. use common\logic\Product\Product\Model\Product;
  42. use yii\data\ActiveDataProvider;
  43. use yii\helpers\Html;
  44. class SiteController extends ProducerBaseController
  45. {
  46. /**
  47. * @inheritdoc
  48. */
  49. public function behaviors()
  50. {
  51. return [];
  52. }
  53. public function actions()
  54. {
  55. return [
  56. 'captcha' => [
  57. 'class' => 'yii\captcha\CaptchaAction',
  58. 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  59. ],
  60. ];
  61. }
  62. /**
  63. * Affiche et gère les erreurs.
  64. */
  65. public function actionError()
  66. {
  67. $exception = \Yii::$app->errorHandler->exception;
  68. if ($exception !== null) {
  69. if ($exception->getMessage() == 'Producteur introuvable') {
  70. \Yii::$app->getResponse()->redirect(
  71. $this->getUrlManagerFrontend()->createAbsoluteUrl(['site/error', 'producer_not_found' => true])
  72. )->send();
  73. } else {
  74. return $this->render('error', ['exception' => $exception]);
  75. }
  76. }
  77. }
  78. /**
  79. * Affiche la page d'accueil des producteurs comprenant une image, une
  80. * description, la liste des points de vente et les produits.
  81. */
  82. public function actionIndex()
  83. {
  84. $productModule = $this->getProductModule();
  85. $pointSaleModule = $this->getPointSaleModule();
  86. $dataProviderPointsSale = new ActiveDataProvider([
  87. 'query' => $pointSaleModule->queryPointSalesPublic($this->getProducerCurrent()),
  88. 'pagination' => [
  89. 'pageSize' => 50,
  90. ],
  91. 'sort' => false,
  92. ]);
  93. $productCategoryArray = $this->getProductCategoryModule()->findProductCategories();
  94. $dataProviderProductsByCategories = [];
  95. foreach ($productCategoryArray as $productCategory) {
  96. $dataProviderProductsByCategories[$productCategory->id] = new ActiveDataProvider([
  97. 'query' => $productModule->queryProductsByProductCategory($productCategory)->query(),
  98. 'pagination' => [
  99. 'pageSize' => 500,
  100. ],
  101. 'sort' => false,
  102. ]);
  103. $this->filterProductsPublic($dataProviderProductsByCategories[$productCategory->id]);
  104. }
  105. $queryProducts = Product::find()
  106. ->andWhere([
  107. 'id_producer' => $this->getProducerCurrent()->id,
  108. 'status' => Product::STATUS_ONLINE,
  109. 'id_product_category' => null,
  110. ])
  111. ->with('productPointSale')
  112. ->orderBy('order ASC');
  113. $dataProviderProducts = new ActiveDataProvider([
  114. 'query' => $queryProducts,
  115. 'pagination' => [
  116. 'pageSize' => 500,
  117. ],
  118. 'sort' => false,
  119. ]);
  120. $this->filterProductsPublic($dataProviderProducts);
  121. $products = $queryProducts->all();
  122. foreach ($dataProviderProductsByCategories as $dataProvider) {
  123. $products = array_merge(
  124. $products,
  125. $dataProvider->query->all()
  126. );
  127. }
  128. $hasProductPhoto = false;
  129. $hasProductWeight = false;
  130. foreach ($products as $product) {
  131. if (strlen($product->photo) > 0) {
  132. $hasProductPhoto = true;
  133. }
  134. if ($product->weight && $product->weight > 0) {
  135. $hasProductWeight = true;
  136. }
  137. }
  138. return $this->render('index', [
  139. 'dataProviderProductsByCategories' => $dataProviderProductsByCategories,
  140. 'dataProviderPointsSale' => $dataProviderPointsSale,
  141. 'dataProviderProducts' => $dataProviderProducts,
  142. 'hasProductPhoto' => $hasProductPhoto,
  143. 'hasProductWeight' => $hasProductWeight,
  144. 'categories' => $productCategoryArray,
  145. ]);
  146. }
  147. public function filterProductsPublic($dataProviderProducts)
  148. {
  149. $productModule = $this->getProductModule();
  150. $models = $dataProviderProducts->getModels();
  151. foreach($models as $index => $product) {
  152. if(!$productModule->isPublic($product)) {
  153. unset($models[$index]);
  154. }
  155. }
  156. $dataProviderProducts->setModels($models);
  157. }
  158. /**
  159. * Affiche et traite le formulaire de contact dédié aux producteurs.
  160. */
  161. public function actionContact()
  162. {
  163. $featureModule = $this->getFeatureModule();
  164. if($featureModule->getChecker()->isDisabled(Feature::ALIAS_CONTACT)) {
  165. return $this->redirect(['site/index']);
  166. }
  167. $model = new ContactForm();
  168. $producer = $this->getProducerCurrent();
  169. if ($model->load(\Yii::$app->request->post()) && $model->validate()) {
  170. $isSent = false;
  171. if ($producer->contact_email && strlen($producer->contact_email) > 0 && $model->sendEmail($producer)) {
  172. $isSent = true;
  173. }
  174. if ($isSent) {
  175. $this->setFlash('success', 'Votre message a bien été envoyé.');
  176. } else {
  177. $this->setFlash('error', 'Il y a eu une erreur lors de l\'envoi de votre message.');
  178. }
  179. $model = new ContactForm();
  180. }
  181. return $this->render('contact', [
  182. 'model' => $model,
  183. 'producer' => $this->getProducerCurrent()
  184. ]);
  185. }
  186. /**
  187. * Ajoute ou supprime un producteur des favoris de l'utilisateur.
  188. * Redirige vers la page d'accueil du producteur.
  189. */
  190. public function actionBookmarks(string $action)
  191. {
  192. $producer = $this->getProducerCurrent();
  193. $userCurrent = $this->getUserCurrent();
  194. if($userCurrent) {
  195. $userProducer = $this->getUserProducerModule()
  196. ->createUserProducerIfNotExist($userCurrent, $producer);
  197. if ($action == 'add') {
  198. $userProducer->bookmark = 1;
  199. $this->setFlash(
  200. 'success',
  201. 'Le producteur <strong>' . Html::encode($producer->name) . '</strong> vient d\'être ajouté à vos favoris.'
  202. );
  203. } else {
  204. $userProducer->bookmark = 0;
  205. $this->setFlash(
  206. 'success',
  207. 'Le producteur <strong>' . Html::encode($producer->name) . '</strong> vient d\'être supprimé de vos favoris.'
  208. );
  209. }
  210. $userProducer->save();
  211. }
  212. return $this->redirect(['site/index']);
  213. }
  214. /**
  215. * Affiche les mentions légales du producteur.
  216. */
  217. public function actionMentions()
  218. {
  219. $producer = $this->getProducerCurrent();
  220. if (!strlen($producer->mentions)) {
  221. throw new \yii\base\UserException('Mentions légales introuvables.');
  222. }
  223. return $this->render('mentions', [
  224. 'producer' => $producer
  225. ]);
  226. }
  227. /**
  228. * Affiche les conditions générales de vente du producteur.
  229. */
  230. public function actionGcs()
  231. {
  232. $producer = $this->getProducerCurrent();
  233. if (!strlen($producer->gcs)) {
  234. throw new \yii\base\UserException('Conditions générales de vente introuvables.');
  235. }
  236. return $this->render('gcs', [
  237. 'producer' => $producer
  238. ]);
  239. }
  240. }
  241. ?>