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.

489 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 common\logic\User\User\User;
  40. use frontend\forms\ProducerCodeForm;
  41. use Yii;
  42. use frontend\forms\PasswordResetRequestForm;
  43. use frontend\forms\ResetPasswordForm;
  44. use frontend\forms\SignupForm;
  45. use common\forms\ContactForm;
  46. use yii\base\InvalidParamException;
  47. use yii\data\ActiveDataProvider;
  48. use yii\web\BadRequestHttpException;
  49. use yii\filters\VerbFilter;
  50. use yii\filters\AccessControl;
  51. use common\forms\LoginForm;
  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::className(),
  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::className(),
  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. * @return mixed
  119. */
  120. public function actionIndex()
  121. {
  122. $this->getLogic()->getProducerContainer()->getBuilder();
  123. $producerRepository = $this->getLogic()->getProducerContainer()->getRepository();
  124. return $this->render('index', [
  125. 'producerDemoAccount' => $producerRepository->getOneDemoAccount(),
  126. 'dataProviderPrices' => $this->getDataProviderPrices()
  127. ]);
  128. }
  129. /**
  130. * Page de présentation des tarifs
  131. *
  132. * @return mixed
  133. */
  134. public function actionPrices()
  135. {
  136. return $this->render('prices', [
  137. 'dataProviderPrices' => $this->getDataProviderPrices()
  138. ]);
  139. }
  140. public function getDataProviderPrices()
  141. {
  142. $producerPriceRangeRepository = $this->getLogic()->getProducerPriceRangeContainer()->getRepository();
  143. return new ActiveDataProvider([
  144. 'query' => $producerPriceRangeRepository->query(),
  145. 'pagination' => [
  146. 'pageSize' => 100,
  147. ],
  148. ]);
  149. }
  150. /**
  151. * Liste les producteurs utilisant la plateforme.
  152. *
  153. * @return mixed
  154. */
  155. public function actionProducers()
  156. {
  157. $producerRepository = $this->getLogic()->getProducerContainer()->getRepository();
  158. $dataProviderProducers = new ActiveDataProvider([
  159. 'query' => $producerRepository->queryActive(),
  160. 'pagination' => [
  161. 'pageSize' => 100,
  162. ],
  163. ]);
  164. return $this->render('producers', [
  165. 'dataProviderProducers' => $dataProviderProducers
  166. ]);
  167. }
  168. /**
  169. * Affiche la page de connexion et traite le formulaire de connexion.
  170. *
  171. * @return mixed
  172. */
  173. public function actionLogin()
  174. {
  175. if (!\Yii::$app->user->isGuest) {
  176. return \Yii::$app->getResponse()->redirect(['site/index']);
  177. }
  178. $model = new LoginForm();
  179. if ($model->load(Yii::$app->request->post()) && $model->login()) {
  180. $returnUrl = \Yii::$app->request->get('return_url');
  181. if ($returnUrl) {
  182. return $this->redirect($returnUrl);
  183. }
  184. else {
  185. $userProducerArray = $this->getLogic()
  186. ->getUserProducerContainer()
  187. ->getRepository()
  188. ->getBy(GlobalParam::getCurrentUserId());
  189. if ($userProducerArray
  190. && is_array($userProducerArray)
  191. && count($userProducerArray) == 1) {
  192. return $this->redirect($this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $userProducerArray[0]->producer->slug]));
  193. }
  194. else {
  195. return $this->goBack();
  196. }
  197. }
  198. } else {
  199. return $this->render('@frontend/views/site/login', [
  200. 'model' => $model,
  201. ]);
  202. }
  203. }
  204. /**
  205. * Déconnecte l'utilisateur.
  206. *
  207. * @return mixed
  208. */
  209. public function actionLogout()
  210. {
  211. \Yii::$app->user->logout();
  212. return $this->goHome();
  213. }
  214. /**
  215. * Affiche la page de contact et traite le formulaire s'il est soumis.
  216. *
  217. * @return mixed
  218. */
  219. public function actionContact()
  220. {
  221. $model = new ContactForm();
  222. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  223. if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
  224. $this->setFlash('success', 'Votre message a bien été envoyé. Nous vous répondrons dès que possible.');
  225. }
  226. else {
  227. $this->setFlash('error', 'Il y a eu une erreur lors de l\'envoi de votre message.');
  228. }
  229. return $this->refresh();
  230. }
  231. else {
  232. return $this->render('contact', [
  233. 'model' => $model,
  234. ]);
  235. }
  236. }
  237. /**
  238. * Affiche la page d'inscription et traite son formulaire.
  239. *
  240. * @return mixed
  241. */
  242. public function actionSignup()
  243. {
  244. $model = new SignupForm();
  245. $producerRepository = \Yii::$app->logic->getProducerContainer()->getRepository();
  246. if ($model->load(Yii::$app->request->post())) {
  247. $user = $model->signup();
  248. if ($user) {
  249. if ($this->getUser()->login($user)) {
  250. if ($model->isProducer()) {
  251. $this->redirect(Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']));
  252. }
  253. else {
  254. $producer = $producerRepository->getOneById($model->id_producer);
  255. if ($producer) {
  256. $this->redirect(Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  257. }
  258. else {
  259. $this->redirect(['site/index']);
  260. }
  261. }
  262. }
  263. }
  264. }
  265. // Liste des producteurs disponibles
  266. $producersArray = $producerRepository->getPopulateDropdown();
  267. $dataProducers = $producersArray['data'];
  268. $optionsProducers = $producersArray['options'];
  269. return $this->render('signup', [
  270. 'model' => $model,
  271. 'dataProducers' => $dataProducers,
  272. 'dataProviderPrices' => $this->getDataProviderPrices(),
  273. 'optionsProducers' => $optionsProducers,
  274. ]);
  275. }
  276. /**
  277. * Affiche la page de demande de nouveau mot de passe.
  278. * Traitement du formulaire.
  279. *
  280. * @return mixed
  281. */
  282. public function actionRequestPasswordReset()
  283. {
  284. $model = new PasswordResetRequestForm();
  285. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  286. if ($model->sendEmail()) {
  287. $this->setFlash('success', 'Un lien vous permettant de réinitialiser votre mot de passe
  288. vient d\'être envoyé sur votre boîte mail.');
  289. return $this->goHome();
  290. }
  291. else {
  292. $this->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
  293. }
  294. }
  295. return $this->render('requestPasswordResetToken', [
  296. 'model' => $model,
  297. ]);
  298. }
  299. /**
  300. * Met à jour le mot de passe de l'utilisateur.
  301. *
  302. * @param string $token
  303. * @return mixed
  304. * @throws BadRequestHttpException
  305. */
  306. public function actionResetPassword($token)
  307. {
  308. try {
  309. $model = new ResetPasswordForm($token);
  310. } catch (InvalidParamException $e) {
  311. throw new BadRequestHttpException($e->getMessage());
  312. }
  313. if ($model->load($this->getRequest()->post())
  314. && $model->validate()
  315. && $model->resetPassword()) {
  316. $this->setFlash('success', 'Votre nouveau mot de passe vient d\'être sauvegardé.');
  317. return $this->goHome();
  318. }
  319. return $this->render('resetPassword', [
  320. 'model' => $model,
  321. ]);
  322. }
  323. /**
  324. * Affiche le formulaire de demande de code pour accéder à certains
  325. * producteurs.
  326. *
  327. * @param integer $id
  328. * @return mixed
  329. * @throws \yii\web\HttpException
  330. */
  331. public function actionProducerCode($id)
  332. {
  333. $producerContainer = $this->getLogic()->getProducerContainer();
  334. $producer = $producerContainer->getRepository()->getOneById($id);
  335. if (!$producer) {
  336. throw new \yii\web\HttpException(404, 'Producteur introuvable');
  337. }
  338. $producerCodeForm = new ProducerCodeForm();
  339. $producerCodeForm->id_producer = $id;
  340. if ($producerCodeForm->load($this->getRequest()->post())
  341. && $producerCodeForm->validate()) {
  342. $producerContainer->getBuilder()->addUser(GlobalParam::getCurrentUserId(), $id);
  343. $this->redirect($this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  344. }
  345. return $this->render('producer_code', [
  346. 'producer' => $producer,
  347. 'producerCodeForm' => $producerCodeForm,
  348. ]);
  349. }
  350. /**
  351. * Affiche la page de connexion / inscription pour accéder notamment au
  352. * formulaire de commande des producteurs.
  353. *
  354. * @param integer $id
  355. * @return mixed
  356. */
  357. public function actionProducer($id)
  358. {
  359. $loginForm = new LoginForm();
  360. $signupForm = new SignupForm();
  361. $producerContainer = $this->getLogic()->getProducerContainer();
  362. $producer = $producerContainer->getRepository()->getOneById($id);
  363. $loginForm->id_producer = $id;
  364. $signupForm->id_producer = $id;
  365. $signupForm->option_user_producer = 'user';
  366. $returnUrl = $this->getRequest()->get('returnUrl', $this->getUrlManagerProducer()->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  367. if ($this->getUser()->isGuest) {
  368. if ($loginForm->load($this->getRequest()->post()) && $loginForm->login()) {
  369. if (!strlen($producer->code)) {
  370. $producerContainer->getBuilder()->addUser(GlobalParam::getCurrentUserId(), $id);
  371. }
  372. $this->redirect($returnUrl);
  373. }
  374. if ($signupForm->load($this->getRequest()->post())
  375. && ($user = $signupForm->signup())
  376. && $this->getUser()->login($user)) {
  377. $this->redirect($returnUrl);
  378. }
  379. }
  380. else {
  381. $this->redirect($returnUrl);
  382. }
  383. return $this->render('producer', [
  384. 'loginForm' => $loginForm,
  385. 'signupForm' => $signupForm,
  386. 'producer' => $producer,
  387. ]);
  388. }
  389. /**
  390. * Indique à l'utilisateur que l'espace d'un producteur est hors ligne
  391. *
  392. * @param integer $id
  393. * @return mixed
  394. */
  395. public function actionProducerOffline($id)
  396. {
  397. $producerRepository = $this->getLogic()->getProducerContainer()->getRepository();
  398. return $this->render('producer_offline', [
  399. 'producer' => $producerRepository->getOneById($id),
  400. ]);
  401. }
  402. /**
  403. * Affiche les mentions légales.
  404. *
  405. * @return mixed
  406. */
  407. public function actionMentions()
  408. {
  409. return $this->render('mentions');
  410. }
  411. /**
  412. * Affiche les conditions générale de service.
  413. *
  414. * @return mixed
  415. */
  416. public function actionCgv()
  417. {
  418. return $this->render('cgv');
  419. }
  420. /**
  421. * Affiche les précisions concernant l'utilisation du crédit.
  422. *
  423. * @return string
  424. */
  425. public function actionCredit()
  426. {
  427. return $this->render('credit');
  428. }
  429. }