Hago más genérico el código que gestiona los campos
authorPlatonides <platonides@gmail.com>
Tue, 22 May 2018 17:39:11 +0000 (19:39 +0200)
committerPlatonides <platonides@gmail.com>
Tue, 22 May 2018 17:47:22 +0000 (19:47 +0200)
html/inscripcion.php

index 08a02de6a7399e7a878108ee708388bdf248f472..2e6f33b8e373ce327a192a404246f45376af8328 100644 (file)
@@ -45,16 +45,12 @@ if (!isset($_GET['e']) || !$_GET['e']) {
 }
 $E = trim ($_GET['e'], "/");
 
-# Hasta arreglo definitivo...
-$EmailText = "<b>Email</b>";
+# Una inscripción especial puede indicarse directamente en el nombre del evento
 if (substr ($E, -10) == "-iespecial") {
     $E = substr ($E, 0, -10);
-    $EmailOpc = TRUE; $EmailText = "Email";
-    unset ($DE["exigidos"]);
+    $_GET["p"] = "-iespecial";
 }
 
-# $Email = ($E == "mensa" ? "info" : $E);
-
 $I = ($_GET["uselang"] ?? "es");
 $D0 = parsecfg ("jembot.0");
 $DD = parsecfg ("jembot.data");
@@ -112,22 +108,37 @@ if (isset($_GET["g"])) {
 $Edicion = ($DE["tipo"] == "editatón" || $DE["tipo"] == "taller de edición");
 $Exigidos = (array)$DE["exigidos"];
 if ($Edicion) $Exigidos[] = "Cuenta";
+$Exigidos[] = "Email";  # Exigimos siempre el correo electrónico
 
-# Hasta arreglo definitivo traslado arriba
-# $EmailText = "<b>Email</b>";
-# Pendiente gestionar email también con $DE["exigidos"]
 if ($_GET["p"] ?? '' == "-iespecial") {
-    $EmailOpc = TRUE; $EmailText = "Email";
     $Exigidos = array();
 }
 
-$DNI = (in_array ("DNI", $Exigidos) ? "<b>{$DI["dni"]}</b>" : $DI["dni"]);
-$Nombre = (in_array ("Nombre", $Exigidos) ? "<b>{$DI["nombre"]}</b>" : $DI["nombre"]);
-$Apellido1 = (in_array ("Apellido1", $Exigidos) ? "<b>{$DI["apellido"]} 1</b>" : "{$DI["apellido"]} 1");
-$Apellido2 = (in_array ("Apellido2", $Exigidos) ? "<b>{$DI["apellido"]} 2</b>" : "{$DI["apellido"]} 2");
-$Sexo = (in_array ("Sexo", $Exigidos) ? "<b>{$DI["sexo"]}</b>" : $DI["sexo"]);
-$Edad = (in_array ("Edad", $Exigidos) ? "<b>{$DI["edad"]}</b>" : $DI["edad"]);
-$Cuenta = (in_array ("Cuenta", $Exigidos) ? "<b>{$DI["nombreusr"]}</b>" : $DI["nombreusr"]);
+$_POST += array(
+    'Nombre' => '',
+    'Apellido1' => '',
+    'Apellido2' => '',
+    'DNI' => '',
+    'Email' => '',
+    'Cuenta' => '',
+    'Comentarios' => '',
+);
+
+$CamposInscripciones = array ("Nombre", "Apellido1", "Apellido2", "DNI", "Sexo", "Edad", "Email", "Cuenta", "Experiencia", "Enterado", "Comentarios");
+
+# TODO: renombrar estas claves
+$DI["apellido1"] = "{$DI["apellido"]} 1";
+$DI["apellido2"] = "{$DI["apellido"]} 2";
+$DI["experiencia"] = $DI["exprevia"];
+$DI["enterado"] = $DI["medioenterado"];
+$DI["cuenta"] = $DI["nombreusr"];
+$DI["email"] = "Email";
+
+foreach ($CamposInscripciones as $Campo) {
+    $msg = htmlspecialchars($DI[strtolower($Campo)]);
+    $ptrCampo = "Etiqueta$Campo";
+    $$ptrCampo = in_array ($Campo, $Exigidos) ? "<b>$msg</b>" : $msg;
+}
 
 $Org = $DE["organizador"];
 $Colab = array_merge ((array) $Org, (array) $DE["colaboradores"]);
@@ -155,22 +166,27 @@ if (isset($_POST["Confirmado"])) {        # Datos enviados
         $Error[] = $DI["errw"]["maxhorarios"];
     }
 
-    foreach (array ("Nombre", "Apellido1", "Apellido2", "DNI", "Sexo", "Edad", "Cuenta") as $C) {
-        if (empty ($_POST[$C]) && in_array ($C, $Exigidos)) {
-             $Error[] = $DI["errw"]["no" . strtolower ($C)];
+    /* Comprobamos que hayan proporcionado todos los campos exigidos */
+    foreach ($CamposInscripciones as $C) {
+        if (in_array ($C, $Exigidos) && (!isset ($_POST[$C]) || $_POST[$C] == '')) {
+             $Error[$C] = $DI["errw"]["no" . strtolower ($C)];
              if ($C == "Cuenta") $Extra = $InfoCrear;
         }
     }
-    
-    $M = $_POST["Email"] ?? "";
-    if (! filter_var ($M, FILTER_VALIDATE_EMAIL) && ($M || ! $EmailOpc)) {
-        $Error[] = $DI["errw"]["noemail"];
-    }  
 
-    $U = strtr ($_POST["Cuenta"], "_", " ");
-    if ($U) {
+    /* Adicionalmente, para el correo se comprueba que el email parezca correcto */
+    $EmailUsuario = $_POST["Email"] ?? "";
+    if ($EmailUsuario || in_array ("Email", $Exigidos)) {
+        if (! filter_var ($EmailUsuario, FILTER_VALIDATE_EMAIL)) {
+            $Error["Email"] = $DI["errw"]["noemail"];
+        }
+    }
+
+    /* Se verifica que la cuenta de la wiki exista y no esté bloqueada */
+    $Usuario = ucfirst (strtr ($_POST["Cuenta"], "_", " "));
+    if ($Usuario) {
             #Comprobar discrepancia en gender:
-            $D = api ("usuario", $U, $P);
+            $D = api ("usuario", $Usuario, $P);
             
             if (array_key_exists ("missing", $D)) {
                 $Error[] = $DI["errw"]["cuentanula"];
@@ -182,19 +198,19 @@ if (isset($_POST["Confirmado"])) {        # Datos enviados
             }
     }
     
-    if ($M || $U) {
+    if ($EmailUsuario || $Usuario) {
         foreach ($DE["inscritos"] as $Grupo => $Lista) {
             if (in_array ($Grupo, $GruposI)) {
                 foreach (explode (";", $Lista) as $Cod) {
-                    if ($M && $DU[$Cod]["Email"] == $M) {
+                    if ($EmailUsuario && $DU[$Cod]["Email"] == $EmailUsuario) {
                         $EmailRep++;
-                    } elseif ($U && $DU[$Cod]["Cuenta"] == $U) {
+                    } elseif ($Usuario && $DU[$Cod]["Cuenta"] == $Usuario) {
                         $CuentaRep++;
                     }
                 }
             }
         }
-        if ($EmailRep) $Error[] = "El correo electrónico {$M} ya ha sido indicado por " . (count ($Grupos) > 1 ? "alguien inscrito en " . singpl ("grupo", $EmailRep) . " de los seleccionados." : "otro inscrito.");
+        if ($EmailRep) $Error[] = "El correo electrónico {$EmailUsuario} ya ha sido indicado por " . (count ($Grupos) > 1 ? "alguien inscrito en " . singpl ("grupo", $EmailRep) . " de los seleccionados." : "otro inscrito.");
         if ($CuentaRep) $Error[] = "La cuenta {$U} ya ha sido indicada por " . (count ($Grupos) > 1 ? "alguien inscrito en " . singpl ("grupo", $CuentaRep) . " de los seleccionados." : "otro inscrito.");
     }
 
@@ -207,21 +223,20 @@ if (isset($_POST["Confirmado"])) {        # Datos enviados
             $Cod = $DU["@"][0] . $Cod;
         }
 
-        $Letra = strtoupper (sinacentos (mb_substr ($U, 0, 1)));
+        $Letra = strtoupper (sinacentos (mb_substr ($Usuario, 0, 1)));
         if ($Letra < "A" || $Letra > "Z") $Letra = "X";
         $Cod .= $Letra;
         $DU["@"] = $Cod;
 
-        if ($EmailOpc & ! $M) {
-            $_POST["Confirmado"] = "OK";
-        } else {        
-            $Base = 111111111111111;
-            $Conf = gmdate ("YmdHis") . "-" . rand ($Base, $Base * 9);
-            $_POST["Confirmado"] = $Conf;
+        if (!$EmailUsuario) {
+            /* El usuario se ha introducido manualmente sin que se indicara email */
+            $_POST["CodigoConfirmacion"] = "manual";
+        } else {
+            $_POST["CodigoConfirmacion"] = bin2hex(random_bytes(15));
         }
         $_POST["Fecha"] = date ("Y-m-d");
-        $_POST["Comentarios"] = strtr ($_POST["Comentarios"], array ("\r\n" => " █ "));
-        $_POST["Cuenta"] = mayusprim (strtr ($_POST["Cuenta"], "_", " "));
+        $_POST["Comentarios"] = strtr ($_POST["Comentarios"], array ("\r\n" => "\n", "\r" => "\n"));
+        $_POST["Cuenta"] = $Usuario;
                             
         foreach ($_POST as $Campo => $V) {
             if ($Campo[0] == "_") {            # $V vale "on", pero no es necesario comprobarlo, solo se pasan los "on"
@@ -236,7 +251,7 @@ if (isset($_POST["Confirmado"])) {  # Datos enviados
         writecfg ("jembot.@{$E}", $DE);
 
         $Marca = "-"; $Extra = "";
-        if ($EmailOpc && ! $M) {
+        if (! $EmailUsuario) {
             print "<script>alert ('Inscripción finalizada correctamente; te esperamos en el evento.');</script>";
         } else {
 
@@ -244,7 +259,7 @@ if (isset($_POST["Confirmado"])) {  # Datos enviados
             $Texto = <<<EOT
 Hola. Este es un mensaje automático del sistema de inscripciones de Wikimedia España.
 
-Se ha realizado una inscripción asociada a tu dirección de correo {$M} y a la cuenta de Wikipedia {$U} para nuestro evento {$DE["nombre"][$I]}.
+Se ha realizado una inscripción asociada a tu dirección de correo {$EmailUsuario} y a la cuenta de Wikipedia {$Usuario} para nuestro evento {$DE["nombre"][$I]}.
 
 Si efectivamente la inscripción es tuya y es correcta, necesitamos que nos lo confirmes, para lo cual solo tienes que entrar en el siguiente enlace en las próximas 24 horas:
 
@@ -262,11 +277,11 @@ Un saludo,
 
 Wikimedia España.
 EOT;
-            $R = mail ($M, "Wikimedia España - Confirmación de la inscripción para el evento: {$DE["nombre"][$I]}", $Texto, "From: {$Email}@wikimedia.es\r\nContent-Type: text/plain; charset=utf-8", "-f inscripciones@wikimedia.es");
+            $R = mail ($EmailUsuario, "Wikimedia España - Confirmación de la inscripción para el evento: {$DE["nombre"][$I]}", $Texto, "From: {$Email}@wikimedia.es\r\nContent-Type: text/plain; charset=utf-8", "-f inscripciones@wikimedia.es");
             if ($R) {
                 print "<script>alert ('Inscripción finalizada correctamente. Se te ha enviado un correo con un enlace para que confirmes la validez de tu dirección, lo cual deberás hacer en las próximas 24 horas. Te esperamos en el evento.');</script>";
             } else {
-                print "<script>alert ('La inscripción ha sido correcta, pero se ha producido un error al enviar el correo de confirmación de tu dirección.\\nPor favor, escribe tú mismo un mensaje a {$Email}@wikimedia.es desde tu cuenta {$M} confirmando que has solicitado tu inscripción con ella. Te esperamos en el evento.');</script>";
+                print "<script>alert ('La inscripción ha sido correcta, pero se ha producido un error al enviar el correo de confirmación de tu dirección.\\nPor favor, escribe tú mismo un mensaje a {$Email}@wikimedia.es desde tu cuenta {$EmailUsuario} confirmando que has solicitado tu inscripción con ella. Te esperamos en el evento.');</script>";
                 $Marca = "*"; $Extra = " - Error al enviar correo para confirmación";
             }
         }
@@ -338,16 +353,6 @@ foreach (array ("jpg", "png") as $Ext) {
 if (!empty($DE["abierto"])) {
     print ("<b>La inscripción a este evento " . ($DE["abierto"] == "no" ? "no se encuentra abierta todavía</b>. Puedes recibir más información <a href=\"https://www.wikimedia.es/wiki/contacto\" onClick=\"ec('info')\">{$DI["enviarmail"]}</a>." : "se abrirá el {$DE["abierto"]}</b>."));
 } else {
-
-    $_POST += array(
-        'Nombre' => '',
-        'Apellido1' => '',
-        'Apellido2' => '',
-        'DNI' => '',
-        'Email' => '',
-        'Cuenta' => '',
-        'Comentarios' => '',
-    );
 ?>
 <FORM NAME=F ACTION="<?= htmlspecialchars ($_SERVER["REQUEST_URI"]) ?>" METHOD=POST>
 <INPUT TYPE=HIDDEN NAME=Confirmado VALUE="N" />
@@ -357,14 +362,14 @@ if (!empty($DE["abierto"])) {
     <p><i><?= $DI["infocertificado"] ?></i></p>
 <?php } ?>
 <TABLE BORDER=0 width=100% >
-<TR><TD width=27%><label for='Nombre'><?= $Nombre ?></label><TD><INPUT type="text" class="t" SIZE=60 MAXLENGTH="60" id='Nombre' NAME='Nombre' VALUE="<?php print htmlspecialchars($_POST["Nombre"]) ?>" />
-<TR><TD><label for='Apellido1'><?= $Apellido1 ?></label><TD><INPUT type="text" class="t" SIZE=48 MAXLENGTH="40" id='Apellido1' NAME='Apellido1' VALUE="<?php print htmlspecialchars($_POST["Apellido1"]) ?>" />
-<TR><TD><label for='Apellido2'><?= $Apellido2 ?></label><TD><INPUT type="text" class="t" SIZE=48 MAXLENGTH="40" NAME='Apellido2' VALUE="<?php print htmlspecialchars($_POST["Apellido2"]) ?>" />
+<TR><TD width=27%><label for='Nombre'><?= $EtiquetaNombre ?></label><TD><INPUT type="text" class="t" SIZE=60 MAXLENGTH="60" id='Nombre' NAME='Nombre' VALUE="<?php print htmlspecialchars($_POST["Nombre"]) ?>" />
+<TR><TD><label for='Apellido1'><?= $EtiquetaApellido1 ?></label><TD><INPUT type="text" class="t" SIZE=48 MAXLENGTH="40" id='Apellido1' NAME='Apellido1' VALUE="<?php print htmlspecialchars($_POST["Apellido1"]) ?>" />
+<TR><TD><label for='Apellido2'><?= $EtiquetaApellido2 ?></label><TD><INPUT type="text" class="t" SIZE=48 MAXLENGTH="40" NAME='Apellido2' VALUE="<?php print htmlspecialchars($_POST["Apellido2"]) ?>" />
 <?php if (in_array ("DNI", $Exigidos) || $DE["certificado"] != "no") { ?>
-    <TR><TD><label for='DNI'><?= $DNI ?></label><TD><INPUT type="text" class="t" SIZE=20 MAXLENGTH="20" NAME='DNI' VALUE="<?php print htmlspecialchars ($_POST["DNI"]) ?>" />
+    <TR><TD><label for='DNI'><?= $EtiquetaDNI ?></label><TD><INPUT type="text" class="t" SIZE=20 MAXLENGTH="20" NAME='DNI' VALUE="<?php print htmlspecialchars ($_POST["DNI"]) ?>" />
 <?php }
 if (! in_array ("Sexo", $DE["invisibles"] ?? array())) { ?>
-<TR><TD><?= $Sexo ?> <img src="img/info.gif" title="<?= $DI["infosexo"] ?>"/><TD>
+<TR><TD><?= $EtiquetaSexo ?> <img src="img/info.gif" title="<?= $DI["infosexo"] ?>"/><TD>
    <INPUT TYPE=RADIO NAME=Sexo id='SexoF' VALUE=F <?= $CheckSexo["F"] ?? '' ?>><label for='SexoF'><?= $DI["mujer"] ?> ♀</label>&nbsp;&nbsp;&nbsp;&nbsp;
    <INPUT TYPE=RADIO NAME=Sexo id='SexoM' VALUE=M <?= $CheckSexo["M"] ?? '' ?>><label for='SexoM'><?= $DI["hombre"] ?> ♂</label>&nbsp;&nbsp;&nbsp;&nbsp;
    <INPUT TYPE=RADIO NAME=Sexo id='SexoO' VALUE=O <?= $CheckSexo["O"] ?? '' ?>><label for='SexoO'><?= $DI["otrasid"] ?></label>&nbsp;&nbsp;&nbsp;&nbsp; 
@@ -372,7 +377,7 @@ if (! in_array ("Sexo", $DE["invisibles"] ?? array())) { ?>
 <?php
 }
 if (! in_array ("Edad", $DE["invisibles"] ?? array())) { ?>
-<TR><TD><?= $Edad ?><TD>
+<TR><TD><?= $EtiquetaEdad ?><TD>
 <?php if ($E == "vmvg") { ?>
    <INPUT TYPE=RADIO NAME=Edad id='EdadA' VALUE=16-24 <?= $CheckEdad["16-24"] ?? '' ?>><label for='EdadA'>16-24</label>&nbsp;&nbsp;&nbsp;&nbsp;
    <INPUT TYPE=RADIO NAME=Edad id='EdadB' VALUE=25-30 <?= $CheckEdad["25-30"] ?? '' ?>><label for='EdadB'>25-30</label>&nbsp;&nbsp;&nbsp;&nbsp;
@@ -390,7 +395,7 @@ if (! in_array ("Edad", $DE["invisibles"] ?? array())) { ?>
 <?php
 }
 ?>
-<TR><TD><label for='Email'><?= $EmailText ?></label><TD><INPUT type="text" class="t" SIZE=60 MAXLENGTH="60" id='Email' NAME='Email' VALUE="<?php print htmlspecialchars($_POST["Email"]) ?>" />
+<TR><TD><label for='Email'><?= $EtiquetaEmail ?></label><TD><INPUT type="text" class="t" SIZE=60 MAXLENGTH="60" id='Email' NAME='Email' VALUE="<?php print htmlspecialchars($_POST["Email"]) ?>" />
 <?php
 if (count ($Grupos) > 1) {
     $MaxF = 1;
@@ -441,10 +446,10 @@ if (count ($Grupos) > 1) {
 }
 ?>
 <TR style="background-color:#e8e8f8"><TD COLSPAN=2><i><?= ucfirst ($DI["en"]) . " {$DI[$DP["familia"]]} {$DI["hermanos"]}" ?>:</i>
-<TR style="background-color:#e8e8f8"><TD><label for='Cuenta'><?= $Cuenta ?></label>&emsp;<small>(<?php
+<TR style="background-color:#e8e8f8"><TD><label for='Cuenta'><?= $EtiquetaCuenta ?></label>&emsp;<small>(<?php
     print ("<a href=\"https://{$DP["web"]}/wiki/Special:CreateAccount\" target=\"_blank\">{$DI["crearla"]}</a>");
 ?>)</small><TD><INPUT type="text" class="t" SIZE=60 MAXLENGTH="60" id='Cuenta' NAME='Cuenta' VALUE="<?= htmlspecialchars ($_POST["Cuenta"]) ?>" />
-<TR style="background-color:#e8e8f8"><TD><label for='Experiencia'><?= $DI["exprevia"] ?></label>
+<TR style="background-color:#e8e8f8"><TD><label for='Experiencia'><?= $EtiquetaExperiencia ?></label>
     <td><SELECT id='Experiencia' NAME="Experiencia">
 <?php
     $ValExp = ($_POST["Experiencia"] ?? "N/D");
@@ -458,7 +463,7 @@ if (count ($Grupos) > 1) {
 if (isset($DE["público"]) && $DE["público"] != "no") {
     $ValEnt = ($_POST["Enterado"] ?? "N/D");
     $CheckEnt[$ValEnt] = "SELECTED";
-    print ("<TR><TD><label for=\"Enterado\">{$DI["medioenterado"]}</label>\n<td><SELECT id=\"Enterado\" NAME=\"Enterado\">");
+    print ("<TR><TD><label for=\"Enterado\">{$EtiquetaEnterado}</label>\n<td><SELECT id=\"Enterado\" NAME=\"Enterado\">");
     print ("<OPTION VALUE='N/D' {$CheckEnt['N/D']}>{$DI["noespecificado"]}");
     for ($i = 1; $i <= 8; $i++) {
         print ("<OPTION VALUE='{$i}' {$CheckEnt[$i]}>{$DI["medio {$i}"]}");
@@ -481,7 +486,7 @@ foreach ($Colab as $C) {            # Ya no se admite diferenciar dentro de un mismo event
    print ("\n<TR><TD COLSPAN=2><INPUT TYPE=Checkbox id=\"RecibirInfo-{$C}\" NAME=\"RecibirInfo-{$C}\" /><label for=\"RecibirInfo-{$C}\">{$DI["infofutura"]} {$DI[$C]}</label>\n");
 }
 
-print ("\n<TR><TD><label for='Comentarios'>{$DI["comentarios"]}");
+print ("\n<TR><TD><label for='Comentarios'>{$EtiquetaComentarios}");
 if ($Edicion && $DE["tablas"][$P]) print ("<br /><span style=\"font-size:80%\"><i>" . preg_replace ("/#(.*?)#/", "<a href=\"" . wikiencode ("https://{$DP["web"]}/wiki/", $DE["página"][$P], NULL, NULL, NULL) ."\">$1</a>", $DI["nuevoart"]) . "</i></span>");
 print ("</label><TD COLSPAN=2><TEXTAREA ROWS=5 COLS=50 id='Comentarios' NAME=\"Comentarios\">" . htmlspecialchars ($_POST['Comentarios']));
 ?>