PHP - ¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

 
Vista:
sin imagen de perfil
Val: 22
Ha aumentado su posición en 2 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por Felipe (12 intervenciones) el 02/10/2019 20:02:07
Tengo un problema al querer realizar una petición AJAX para anidar un SELECT en un formulario especifico, estoy utilizando PHP MVC creado desde cero (me base en un curso) y en mi index.php cargo mis controladores con sus respectivos métodos(actions), resulta que al ejecutar mi función AJAX, esta me muestra la información en el index, y no mantiene la vista en la cual la ejecuto.

Aquí dejo mi AJAX:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$(document).ready(function(){
        $('#idRegion').change(function(){
            $('#idRegion option:selected').each(function(){
                id_region = $(this).val();
                $.ajax({
                    type: 'POST',
                    url: '<?=base_url?>sitio/obtenerProvincias',
                    data: {id_region: id_region},
                    dataType: 'json',
                    success: function(data){
                        $('#idProvincia').html(data.html);
                    }
                    }
                });
            });
        });
    });

PHP SitioController:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function obtenerProvincias(){
 
    $id_region = $_POST['id_region'];
 
    $provincia = new Provincia();
    $provincia->setIdRegion($id_region);
    $provincias = $provincia->getAllByRegion();
 
    $html = "<option value='0'>Seleccionar Provincia</option>";
 
    while($pro = $provincias->fetchObject()){
        $html .= "<option value='".$pro->tb_idProvincia."'>".$pro->nombre."</option>";
    }
 
    echo json_encode($html);
}

PD: He ocupado autoload para cargar mis controladores y mi archivo .htaccess lo tengo configurado asi:

HTACCESS:

1
2
3
4
5
6
7
8
9
10
11
<IfModule mod_rewrite.c>
 
RewriteEngine on
ErrorDocument 404 http://URL/MIPROYECTO/error/
 
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
 
RewriteRule ^(.*)/(.*) index.php?controller=$1&action=$2
 
</IfModule>

De antemano agradezco cualquier información y ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de John
Val: 91
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por John (33 intervenciones) el 04/10/2019 19:40:11
Hola amigo, en el url de ajax, pon la ruta hasta la carpeta del controlador, no instancies el controlador en la vista.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public function obtenerProvincias(){
 
    $id_region = $_POST['id_region'];
 
    $provincia = new Provincia();
    $provincia->setIdRegion($id_region);
    $provincias = $provincia->getAllByRegion();
 
    $html = "<option value='0'>Seleccionar Provincia</option>";
 
    while($pro = $provincias->fetchObject()){
        $html .= "<option value='".$pro->tb_idProvincia."'>".$pro->nombre."</option>";
    }
 
   // Usar return en vez de echo en esta parte
    return json_encode($html);
}
 
// Aqui agregale esta parte donde va a recibir el id de la región
 
if(isset($_POST['id_region'])){
       echo obtenerProvincias($_POST['id_region']);
}

y aqui coloca la ruta del controlador y el nombre del archivo, asi como los demás detalles que le quite, pruebalo y me comentas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$(document).ready(function(){
    $('#idRegion').change(function(){
        $('#idRegion option:selected').each(function(){
            id_region = $(this).val();
            $.ajax({
                type: 'POST',
                url: '../controlador/obtenerProvincias.php',
                data: {id_region: id_region},
                success: function(data){
                    $('#idProvincia').html(data);
                }
                }
            });
        });
    });
});
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 22
Ha aumentado su posición en 2 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por Felipe (12 intervenciones) el 04/10/2019 20:48:08
Hola, gracias por tu respuesta :D
No puedo implementar tu código debido a que mis controladores los defino así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
require_once 'models/provincia.php';
 
class sitioController{
 
    public function obtenerProvincias(){
 
        if(isset($_POST)){
            $id_region = $_POST['id_region'];
 
            $provincia = new Provincia();
            $provincia->setIdRegion($id_region);
            $provincias = $provincia->getAllByRegion();
 
            $html = "<option value='0'>Seleccionar Provincia</option>";
 
            while($pro = $provincias->fetchObject()){
                $html .= "<option value='".$pro->tb_idProvincia."'>".$pro->nombre."</option>";
            }
 
            return json_encode($html);
        }
    }
}

No puedo agregar este trozo de código debido a que la clase espera funciones y no condiciones...

1
2
3
if(isset($_POST['id_region'])){
       echo obtenerProvincias($_POST['id_region']);
}

Además, no puedo llamar a una URL como la siguiente '../controlador/obtenerProvincias.php' debido a que estoy trabajando con autoload, por ende, mis URL se conforman así: miproyecto/controller/action
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de John
Val: 91
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por John (33 intervenciones) el 04/10/2019 23:04:00
En este caso
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class sitioController{
 
    public function obtenerProvincias(){
 
        if(isset($_POST)){
            $id_region = $_POST['id_region'];
 
            $provincia = new Provincia();
            $provincia->setIdRegion($id_region);
            $provincias = $provincia->getAllByRegion();
 
            $html = "<option value='0'>Seleccionar Provincia</option>";
 
            while($pro = $provincias->fetchObject()){
                $html .= "<option value='".$pro->tb_idProvincia."'>".$pro->nombre."</option>";
            }
 
            return json_encode($html);
        }
    }
}

tendrias que poner el if justo debajo de donde cierra la llave de tu clase, algo asi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class sitioController{
 
    // No olvides pasar el parametro del id_region a la función
    public function obtenerProvincias($id_region){
 
        if(isset($_POST)){
            $id_region = $_POST['id_region'];
 
            $provincia = new Provincia();
            $provincia->setIdRegion($id_region);
            $provincias = $provincia->getAllByRegion();
 
            $html = "<option value='0'>Seleccionar Provincia</option>";
 
            while($pro = $provincias->fetchObject()){
                $html .= "<option value='".$pro->tb_idProvincia."'>".$pro->nombre."</option>";
            }
 
            return json_encode($html);
        }
    }
}
 
if(isset($_POST['id_region'])){
 
       echo sitioController::obtenerProvincias($_POST['id_region']);
 
}

entiendo que estas usando autoload, en mi ejemplo yo extenderia la clase sitioController con la clase Provincia, quedando algo asi mas o menos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class sitioController extends Provincia{
 
  public function obtenerProvincias(){
 
      // claro esta demás decir que aqui se reciben los datos del modelo y alla mismo le hiciste fetchAll
 
      $datos = Provincia::setIdRegion($id_region);
 
      $html = "<option value='0'>Seleccionar Provincia</option>";
 
      foreach($datos as $provincia){
 
         $html .= "<option value='".$provincia[0]."'>".$provincia[1]."</option>";
 
      }
 
         return json_encode($html);
 
  }
 
 
}
 
if(isset($_POST['id_region'])){
 
       echo sitioController::obtenerProvincias($_POST['id_region']);
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 22
Ha aumentado su posición en 2 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por Felipe (12 intervenciones) el 07/10/2019 16:04:53
He probado el código y me sigue mostrando la información como en un principio...


combo

Donde se despliega la información es la vista index donde muestro mis controladores con sus respectivos actions.

Alguna otra idea de como cargar el select ? alguna forma de hacerlo sin ajax ?

Gracias de todas formas :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de John
Val: 91
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por John (33 intervenciones) el 10/10/2019 14:43:51
Hola, perdón por la tardanza.

quisiera poder ayudarte mejor, si tienes github para ver tu proyecto y aportarte la solución que requieres, seria genial.

Si quieres buscar otra manera de mostrar el select con los datos, puedes instanciar al controlador directamente desde la vista. (Bueno no siempre, pero en este caso si).

1
2
require_once './controllers/ajaxController.php';
$selects = new ajaxController();

Y cargar los datos directamente en el select, de esta forma lo uso yo.

1
2
3
<select class="custom-select" name="tipo" id="tipo">
       <?= $selects->select_tipo_controller(); ?>
</select>

Controlador

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ajaxController extends ajaxModel{
 
          function select_tipo_controller(){
 
        		$datos = ajaxModel::select_tipo_model();
 
       		     $html = "<option value=''>Tipo</option>";
 
        		foreach ($datos as $value){
 
            			$html.="<option value='$value[id_tipo]'>".$value['tipo']."</option>";
 
        		}
 
        		return $html;
           }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 22
Ha aumentado su posición en 2 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo implementar AJAX en MVC con URL/controller/action?

Publicado por Felipe (12 intervenciones) el 10/10/2019 19:17:38
Hola John, al final termine implementando algo parecido a lo tuyo, cree las funciones que devuelven un JSON en otro directorio y simplemente en la url del AJAX llamo a esos archivos. Era más sencillo de lo que pensaba, pero creo que no es la mejor forma al momento de trabajar con MVC.

Gracias por tu ayuda :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar