entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

respuesta de AJAX me duplica header y footer

hola que tal,

estoy creando una tienda online usando POO en PHP, pero tengo un problema cuando integro ajax y es que como dice el titulo de la pregunta, cuando me llega la respuesta al elemento designado(#stock), me duplica el header y el footer junto con la respuesta. Mi teoría es que el problema ocurre cuando el controlador frontal carga la vista, ya que aparte de cargar la vista el controlador también hace un require_once de el header y el footer y supongo que cuando ajax devuelve la repuesta al elemento designado se vuelve a cargar el header y el footer.

CONTROLADOR FRONTAL

<?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';

VISTA VER.PHP

<?php if(isset($product)): ?>

    <div class="container">
        <div class="slideshow-wrapper">

        <div class="slider-wrapper">
            <div class="inner-wrapper">
                <div class="slide">
                    <?php if($product->imagen != NULL): ?>
                        <img class="slider-image" src="<?=base_url?>uploads/images/<?=$product->imagen?>">
                    <?php else: ?>
                        <img class="slider-image" src="<?=base_url?>assets/img/sin_imagen.png">
                    <?php endif; ?>
                </div>
                <div class="slide">
                    <?php if($product->imagen != NULL): ?>
                        <img class="slider-image" src="<?=base_url?>uploads/images/<?=$product->imagen2?>">
                    <?php else: ?>
                        <img class="slider-image" src="<?=base_url?>assets/img/sin_imagen.png">
                    <?php endif; ?>
                </div>
                <div class="slide">
                    <?php if($product->imagen != NULL): ?>
                        <img class="slider-image" src="<?=base_url?>uploads/images/<?=$product->imagen3?>">
                    <?php else: ?>
                        <img class="slider-image" src="<?=base_url?>assets/img/sin_imagen.png">
                    <?php endif; ?>
                </div>              
            </div>

            <div class="left">
                <span class="fas fa-angle-left"></span>
            </div>

            <div class="right">
                <span class="fas fa-angle-right"></span>
            </div>
        </div>

        <div class="data">
            <h1><?=$product->nombre?></h1>
            <p class="price-product">$<?=$product->precio?></p>
            <?php if (!isset($oferta)) : ?>
                <h3>NO APLICA DESCUENTO</h3>
                <p>Sobre este articulo no se podra aplicar ninguno descuento.</p>
            <?php endif; ?>
            <form class="form-tallas">
                <div id="colour-selection" class="product-variation">
                <?php $color = Utils::productoColores(); ?>
                <?php while($col = $color->fetch_object()): ?>
                <label for="<?=$col->color?>">
                    <?php if ($col->color == "3" && $product->color == "3") : ?>
                    <input type="radio" class="radio" id="<?=$col->color?>" name="id_color" value="<?=$product->id?>" checked>
                    <div class="front-end box">
                    <span>gr</span>
                    </div>
                    <?php elseif ($col->color == "3") : ?>
                    <input type="radio" class="radio" id="<?=$col->color?>" name="id_color" value="<?=$product->id?>">
                    <div class="front-end box">
                    <span>gr</span>
                    </div>
                    <?php endif; ?>

                    <?php if ($col->color == "4" && $product->color == "4") : ?>
                    <input type="radio" class="radio" id="<?=$col->color?>" name="id_color" value="<?=$product->id?>" checked>
                    <div class="front-end box">
                    <span>bl</span>
                    </div>
                    <?php elseif ($col->color == "4") : ?>
                    <input type="radio" class="radio" id="<?=$col->color?>" name="id_color" value="<?=$product->id?>" checked>
                    <div class="front-end box">
                    <span>bl</span>
                    </div>
                    <?php endif; ?>
                </label>
                <?php endwhile; ?>  
                </div>

                <div id="size-selection" class="product-variation">
                <?php $talla = Utils::productoTallas(); ?>
                <?php while($ta = $talla->fetch_object()): ?>
                <label for="<?=$ta->talla_id?>">    
                    <input type="radio" class="radio" id="<?=$ta->talla_id?>" name="id_talla" value="<?=$product->id?>">
                    <div class="front-end box">
                    <span><?=$ta->tallanombre?></span>
                    </div>
                </label>
                <?php endwhile; ?>
                </div> 
            </form> 

            <p>Selecciona una talla para comprobar si esta disponible.</p>
            <?php if (isset($_POST['id_talla'])) : ?>
                <p>existe talla.</p>
            <?php endif; ?> 
            <div id="stock"></div>
            <button class="btn btn-dark add-button" id="submit">SELECCIONA UNA TALLA</button>
        </div>

        </div>

        <p class="description"><?=$product->descripcion?></p>

    </div>

<?php else: ?>
    <h1>El producto no existe</h1>  
<?php endif; ?> 

AJAX

$('#size-selection .radio').unbind('click').click(function(){
    var url = 'http://localhost/tienda-poo/';
    var id = $(this).val();
    var id_size = $(this).attr("id");

    $.ajax({
        url: url+'/categoria/'+'/comprobarTalla',
        type:'POST',
        data:{id:id, id_talla:id_size},
        success:function(data){

            $("#stock").empty().html(data);
        }
    });
});

1 Respuesta

1voto

mchojrin Puntos2630

Diría que tu teoría es correcta. Lo que te sugiero que hagas es diferenciar las peticiones con Ajax de las "comunes".

Para eso puedes usar un código como

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')

No es 100% fiable (Es decir, un cliente malintencionado podría inyectar esa información) pero pienso que a los efectos de tu problema debería andar bien

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta