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.

471 lines
17KB

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