2010-08-18 11 views
74

Editar nuevamente:¿Cómo puedo hacer que un formulario HTML completo sea "de solo lectura"? En el lado del servidor, por favor

¿Sin duda esto es estándar? No puedo estar reinventando la rueda ?? El usuario rellena un formulario y se lo muestra (usando PHP, pero eso no debería importar). Lo muestran a él como confirmación, por lo que no debería ser capaz de intentar cambiar de nuevo ...


Ver pregunta relacionada, How to display a form list box as read-only or disabled with a selected index? El quid de la cuestión es que quiero llevar a cabo lo que debe ser una muy tarea común ...

Hay dos formas: un formulario de envío en HTML y un formulario de reconocimiento de procesamiento & en PHP.

El primer formulario ofrece una opción en muchos controles, el segundo verifica la entrada y, si es válido, muestra el formulario de entrada nuevamente con un mensaje de confirmación. En esta segunda forma, todos los campos deben ser estáticos.

Por lo que puedo ver, algunos controles de formulario pueden ser readonly y todos pueden ser disabled, la diferencia es que aún se puede tabular en un campo de solo lectura.

En lugar de hacer este campo por campo ¿hay alguna forma de marcar el formulario completo como readonly/disabled/static de modo que el usuario no pueda alterar ninguno de los controles?


Editar: gracias por todas las soluciones JS (que no tengo +1) pero estoy restringido a una solución de servidor. Lo siento, debería haber dicho esto originalmente.


[Actualización] Esto se sigue recibiendo respuestas siete años más tarde ;-) Lo que hice, al final, era para generar la forma de PHP y, para cada campo escribir un atributo readonly o disabled (según sea apropiado al tipo de control), se establece en verdadero o falso según una variable global.

+1

@mawg ¿qué idioma del lado del servidor está utilizando entonces? –

+0

¿No puedes generar el código JavaScript en el lado del servidor? No hay forma de hacerlo en solo HTML si eso es lo que estás preguntando. –

+0

@ben rowe, +1 para preguntar, pero ¿cómo puede hacer alguna diferencia? Quiero mostrar un HTNL o al lado del cliente, deshabilitado. PHP, como sucede, pero no veo que importe, ¿o extraño algo? La pinta es que readonly/disabled debe provenir del servidor, pero para cuando llegue al cliente no debería importar cómo se hizo. – Mawg

Respuesta

105

Envuelva todo el contenido del formulario en una etiqueta <fieldset> y configure su atributo disabled.

<form> 
    <fieldset disabled> 
     <input/> 
     <input/> 
     <input/> 
    </fieldset> 
</form> 
+1

¿Has probado eso? Subí, pero me gustaría que se confirmara. – Mawg

+2

¡Lo intenté, funciona como un encanto! –

+0

Repaso esta pregunta, años después, y cambié la respuesta otorgada a esta. Funciona, como se puede ver en http://www.w3schools.com/jsref/prop_fieldset_disabled.asp No puedo entender por qué no estaba enterado de esto antes de que – Mawg

3

No hay una forma HTML oficial totalmente compatible para hacerlo, pero un pequeño javascript puede ser de gran ayuda. Otro problema con el que se encontrará es que los campos deshabilitados no aparecen en los datos de POST

+2

Si ya ha validado los datos, debe guardarlos del lado del servidor. Enviarlo de ida y vuelta al cliente es un gran agujero de seguridad. Incluso si usa css, js o html para congelar los campos, puede editar 'm con Firebug o cambiando manualmente la siguiente solicitud HTTP –

+0

+1 Gracias, pero no puedo usar las soluciones del lado del cliente, vea la pregunta actualizada (lo siento, mi mal) – Mawg

4

No existe una forma integrada que conozca para hacer esto, por lo que tendrá que encontrar una solución personalizada sobre lo complicado que es tu formulario Debe leer este mensaje:

Convert HTML forms to read-only

EDIT: En base a su actualización, por qué estás tan preocupado por tener que leer solamente? Puede hacerlo a través del lado del cliente, pero si no, tendrá que agregar la etiqueta requerida a cada control o convertir los datos y mostrarlos como texto sin formato, sin controles. Si intentas que se lea solo para que la próxima publicación no se modifique, entonces tienes un problema porque cualquiera puede meterse con la publicación para producir lo que quiera, de modo que cuando de hecho finalmente recibas la información, es mejor que la revises nuevamente. para asegurarse de que sea válido

+0

+1 Gracias, pero no puedo usar las soluciones del lado del cliente, vea la pregunta actualizada (lo siento, mi mal) – Mawg

+0

"En función de su actualización, ¿por qué está tan preocupado por que solo se lea? Puede hacerlo a través del lado del cliente "Lo siento, pero 1) No puedo hacerlo desde el lado del cliente (no es mi elección) y 2) si al usuario le parece que está cambiando cosas que podrían confundirlo. – Mawg

+0

@mawg bien si es puramente para efectos visuales, entonces, lo único que puedo recomendar es reemplazar todos los controles en línea con su equivalente de texto o agregar la propiedad de solo lectura a los controles. No hay una solución mágica y tengo la sensación de que es lo que estás buscando. ¿Puedes publicar un fragmento del código que puedes modificar? Ayudaría obtener una base para lo que está trabajando. – Kelsey

6

Puede utilizar esta función para desactivar la forma:

function disableForm(formID){ 
    $('#' + formID).children(':input').attr('disabled', 'disabled'); 
} 

See the working demo here

Note que usa jQuery.

+0

+1 Gracias, pero no puedo usar las soluciones del lado del cliente, vea la pregunta actualizada (lo siento, mi mal) – Mawg

1

Ten todos los id del formulario numerados y ejecute un bucle for en JS.

for(id = 0; id<NUM_ELEMENTS; id++) 
    document.getElementById(id).disabled = false; 
+0

+1 Gracias, pero no puedo usar las soluciones del lado del cliente, vea la pregunta actualizada (lo siento, mi mal) – Mawg

5

En la página de confirmación, no coloque el contenido en controles editables, simplemente escríbalos en la página.

+1

Este es realmente el enfoque más sagrado. No presente una forma no editable a un usuario, o terminará siendo una entrada en la pregunta "El menor asombro". – kibibu

+2

Y tiene un enlace a una página de edición. –

+1

cómo? ¿Cómo puedo mostrar una casilla de verificación y su condición de verificación/no verificada, o un grupo de radio con su elemento seleccionado, etc.? – Mawg

143

Envuelva los campos de entrada y otras cosas en un <fieldset> y asígnele el atributo disabled="disabled".

Ejemplo (http://jsfiddle.net/7qGHN/):

<form> 
 
    <fieldset disabled="disabled"> 
 
     <input type="text" name="something" placeholder="enter some text" /> 
 
     <select> 
 
      <option value="0" disabled="disabled" selected="selected">select somethihng</option> 
 
      <option value="1">woot</option> 
 
      <option value="2">is</option> 
 
      <option value="3">this</option> 
 
     </select> 
 
    </fieldset> 
 
</form>

+1

solución simple y más grande para mí. Gracias – demo

+1

La mejor solución para el lado del cliente :) +1 – Sisir

+2

Esta debería ser la respuesta aceptada. – cdrev

6

No todos los elementos de formulario se puede configurar para readonly, por ejemplo:

  • casillas de verificación
  • cajas de radio
  • archivo de carga
  • ... más ..

A continuación, la solución razonable sería establecer atributos disabled todos los elementos del formulario a true, ya que el PO no afirmó que la específica 'bloqueado' forma debe ser enviado al servidor (que el atributo disabled no permite).

Otra solución, que se presenta en la demostración a continuación, es colocar una capa en la parte superior del elemento de form que evitará cualquier interacción con todos los elementos en el interior del elemento de form, puesto que la capa se ajusta con un mayor valor z-index :

DEMO:

var form = document.forms[0], // form element to be "readonly" 
 
    btn1 = document.querySelectorAll('button')[0], 
 
    btn2 = document.querySelectorAll('button')[1] 
 

 
btn1.addEventListener('click', lockForm) 
 
btn2.addEventListener('click', lockFormByCSS) 
 

 
function lockForm(){ 
 
    btn1.classList.toggle('on'); 
 
    [].slice.call(form.elements).forEach(function(item){ 
 
     item.disabled = !item.disabled; 
 
    }); 
 
} 
 

 
function lockFormByCSS(){ 
 
    btn2.classList.toggle('on'); 
 
    form.classList.toggle('lock'); 
 
}
form{ position:relative; } 
 
form.lock::before{ 
 
    content:''; 
 
    position:absolute; 
 
    z-index:999; 
 
    top:0; 
 
    right:0; 
 
    bottom:0; 
 
    left:0; 
 
} 
 

 
button.on{ color:red; }
<button type='button'>Lock/Unlock Form</button> 
 
<button type='button'>Lock/Unlock Form (with CSS)</button> 
 
<br><br> 
 
<form> 
 
    <fieldset> 
 
    <legend>Some Form</legend> 
 
    <input placeholder='text input'> 
 
    <br><br> 
 
    <input type='file'> 
 
    <br><br> 
 
    <textarea placeholder='textarea'></textarea> 
 
    <br><br> 
 
    <label><input type='checkbox'>Checkbox</label> 
 
    <br><br> 
 
    <label><input type='radio' name='r'>option 1</label> 
 
    <label><input type='radio' name='r' checked>option 2</label> 
 
    <label><input type='radio' name='r'>option 3</label> 
 
    <br><br> 
 
    <select> 
 
     <option>options 1</option> 
 
     <option>options 2</option> 
 
     <option selected>options 3</option> 
 
    </select> 
 
    </fieldset> 
 
</form>

2

prefiero usar jQuery:

find() iría mucho más profundo hasta el nido nido que los niños(), que solo busca hijos inmediatos.

+0

Gracias, te invitaré a que lo intentes, ya que eres nuevo. PERO, tenga en cuenta que claramente pedí una solución para el lado del servidor. En ese momento solo codificaba PHP y aún no JS. Un consejo amistoso para leer la pregunta, ya que algunos podrían menospreciarte por esto :-(Bienvenido a bordo :-) – Mawg

Cuestiones relacionadas