constancias_cidit_alta.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/util.php");
  4. require_once("../include/bd_pdo.php");
  5. require_once("../classes/ValidaSesion.php");
  6. require_once("../classes/MainMenu.php");
  7. require_once("./include/constantes.php");
  8. $menu = 30;
  9. $submenu = 301;
  10. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  11. $objSesion = new ValidaSesion($pdo, $submenu, CONSTANCIA);
  12. if(!$objSesion->tieneAcceso()){
  13. $objSesion->terminaSesion();
  14. }
  15. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  16. if(!$objSesion->puedeEditar()){
  17. $errorDesc = "No tienes permiso de editar las fechas.";
  18. }
  19. if(!isset($_POST["part_tipo"], $_POST["part_tipo_desc"], $_POST["concurso"])){
  20. header("Location: constancias_cidit.php?error=0");
  21. }
  22. $concurso = filter_input(INPUT_POST, "concurso", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  23. $part = filter_input(INPUT_POST, "part_tipo", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  24. $part_desc = trim(filter_input(INPUT_POST, "part_tipo_desc", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  25. $doc_id = filter_input(INPUT_POST, "doc_id", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  26. $doc_desc = trim(filter_input(INPUT_POST, "doc_desc", FILTER_SANITIZE_STRING,array('flags' => FILTER_FLAG_STRIP_LOW)));//limpia texto
  27. ?>
  28. <!DOCTYPE html>
  29. <html lang="es" prefix="og: http://ogp.me/ns#">
  30. <head>
  31. <title>Constancias - Facultad de Ingeniería</title>
  32. <meta charset="utf-8">
  33. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  34. <link rel="icon" type="image/png" href="../img/favicon.png" />
  35. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  36. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  37. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  38. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  39. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  40. <link rel="stylesheet" href="../css/calendar.css" type="text/css">
  41. <link rel="stylesheet" href="../css/toggle.css" type="text/css">
  42. <style>
  43. .ing-rotate-45 {
  44. -webkit-transform: rotate(315deg);
  45. -moz-transform: rotate(315deg);
  46. -ms-transform: rotate(315deg);
  47. -o-transform: rotate(315deg);
  48. transform: rotate(315deg);
  49. }
  50. #participante_list .form-check-input {
  51. position: relative;
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <div>
  57. <?php
  58. //--- Objeto que pinta menu
  59. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, CONSTANCIA, "Crear constancias CIDIT");//usr, menu, pdo, sist
  60. $menuObj->printMenu();
  61. //Datos concurso
  62. $stmt = $pdo->prepare('SELECT * FROM cidit_fs_concurso(:conc)');
  63. $stmt->bindParam(":conc", $concurso);
  64. if($stmt->execute()){
  65. $concurso_rs = $stmt->fetch();
  66. }else{
  67. $errorDesc = "Ocurrió un error al obtener los datos del concurso.";
  68. }
  69. $stmt->closeCursor();
  70. $stmt = null;
  71. //Texto constancia
  72. //$stmt = $pdo->prepare('SELECT * FROM cidit_fs_textoconstancia(:tipo)');
  73. $stmt = $pdo->prepare('SELECT * FROM fs_textoconstanciasistema(:tipo, '.CIDIT.')');
  74. $stmt->bindParam(":tipo", $part);
  75. if($stmt->execute()){
  76. $texto_rs = $stmt->fetch();
  77. }else{
  78. $errorDesc = "Ocurrió un error al obtener los datos del concurso.";
  79. }
  80. $stmt->closeCursor();
  81. $stmt = null;
  82. //Obtiene IDs de usuarios
  83. $stmt = $pdo->prepare('select * from cidit_fs_constanciasconcurso(:conc, :tipo)');
  84. $stmt->bindParam(":conc", $concurso);
  85. $stmt->bindParam(":tipo", $part);
  86. if($stmt->execute()){
  87. $usr_rs = $stmt->fetchAll();
  88. }else{
  89. $errorDesc = "Ocurrió un error al obtener los usuarios.";
  90. }
  91. $stmt->closeCursor();
  92. $stmt = null;
  93. $stmt = $pdo->prepare('Select * from fs_constanciafirma(NULL, true)');
  94. if($stmt->execute()){
  95. $firmas_rs = $stmt->fetchAll();
  96. }
  97. $stmt->closeCursor();
  98. $stmt = null;
  99. //--Manejo de errores y mensajes de exito
  100. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  101. switch ($_GET["error"]){
  102. case 0: $errorDesc = "No se reciberon los datos para generar el archivo."; break;
  103. case 1: $errorDesc = "No tienes permisos de realizar esa acción."; break;
  104. case 2: $errorDesc = "Ocurrió un error al obtener los datos de las constancias."; break;
  105. case 3: $errorDesc = "Ocurrió un error al generar las constancias."; break;
  106. case 4: $errorDesc = "Ocurrió un error al actualizar el texto de las constancias."; break;
  107. }
  108. }
  109. if(isset($_GET["ok"]) && is_numeric($_GET["ok"])){
  110. switch ($_GET["ok"]){
  111. case 0: $successDesc = "Las fechas se guardaron correctamente."; break;
  112. }
  113. }
  114. ?>
  115. <main class="container-fluid content marco">
  116. <?php include_once("../include/errorMessage.php");?>
  117. <?php if ($objSesion->puedeEditar()){
  118. ?>
  119. <div id="forma_block">
  120. <form action="./export/pdf_constancias_cidit_split.php" method="post" id="formaConstancias">
  121. <!-- id documento se obtiene solo cuando se genera -->
  122. <input type="hidden" name="concurso" value="<?php echo $concurso;?>">
  123. <input type="hidden" name="doc_desc" id="doc_desc" value="<?php echo $doc_desc;?>"><!-- texto: constancia, reconocimiento -->
  124. <input type="hidden" name="doc_id" id="doc_id" value="<?php echo $doc_id;?>">
  125. <input type="hidden" id="motivo" name="motivo" value="<?php echo $part_desc;?>"> <!-- participante, ganador..-->
  126. <input type="hidden" id="part_id" name="part_id" value="<?php echo $part;?>"> <!-- participante, ganador..-->
  127. <div class="form-box">
  128. <div class="form-group row">
  129. <label class="col-4 col-form-label">Participantes *</label>
  130. <div class="col-8 col-md-6">
  131. <div style="max-height:200px; overflow:auto; padding-right:10px" id="participante_list">
  132. <?php foreach($usr_rs as $usr){?>
  133. <div class="ml-4">
  134. <input type="checkbox" name="participantes[]" class="form-check-input radio-md participante_check" value="<?php echo $usr["idusuario"];?>" id="usr_check<?php echo $usr["idusuario"];?>" checked="checked">
  135. <label for="usr_check<?php echo $usr["idusuario"];?>"><?php echo $usr["nombre"];?></label>
  136. </div>
  137. <?php } ?>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="form-group row">
  142. <label for="desc" class="col-4 col-form-label">Texto de la constancia *<br><button type="button" class="btn btn-sm btn-outline-secondary" data-toggle="modal" data-target="#modalPalabras">Palabras clave <span class="ing-flecha ing-rotate-45"></span></button></label>
  143. <div class="col-8 col-md-6">
  144. <textarea id="desc" name="desc" class="richtext" rows="4"><?php echo $texto_rs["ConstanciaTextoSistema_desc"]; ?></textarea>
  145. </div>
  146. </div>
  147. <div class="form-group row">
  148. <label for="fecha" class="col-4 col-form-label">Fecha de la constancia *</label>
  149. <div class="col-8 col-md-4">
  150. <input id="fecha" name="fecha" type="text" class="form-control date-picker-all" placeholder="dd/mm/aaaa" maxlength="10" required="required" readonly="readonly" value="<?php echo date("d/m/Y");?>">
  151. </div>
  152. </div>
  153. <div class="form-group row">
  154. <label for="tipo" class="col-4 col-form-label">Número de firmas *</label>
  155. <div class="col-8 col-md-4">
  156. <div class="datalist datalist-select mb-1 w-100" id="datalistFirmas">
  157. <div class="datalist-input">1 Firma</div>
  158. <span class="ing-buscar icono"></span>
  159. <ul style="display:none">
  160. <?php for($i=1; $i<=4; $i++) {?>
  161. <li data-id="<?php echo $i;?>"><?php echo $i;?> Firma<?php if ($i>1){echo 's';}?> </li>
  162. <?php }?>
  163. </ul>
  164. <input type="hidden" id="num_firmas" name="num_firmas" value="1">
  165. </div>
  166. </div>
  167. </div>
  168. </div>
  169. <p class="font-weight-bold">Orden de los firmantes</p>
  170. <ul>
  171. <li>Jerarquía alta | Jerarquía baja </li>
  172. <li>Jerarquía baja | Jerarquía alta | Jerarquía media</li>
  173. </ul>
  174. <div class="form-box" id="firmas_block">
  175. <div class="form-group row firma-box" data-id="1">
  176. <div class="col-5">
  177. <div class="datalist datalist-select mb-1 w-100 datalist-firma" id="datalistFirma_1">
  178. <div class="datalist-input">1</div>
  179. <span class="ing-buscar icono"></span>
  180. <ul style="display:none">
  181. <?php foreach($firmas_rs as $firma) { ?>
  182. <li data-id="<?php echo $firma["ConstanciaFirma_id"];?>" data-puesto="<?php echo $firma["ConstanciaFirma_puesto"];?>">
  183. <?php
  184. //echo mb_convert_case(mb_strtolower($firma["ConstanciaFirma_nombre"]), MB_CASE_TITLE, "UTF-8");
  185. echo $firma["ConstanciaFirma_nombre"];
  186. ?>
  187. </li>
  188. <?php }?>
  189. </ul>
  190. <input type="hidden" id="firma_1" name="firma[]" value="0" class="firma_input">
  191. </div>
  192. </div>
  193. <div class="col-5">
  194. <input type="text" id="puesto_1" name="puesto[]" class="form-control puesto_input" placeholder="Puesto" value="<?php echo $firmas_rs[0]["ConstanciaFirma_puesto"];?>" required="required">
  195. </div>
  196. <div class="col-2 pt-1 pl-4">
  197. <input type="checkbox" class="form-check-input radio-md lleva_firma" value="1" id="lleva_firma_1">
  198. <label for="lleva_firma_1">Mostrar firma</label>
  199. <input name="lleva_firma[]" type="hidden" class="lleva_firma_hidden" value="0">
  200. </div>
  201. </div>
  202. </div>
  203. <div class="form-group row">
  204. <div class="col-12 text-center">
  205. <button type="button" class="btn btn-outline-primary btn-abrir-confirm"><?php echo $ICO["aceptar"];?> Generar constancias</button>
  206. <a href="constancias_cidit.php?id=<?php echo $concurso;?>" class="btn btn-outline-danger"><span class="ing-cancelar"></span> Regresar</a>
  207. </div>
  208. </div>
  209. </form>
  210. </div>
  211. <div id="generado_block" class="d-none">
  212. <h3 class="mt-5"><?php echo $ICO["alerta"];?> Se está generado el archivo .zip de los documentos elegidos</h3>
  213. <p class="text-center">
  214. <a href="constancias_cidit.php?id=<?php echo $concurso;?>" class="btn btn-outline-primary mt-3"><span class=""></span> Regresar</a>
  215. </p>
  216. </div>
  217. <?php } ?>
  218. </main>
  219. <!--- FOOTER--->
  220. <?php require_once("../include/footer.php"); ?>
  221. <!-- Modal -->
  222. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  223. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  224. <div class="modal-content">
  225. <div class="modal-body">
  226. <div class="row">
  227. <div class="col bg-light p-4">
  228. <h4 id="confirm-participante">Nombre</h4>
  229. <div id="confirm-desc">Texto</div>
  230. <p id="confirm-fecha">Fecha</p>
  231. <div class="row" id="confirm-firma-list">
  232. <div class="col">
  233. <p><b class="confirm-firma">Firma</b><br>
  234. <span class="confirm-puesto">Puesto</span>
  235. </p>
  236. </div>
  237. </div>
  238. </div>
  239. </div>
  240. <hr>
  241. <div class="row">
  242. <div class="col">
  243. <p class="font-weight-bold">¿Estás seguro de que quieres generar las constancias?</p>
  244. <p>Una vez generadas se asignará un folio único.<br>En caso de haber errores se deberá cancelar y generar una nueva.</p>
  245. </div>
  246. </div>
  247. </div>
  248. <div class="modal-footer">
  249. <input type="hidden" id="id_borrar" value="">
  250. <button type="button" class="btn btn-outline-primary btn-enviar"><?php echo $ICO["aceptar"];?> Continuar</button>
  251. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  252. </div>
  253. </div>
  254. </div>
  255. </div>
  256. <!-- Plabras clave -->
  257. <div class="modal fade" id="modalPalabras" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  258. <div class="modal-dialog modal-dialog-centered modal" role="document">
  259. <div class="modal-content">
  260. <div class="modal-header">
  261. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Palabras clave</span>
  262. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  263. <span aria-hidden="true">&times;</span>
  264. </button></h4>
  265. </div>
  266. <div class="modal-body">
  267. <p>Los códigos serán reemplazados por la información personalizada de la persona o concurso.</p>
  268. <?php foreach($_CODIGO_TEXTO as $codigo){?>
  269. <div class="row mb-2">
  270. <div class="col-6">
  271. <p class="text-right my-2"><?php echo $codigo["desc"];?></p>
  272. </div>
  273. <div class="col-6">
  274. <div class="input-group">
  275. <input type="text" class="form-control texto-copiar text-info" value="<?php echo $codigo["code"];?>" readonly="true">
  276. <div class="input-group-append">
  277. <button class="btn btn-outline-primary btn-copiar" type="button" title="Copiar código" data-dismiss="modal"><span class="ing-copiar"></span></button>
  278. </div>
  279. </div>
  280. </div>
  281. </div>
  282. <?php } ?>
  283. <div class="text-center mt-4"><button type="reset" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"];?> Cerrar</button></div>
  284. </div>
  285. </div>
  286. </div>
  287. </div>
  288. </div>
  289. <script src="../js/jquery.min.js"></script>
  290. <script src="../js/jquery-ui.js"></script>
  291. <script src="../js/datepicker-es.js"></script>
  292. <script src="../js/bootstrap/popper.min.js"></script>
  293. <script src="../js/bootstrap/bootstrap.min.js"></script>
  294. <script src="../js/fechas.js"></script>
  295. <script src="../js/sidebarmenu.js"></script>
  296. <?php if($objSesion->puedeEditar()){ ?>
  297. <script src="../js/toggle.js"></script>
  298. <script src="../js/datalist.js"></script>
  299. <script src="../js/util.js"></script>
  300. <script src="../js/tinymce/tinymce.min.js"></script>
  301. <script>
  302. var datepickerOptions_all = { dateFormat: "dd/mm/yy", changeMonth: true};
  303. tinymce.init({
  304. selector: '.richtext',
  305. statusbar: false,
  306. toolbar: 'undo redo | bold italic',
  307. branding: false,
  308. menubar: false,
  309. valid_elements : 'strong/b,em/i',
  310. });
  311. $(document).ready(function(){
  312. setDatalistFirst("#tipo");
  313. setDatalistFirst("#firma_1");
  314. $(".date-picker-all" ).datepicker(datepickerOptions_all);
  315. $(".date-picker-all" ).datepicker( $.datepicker.regional[ "es" ] );
  316. $("#datalistFirmas ul li").click(function(){//cambia datalist
  317. var total = $("#firmas_block .firma-box").length;
  318. var nuevos = $(this).data('id');
  319. if(total < nuevos){
  320. //Clonar
  321. do{
  322. var cloned = $("#firmas_block >.firma-box:first-child").clone(true).appendTo("#firmas_block");
  323. //cloned.find("input").val("");
  324. total++;
  325. cloned.find(".firma_input").attr("id", "firma_"+total);
  326. cloned.find(".puesto_input").attr("id", "puesto_"+total);
  327. cloned.data("id", total);
  328. cloned.find(".lleva_firma").attr("id", "lleva_firma_"+total);
  329. cloned.find(".lleva_firma").siblings("label").attr("for", "lleva_firma_"+total);
  330. }while(total < nuevos);
  331. }else if(total > nuevos){
  332. //Quitar
  333. do{
  334. $("#firmas_block >.firma-box:last-child").remove();
  335. total--;
  336. }while(total > nuevos);
  337. }
  338. });
  339. $(".datalist-firma ul li").click(function(){//cambia datalist
  340. var id = $(this).parents(".firma-box").data('id');
  341. var puesto = $(this).data('puesto');
  342. console.log("Busca puesto "+id+", "+puesto);
  343. $("#puesto_"+id).val(puesto);
  344. });
  345. $(".btn-copiar").click(function(){
  346. var textoCopiar = $(this).parents(".input-group").find('.texto-copiar');
  347. textoCopiar.select();
  348. document.execCommand("copy");
  349. window.getSelection().removeAllRanges();
  350. //textoCopiar.blur();
  351. });
  352. //--- Modales
  353. $(".block-crear").removeClass("d-none"); // Quitar
  354. $('#modalParticipante').on('show.bs.modal', function (e) {
  355. $('#modalParticipante').find("input[type=text]").val("");
  356. });
  357. $('#modalParticipante').on('shown.bs.modal', function (e) {
  358. $('#modalParticipante').find("input[type=text]:first").focus();
  359. });
  360. $('#modalParticipante input[type=text]').keydown(function(event) {
  361. if (event.keyCode == 13) {
  362. $("#btn-guarda").trigger('click');
  363. }
  364. });
  365. $(".perfil").click(function(){
  366. var show = $(this).data("show");
  367. var hide = $(this).data("hide");
  368. $("."+show).removeClass("d-none");
  369. $("."+hide).addClass("d-none");
  370. $("#resultados").addClass("d-none");
  371. $("#nombre_alumno").removeClass("is-invalid");
  372. });
  373. $("#btn-guarda").click(function(){
  374. $("#nombre_alumno").removeClass("is-invalid");
  375. var nombre_new = trim($("#nombre_alumno").val() );
  376. //console.log(nombre_new);
  377. if(nombre_new == ""){
  378. $("#nombre_alumno").addClass("is-invalid");
  379. return;
  380. }
  381. if($("#participante_list").hasClass("d-none")){
  382. $(".participante-block .part-texto").val( nombre_new );
  383. $(".participante-block .part-texto").attr("disabled", false);
  384. $("#participante_list").removeClass("d-none");
  385. }else{
  386. var cloned = $("#participante_list >.participante-block:first-child").clone(true).appendTo("#participante_list");
  387. cloned.find(".part-texto").val(nombre_new);
  388. }
  389. $('#modalParticipante').modal('hide');
  390. });
  391. $(".btn-abrir-confirm").click(function(){
  392. if(validaForma()){
  393. $('#modal_confirm').modal('show');
  394. }else{
  395. $("#errorBox").collapse('show');
  396. $('#messageBox')[0].scrollIntoView({ block: "end" });
  397. }
  398. });
  399. $('#modal_confirm').on('show.bs.modal', function (e) {
  400. $("#confirm-participante").text( $(".participante-block .part-texto:first-child").val() );
  401. $("#confirm-desc").html( tinymce.get('desc').getContent() );
  402. $("#confirm-fecha").text( $("#fecha").val() );
  403. var firmas_block = $("#confirm-firma-list .col").length;
  404. var firmas = $('.puesto_input').length;
  405. if(firmas_block < firmas){//faltan
  406. do{
  407. var cloned = $("#confirm-firma-list >.col:first-child").clone(true).appendTo("#confirm-firma-list");
  408. firmas_block++;
  409. }while(firmas_block < firmas);
  410. }else{
  411. while(firmas_block > firmas){
  412. $("#confirm-firma-list >col:last-child").remove();
  413. firmas_block--;
  414. }
  415. }
  416. $.each($('#confirm-firma-list .col'), function(i){
  417. var nombre = getDatalistText($("#firma_"+(i+1)), $("#firma_"+(i+1)).val())
  418. $(this).find(".confirm-firma").text( nombre );
  419. $(this).find(".confirm-puesto").text( $("#puesto_"+(i+1)).val() );
  420. });
  421. });
  422. $(".btn-enviar").click(function(){
  423. $.each($('.firma-box'), function(i){
  424. if($(this).find(".lleva_firma").prop("checked")){
  425. $(this).find(".lleva_firma_hidden").val("1");
  426. }else{
  427. $(this).find(".lleva_firma_hidden").val("0");
  428. }
  429. });
  430. $("#formaConstancias").submit();
  431. $('#modal_confirm').modal('hide');
  432. $('#messageBox')[0].scrollIntoView({ block: "end" });
  433. $("#forma_block").addClass("d-none");
  434. $("#generado_block").removeClass("d-none");
  435. });
  436. });
  437. $(document).on( "click", ".btn-borrar", function(event){
  438. if($(".participante-block").length > 1){
  439. $(this).parents(".participante-block").remove();
  440. }else{
  441. $(".participante-block .part-texto").attr("disabled", true).val("");
  442. $("#participante_list").addClass("d-none");
  443. }
  444. });
  445. function validaForma(){
  446. $(".is-invalid").removeClass("is-invalid");
  447. var error = false;
  448. if(tinymce.get('desc').getContent() == ""){
  449. error = true;
  450. }
  451. $.each($('.puesto_input'), function(){
  452. if(trim($(this).val()) == ""){
  453. error = true;
  454. $(this).addClass("is-invalid");
  455. }
  456. });
  457. if(error){
  458. $("#errorBox_text").html("Debes completar todos los campos");
  459. return false;
  460. }
  461. if($(".participante_check:checked").length == 0){
  462. $("#errorBox_text").html("Debes elegir al menos un participante");
  463. return false;
  464. }
  465. return true;
  466. }
  467. </script>
  468. <?php } ?>
  469. </body>
  470. </html>