checkbox con twit y api rest para más de una tabla

Tema en 'Soporte' iniciado por Carlos, el 27 Oct 2017.

  1. Carlos

    Carlos New Member

    Registrado:
    2 Oct 2017
    Mensajes:
    9
    Me Gusta recibidos:
    0
    Puntos de trofeo:
    1
    Género:
    Masculino
    Estimados amigos,
    tengo tres tablas, una tabla para regiones, otra para estados y otra tabla regiones_estados donde relaciono las regiones a las que pertenece un estado. En la sección de editar estado muestro una lista de las regiones disponibles para marcar el checkbox de cada región a las que pertenece el estado.

    Desde el modelo Estados mando por un lado todo de la tabla regiones y por otro, selecciono de la tabla regiones_estados las regiones a las que pertenece el estado:
    PHP:
    /**
    * Obtiene Todas las Regiones registradas
    *
    * @return false|array con información de la regiones
    */
    public function getAllRegiones() {
    return 
    $this->db->query_select("SELECT * FROM tregiones
    WHERE idPais=1
    ORDER BY ruta"
    );
    }

    /**
    * Obtiene las regiones a las que pertenece el estado
    *
    * @return false|array con información de las regiones_
    */
    public function getRegionesEstado() {
    return 
    $this->db->query_select("SELECT rn.id_tregiones, rn.region
    FROM (testados e INNER JOIN tregiones rn ON rn.idPais=e.idPais)
    INNER JOIN tregiones_estado rne
    ON rn.id_tregiones=rne.id_tregiones AND e.id_testados=rne.id_testados
    WHERE e.id_testados=
    $this->id
    ORDER BY rn.ruta"
    );
    }
    Con esto ya obtengo los dos arrays con la información que deseo obtener.

    Mi primer problema es cómo resolver con twig el mostrar una lista de regiones con checkbox y mostrar marcadas las he seleccionado previamente. Si lo hiciera con Smarty haría algo así:
    HTML:
    {html_checkboxes name='id_tregiones' output=$regiones values=$idRegiones selected=$idRegionesEstado separator='<br>'}
    
    ¿Cómo podría hacerlo con twig?

    Intenté esto, pero me salen dos columnas, una con la lista de casillas en blanco y otra con las casillas seleccionadas:
    HTML:
    {% for rn in rutasnac if false != rutasnac %}
          <div class="checkbox">
             <label>
              <input name="id_trutasnac" type="checkbox" id="id_trutasnac"> {{ rn.ruta }}
             {% for rne in rutasnac_estado if false != rutasnac_estado %}
               {% if rn.id_trutasnac == rne.id_trutasnac %}
               <input name="id_trutasnac" type="checkbox" id="id_trutasnac" checked='checked'> {{ rn.ruta }}
               {% endif %}
           {% endfor %}
           </label>
        </div>
    {% endfor %}
    
    Mi segundo problema es cómo lo voy a guardar usando el Api Rest, si con el .js generado para editar el estado, sólo guarda en la tabla estados y al mismo tiempo debo guardar en la tabla regiones_estado los id y de regiones y estados.

    Agradezco sus opiniones
     
  2. prinick

    prinick Ocrend Developer Miembro del Staff

    Registrado:
    28 Sep 2017
    Mensajes:
    48
    Me Gusta recibidos:
    6
    Puntos de trofeo:
    8
    Género:
    Masculino
    Profesión:
    Engineer
    País:
    venezuela
    Primer problema
    Te recomiendo que hagas esto, aunque no es la mejor manera pero estás obligado por la lógica que has usado:
    HTML:
    {% for rn in rutasnac if false != rutasnac %}
      <div class="checkbox">
        <label>
          {% for rne in rutasnac_estado if false != rutasnac_estado %}
            {# El primer error, es que estás repitiendo un id en un bucle, el id es único siempre #}
            <input name="id_trutasnac[]" type="checkbox" class="id_trutasnac" {{ rn.id_trutasnac == rne.id_trutasnac ? 'checked="checked"' : '' }}> {{ rn.ruta }}
          {% endfor %}
        </label>
      </div>
    {% endfor %}
    No termino de entender bien lo que necesitas hacer.

    Segundo problema
    A través del mismo endopint, modifica al método que es llamado para que guarde ambas cosas. No debes limitarte a lo que escribió el generador por ti, al final eso es código y es 100% editable.
     
  3. Carlos

    Carlos New Member

    Registrado:
    2 Oct 2017
    Mensajes:
    9
    Me Gusta recibidos:
    0
    Puntos de trofeo:
    1
    Género:
    Masculino
    Prinick, gracias por tu respuesta.

    Primer problema
    Lo que intento hacer es una lista de checkboxes, en la que debo poder seleccionar tantas opciones como estén disponibles o ninguna, para elegir la pertenencia de un estado a una región:

    listaCheckboxes.png

    Para lo cual tengo tres tablas, la de los estados (donde al editar cada estado abro esta lista de opciones), la tabla de las regiones y una tercera tabla regiones_estados donde relaciono las regiones al estado usando los id para la relación.

    Con relación a tu comentario de que "no es la mejor manera de lograrlo", podrías mostrarme cuál sería la mejor opción. La lógica es la que he usado cuando programo para Smarty y sin un framework. Pienso que sería mejor hacerlo de la forma correcta.

    La implementación de tu sugerencia
    Por otro lado, implementé tu sugerencia y lo que obtengo es lo siguiente:
    Captura de pantalla 2017-10-29 a la(s) 11.55.37.png
    Y cuando un estado previamente no tiene registro de regiones, no aparece ninguna lista para seleccionar opciones de regiones. Sólo aparece el espacio en blanco, es por esa razón que el código que envié en mi primer post está hecho así, porque de esa manera obtengo una lista de opciones en "blanco" o sin selección previa.

    Quedo al pendiente de tus sugerencias.
     
  4. prinick

    prinick Ocrend Developer Miembro del Staff

    Registrado:
    28 Sep 2017
    Mensajes:
    48
    Me Gusta recibidos:
    6
    Puntos de trofeo:
    8
    Género:
    Masculino
    Profesión:
    Engineer
    País:
    venezuela
    Tu relación es entonces N a N con estados y regiones, y regiones_estados es la entidad débil que las conecta? Tus estados estarán dentro de regiones o es al revés?

    En tu lógica tienes algo como: estados/editar/ID
    Y dentro de ello quieres mostrar todas las regiones que existen en el sistema, pero marcadas a las cuales pertenece dicho estado?

    Si es exactamente eso dime, para hacerte una pequeña forma de lograrlo bien.
     
  5. Carlos

    Carlos New Member

    Registrado:
    2 Oct 2017
    Mensajes:
    9
    Me Gusta recibidos:
    0
    Puntos de trofeo:
    1
    Género:
    Masculino
    Así es Prinick, la tabla regiones_estados es la que conecta. Un estado puede pertenecer a una, a varias o a ninguna región. Una región puede contener uno o varios estados. En la tabla regiones_estados tengo solo dos columnas, id_regiones e id_estados, que son las que llamo cuando quiero saber a que regiones pertenece cada estado (al menos así es la forma en que lo hago usando Smarty {html_checkboxes}).

    Sí, donde edito el estado es en: estados/editar/ID

    Justo en esta ruta es donde quiero mostrar todas las regions que existen para elegir la pertenencia del estado a la región. Luego, cada vez que acceda a esta url (estados/editar/ID) debo poder ver la lista de todas las regiones y únicamente marcadas a las que pertenece o ninguna marcada si es que no pertenece a ninguna.

    Nuevamente gracias por tu apoyo.
    Saludos!
     
  6. prinick

    prinick Ocrend Developer Miembro del Staff

    Registrado:
    28 Sep 2017
    Mensajes:
    48
    Me Gusta recibidos:
    6
    Puntos de trofeo:
    8
    Género:
    Masculino
    Profesión:
    Engineer
    País:
    venezuela
    Perdón por la demora, pero estábamos migrando todo a unos servidores nuevos.

    En tu modelo, vas a tener estos dos métodos:
    PHP:
    /**
    * Obtiene todas las regiones de un estado
    *
    * Se hace suposición de que la tabla 'regiones' tiene un id_region.
    *
    * @param int $id_estado : Id del estado
    * @param array $regiones: TODAS las regiones
    *
    * @return array con las regiones
    */
    private function getRegionesEstados(int $id_estado, array $regiones) : array {
        
    # Obtenemos las regiones pertenecientes al estado
        
    $regiones_del_estado $this->db->select('*','regiones_estados',"id_estados='$id_estado'");
        if(
    false != $regiones_del_estado) {
            
    # Llenamos un auxiliar con las regiones
            
    $checkeds = array();
            foreach(
    $regiones_del_estado as $region) {
                
    $checkeds[$region['id_region']] = true;
            }

            
    # Ahora asignamos un nuevo elemento al arreglo de región sólamete para las que pertenecen al estado
            
    foreach($regiones as $key => $region) {
                if(
    array_key_exists($region['id_region'],$checkeds)) {
                    
    $regiones[$key]['checked'] = true;
                }
            }
        }

        return 
    $regiones;
    }

    /**
    * Obtiene todas las regiones y trae marcadas las regiones de un estado.
    *
    * @return false|array
    */
    public function getRegiones() {
        
    # Obtener primero todas las regiones
        
    $regiones $this->db->select('*','regiones');
        if(
    false === $regiones) {
            return 
    false;
        }

        
    # Ahora fusiono todas las regiones, con las regiones que ya tiene el estado
        
    return $this->getRegionesEstados($this->id$regiones);
    }
    En el controlador donde renderizas la vista de la edición vas a meter
    PHP:
    $this->template('...', array(
        
    # ...
        
    'regiones' => $modelo->getRegiones()
    ))
    En la vista
    HTML:
    {% for r in regiones %}
        <div class="checkbox">
            <label>
                <input name="id_trutasnac[]" type="checkbox" class="id_trutasnac" {% if r.checked is defined %}checked{% endif %} /> {{ r.ruta }}
            </label>
        </div>
    {% endfor %}
    No lo he testeado, pero la lógica comentada creo que se entiende y es más o menos lo que deberías hacer.
     
    Última edición: 3 Nov 2017
  7. Carlos

    Carlos New Member

    Registrado:
    2 Oct 2017
    Mensajes:
    9
    Me Gusta recibidos:
    0
    Puntos de trofeo:
    1
    Género:
    Masculino
    Prinick, no te preocupes por el tiempo, avancé en otras cosas por lo pronto y ya estoy implementando tu sugerencia.

    1.- Error
    Aun no corre, me topé con este error:

    HTML:
    (1/1) FatalThrowableError
    Parse error: syntax error, unexpected '(', expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$'
    
    El error se refiere al return del método de getRegiones():

    PHP:
    /**
    * Obtiene todas las regiones y trae marcadas las regiones de un estado.
    *
    * @return false|array
    */
    public function getRegiones() {
        
    # Obtener primero todas las regiones
        
    $regiones $this->db->select('*','regiones');
        if(
    false === $regiones) {
            return 
    false;
        }

        
    # Ahora fusiono todas las regiones, con las regiones que ya tiene el estado
        
    return $this->($this->id$regiones);
    }
    2.- Duda
    En el primer método, el de getRegionesEstados(int $id_estado, array $regiones) : array { ... } ya tengo el $this->id del modelo Estados, que me pone , podría usar ese en lugar de el ...int $id_estado...?
     
  8. prinick

    prinick Ocrend Developer Miembro del Staff

    Registrado:
    28 Sep 2017
    Mensajes:
    48
    Me Gusta recibidos:
    6
    Puntos de trofeo:
    8
    Género:
    Masculino
    Profesión:
    Engineer
    País:
    venezuela
    Ese return, revisa de nuevo el post que lo edité, se me paso ponerlo. Con lo que edite, queda contestada la duda 2.

    Me avisas que tal va, lo estoy programando a ciegas básicamente.

    Saludos
     
  9. Carlos

    Carlos New Member

    Registrado:
    2 Oct 2017
    Mensajes:
    9
    Me Gusta recibidos:
    0
    Puntos de trofeo:
    1
    Género:
    Masculino
    ¡Listo Prinick! Resuelto el Primer problema, ahora me muestra el listado de checkboxes como se requiere. Ya hice pruebas modificando manualmente la tabla regiones_estados y muestra correctamente tanto los vacíos como los marcados.

    Ahora voy a trabajar con el Segundo problema, el de guardar en la base de datos lo que marco y desmarco de los checkboxes en la segunda tabla regiones_estados. ¿Alguna idea?
     
  10. prinick

    prinick Ocrend Developer Miembro del Staff

    Registrado:
    28 Sep 2017
    Mensajes:
    48
    Me Gusta recibidos:
    6
    Puntos de trofeo:
    8
    Género:
    Masculino
    Profesión:
    Engineer
    País:
    venezuela
    Pues en el HTML tienes un name="id_trutasnac[]" son todos checkbox, desde el php cuando atrapes $http->request->get('id_trutasnac') vas a tener un arreglo con sólamente las regiones que están marcadas, si no marcan ninguna obtendrás un null así que cuidado con eso.
     
  11. Carlos

    Carlos New Member

    Registrado:
    2 Oct 2017
    Mensajes:
    9
    Me Gusta recibidos:
    0
    Puntos de trofeo:
    1
    Género:
    Masculino
    Gracias prinick, voy a intentar hacerlo y comparto la solución (o pido ayuda si me atoro).
    Saludos!
     

Compartir esta página