Foros del Web » Programando para Internet » PHP » Symfony »

Enviar dato sin formulario, es posible ??

Estas en el tema de Enviar dato sin formulario, es posible ?? en el foro de Symfony en Foros del Web. Buen día. Como verán tengo tiempos de no crear un tema, y pues hoy me decidí a hacer este por razones que superan mis conocimientos. ...
  #1 (permalink)  
Antiguo 13/02/2018, 11:07
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Enviar dato sin formulario, es posible ??

Buen día.

Como verán tengo tiempos de no crear un tema, y pues hoy me decidí a hacer este por razones que superan mis conocimientos.

Historia: Hace ya unos meses unos consultores externos desarrollaron una aplicación en Symfony (SF) y se la han trasladado al departamento para su mantenimiento y modificación. Si tener conocimientos de este FW, y con un requerimiento "sencillo" sobre mi, me he dispuesto a encaminarme mas en SF.

Este curso, es el que estoy siguiendo, pero con un requerimiento urgente que hacer, no toca de otra que solicitar a los experto de su ayuda

Problema: En este sistema se pueden crear Solicitudes de Compra (OC) las cuales se ven así en su consulta.


Pero en el departamento de compras (UACI) necesitan colocarles a cada solicitud un numero de OC, ya que el sistema a futuro (Esto lo haré YO) generara sus propias OC a partir de cada solicitud. Pero por el momento no existe ese modulo.

Bien, tomando como base la vista inicial que les puse arriba, logre crear por medio de la Entity, los nuevos campos (numero de OC y Fecha y Hora en que se registro ese numero) para la tabla de Solicitudes. Hasta ahi bien.

Esta es mi vista


Me costo, pero hoy cada vez que hago clic en el botón, se guarda la fecha y hora del momento, ya despues solo ocultare las que ya tengan un numero de OC en el campo y listo, peeeeero, a pesar de que coloque el textbox de Num OC en la vista, no logro hacer que se guarde en la DB y esto a de ser porque no estoy usando formulario, sino que tratando de enviar desde una vista un campo y es ahi donde tengo lios

Me gustaría saber si es posible o como puedo hacer para meter ese "textbox" en la DB.

Código de la Vista
Código HTML:
Ver original
  1. {% extends 'plantilla.html.twig' %}
  2.  
  3. {% block title %}
  4.    Solicitudes sin OC
  5. {% endblock %}
  6.  
  7. {% block body %}
  8.     {{ include('default/menu.html.twig') }}
  9.     <div class="container">
  10.         <article class="tema col-xs-12 col-sm-12 col-md-12">
  11.             <h3 class="text-muted centrar">Listado de Solicitudes sin Orden de Compra</h3>
  12.         </article>
  13.     </div>
  14.     <div class="table-responsive">
  15.         <table class="table table-striped table-bordered table-hover">
  16.             <caption>Registros encontrados: <span id="total">{{ solicitudes.getTotalItemCount }}</span></caption>
  17.             <thead>
  18.                 <tr class="danger">
  19.                     <th class="hidden-xs centrar"></th>
  20.                     <th class="centrar">SOLICITUD</th>
  21.                     <th class="centrar">FECHA</th>
  22.                     <th class="centrar">CREADOR</th>
  23.                     <th class="centrar">MONTO</th>
  24.                     <th class="col-lg-2 centrar">NUMERO OC</th>
  25.                     <th class="centrar">GUARDAR</th>
  26.                 </tr>
  27.             </thead>
  28.             <tbody>
  29.                 {% if solicitudes is not empty %}
  30.                     {% for solicitud in solicitudes %}
  31.                         <tr data-id="{{ solicitud.id }}">
  32.                             <td class="hidden-xs centrar">{{ loop.index }}</td>
  33.                             <td class="centrar">{{ solicitud.id }}</td>
  34.                             <td class="centrar">{{ solicitud.fecha|date('d/m/Y') }}</td>
  35.                             <td class="centrar">{{ solicitud.usuario.usuario }}</td>
  36.                             <td class="centrar">${{ solicitud.total|number_format(2, '.', ',') }}</td>
  37.                             <td class="centrar">
  38.                                 <input type="text" class="input form-control controles" placeholder="N° OC" onkeyup="this.value=this.value.toUpperCase()" name="oc_numero" id="oc_numero" autofocus>
  39.                             </td>
  40.                             <td class="centrar">
  41.                                 <a title="APROBAR"
  42.                                class="btn btn-info active" href="{{ path('numerar_solicitud', {id: solicitud.id})  }}">
  43.                                     <i class="glyphicon glyphicon-ok"></i>
  44.                                 </a>
  45.                             </td>
  46.                         </tr>
  47.                     {% endfor %}
  48.             </tbody>
  49.                 {% else %}
  50.                     <tr>
  51.                         <td colspan="8">
  52.                             <center>
  53.                                 <img src="{{ asset('img/datos.png') }}" class="img-responsive" alt="SIN RESULTADOS">
  54.                             </center>
  55.                         </td>
  56.                     </tr>
  57.                 {% endif %}
  58.         </table>
  59.         <div class="navigation">
  60.             {{ knp_pagination_render(solicitudes) }}
  61.         </div>
  62.     </div>
  63. {% endblock %}

Código del Controller
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #2 (permalink)  
Antiguo 13/02/2018, 11:12
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Enviar dato sin formulario, es posible ??

No me dejo poner código PHP en el post original

Código del Controller
Código PHP:
Ver original
  1. // Numerar Solicitud con OC
  2.     /**
  3.      * @Route("/{id}/numerar_solicitud", name="numerar_solicitud")
  4.      */
  5.     public function numerarSolicitudAction(Request $request, $id) {
  6.         $securityContext = $this->container->get('security.authorization_checker');
  7.         if ($securityContext->isGranted('ROLE_NUM_OC')) {
  8.             $em = $this->getDoctrine()->getManager();
  9.  
  10.             // Debo buscar en la tabla Solicitud por el ID de Solicitud
  11.             $solicitud = $em->getRepository('AppBundle:Solicitud')
  12.                     ->findOneById($id);
  13.  
  14.             $oc = $request->request->get("oc_numero");
  15.             print($oc);
  16.  
  17.             // Fecha NOW()
  18.             $fecha = date('Y-m-d H:i:s');
  19.             // $seguimiento = $em->getRepository('AppBundle:Seguimiento')
  20.             //         ->findOneByidSolicitud($solicitud);
  21.             // $seguimiento->setPresidencia(new \DateTime($fecha));
  22.  
  23.             $solicitud->setFechaOrden(new \DateTime($fecha));
  24.  
  25.             // Obtener ID de usuario activo
  26.             $user = $this->getUser();
  27.             $usuario = $this->getDoctrine()
  28.                     ->getManager()
  29.                     ->getRepository('AppBundle:Usuario')
  30.                     ->findOneById($user->getId());
  31.             // Bitacora
  32.             $bitacora = new Bitacora();
  33.             $accion = 'Colocar Numero de OC a la Solicitud '.$solicitud->getId();
  34.             $bitacora->setUsuario($usuario);
  35.             $bitacora->setAccion($accion);
  36.  
  37.             $em->persist($solicitud);
  38.             $em->persist($bitacora);
  39.             $em->flush();
  40.  
  41.             return $this->redirectToRoute('numero_oc');
  42.         } else {
  43.             return $this->render('error/error403.html.twig');
  44.         }
  45.     }

Si se fijan en la vista, lo que no estoy mandando en el href del ancla es el parámetro del textbox, porque si lo colocaba 'oc': oc_numero como parametro pues me da error 500 y no carga nada ni da errores.

Ya en el controlador, en la linea 14 y 15, intento extraer el numero o dato que se ha mandado desde la vista, y por lo menos mostrarla en un echo para verla en la vista, pero a pesar que no me da errores (porque obvio no mando ese parámetro) no puedo pasar de ahí.

Espero haber explicado bien mi problema y sepan que ya estoy leyendo mucho de Symfony...
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.

Última edición por KATHYU; 13/02/2018 a las 11:18
  #3 (permalink)  
Antiguo 25/02/2018, 19:17
 
Fecha de Ingreso: octubre-2007
Mensajes: 267
Antigüedad: 11 años
Puntos: 4
Respuesta: Enviar dato sin formulario, es posible ??

No veo en la vista el boton (ancla) que te servira para llamar al controler, asumo que es un boton en cada fila de tu tabla. Bueno usando algo de ajax, con jquery para hacerlo mas sencillo, pudieras enviar el id del registro que quieres acualizar y el valor del campo de texto que se encuentra en la fila del registro.
El valor OC tene reglas muy específica como para desde ya te crees un script que los genere para cada solicitud que no lo tenga?!?

Última edición por X_fran; 25/02/2018 a las 19:28 Razón: Editandoooo, disculpa está claro. El botón o ancla es por cada fila.
  #4 (permalink)  
Antiguo 05/03/2018, 08:59
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Enviar dato sin formulario, es posible ??

Es el botón de "Guardar"

En el curso que estoy siguiendo, el crear el formulario me esta dando problemas, espero poder encontrar la solución pronto
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #5 (permalink)  
Antiguo 05/03/2018, 20:27
 
Fecha de Ingreso: octubre-2007
Mensajes: 267
Antigüedad: 11 años
Puntos: 4
Respuesta: Enviar dato sin formulario, es posible ??

Bueno yo lo haría de la siguiente manera, basándome en lo que tienes en tu plantilla twig. Este código iria al final de la plantilla, y se asume que usas jquery 3.*
Código:
{% block javascript %}
    {{ parent() }}
    <script type="text/javascript">
         $("table.table.table-striped.table-bordered.table-hover tbody").on('click', 'a.btn.btn-info.active', function(e){
             e.preventDefault();
             var anclaGuardar=$(this);
             var ocNumeroValor=$(anclaGuardar).parents('tr').find("#oc_numero").val();
             $.ajax({
                 type:'PUT',
                 url: $(anclaGuardar).attr('href'),
                 data: {'oc_numero': ocNumeroValor},
                 beforeSend: function(){
                     //indocarle al usuario de alguna manera el inicio de la peticion ajax
                 }
             }).done(function(data){
                 // el parametro data contiene la respuesta del controlador symfony, hacer algo con el parametro.
                 alert(data);
             }).fail(function(jqXHR){
                 //se ejecuta cuando la peticion falla
                 alert(jqXHR.responseText);
             });
         });
    </script>

{% endblock %}
Si emplearas jquery inferior a 3, cambiar las promesas done y fail por success y error como lo indica la documentacion de la funcion ajax de jquery.
Ademas, le agregaria una clase xxx a los vinculos que sirven como boton Guardar para que sea mas sencillo poder obtenerlos; asi como a la tabla tambien le pondria un id, con el mismo fin.
En el controlador obtendras los dos parametros desde el objeto $request, es decir el id del registro que forma parte del routing y el valor del campo detexto,enviado como parametro de la peticion ajax. Puedes tsmbien en el controlador veroficar que la peticion se haga via ajax, por el metodo PUT y verificar los permisos del usuario.

Tal vez tenga errores en los selectores, pero esa es la idea de la solución. Espero te sirva de punto de partida. No creo sea necesario tener un formulario para este caso puntual.

Última edición por X_fran; 05/03/2018 a las 20:33
  #6 (permalink)  
Antiguo 07/03/2018, 08:04
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Enviar dato sin formulario, es posible ??

Voy a probarlo...
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #7 (permalink)  
Antiguo 14/03/2018, 15:05
 
Fecha de Ingreso: octubre-2007
Mensajes: 267
Antigüedad: 11 años
Puntos: 4
Respuesta: Enviar dato sin formulario, es posible ??

El codigo anterior debe ejecutarse luego wue el DOM este listo, para ello se deberá ejecutar en el evento ready.
Se debe escribir el codigo javascript anterior dentro de
Código Javascript:
Ver original
  1. $(document).ready(function(){
  2.        // escribir codigo javascript anterior aquí
  3.     });
  #8 (permalink)  
Antiguo 22/03/2018, 13:44
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Enviar dato sin formulario, es posible ??

Algo que no sea JS o del lado de la vista si no del controlador ??

Ya voy avanzando en el curso pero no logro "leer" el contenido del textbox en el controlador, y ya dias estoy peleando con esto
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #9 (permalink)  
Antiguo 23/03/2018, 17:14
 
Fecha de Ingreso: octubre-2007
Mensajes: 267
Antigüedad: 11 años
Puntos: 4
Respuesta: Enviar dato sin formulario, es posible ??

Toda respuesta que se de seguirá la lógica de iniciar en la vista, porque el dato que quieres persistir está en una vista.

El contenido del textbox lo capturas mediante javascript, en este caso haciendo uso de jquery, y envias su valor junto con el id del registro vía AJAX a tu controlador symfony
En el controlador obtienes las variables a través del objeto $request:
Cita:
$id=$request->get('id');
$oc_numero=$request->get('oc_numero');
Recuerda q el id forma parte de la url del botón Guardar, y oc_numero se lo agregué yo como parte del parámetro data de la petición AJAX.

Como respuesta de tu controlador puedes devolver un mensaje informando la operación fue satisfactoria. Por supuesto despues de persistir el cambio en la base de datos.
return new Response("se actualizó satisfactoriamente el OC");

Última edición por X_fran; 26/03/2018 a las 19:05

Etiquetas: dato, formulario, posible
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 04:30.