Foros del Web » Programando para Internet » PHP »

Header location sin anclas

Estas en el tema de Header location sin anclas en el foro de PHP en Foros del Web. Hola. Soy nuevo en esto de foros del web, nuevo en realizar plantillas para wordpress y casi nuevo en php. Estoy haciendo una plantilla que ...
  #1 (permalink)  
Antiguo 24/07/2012, 23:27
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Header location sin anclas

Hola.

Soy nuevo en esto de foros del web, nuevo en realizar plantillas para wordpress y casi nuevo en php.

Estoy haciendo una plantilla que tiene un formulario de contacto en el footer. Al dar submit recarga esa misma página para hacer una validación con php (también valida con js, pero es por si el usuario tiene deshabilitado js). Como el formulario está en el footer, al recargar la página le agrego un ancla a la url para que quede algo así: pagina/#footer y me mande hasta donde está el formulario y despliegue los mensajes de los errores o campos necesarios. Esto lo hago con action="#footer" en el formulario.

Cuando el usuario ya mandó correctamente la información utilizo un header location para mandarlo a la página /gracias/ pero el problema es que me sigue poniendo el ancla y queda /gracias/#footer. No entiendo el por qué sigue poniendo el ancla en la url. ¿Lo estoy haciendo totalmente mal o sólo me falta alguna cosilla?

Gracias y saludos.
  #2 (permalink)  
Antiguo 24/07/2012, 23:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Header location sin anclas

Sin ver el código responsable es complicado adivinar, sin embargo las anclas corresponden al navegador y no al servidor.

Aún así es complicado deducir sin conocer el cómo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 25/07/2012, 00:14
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

Perdona, aquí pongo el código.

Al principio del header tengo esta validación:

Código PHP:
// Validación contacto footer
global $errores;
global 
$respuestaErrores;
global 
$fallaEnvio;
if(isset(
$_POST['enviado'])) {
    
$errores 0;
    
    
$campo_nombre $_POST['footer_contacto_nombre'];
    
$campo_correo $_POST['footer_contacto_correo'];
    
$campo_mensaje $_POST['footer_contacto_mensaje'];
    
    
$respuestaErrores '
    <script>
        $("#footer_contacto_nombre").val("'
.$campo_nombre.'");
        $("#footer_contacto_correo").val("'
.$campo_correo.'");
        $("#footer_contacto_mensaje").val("'
.$campo_mensaje.'");';
    
    if(
trim($campo_nombre) == '') {
        
$errores ++;
        
$respuestaErrores.= '$("#nombre_req").css("display","inline");';
        }
        
    if(
trim($campo_correo) == '') {
        
$errores ++;
        
$respuestaErrores.= '$("#correo_req").css("display","inline");';
        }
        
    else if(!
preg_match("/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i"$campo_correo)) {
        
$errores ++;
        
$respuestaErrores.= '$("#correo_req").css("display","inline");';
      }
        
    if(
trim($campo_mensaje) == '') {
        
$errores ++;
        
$respuestaErrores.= '$("#mensaje_req").css("display","inline");';
        }
    
$respuestaErrores.= '
    </script>'
;    
    
    if ( 
$errores == ) {
        
        require_once 
ABSPATH WPINC '/class-phpmailer.php';
        require_once 
ABSPATH WPINC '/class-smtp.php';
        
        
$mail = new PHPMailer();
        
        
$mail->IsSMTP();
        
$mail->SMTPAuth   true;                  // enable SMTP authentication
        
        
$mail->SMTPSecure "ssl";                 // sets the prefix to the servier
        
$mail->Host       "smtp.gmail.com";      // sets GMAIL as the SMTP server
        
$mail->Port       465;                   // set the SMTP port : Gmail:465 y 587
        
        
$mail->Username   "mi correo";  // username
        
$mail->Password   "mi contraseña";            // password
        
        
$mail->From       $campo_correo;
        
$mail->FromName   "Enviado por: $campo_nombre";
        
$mail->Subject    "Contacto web";
        
        
$body  "<span style='color:#999'>De:</span> $campo_nombre <br /><span style='color:#999'>Correo electr&oacute;nico:</span> $campo_correo <br /><br /><span style='color:#999'>Mensaje:</span><br /> $campo_mensaje";
        
$body str_replace("\n""<br />"$body); 
        
$mail->Body $body;
        
        
$mail->AltBody "De: $campo_nombre\nCorreo electrónico: $campo_correo\n\nMensaje:\n$campo_mensaje";
        
        
$mail->WordWrap 10// set word wrap
        
        
$mail->MsgHTML($body);
        
        
$mail->AddReplyTo($campo_correo,$campo_nombre);
        
$mail->AddAddress("correo","destinatario");
        
        
$mail->IsHTML(true);
        
        if(!
$mail->Send()) {
          
$fallaEnvio true;
        }
        else {
          
$urlGracias home_url'/gracias/' );
          
header("Location: $urlGracias");
          exit;
        }
    }    


En el footer tengo este formulario:

Código HTML:
<form id="footer_contacto" name="footer_contacto" method="post" onsubmit="return valida(this);" action="#footer_contacto">
    <fieldset>
        <label class="assistive-text" for="footer_contacto_nombre">Nombre</label>
        <p class="requerido" id="nombre_req">*</p>
        <input id="footer_contacto_nombre" name="footer_contacto_nombre" type="text" placeholder="Nombre">
        
        <label class="assistive-text" for="footer_contacto_correo">Correo electrónico</label>
        <p class="requerido" id="correo_req">*</p>
        <input id="footer_contacto_correo" name="footer_contacto_correo" type="text" placeholder="Correo electrónico">
        
        <label class="assistive-text" for="footer_contacto_mensaje">Mensaje</label>
        <p class="requerido" id="mensaje_req">*</p>
        <textarea id="footer_contacto_mensaje" name="footer_contacto_mensaje" placeholder="Mensaje"></textarea>
        
    	<input type="hidden" name="enviado" id="enviado" value="true" />
        <input type="submit" value="Enviar">
    </fieldset>
</form> 

Si estoy por ejemplo en localhost/index.php y intento mandar el formulario con un campo incompleto vuelve a cargar esa misma página pero con un ancla, es decir, carga: localhost/index.php#footer_contacto para que el navegador vaya a la forma de contacto y el usuario vea los campos que le faltaron llenar. Después de eso lleno correctamente los datos y al hacer submit me manda el correo y me manda a la página localhost/gracias/#footer_contacto cuando me debería llevar nada más a localhost/gracias/ (sin el #footer_contacto al final).

No sé si en el header(location:…) se le pueda decir que ignore el vínculo al ancla que supongo se queda memorizada desde la página anterior.
  #4 (permalink)  
Antiguo 25/07/2012, 00:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Header location sin anclas

Pero según se entiende el envío lo debes estar haciendo con Javascript, ¿o no?

Ya que naturalmente un action usando una ancla únicamente no produce el envío natural del formulario.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 25/07/2012, 00:38
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

En este caso únicamente utilzo javascript (jquery) para la validación:


Código Javascript:
Ver original
  1. function valida() {
  2.     var contactoErrores = 0;
  3.     var footerNombre = $("#footer_contacto_nombre");
  4.     var footerNombreReq = $("#nombre_req");
  5.     var footerCorreo = $("#footer_contacto_correo");
  6.     var footerCorreoReq = $("#correo_req");
  7.     var footerMensaje = $("#footer_contacto_mensaje");
  8.     var footerMensajeReq = $("#mensaje_req");
  9.    
  10.     if(footerNombre.val() == "" || footerNombre.val() == "Nombre") {
  11.         contactoErrores++;
  12.         footerNombreReq.css("display","inline");
  13.         footerNombre.keyup(function(){
  14.             footerNombreReq.fadeOut("slow");
  15.         });
  16.     }
  17.        
  18.     if(footerCorreo.val() == "" || footerCorreo.val() == "Correo electrónico") {
  19.         contactoErrores++;
  20.         footerCorreoReq.css("display","inline");
  21.         footerCorreo.keyup( function() {
  22.             footerCorreoReq.fadeOut("slow");
  23.             footerCorreo.focusout(function() {
  24.                 if (!regex_correo.test(correoVal)) {
  25.                     footerCorreoReq.css("display","inline");
  26.                 }
  27.             });
  28.         });
  29.     }
  30.     else {
  31.         correoVal = footerCorreo.val();
  32.         regex_correo = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
  33.         if (!regex_correo.test(correoVal)) {
  34.             contactoErrores++;
  35.             footerCorreoReq.css("display","inline");
  36.         }
  37.     }
  38.     if(footerMensaje.val() == "" || footerMensaje.val() == "Mensaje" ){
  39.         contactoErrores++;
  40.         footerMensajeReq.css("display","inline");
  41.         footerMensaje.keyup(function(){
  42.             footerMensajeReq.fadeOut("slow");
  43.         });
  44.     }
  45.  
  46.     if( contactoErrores < 1 ) { return true; }
  47.     return false;
  48. }

El correo se manda por phpmailer y todo funciona correctamente salvo ese detalle de que por alguna razón me sigue poniendo #footer_contacto al final de la url después de hacer el header location y no hallo cómo decirle que ya no lo ponga después de mandar el correo.
  #6 (permalink)  
Antiguo 25/07/2012, 00:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Header location sin anclas

Intenta agregar un ancla vacía al final de la URL.
Código PHP:
header("Location: $urlGracias#"); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 25/07/2012, 00:55
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

Cita:
Iniciado por pateketrueke Ver Mensaje
Intenta agregar un ancla vacía al final de la URL.
Código PHP:
header("Location: $urlGracias#"); 
Agregando únicamente el # no funciona, sigue poniendo el #footer_contacto. Agredando un id existente (por ejemplo $urlGracias#header) sí funciona y la página se queda mostrando la parte de arriba. Esto es lo que tengo planeado hacer en caso de no hallar una solución para que no escriba anclas en el url.

Mi intención es hallar alguna de estas soluciones:
Que después de hacer el redireccionamiento con el header location ya no me ponga el ancla.
O que en el action del formulario hacer que vuelva a cargar la misma página en la que el usuario está y mandarlo hasta el footer sin tener que usar anclas.

Bueno, es tarde y me retiro a dormir. Ya no podré responder por el día de hoy.

Te agradezco las respuestas
  #8 (permalink)  
Antiguo 25/07/2012, 09:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Header location sin anclas

¿que hace la función home_url()?
  #9 (permalink)  
Antiguo 25/07/2012, 09:51
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

home_url() es una función de wordpress que te regresa la dirección base de la página ( http://codex.wordpress.org/Function_Reference/home_url ).

Intenté escribiendo directamente el url absoluto de donde tengo la página en localhost y el resultado no cambia.
  #10 (permalink)  
Antiguo 25/07/2012, 10:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Header location sin anclas

Es muy raro que al hacer el header no quite el ancla, pero igual podrías intentar no usar la función y solamente hacer: header('Location: /gracias');
  #11 (permalink)  
Antiguo 25/07/2012, 13:14
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

Por lo que he podido leer, al utilizar Location es muy recomendable utilizar rutas absolutas para evitar posibles errores. De cualquier forma utilizando "/gracias" o "/gracias/" tiene el mismo resultado.

Después de leer en varias páginas y foros parece ser que la parte del ancla no se envía a php si no que se queda del lado del cliente, por lo que lo más probable es que no la pueda quitar desde php.

La forma en que se maneja el redireccionamiento por medio de location depende de cómo lo interprete cada navegador. Por ejemplo en Safari sí me está llevando a /gracias/ sin el ancla, mientras que en Chrome, Firefox y Opera ocurre el problema que les comento.

¿El valor de que tiene el atributo action del formulario puede ser modificado en php? Si esto se pudiera hacer, podría reemplazar este valor al momento de hacer la validación y solucionaría el problema.
  #12 (permalink)  
Antiguo 25/07/2012, 13:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Header location sin anclas

El valor del action ya no lo puedes cambiar con php porque ya está impreso en el formulario, sin embargo si puedes modificarlo con Javascript.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 25/07/2012, 13:48
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

Me refiero a cambiarlos en la información que ya se mandó a php.

Por ejemplo, durante la validación se utiliza $_POST['nombre'] para obtener lo que el usuario introdujo en el campo nombre.

¿El valor que tiene el atributo value es enviado junto con los datos del formulario? Intenté con un $_POST['action'] a ver si me daba algo de resultado pero parece que no.
¿En caso de que lo que hay en action se mande al hacer el submit, se puede modificar durante la validación?
  #14 (permalink)  
Antiguo 25/07/2012, 14:51
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Header location sin anclas

A ver, el atributo action es propio de HTML y claro que puede ser alterado con Javascript en tiempo de ejecución.

De ninguna forma es accesible por PHP ya que el action en si mismo es el destino del formulario.

Que cosas, ¿no?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 25/07/2012, 16:13
 
Fecha de Ingreso: julio-2012
Mensajes: 8
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Header location sin anclas

Ya veo. Creo que me tendré que aguantar agregándole algo como #top al hacer el location.

En fin, les agradezco las respuestas.

Etiquetas: anclas, formulario, header, location, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:37.