PHP - como integrar ajax en proyecto mvc?

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

como integrar ajax en proyecto mvc?

Publicado por jm (4 intervenciones) el 07/05/2019 23:46:11
Hola a todos, no hace mucho empece a aprender poo en php y estoy haciendo una tienda virtual utilizando el patrón mvc para practicar, la cosa es que quiero integrar ajax en mi código pero no se como hacerlo funcionar con mi código. Les dejo el código en cuestión:

.HTACCESS

1
2
3
4
5
6
7
8
9
10
<ifModule mod_rewrite.c>
#Activar Rewrite Engine
RewriteEngine on
ErrorDocument 404 http://localhost/tienda-poo/error/
 
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
 
RewriteRule ^(.*)/(.*) index.php?controller=$1&action=$2
</ifModule>


AUTOLOAD

1
2
3
4
5
6
7
<?php
 
function controller_autoload($classname){
	include 'controllers/' . $classname . '.php';
}
 
spl_autoload_register('controller_autoload');

CONTROLADOR FRONTAL O INDEX

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
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
session_start();
require_once 'autoload.php';
require_once 'config/db.php';
require_once 'config/parameters.php';
require_once 'helpers/Utils.php';
require_once 'views/layout/header.php';
 
function show_error(){
	$error = new ErrorController();
	$error->index();
}
 
if (isset($_GET['controller'])) {
	$nombre_controlador = $_GET['controller'].'Controller';
 
}elseif(!isset($_GET['controller']) && !isset($_GET['action'])){
	$nombre_controlador = controller_default;
 
}else{
	show_error();
	exit();
}
 
if (class_exists($nombre_controlador)) {
	$controlador = new $nombre_controlador();
 
	if (isset($_GET['action']) && method_exists($controlador, $_GET['action'])) {
		$action = $_GET['action'];
		$controlador->$action();
	}elseif(!isset($_GET['controller']) && !isset($_GET['action'])){
		$action_default = action_default;
		$controlador->$action_default();
	}else{
		show_error();
	}
}else{
	show_error();
}
 
require_once 'views/layout/footer.php';

Lo que estoy intentando hacer es crear un menú de filtros en el que el usuario pueda filtrar los productos por mas de un filtro si así quisiera, entonces estoy pensando en usar ajax para enviar una o mas variables a un controlador y que este las reciba por get y luego ejecute un método.
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 joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por joel (1269 intervenciones) el 08/05/2019 07:43:48
Hola Jm, exactamente a que te refieres con "no se como hacerlo funcionar con mi código"? no sabes como crear la función para utilizar peticiones AJAX?

si nos puedes dar mas detalle...

En tu código no muestras la vista, que entiendo que es ahí donde lo quieres utilizar, no?
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: 7
Ha aumentado su posición en 23 puestos en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por jm (4 intervenciones) el 09/05/2019 03:35:16
Hola joel, no se como crear correctamente la función o el script para enviar por ajax datos a un controlador y necesito enviarlos no a una vista si no a un controlador, como dije anteriormente. Para ser mas exactos necesito enviar los datos de este formulario:

FORM

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
29
30
31
32
33
34
35
36
<div>
	<form id="form-filter">
		<div class="form-wrapper">
			<div class="input-wrapper">
				<button class="navbar-button form-label" type="button" id="gender-btn">GENERO <span class="form-span"><i class="fas fa-caret-down"></span></i></button>
 
                <div class="gender-wrapper" id="gender">
                    <label class="label-wrapper" for="hombre">HOMBRE
                        <input class="checkbox" type="checkbox" name="id_genero" id="hombre" value="1">
                        <span class="checkmark"></span>
                    </label>
 
                    <label class="label-wrapper" for="mujer">MUJER
                        <input class="checkbox" type="checkbox" name="id_genero" id="mujer" value="2">
                        <span class="checkmark"></span>
                    </label>
                </div>
			</div>
 
			<div class="input-wrapper">
                <button class="navbar-button form-label" type="button" id="product-btn">TIPO DE PRODUCTO <span class="form-span"><i class="fas fa-caret-down"></span></i></button>
                <?php $categorias = Utils::showCategorias(); ?>
                <div class="product-wrapper" id="produc-category">
                    <?php while($cat = $categorias->fetch_object()): ?>
                    <label class="label-wrapper" for="<?=$cat->nombre?>"><?=$cat->nombre?>
                        <input class="checkbox" type="checkbox" name="id" id="<?=$cat->nombre?>" value="<?=$cat->id?>">
                        <span class="checkmark"></span>
                    </label>
                <?php endwhile; ?>
                </div>
        	</div>
        	<div class="submit-wrapper"><button class="filter-submit" id="btn-filtros">Filtrar</button>
            </div>
		</div>
	</form>
</div>


necesito que los reciba este controlador

CATEGORIACONTROLLER

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
require_once 'models/Categoria.php';
require_once 'models/Producto.php';
 
class CategoriaController{
 
	public function filtro(){
		if (isset($_GET['id']) && isset($_GET['id_genero'])) {
			$id = $_GET['id'];
			$id_genero = $_GET['id_genero'];
 
			$categoria = new Categoria();
			$categoria->setId($id);
 
			$genero = new Categoria();
			$genero->setId($id_genero);
 
			$categoria = $categoria->getOne();
			$genero = $genero->getOneGenre();
 
			//Conseguir productos
			$producto = new Producto();
			$producto->setCategoria_id($id);
			$producto->setGenero_id($id_genero);
 
			$productos = $producto->getAllCategoryAndGenre();
		}elseif (isset($_GET['id'])) {
			$id = $_GET['id'];
 
			//Conseguir categoria
			$categoria = new Categoria();
			$categoria->setId($id);
 
			$categoria = $categoria->getOne();
 
			//Conseguir productos
			$producto = new Producto();
			$producto->setCategoria_id($id);
 
			$productos = $producto->getAllCategory();
		}else{
			if (isset($_GET['id_genero'])) {
				$id_genero = $_GET['id_genero'];
 
				$genero = new Categoria();
				$genero->setId($id_genero);
 
				$genero = $genero->getOneGenre();
 
				$producto = new Producto();
				$producto->setGenero_id($id_genero);
 
				$productos = $producto->getAllGenre();
			}
		}
	require_once 'views/categoria/ver.php';
}
 
}

y luego lo que hace la vista es simplemente comprobar si existe el objeto categoria o genero y realizar un ciclo while a productos.

he intentado enviar el value de los checbox con javascript asi:

JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$('#filter-menu').submit(function(e){
	e.preventDefault();
 
	var url = window.location.href = 'categoria/filtro';
 
    var checkboxs = document.querySelectorAll('.checkbox:checked');
 
      checkboxs.forEach((checkbox, index) => {
        if (index == 0) {
          url += ('&' + checkbox.name + '=' + checkbox.value);
        } else {
          url += ('&' + checkbox.name + '=' + checkbox.value);
        }
      });
 
      console.log(url);
});

pero no funciono, estaba pensando en usar ajax pero no se como empezar, la razón por la que quiero usar ajax o js para enviar los valores de los inputs en vez de usar el submit del formulario es porque quiero concatenar mas de una variable sin sobrescribir la ulr, A lo que me refiero es que si el usuario filtra por una categoría la url debería quedar asi: http://localhost/tienda-poo/categoria/filtrar&primervariable=1 pero si añade otro filtro la url deberia quedar asi: http://localhost/tienda-poo/categoria/filtrar&primervarible=1&segundavariable=2.
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por Mauro (1036 intervenciones) el 09/05/2019 17:36:03
El cambio de la URL lo podrías lograr haciendo que el formulario utilice el método GET en lugar de POST.

Respecto de cómo lograr que el formulario llame al controlador, depende de cómo se mapeen las URLs de tu aplicación hacia métodos del controlador... ¿estás usando algún framework en particular?
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: 7
Ha aumentado su posición en 23 puestos en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por jm (4 intervenciones) el 09/05/2019 22:27:55
no estoy usando ningún framework, Mi .htaccess sobrescribe la url con dos parámetros, el primero seria el controlador si existe, si no carga el controlador por defecto que es ProductoController y el segundo parámetro el método de ese controlador si existe si no carga el método por defecto que es index. Si uso el js que puse antes logro que me redireccione a categoriaController/filtro pero no parece que le este llegando ningún valor.
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por Mauro (1036 intervenciones) el 09/05/2019 23:14:23
¿Por qué dices que no parece llegar nada? Podrías usar un var_dump sobre $_GET para ver qué llega o, mucho mejor, no usar var_dump :)
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: 7
Ha aumentado su posición en 23 puestos en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por jm (4 intervenciones) el 10/05/2019 00:03:07
la vista me carga el siguiente texto: NO EXISTE LA CATEGORIA , esto pasa cuando el método filtro de CategoriaController no se ejecuta, y ese método no se ejecuta cuando no le llega el dato necesario.
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

como integrar ajax en proyecto mvc?

Publicado por Mauro (1036 intervenciones) el 10/05/2019 15:34:07
Ok... Yo empezaría por examinar el contenido de $_GET en el archivo categoriaController para salir de la duda, si los datos no llegan el problema está antes, si llegan bien el problema está acá.

Hasta no saber eso es difícil corregir el error.
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

como integrar ajax en proyecto mvc?

Publicado por Oz (1 intervención) el 22/05/2022 20:20:16
Yo estuve hace un año teniendo la misma consulta y en verdad se vuelve un poco complicado encontrarle la solución, ya que si queremos respetar el patrón MVC, debes considerar que la función AJAX va a llamar en teoría a una página, la cual probablemente hará consultas a una Base de Datos, y en tu caso, al igual que el mío tenemos un .htaccess que es parte de routing de todo tu proyecto (sitio web). Entonces que hacer (es mi solución, seguramente hay más):
- Crear un file js que reciba todos los POST que haya en tu proyecto. Este contendrá una función que haga las llamadas POST usando XHR, que no es más que AJAX. https://stackoverflow.com/questions/30008114/how-do-i-promisify-native-xhr
- El resultado de esta función es la data que usarás en tu sitio.
- La data puede ser desde un simple mensaje informativo, "Se ha creado con éxito el usuario" a varios datos como por ejemplo para poblar los textboxes del formulario que se usa para editar un registro existente. Normalmente cuando son muchos datos, debes convertirlos a JSON.
- EL AJAX en mi caso, llama a un controlador para respetar el patrón MVC, el cual llama a mi clase Modelo, que es la que debe hacer las consultas a la BD. Una vez reciba respuesta de la BD, es mi controlador quien manda al AJAX la respuesta. Un mensaje informativo es simplemente un: echo "mensaje"; exit();

Ahora, como identificas cada POST. Yo lo hago haciendo un recorrido de los forms y dentro de ese bucle simplemente un Select Case (Switch) preguntando por el nombre del form. Esto también va en el mismo script js donde está el AJAX

Con el XHR de arriba, eliminas ese montón de AJAX que antes usábamos para cada llamada a un AJAX
$.ajax ({ bla bla bla});
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