選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

459 行
14KB

  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 frontend\controllers;
  38. use common\helpers\GlobalParam;
  39. use frontend\forms\ProducerCodeForm;
  40. use Yii;
  41. use frontend\forms\PasswordResetRequestForm;
  42. use frontend\forms\ResetPasswordForm;
  43. use frontend\forms\SignupForm;
  44. use common\forms\ContactForm;
  45. use yii\base\InvalidParamException;
  46. use yii\data\ActiveDataProvider;
  47. use yii\web\BadRequestHttpException;
  48. use yii\filters\VerbFilter;
  49. use yii\filters\AccessControl;
  50. use common\forms\LoginForm;
  51. use yii\web\NotFoundHttpException;
  52. /**
  53. * Site controller
  54. */
  55. class SiteController extends FrontendController
  56. {
  57. /**
  58. * @inheritdoc
  59. */
  60. public function behaviors()
  61. {
  62. return [
  63. 'access' => [
  64. 'class' => AccessControl::class,
  65. 'only' => ['logout', 'signup'],
  66. 'rules' => [
  67. [
  68. 'actions' => ['signup'],
  69. 'allow' => true,
  70. 'roles' => ['?'],
  71. ],
  72. [
  73. 'actions' => ['logout'],
  74. 'allow' => true,
  75. 'roles' => ['@'],
  76. ],
  77. ],
  78. ],
  79. 'verbs' => [
  80. 'class' => VerbFilter::class,
  81. 'actions' => [
  82. 'logout' => ['get'],
  83. ],
  84. ],
  85. ];
  86. }
  87. /**
  88. * @inheritdoc
  89. */
  90. public function actions()
  91. {
  92. return [
  93. 'captcha' => [
  94. 'class' => 'yii\captcha\CaptchaAction',
  95. 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  96. ],
  97. ];
  98. }
  99. /**
  100. * Affiche la page d'erreur.
  101. *
  102. * @return mixed
  103. */
  104. public function actionError()
  105. {
  106. $exception = \Yii::$app->errorHandler->exception;
  107. if ($exception->getMessage() == 'Producteur introuvable'
  108. || \Yii::$app->getRequest()->getQueryParam('producer_not_found')) {
  109. return $this->render('error-404-producer', ['exception' => $exception]);
  110. }
  111. if ($exception !== null) {
  112. return $this->render('error', ['exception' => $exception]);
  113. }
  114. }
  115. /**
  116. * Affiche la page d'accueil.
  117. */
  118. public function actionIndex()
  119. {
  120. return $this->render('index', [
  121. 'producerDemoAccount' => $this->getProducerManager()->findOneProducerDemoAccount(),
  122. 'dataProviderPrices' => $this->getDataProviderPrices()
  123. ]);
  124. }
  125. /**
  126. * Page de présentation des tarifs.
  127. */
  128. public function actionPrices()
  129. {
  130. return $this->render('prices', [
  131. 'dataProviderPrices' => $this->getDataProviderPrices()
  132. ]);
  133. }
  134. public function getDataProviderPrices()
  135. {
  136. return new ActiveDataProvider([
  137. 'query' => $this->getProducerPriceRangeManager()->queryProducerPriceRanges(),
  138. 'pagination' => [
  139. 'pageSize' => 100,
  140. ],
  141. ]);
  142. }
  143. /**
  144. * Liste les producteurs utilisant la plateforme.
  145. */
  146. public function actionProducers()
  147. {
  148. $dataProviderProducers = new ActiveDataProvider([
  149. 'query' => $this->getProducerManager()->queryProducersActive(),
  150. 'pagination' => [
  151. 'pageSize' => 100,
  152. ],
  153. ]);
  154. return $this->render('producers', [
  155. 'dataProviderProducers' => $dataProviderProducers
  156. ]);
  157. }
  158. /**
  159. * Affiche la page de connexion et traite le formulaire de connexion.
  160. */
  161. public function actionLogin()
  162. {
  163. if (!\Yii::$app->user->isGuest) {
  164. return \Yii::$app->getResponse()->redirect(['site/index']);
  165. }
  166. $model = new LoginForm();
  167. if ($model->load(Yii::$app->request->post()) && $model->login()) {
  168. $returnUrl = \Yii::$app->request->get('return_url');
  169. if ($returnUrl) {
  170. return $this->redirect($returnUrl);
  171. }
  172. else {
  173. $userProducerArray = $this->getUserProducerManager()->findUserProducersByUser(GlobalParam::getCurrentUser());
  174. if ($userProducerArray
  175. && is_array($userProducerArray)
  176. && count($userProducerArray) == 1) {
  177. $urlRedirect = $this->getUrlManagerProducer()
  178. ->createAbsoluteUrl([
  179. 'site/index',
  180. 'slug_producer' => $userProducerArray[0]->producer->slug
  181. ]);
  182. return $this->redirect($urlRedirect);
  183. }
  184. else {
  185. return $this->goBack();
  186. }
  187. }
  188. } else {
  189. return $this->render('@frontend/views/site/login', [
  190. 'model' => $model,
  191. ]);
  192. }
  193. }
  194. /**
  195. * Déconnecte l'utilisateur.
  196. */
  197. public function actionLogout()
  198. {
  199. \Yii::$app->user->logout();
  200. return $this->goHome();
  201. }
  202. /**
  203. * Affiche la page de contact et traite le formulaire s'il est soumis.
  204. */
  205. public function actionContact()
  206. {
  207. $model = new ContactForm();
  208. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  209. if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
  210. $this->setFlash('success', 'Votre message a bien été envoyé. Nous vous répondrons dès que possible.');
  211. }
  212. else {
  213. $this->setFlash('error', 'Il y a eu une erreur lors de l\'envoi de votre message.');
  214. }
  215. return $this->refresh();
  216. }
  217. else {
  218. return $this->render('contact', [
  219. 'model' => $model,
  220. ]);
  221. }
  222. }
  223. /**
  224. * Affiche la page d'inscription et traite son formulaire.
  225. */
  226. public function actionSignup()
  227. {
  228. $model = new SignupForm();
  229. $producerManager = $this->getProducerManager();
  230. if ($model->load(Yii::$app->request->post())) {
  231. $user = $model->signup();
  232. if ($user && Yii::$app->getUser()->login($user)) {
  233. if ($model->isProducer()) {
  234. $this->redirect(['site/signup-confirm']);
  235. }
  236. else {
  237. $producer = $producerManager->findOneProducerById($model->id_producer);
  238. if ($producer) {
  239. $this->redirect(['site/signup-confirm', 'idProducerRedirect' => $producer->id]);
  240. }
  241. else {
  242. $this->redirect(['site/index']);
  243. }
  244. }
  245. }
  246. }
  247. // Liste des producteurs disponibles
  248. $producersArray = $producerManager->populateProducerDropdown();
  249. $dataProducers = $producersArray['data'];
  250. $optionsProducers = $producersArray['options'];
  251. return $this->render('signup', [
  252. 'model' => $model,
  253. 'dataProducers' => $dataProducers,
  254. 'dataProviderPrices' => $this->getDataProviderPrices(),
  255. 'optionsProducers' => $optionsProducers,
  256. ]);
  257. }
  258. public function actionSignupConfirm($idProducerRedirect = null)
  259. {
  260. $producerManager = $this->getProducerManager();
  261. $user = $this->getUserCurrent();
  262. $producerRedirect = $idProducerRedirect ? $producerManager->findOneProducerById($idProducerRedirect) : null ;
  263. if(!$user) {
  264. throw new NotFoundHttpException('Page introuvable');
  265. }
  266. return $this->render('signup_confirm', [
  267. 'user' => $user,
  268. 'producerRedirect' => $producerRedirect
  269. ]);
  270. }
  271. /**
  272. * Affiche la page de demande de nouveau mot de passe.
  273. * Traitement du formulaire.
  274. */
  275. public function actionRequestPasswordReset()
  276. {
  277. $model = new PasswordResetRequestForm();
  278. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  279. if ($model->sendEmail()) {
  280. $this->setFlash('success', 'Un lien vous permettant de réinitialiser votre mot de passe
  281. vient d\'être envoyé sur votre boîte mail.');
  282. return $this->goHome();
  283. }
  284. else {
  285. $this->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
  286. }
  287. }
  288. return $this->render('requestPasswordResetToken', [
  289. 'model' => $model,
  290. ]);
  291. }
  292. /**
  293. * Met à jour le mot de passe de l'utilisateur.
  294. */
  295. public function actionResetPassword($token)
  296. {
  297. try {
  298. $model = new ResetPasswordForm($token);
  299. } catch (InvalidParamException $e) {
  300. throw new BadRequestHttpException($e->getMessage());
  301. }
  302. if ($model->load($this->getRequest()->post())
  303. && $model->validate()
  304. && $model->resetPassword()) {
  305. $this->setFlash('success', 'Votre nouveau mot de passe vient d\'être sauvegardé.');
  306. return $this->goHome();
  307. }
  308. return $this->render('resetPassword', [
  309. 'model' => $model,
  310. ]);
  311. }
  312. /**
  313. * Affiche le formulaire de demande de code pour accéder à certains producteurs.
  314. */
  315. public function actionProducerCode(int $id)
  316. {
  317. $producerManager = $this->getProducerManager();
  318. $producer = $producerManager->findOneProducerById($id);
  319. if (!$producer) {
  320. throw new \yii\web\HttpException(404, 'Producteur introuvable');
  321. }
  322. $producerCodeForm = new ProducerCodeForm();
  323. $producerCodeForm->id_producer = $id;
  324. if ($producerCodeForm->load($this->getRequest()->post())
  325. && $producerCodeForm->validate()) {
  326. $producerManager->addUser(GlobalParam::getCurrentUser(), $producer);
  327. $this->redirect($this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  328. }
  329. return $this->render('producer_code', [
  330. 'producer' => $producer,
  331. 'producerCodeForm' => $producerCodeForm,
  332. ]);
  333. }
  334. /**
  335. * Affiche la page de connexion / inscription pour accéder notamment au
  336. * formulaire de commande des producteurs.
  337. */
  338. public function actionProducer(int $id)
  339. {
  340. $loginForm = new LoginForm();
  341. $signupForm = new SignupForm();
  342. $producerManager = $this->getProducerManager();
  343. $producer = $producerManager->findOneProducerById($id);
  344. $loginForm->id_producer = $id;
  345. $signupForm->id_producer = $id;
  346. $signupForm->option_user_producer = 'user';
  347. $returnUrl = $this->getRequest()->get('returnUrl', $this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  348. if ($this->getUser()->isGuest) {
  349. if ($loginForm->load($this->getRequest()->post()) && $loginForm->login()) {
  350. if (!strlen($producer->code)) {
  351. $producerManager->addUser(GlobalParam::getCurrentUser(), $producer);
  352. }
  353. $this->redirect($returnUrl);
  354. }
  355. if ($signupForm->load($this->getRequest()->post())
  356. && ($user = $signupForm->signup())
  357. && $this->getUser()->login($user)) {
  358. $this->redirect($returnUrl);
  359. }
  360. }
  361. else {
  362. $this->redirect($returnUrl);
  363. }
  364. return $this->render('producer', [
  365. 'loginForm' => $loginForm,
  366. 'signupForm' => $signupForm,
  367. 'producer' => $producer,
  368. ]);
  369. }
  370. /**
  371. * Indique à l'utilisateur que l'espace d'un producteur est hors ligne.
  372. */
  373. public function actionProducerOffline(int $id)
  374. {
  375. return $this->render('producer_offline', [
  376. 'producer' => $this->getProducerManager()->findOneProducerById($id),
  377. ]);
  378. }
  379. /**
  380. * Affiche les mentions légales.
  381. */
  382. public function actionMentions()
  383. {
  384. return $this->render('mentions');
  385. }
  386. /**
  387. * Affiche les conditions générale de service.
  388. */
  389. public function actionCgv()
  390. {
  391. return $this->render('cgv');
  392. }
  393. /**
  394. * Affiche les précisions concernant l'utilisation du crédit.
  395. */
  396. public function actionCredit()
  397. {
  398. return $this->render('credit');
  399. }
  400. }