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

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