Buenas noches, tengo un problema que me esta dando muchos quebraderos de cabeza. Tengo un producto con los típicos campos y el campo precio me esta dando problemas. En el modelo lo tengo como decimal, y al momento de crear el formulario lo tengo como money
, pero cuando de por si ingreso solo letras en el campo obtengo la siguiente excepción: "Warning: NumberFormatter::parse(): Number parsing failed"
Mis clases son las siguientes:
class Producto { /** * @ORM\Column(type="decimal", scale=2) * @Assert\Range(min = 0) */ protected $precio; // ... }
class ProductoType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('nombre') ->add('descripcion', 'textarea') ->add('precio', 'money') ->add('foto', 'file', array('required' => false)) ; } // ... }
Estoy trabajando con Symfony 2.6.9.
Agradezco sus respuestas de antemano, gracias.
Respuestas
Lo que no me queda claro después de leer tu pregunta es cuál es exactamente el problema. ¿Te gustaría que el navegador impidiear enviar el formulario si introduces letras en el campo del precio? ¿Te gustaría ver otro mensaje de error?
@javiereguiluz
Gracias por responder y lamento si no supe explicarme bien, básicamente si en mi campo money ingreso letras sale la excepción "Warning: NumberFormatter::parse(): Number parsing failed". Agregué validaciones con @Assert\Regex
y @Assert\Type
y siempre me da la misma excepción.
@zenderizer
Pero entiendo que el error es correcto, porque estás introduciendo letras en un campo numérico y por tanto, se está produciendo el error que te indica el mensaje ("Ha fallado el procesamiento del número"). Como ves, y perdona mi torpeza, creo que sigo sin entender el problema.
@javiereguiluz
Si claro, pero entonces como puedo validar eso, para que solamente me deje ingresar datos válidos?
@zenderizer
La siguiente validación debería funcionarte en este caso:
class Producto { /** * @ORM\Column(type="decimal", scale=2) * @Assert\Type(type = "numeric", message = "Introduce un número válido para el precio.") * @Assert\Range(min = 0, message = "Introduce un precio mayor que cero.") */ protected $precio; // ... }
@javiereguiluz
Gracias por la respuesta pero me sigue saliendo el mismo tipo de excepción. De hecho intente también con @Assert\Regex( pattern="/^\d+\.?\d+$/")
pero tampoco me ha funcionado.
@zenderizer
Buscando más información sobre este problema he encontrado este issue del repositorio de Symfony. Al parecer, tus validaciones son seguramente correctas pero el problema es que no se llegan a ejecutar.
Antes de aplicar la validación, se comprueba si es un valor numérico en este método. Ahí puedes ver cómo se lanza el famoso error "Number parsing failed":
preg_match('/^([^0-9\-\.]{0,})(.*)/', $value, $matches); // Any string before the numeric value causes error in the parsing if (isset($matches[1]) && !empty($matches[1])) { IntlGlobals::setError(IntlGlobals::U_PARSE_ERROR, 'Number parsing failed'); // ... }
La solución que proponen es ocultar los errores de internacionalización de PHP poniendo la opción intl.error_level
a 0
o comentándola en el archivo php.ini
.
@javiereguiluz
Buenas, revisando el link de Javier, se puede constatar que el seteo del error_level del intl, es una de las recomendaciones de symfony cuando ejecutamos http://localhost/proyecto/web/config.php
.
Además ejecutando el comando php app/check.php
tambien aparece dicha recomendación :)
No se si en todas las versiones, pero en la 2.7 me ha funcionado.
Saludos!!!
@manuel_j555
Efectivamente, ejecuté el php app/check.php
y al parecer es una recomendación que pasé por alto. Gracias por hacerme ver la luz. Saludos.
@zenderizer