Advertisement
Guest User

Untitled

a guest
Aug 7th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.20 KB | None | 0 0
  1. <?php
  2.  
  3. namespace app\controllers;
  4.  
  5. use Yii;
  6. use yii\filters\AccessControl;
  7. use yii\web\Controller;
  8. use yii\filters\VerbFilter;
  9. use app\models\LoginForm;
  10. use app\models\ContactForm;
  11. use app\models\ValidarFormulario;
  12. use app\models\ValidarFormularioAjax;
  13. use yii\widgets\ActiveForm;
  14. use yii\web\Response;
  15. use app\models\FormClientes;
  16. use app\models\Clientes;
  17. use app\models\FormSearch;
  18. use yii\helpers\Html;
  19. use yii\data\Pagination;
  20. use yii\helpers\Url;
  21. use app\models\FormRegister;
  22. use app\models\Users;
  23. use yii\web\Session;
  24. use app\models\FormRecoverPass;
  25. use app\models\FormResetPass;
  26. use app\models\User;
  27.  
  28. class SiteController extends Controller
  29. {
  30. public function actionUser()
  31. {
  32. return $this->render("view");
  33. }
  34.  
  35. public function actionAdmin()
  36. {
  37. return $this->render("register");
  38. }
  39.  
  40. public function actionRecoverpass()
  41. {
  42. //Instancia para validar el formulario
  43. $model = new FormRecoverPass;
  44.  
  45. //Mensaje que será mostrado al usuario en la vista
  46. $msg = null;
  47.  
  48. if ($model->load(Yii::$app->request->post()))
  49. {
  50. if ($model->validate())
  51. {
  52. //Buscar al usuario a través del email
  53. $table = Users::find()->where("email=:email", [":email" => $model->email]);
  54.  
  55. //Si el usuario existe
  56. if ($table->count() == 1)
  57. {
  58. //Crear variables de sesión para limitar el tiempo de restablecido del password
  59. //hasta que el navegador se cierre
  60. $session = new Session;
  61. $session->open();
  62.  
  63. //Esta clave aleatoria se cargará en un campo oculto del formulario de reseteado
  64. $session["recover"] = $this->randKey("abcdef0123456789", 200);
  65. $recover = $session["recover"];
  66.  
  67. //También almacenaremos el id del usuario en una variable de sesión
  68. //El id del usuario es requerido para generar la consulta a la tabla users y
  69. //restablecer el password del usuario
  70. $table = Users::find()->where("email=:email", [":email" => $model->email])->one();
  71. $session["id_recover"] = $table->id;
  72.  
  73. //Esta variable contiene un número hexadecimal que será enviado en el correo al usuario
  74. //para que lo introduzca en un campo del formulario de reseteado
  75. //Es guardada en el registro correspondiente de la tabla users
  76. $verification_code = $this->randKey("abcdef0123456789", 8);
  77. //Columna verification_code
  78. $table->verification_code = $verification_code;
  79. //Guardamos los cambios en la tabla users
  80. $table->save();
  81.  
  82. //Creamos el mensaje que será enviado a la cuenta de correo del usuario
  83. $subject = "Recuperar password";
  84. $body = "<p>Copie el siguiente código de verificación para restablecer su password ... ";
  85. $body .= "<strong>".$verification_code."</strong></p>";
  86. $body .= "<p><a href='http://yii.local/index.php?r=site/resetpass'>Recuperar password</a></p>";
  87.  
  88. //Enviamos el correo
  89. Yii::$app->mailer->compose()
  90. ->setTo($model->email)
  91. ->setFrom([Yii::$app->params["adminEmail"] => Yii::$app->params["title"]])
  92. ->setSubject($subject)
  93. ->setHtmlBody($body)
  94. ->send();
  95.  
  96. //Vaciar el campo del formulario
  97. $model->email = null;
  98.  
  99. //Mostrar el mensaje al usuario
  100. $msg = "Le hemos enviado un mensaje a su cuenta de correo para que pueda resetear su password";
  101. }
  102. else //El usuario no existe
  103. {
  104. $msg = "Ha ocurrido un error";
  105. }
  106. }
  107. else
  108. {
  109. $model->getErrors();
  110. }
  111. }
  112. return $this->render("recoverpass", ["model" => $model, "msg" => $msg]);
  113. }
  114.  
  115. public function actionResetpass()
  116. {
  117. //Instancia para validar el formulario
  118. $model = new FormResetPass;
  119.  
  120. //Mensaje que será mostrado al usuario
  121. $msg = null;
  122.  
  123. //Abrimos la sesión
  124. $session = new Session;
  125. $session->open();
  126.  
  127. //Si no existen las variables de sesión requeridas lo expulsamos a la página de inicio
  128. if (empty($session["recover"]) || empty($session["id_recover"]))
  129. {
  130. return $this->redirect(["site/index"]);
  131. }
  132. else
  133. {
  134.  
  135. $recover = $session["recover"];
  136. //El valor de esta variable de sesión la cargamos en el campo recover del formulario
  137. $model->recover = $recover;
  138.  
  139. //Esta variable contiene el id del usuario que solicitó restablecer el password
  140. //La utilizaremos para realizar la consulta a la tabla users
  141. $id_recover = $session["id_recover"];
  142.  
  143. }
  144.  
  145. //Si el formulario es enviado para resetear el password
  146. if ($model->load(Yii::$app->request->post()))
  147. {
  148. if ($model->validate())
  149. {
  150. //Si el valor de la variable de sesión recover es correcta
  151. if ($recover == $model->recover)
  152. {
  153. //Preparamos la consulta para resetear el password, requerimos el email, el id
  154. //del usuario que fue guardado en una variable de session y el código de verificación
  155. //que fue enviado en el correo al usuario y que fue guardado en el registro
  156. $table = Users::findOne(["email" => $model->email, "id" => $id_recover, "verification_code" => $model->verification_code]);
  157.  
  158. //Encriptar el password
  159. $table->password = crypt($model->password, Yii::$app->params["salt"]);
  160.  
  161. //Si la actualización se lleva a cabo correctamente
  162. if ($table->save())
  163. {
  164.  
  165. //Destruir las variables de sesión
  166. $session->destroy();
  167.  
  168. //Vaciar los campos del formulario
  169. $model->email = null;
  170. $model->password = null;
  171. $model->password_repeat = null;
  172. $model->recover = null;
  173. $model->verification_code = null;
  174.  
  175. $msg = "Enhorabuena, password reseteado correctamente, redireccionando a la página de login ...";
  176. $msg .= "<meta http-equiv='refresh' content='5; ".Url::toRoute("site/login")."'>";
  177. }
  178. else
  179. {
  180. $msg = "Ha ocurrido un error";
  181. }
  182.  
  183. }
  184. else
  185. {
  186. $model->getErrors();
  187. }
  188. }
  189. }
  190.  
  191. return $this->render("resetpass", ["model" => $model, "msg" => $msg]);
  192.  
  193. }
  194.  
  195. private function randKey($str='', $long=0)
  196. {
  197. $key = null;
  198. $str = str_split($str);
  199. $start = 0;
  200. $limit = count($str)-1;
  201. for($x=0; $x<$long; $x++)
  202. {
  203. $key .= $str[rand($start, $limit)];
  204. }
  205. return $key;
  206. }
  207.  
  208. public function actionConfirm()
  209. {
  210. $table = new Users;
  211. if (Yii::$app->request->get())
  212. {
  213.  
  214. //Obtenemos el valor de los parámetros get
  215. $id = Html::encode($_GET["id"]);
  216. $authKey = $_GET["authKey"];
  217.  
  218. if ((int) $id)
  219. {
  220. //Realizamos la consulta para obtener el registro
  221. $model = $table
  222. ->find()
  223. ->where("id=:id", [":id" => $id])
  224. ->andWhere("authKey=:authKey", [":authKey" => $authKey]);
  225.  
  226. //Si el registro existe
  227. if ($model->count() == 1)
  228. {
  229. $activar = Users::findOne($id);
  230. $activar->activate = 1;
  231. if ($activar->update())
  232. {
  233. echo "Enhorabuena registro llevado a cabo correctamente, redireccionando ...";
  234. echo "<meta http-equiv='refresh' content='8; ".Url::toRoute("site/login")."'>";
  235. }
  236. else
  237. {
  238. echo "Ha ocurrido un error al realizar el registro, redireccionando ...";
  239. echo "<meta http-equiv='refresh' content='8; ".Url::toRoute("site/login")."'>";
  240. }
  241. }
  242. else //Si no existe redireccionamos a login
  243. {
  244. return $this->redirect(["site/login"]);
  245. }
  246. }
  247. else //Si id no es un número entero redireccionamos a login
  248. {
  249. return $this->redirect(["site/login"]);
  250. }
  251. }
  252. }
  253.  
  254. public function actionRegister()
  255. {
  256. //Creamos la instancia con el model de validación
  257. $model = new FormRegister;
  258.  
  259. //Mostrará un mensaje en la vista cuando el usuario se haya registrado
  260. $msg = null;
  261.  
  262. //Validación mediante ajax
  263. if ($model->load(Yii::$app->request->post()) && Yii::$app->request->isAjax)
  264. {
  265. Yii::$app->response->format = Response::FORMAT_JSON;
  266. return ActiveForm::validate($model);
  267. }
  268.  
  269. //Validación cuando el formulario es enviado vía post
  270. //Esto sucede cuando la validación ajax se ha llevado a cabo correctamente
  271. //También previene por si el usuario tiene desactivado javascript y la
  272. //validación mediante ajax no puede ser llevada a cabo
  273. if ($model->load(Yii::$app->request->post()))
  274. {
  275. if($model->validate())
  276. {
  277. //Preparamos la consulta para guardar el usuario
  278. $table = new Users;
  279. $table->username = $model->username;
  280. $table->email = $model->email;
  281. //Encriptamos el password
  282. $table->password = crypt($model->password, Yii::$app->params["salt"]);
  283. //Creamos una cookie para autenticar al usuario cuando decida recordar la sesión, esta misma
  284. //clave será utilizada para activar el usuario
  285. $table->authKey = $this->randKey("abcdef0123456789", 200);
  286. //Creamos un token de acceso único para el usuario
  287. $table->accessToken = $this->randKey("abcdef0123456789", 200);
  288.  
  289. //Si el registro es guardado correctamente
  290. if ($table->insert())
  291. {
  292. //Nueva consulta para obtener el id del usuario
  293. //Para confirmar al usuario se requiere su id y su authKey
  294. $user = $table->find()->where(["email" => $model->email])->one();
  295. $id = urlencode($user->id);
  296. $authKey = urlencode($user->authKey);
  297.  
  298. $subject = "Confirmar registro";
  299. $body = "<h1>Haga click en el siguiente enlace para finalizar tu registro</h1>";
  300. $body .= "<a href='http://yii.local/index.php?r=site/confirm&id=".$id."&authKey=".$authKey."'>Confirmar</a>";
  301.  
  302. //Enviamos el correo
  303. Yii::$app->mailer->compose()
  304. ->setTo($user->email)
  305. ->setFrom([Yii::$app->params["adminEmail"] => Yii::$app->params["title"]])
  306. ->setSubject($subject)
  307. ->setHtmlBody($body)
  308. ->send();
  309.  
  310. $model->username = null;
  311. $model->email = null;
  312. $model->password = null;
  313. $model->password_repeat = null;
  314.  
  315. $msg = "Enhorabuena, ahora sólo falta que confirmes tu registro en tu cuenta de correo";
  316. }
  317. else
  318. {
  319. $msg = "Ha ocurrido un error al llevar a cabo tu registro";
  320. }
  321.  
  322. }
  323. else
  324. {
  325. $model->getErrors();
  326. }
  327. }
  328. return $this->render("register", ["model" => $model, "msg" => $msg]);
  329. }
  330.  
  331. public function actionUpdate()
  332. {
  333. $model = new FormClientes;
  334. $msg = null;
  335.  
  336. if($model->load(Yii::$app->request->post()))
  337. {
  338. if($model->validate())
  339. {
  340. $table = Clientes::findOne($model->id_cliente);
  341. if($table)
  342. {
  343. $table->nombre = $model->nombre;
  344. $table->apellidos = $model->apellidos;
  345. $table->dni = $model->dni;
  346. $table->celular = $model->celular;
  347. if ($table->update())
  348. {
  349. $msg = "El Cliente ha sido actualizado correctamente";
  350. }
  351. else
  352. {
  353. $msg = "El Cliente no ha podido ser actualizado";
  354. }
  355. }
  356. else
  357. {
  358. $msg = "El Cliente seleccionado no ha sido encontrado";
  359. }
  360. }
  361. else
  362. {
  363. $model->getErrors();
  364. }
  365. }
  366.  
  367.  
  368. if (Yii::$app->request->get("id_cliente"))
  369. {
  370. $id_cliente = Html::encode($_GET["id_cliente"]);
  371. if ((int) $id_cliente)
  372. {
  373. $table = clientes::findOne($id_cliente);
  374. if($table)
  375. {
  376. $model->id_cliente = $table->id_cliente;
  377. $model->nombre = $table->nombre;
  378. $model->apellidos = $table->apellidos;
  379. $model->dni = $table->dni;
  380. $model->celular = $table->celular;
  381. }
  382. else
  383. {
  384. return $this->redirect(["site/view"]);
  385. }
  386. }
  387. else
  388. {
  389. return $this->redirect(["site/view"]);
  390. }
  391. }
  392. else
  393. {
  394. return $this->redirect(["site/view"]);
  395. }
  396. return $this->render("update", ["model" => $model, "msg" => $msg]);
  397. }
  398.  
  399. public function actionDelete()
  400. {
  401. if(Yii::$app->request->post())
  402. {
  403. $id_cliente = Html::encode($_POST["id_cliente"]);
  404. if((int) $id_cliente)
  405. {
  406. if(Clientes::deleteAll("id_cliente=:id_cliente", [":id_cliente" => $id_cliente]))
  407. {
  408. echo "Cliente con id $id_cliente eliminado con éxito, redireccionando ...";
  409. echo "<meta http-equiv='refresh' content='3; ".Url::toRoute("site/view")."'>";
  410. }
  411. else
  412. {
  413. echo "Ha ocurrido un error al eliminar el cliente, redireccionando ...";
  414. echo "<meta http-equiv='refresh' content='3; ".Url::toRoute("site/view")."'>";
  415. }
  416. }
  417. else
  418. {
  419. echo "Ha ocurrido un error al eliminar el cliente, redireccionando ...";
  420. echo "<meta http-equiv='refresh' content='3; ".Url::toRoute("site/view")."'>";
  421. }
  422. }
  423. else
  424. {
  425. return $this->redirect(["site/view"]);
  426. }
  427. }
  428.  
  429. public function actionView()
  430. {
  431. $form = new FormSearch;
  432. $search = null;
  433. if($form->load(Yii::$app->request->get()))
  434. {
  435. if ($form->validate())
  436. {
  437. $search = Html::encode($form->q);
  438. $table = Clientes::find()
  439. ->where(["like", "id_cliente", $search])
  440. ->orWhere(["like", "nombre", $search])
  441. ->orWhere(["like", "apellidos", $search]);
  442. $count = clone $table;
  443. $pages = new Pagination([
  444. "pageSize" => 1,
  445. "totalCount" => $count->count()
  446. ]);
  447. $model = $table
  448. ->offset($pages->offset)
  449. ->limit($pages->limit)
  450. ->all();
  451. }
  452. else
  453. {
  454. $form->getErrors();
  455. }
  456. }
  457. else
  458. {
  459. $table = Clientes::find();
  460. $count = clone $table;
  461. $pages = new Pagination([
  462. "pageSize" => 5,
  463. "totalCount" => $count->count(),
  464. ]);
  465. $model = $table
  466. ->offset($pages->offset)
  467. ->limit($pages->limit)
  468. ->all();
  469. }
  470. return $this->render("view", ["model" => $model, "form" => $form, "search" => $search, "pages" => $pages]);
  471. }
  472.  
  473. public function actionCreate()
  474. {
  475. $model = new FormClientes;
  476. $msg = null;
  477. if($model->load(Yii::$app->request->post()))
  478. {
  479. if($model->validate())
  480. {
  481. $table = new Clientes;
  482. $table->nombre = $model->nombre;
  483. $table->apellidos = $model->apellidos;
  484. $table->dni = $model->dni;
  485. $table->celular = $model->celular;
  486. if ($table->insert())
  487. {
  488. $msg = "Enhorabuena registro guardado correctamente";
  489. $model->nombre = null;
  490. $model->apellidos = null;
  491. $model->dni = null;
  492. $model->celular = null;
  493. }
  494. else
  495. {
  496. $msg = "Ha ocurrido un error al insertar el registro";
  497. }
  498. }
  499. else
  500. {
  501. $model->getErrors();
  502. }
  503. }
  504. return $this->render("create", ['model' => $model, 'msg' => $msg]);
  505. }
  506.  
  507.  
  508.  
  509. public function actionFormulario($mensaje = null)
  510. {
  511. return $this->render("formulario", ["mensaje" => $mensaje]);
  512. }
  513.  
  514. public function actionRequest()
  515. {
  516. $mensaje = null;
  517. if (isset($_REQUEST["nombre"]))
  518. {
  519. $mensaje = "Bien, has enviando tu nombre correctamente: " . $_REQUEST["nombre"];
  520. }
  521. $this->redirect(["site/formulario", "mensaje" => $mensaje]);
  522. }
  523.  
  524. public function actionValidarformulario()
  525. {
  526.  
  527. $model = new ValidarFormulario;
  528.  
  529. if ($model->load(Yii::$app->request->post()))
  530. {
  531. if($model->validate())
  532. {
  533. //Por ejemplo, consultar en una base de datos
  534. }
  535. else
  536. {
  537. $model->getErrors();
  538. }
  539. }
  540.  
  541. return $this->render("validarformulario", ["model" => $model]);
  542. }
  543.  
  544. public function actionValidarformularioajax()
  545. {
  546. $model = new ValidarFormularioAjax;
  547. $msg = null;
  548.  
  549. if ($model->load(Yii::$app->request->post()) && Yii::$app->request->isAjax)
  550. {
  551. Yii::$app->response->format = Response::FORMAT_JSON;
  552. return ActiveForm::validate($model);
  553. }
  554.  
  555. if ($model->load(Yii::$app->request->post()))
  556. {
  557. if ($model->validate())
  558. {
  559. //Por ejemplo hacer una consulta a una base de datos
  560. $msg = "Enhorabuena formulario enviado correctamente";
  561. $model->nombre = null;
  562. $model->email = null;
  563. }
  564. else
  565. {
  566. $model->getErrors();
  567. }
  568. }
  569.  
  570. return $this->render("validarformularioajax", ['model' => $model, 'msg' => $msg]);
  571. }
  572.  
  573. public function behaviors()
  574. {
  575. return [
  576. 'access' => [
  577. 'class' => AccessControl::className(),
  578. 'only' => ['logout', 'user', 'admin'],
  579. 'rules' => [
  580. [
  581. //El administrador tiene permisos sobre las siguientes acciones
  582. 'actions' => ['logout', 'user', 'admin'],
  583. //Esta propiedad establece que tiene permisos
  584. 'allow' => true,
  585. //Usuarios autenticados, el signo ? es para invitados
  586. 'roles' => ['@'],
  587. //Este método nos permite crear un filtro sobre la identidad del usuario
  588. //y así establecer si tiene permisos o no
  589. 'matchCallback' => function ($rule, $action) {
  590. //Llamada al método que comprueba si es un administrador
  591. return User::isUserAdmin(Yii::$app->user->identity->id);
  592. },
  593. ],
  594. [
  595. //Los usuarios simples tienen permisos sobre las siguientes acciones
  596. 'actions' => ['logout', 'user'],
  597. //Esta propiedad establece que tiene permisos
  598. 'allow' => true,
  599. //Usuarios autenticados, el signo ? es para invitados
  600. 'roles' => ['@'],
  601. //Este método nos permite crear un filtro sobre la identidad del usuario
  602. //y así establecer si tiene permisos o no
  603. 'matchCallback' => function ($rule, $action) {
  604. //Llamada al método que comprueba si es un usuario simple
  605. return User::isUserSimple(Yii::$app->user->identity->id);
  606. },
  607. ],
  608. ],
  609. ],
  610. //Controla el modo en que se accede a las acciones, en este ejemplo a la acción logout
  611. //sólo se puede acceder a través del método post
  612. 'verbs' => [
  613. 'class' => VerbFilter::className(),
  614. 'actions' => [
  615. 'logout' => ['post'],
  616. ],
  617. ],
  618. ];
  619. }
  620.  
  621. public function actions()
  622. {
  623. return [
  624. 'error' => [
  625. 'class' => 'yii\web\ErrorAction',
  626. ],
  627. 'captcha' => [
  628. 'class' => 'yii\captcha\CaptchaAction',
  629. 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  630. ],
  631. ];
  632. }
  633.  
  634. public function actionIndex()
  635. {
  636. return $this->render('index');
  637. }
  638.  
  639. public function actionLogin()
  640. {
  641. if (!\Yii::$app->user->isGuest) {
  642.  
  643. if (User::isUserAdmin(Yii::$app->user->identity->id))
  644. {
  645. return $this->redirect(["site/register"]);
  646. }
  647. else
  648. {
  649. return $this->redirect(["site/view"]);
  650. }
  651. }
  652.  
  653. $model = new LoginForm();
  654. if ($model->load(Yii::$app->request->post()) && $model->login()) {
  655.  
  656. if (User::isUserAdmin(Yii::$app->user->identity->id))
  657. {
  658. return $this->redirect(["site/register"]);
  659. }
  660. else
  661. {
  662. return $this->redirect(["site/view"]);
  663. }
  664.  
  665. } else {
  666. return $this->render('login', [
  667. 'model' => $model,
  668. ]);
  669. }
  670. }
  671.  
  672. public function actionLogout()
  673. {
  674. Yii::$app->user->logout();
  675.  
  676. return $this->goHome();
  677. }
  678.  
  679. public function actionContact()
  680. {
  681. $model = new ContactForm();
  682. if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
  683. Yii::$app->session->setFlash('contactFormSubmitted');
  684.  
  685. return $this->refresh();
  686. } else {
  687. return $this->render('contact', [
  688. 'model' => $model,
  689. ]);
  690. }
  691. }
  692.  
  693. public function actionAbout()
  694. {
  695. return $this->render('about');
  696. }
  697. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement