You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

486 lines
15KB

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