Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

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