[Pregunta]: ¿Alguna idea de como podría realizar esto?

Iniciado por Leguim, 11 Agosto 2019, 03:14 AM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Buenas noches, tengo un problema y es que no puedo entender como podría solucionar el siguiente problema.

Para ponerlos en contexto primero quisiera explicar el sistema, vendría siendo un procedimiento por el cual al cargar la pagina se muestran 5 registros y dependiendo si existen mas de 5 registros se habilitará un botón el cual cuando se presione ejecutará una función JS (Ajax) que llamará a un archivo .php

El sistema funciona perfecto o mejor dicho casi perfecto, ya que lo único que me falta para que quede totalmente terminado es lo siguiente:

En el archivo .php pre-cargado
Código (php) [Seleccionar]

if($cantidad_total >= 6) // Cantidad total se refiere a la cantidad total de registros encontrados
{
     ?>
     <script type="text/javascript">
     // habilita o crea la función que al dar click en X botón mostrará más registros
     $(".boton_mas_resultados").click(function()
     {
    var cantidad_vista = document.querySelectorAll('.box_resultado_busqueda').length;

    More_Results_Registros(cantidad_vista, <?php echo($cantidad_total); ?>);
});
     </script>
     <?php
}


Ahora en el archivo ajax.js donde está la función more results
Código (javascript) [Seleccionar]

function More_Results_Registros(cantidad_vista, cantidad_total)
{
    var cant_actual = cantidad_total- cantidad_vista;

    if(cantidad_actual >= 1) // Si quedan registros disponibles para mostrar al menos 1
    {
           document.body.style.cursor = "progress";
    }

    $.ajax({
          url: 'ajax/elficheroajax.php',
  type: 'POST',
  dataType: 'html',
  data: {cantidad_vista, cantidad_total},

  success: function() {
document.body.style.cursor = "default";
  }
      })

      .done(function(anuncios)
      {
      if(cantidad_actual >= 1)
      {
$('.mostrador').html(anuncios);
      }
})
}


Básicamente lo que hace este código es que si no hay ningún registro disponible para mostrar en una próxima tanda no va a ejecutar ni a llamar ningún fichero ya que es algo totalmente innecesario.

El problema radica que necesito que esa cantidad_total va a ser actualizada por lo que no puedo usar siempre el mismo <script> que llama a la función more que es cuando se da click a dicho botón.

Mi idea era agregar un nuevo fragmento de código <script> en el fichero ajax que llamamos desde ajax.js
re-actualizando o recreando el script, nosé bien si este seria un metodo optimo para hacerlo.

Gracias

@XSStringManolo

Hola Miguel, siempre andas con cosas chulas jajaja.

Esta linea
if($cantidad_total >= 6)
La puedes cambiar por
if($cantidad_total > 5)
Es resultado es el mismo, te ahorras un caracter de código y diria que evitas una comprobación ya que creo que el >= hace lo siguiente:
if($cantidad_total > 6 || $cantidad_total = 6)
Lo mismo con cantidad_actual >=1

No entiendo lo comentado en esta frase:
CitarEl problema radica que necesito que esa cantidad_total va a ser actualizada por lo que no puedo usar siempre el mismo script que llama a la función more que es cuando se da click a dicho botón.
Cual es el motivo de que no puedes usar el mismo script que llama a more()?

Si entiendo lo que intentas hacer...

Quieres mostrar por ejemplo 5 links "gratis" y que si el usuario carga 1 link más, que se le adjunte un anuncio.
Lo que no entiendo es que quieres hacer a partir de ahí. Mostrar un anuncio por cada link cargado?

Podrías replanteàrtelo a la inversa.
Carga siempre 1 anuncio por link. Menos cuando el usuario solo tenga menos de 6 registros.

Igual no es lo que pides. Si explicas el objetivo que intentas conseguir através del código te comento como modificaría tu codigo para hacerlo.

MinusFour

No entiendo, si le vas a preguntar de nuevo al servidor por la cantidad total de registros (porque es la única forma de hacerlo) para que hacer todo esto. Mejor decirle al usuario que si te llega una respuesta vacía, es que no hay más datos para mostrar ahora. Vaya que si le tienes que preguntar al servidor, no te queda de otra que hacer una petición de si o si.

Leguim

#3
Gracias a los dos por responder!

No me di a entender bien, disculpen. Básicamente es ir cargando datos, yo de entrada muestro 5 datos y al hacer click en x botón mostrará más datos y así sucesivamente hasta completar todos los registros disponibles. Es interesante el sistema que dijiste de ir mostrando un anuncio por cada tanda de datos que se muestra pero no era lo que quería. Me explique muy mal seguramente..

Imaginemos que para el momento en que la pagina ya fue cargada yo ya tengo 5 registros mostrados... okay... y en total hay 25 registros pero sólo mostrara 5 registros de entrada... ahora como hay más de 5 registros ($cantidad_total >= 6) mostrará el botón para cargar más.. voy a aplicar lo de cambiar >= por > gracias por tu consejo!

Pero ahora imaginemos que antes de haber presionado el botón de cargar más, se borraron algunos registros nose.. 7 registros se borraron... como ya se pueden estar imaginando para cuando yo use la función que esta en ajax.. usará la cantidad total de anuncios que fue cargada anteriormente es decir usará $cantidad_total = 25 un dato que es falso ya que se habían borrado 7 registros por lo que el dato real es $cantidad_total = 18

Ya creo haber encontrado la solución a esto y quería compartirla con ustedes, para saber que les parece y por si a alguien alguna vez le hace falta.

En el ficheroajax.php se debe poner el <script> renovado
Código (javascript) [Seleccionar]

$(".boton").click(function()
{
var dato = 1;
alert(dato);
});

$('.boton').unbind('click');
$(".boton").click(function()
{
var dato = 2;
alert(dato);
});


Les voy a explicar el código el primer fragmento mostrado vendría a ser el script que ya esta en la pagina cargada (no se debería poner en el ficheroajax.php
Después donde dice $('.boton').unbind('click'); sirve para eliminar un script o un evento mejor dicho entonces eliminamos ese evento y lo creamos nuevamente pero con datos actualizados... basicamente eliminas el evento desde ficheroajax.php y volves a preguntar u obtener datos actualizados copiando y pegando el script donde se llama a more_results ...

Si tu evento es un "scroll" se puede eliminar así

Código (javascript) [Seleccionar]

$(document).unbind('scroll'); // document puede cambiarse si el scroll se realiza en un div, en ese caso pondrías el id o la clase del div que tiene el scroll pero si el scroll se realiza en el body se deja así..


Estos códigos ya los probé y funcionan correctamente.
Si me quieren dar su opinión estoy abierto a criticas, y si alguien necesitó de este código pero todavía no termino de entender me puede preguntar y voy a tratar de explicarlo mejor.

MinusFour

#4
Pero todo esto es porque te quieres evitar hacer una petición extra al llegar al final de los resultados. De que te sirve esto, si como quiera tienes que preguntarle al servidor si tienes nuevos resultados. Porque no mejor decirle al usuario que recibiste una respuesta vacía del servidor, indicando que ya no tienes nada más que mostrar.

Leguim

#5
hola!

La petición la hago en > el ficheroajax.php

al inicio del fichero pregunto la cantidad total.

Pagina cargada -> realiza una consulta preguntando $cantidad_total
Ajax.js -> Hago una operación cantidad_disponible = cantidad_total - cantidad_vista;
Si la cantidad disponible > 0 se va a permitir usar dicha función .js

Es este el control:
Código (javascript) [Seleccionar]

function More(cantidad_total, cantidad_vista)
{
  var cantidad_disponible = cantidad_total - cantidad_vista;

  if(cantidad_disponible > 0)
  {
document.body.style.cursor = "progress";
  }

  $.ajax({
       url: 'ajax/ficheroajax.php',
type: 'POST',
dataType: 'html',
data: {cantidad_vista},

success: function() {
      document.body.style.cursor = "default";
}
   })

   .done(function(resultados)
   {
  if(cantidad_disponible > 0)
    {
$('.mostrador).html(resultados);
  }
   })
}


ficheroajax.php -> vuelve a realizar una consulta preguntando $cantidad_total, y hace lo que dije antes elimina el evento click y crea uno nuevo con la cantidad total actualizada que pregunte en este mismo fichero (ficheroajax.php)

Entonces siempre va a estar trabajando con datos actualizados realmente.