Autor Tema: ordenar por los mas votados módulo zoo joomla modificar código  (Leído 36108 veces)

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #20 en: 13 de Abril 2013, 19:26 »
Pues bien toddas esas son las tablas de joomla y las de zoo que he encontrado... y esta es el select del codigo...

Código: [Seleccionar]
      require_once JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php';
      $db =& JFactory::getDBO();
      $query = "SELECT cc.title AS category, a.id, a.title, DATE_FORMAT(a.created,'%d.%m.%Y') as created,
u.username, a.hits, cc.id as catid, format((r.rating_sum / r.rating_count), 2) as averagerating

      FROM #__content AS a

      LEFT JOIN #__categories AS cc ON a.catid = cc.id

      LEFT JOIN #__users AS u ON u.id = a.created_by

      LEFT JOIN #__content_rating as r ON a.id = r.content_id

      WHERE r.rating_count is not null";

Te pongo esto por que me hago un poco de lio con los alias... y me dificulta saber relaionar las tblas que realmente puedan ser...

Un saludo

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #21 en: 15 de Abril 2013, 09:51 »
Tabla prefijo_conteng_rating: contiene 4 campos que son content_id (tipo entero), rating_sum (tipo entero), rating_count (tipo entero) y lastip (tipo varchar de 50 caracteres).

Tabla prefijo_content: contiene numerosos campos como id, introtext, fulltext, etc.

El campo content_id en principio relaciona con el campo id de la tabla content

En zoo en la tabla zoo_rating parece estar almacenado cada voto con su valor en el campo value y relacionado con el item de zoo para el que va el voto que es el item_id. Habría que contar el número de votos que tiene cada item_id y sumar las puntuaciones que tiene para obtener el acumulado, y luego dividir entre el número de votos que tiene para obtener la puntuación. Ahora bien, esa puntuación ya la está mostrando en el frontEnd, entonces supongo que estará almacenada en otra tabla de zoo que habría que buscar (no creo que esté realizando el cálculo a través de código cada vez que se visualiza un item de zoo en el frontEnd).

El campo item_id en principio relaciona con el campo id de la tabla AC_zoo_item

Si quieres realizar ordenaciones eligiendo categoría faltaría por ver en qué tabla de zoo relaciona cada item_id con su categoría. Si no quieres realizar ordenaciones eligiendo categoría no haría falta ver esa relación.

En el código del módulo efectivamente tienes la consulta donde extrae los datos y realiza el cálculo:

$query = "SELECT cc.title AS category, a.id, a.title, DATE_FORMAT(a.created,'%d.%m.%Y') as created,
       u.username, a.hits, cc.id as catid, format((r.rating_sum / r.rating_count), 2) as averagerating

...

ORDER BY (r.rating_sum / r.rating_count) desc, rating_count desc";


si te fijas lo que hace es dividir la puntuación acumulada entre el número de votos, por ejemplo si tiene puntuación acumulada 20 y el número de votos es 5 resulta 20/5 = 4 sería su rating y muestra los resultados ordenados en base a la puntuación.

Yo lo primero que miraría sería a ver de dónde extrae la información del rating de zoo en el frontEnd, bien una tabla de la base de datos o bien código si realiza el cálculo (menos probable). Si lo tienes en una tabla, es a partir de ahí de donde puedes extraer la información.
Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #22 en: 15 de Abril 2013, 17:33 »
1º En la tabla zoo_item en el campo "elements" en la gran mayoria de estos contiene estos datos:

Código: [Seleccionar]
{
"46a4ee50-9d88-4142-9acf-3b5169833a57":  {
"votes": "1",
"value": "4.0000"
},
"1cc21c78-250d-482f-aa93-54983d2923ce":  {
"value": "1"
},
"f117218a-c831-452e-a8bc-850a6ee9ec0a":  {
"option":  {
"0": ""
},
"select": "1"
},
"701cb971-8956-4aea-8c19-4bf201f25cdc":  {
"0":  {
"value": ""
}
},
"008a8be7-365e-4dfd-9a32-691227f1eced":  {
"0":  {
"value": "EC-JQQ"
}
},
"d4704df9-558c-4beb-9d27-203af1bfc7fa":  {
"0":  {
"value": "Air Europa"
}
},
"4f65435d-7454-4fdb-9b8f-bdd2816a09fb":  {
"0":  {
"value": "Espa\u00f1a"
}
},
"64b17c0e-e3d5-41f6-b57c-0a8bb5827b50":  {
"0":  {
"value": "Madrid - Barajas (MAD\/LEMD)"
}
},
"dfb68bc5-0f33-4fbc-978e-1a8e0b6c62f3":  {
"0":  {
"value": "<p>Entrando en pista 15R para despegue inmediato v\u00eda LimaAlfa. Impresionantes los 60.30m de envergadura de esta m\u00e1quina.<\/p>"
}
},
"d7455e43-f654-49b0-bd65-d8bb84f61e21":  {
"file": "images\/03-spotting\/galeria_spotting\/watermark\/EC-JQQ-A330-203-AIR-EUROPA5.jpg",
"title": "",
"link": "images\/03-spotting\/galeria_spotting\/watermark\/EC-JQQ-A330-203-AIR-EUROPA5.jpg",
"target": "0",
"rel": "",
"lightbox_image": "",
"spotlight_effect": "",
"caption": "",
"width": 1024,
"height": 683
},
"f001e203-1af8-455a-ad2f-a3c3abce2b09":  {

},
"fe50247a-0bd5-4620-8798-bb8f7fb90a27":  {
"0":  {
"value": ""
}
}
}

Supongo que corresponde con lo que tu me decias, que ahi es donde guarda los calculos y demás de el rating...

Tambien por si sirve de algo te enseño lo que hay dentro del sig. campo que es el de params:

Código: [Seleccionar]
{
"metadata.title": "",
"metadata.description": "",
"metadata.keywords": "",
"metadata.robots": "",
"metadata.author": "",
"config.enable_comments": "1",
"config.primary_category": "738"
}

2º La sql que tu me has puesto ahi... es por la que debería sustituir a la anterior?¿ por que creo que esta modificada no?¿

Un saludo y gracias por tu ayuda...

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #23 en: 16 de Abril 2013, 09:13 »
He intentado instalar la extensión zoo para mirarlo pero me salta un error. Yo creo que no sea en la tabla zoo_item sino en la tabla zoo_rating donde debas mirar. Puedes hacer una prueba:

Identifica cuál es el item de zoo nº980 (el que me pusiste en la imagen en post anterior). Haz una consulta en mysql para ver cuántas líneas aparecen en la tabla zoo_rating con ese item_id. Imagínate que te aparecen 3 líneas. A continuación, haz un voto por ese item en el frontEnd y dale por ejemplo valor 4. Luego repite la consulta en la tabla: si te aparece una nueva línea con item_id 980 y value 4 eso significa que es en esa tabla donde de forma principal se está almacenando la información de los votos.

Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #24 en: 16 de Abril 2013, 13:24 »
He echo lo que tu me has dicho y ya confirmado... el 980 tenia 1 voto que era de 5 y la he vuelto a votar y con un 2 y el rating se ha puesto a 3.5 y en la base de datos ha cambiado... a ese resultado... por lo que los datos salen.. de AC_Zoo_rating...

Entonces ahora... cual debería ser la llamada sql para sustituir... en el modulo...

Un saluod y gracias!!!

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #25 en: 16 de Abril 2013, 13:29 »
perdon me he equivocado... sería AC_zoo_item...

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #26 en: 17 de Abril 2013, 09:57 »
Suponiendo que queremos rescatar el campo "name" de la tabla AC_zoo_item en base al campo "value" de la tabla AC_zoo_rating lo primero sería probar a hacer la consulta en phpMyAdmin para comprobar que funcione. La consulta sería algo así (habría que probar):

SELECT tab1.name AS title, tab2.value AS puntuacion

FROM AC_zoo_item AS tab1 LEFT JOIN AC_zoo_rating as tab2 ON tab1.id = tab2.item_id

ORDER BY tab2.value DESC



Lo que estaríamos intentando es: obtener la lista de name desde la tabla AC_zoo_item en base al valor value que tengan esos items en la tabla AC_zoo_rating y ordenarlos por orden descendente (es decir, de mayor a menor puntuación).

Lo primero es probar que haciendo la consulta en phpMyAdmin te devuelva la lista de nombres ordenados por puntuación y que te salga ordenado correctamente. Si sale bien en phpMyAdmin ya se podría pasar a ver cómo habría que hacerlo en código, si no sale bien hay que corregir la consulta hasta que salga bien.

Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #27 en: 17 de Abril 2013, 11:15 »
Funciona...el único problema que hay es que hay 2 datos en el rating... que son la puntuación del 1 al 5 y despues el nº de votos... no es lo mismo 1 voto 5 estrellas, que 20 votos de 5...y creo que ahora mismo salen todos los 5 que haya direct<mente independientemente del número de votos que tengan...

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #28 en: 18 de Abril 2013, 10:02 »
¿Dónde ves el número de votos? ¿Lo tienes en un campo específico o simplemente sabes que hay varios votos porque hay varias líneas en la tabla AC_zoo_rating donde el item_id es el mismo, lo que significaría varios votos para un item? ¿Puedes ponerme una imagen para verlo?

Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #29 en: 18 de Abril 2013, 10:44 »
Si hay un campo especifico donde aparecen varias cosas entre ellas el nº de votos y el rating generado... ya te lo comente en post anteriores...pero  te pongo la img del 980 que es el que hemos hablado...
Este es el contenido del campo elements:
Código: [Seleccionar]
{
"46a4ee50-9d88-4142-9acf-3b5169833a57":  {
"votes": "2",
"value": "3.5000"
},
"1cc21c78-250d-482f-aa93-54983d2923ce":  {
"value": "1"
},
"f117218a-c831-452e-a8bc-850a6ee9ec0a":  {
"option":  {
"0": "boeing"
},
"select": "1"
},
"701cb971-8956-4aea-8c19-4bf201f25cdc":  {
"0":  {
"value": ""
}
},
"008a8be7-365e-4dfd-9a32-691227f1eced":  {
"0":  {
"value": "60-0350"
}
},
"d4704df9-558c-4beb-9d27-203af1bfc7fa":  {
"0":  {
"value": "USAF"
}
},
"4f65435d-7454-4fdb-9b8f-bdd2816a09fb":  {
"0":  {
"value": "Espa\u00f1a"
}
},
"64b17c0e-e3d5-41f6-b57c-0a8bb5827b50":  {
"0":  {
"value": "Gran Canaria - Gando (LPA\/GCLP) "
}
},
"dfb68bc5-0f33-4fbc-978e-1a8e0b6c62f3":  {
"0":  {
"value": ""
}
},
"d7455e43-f654-49b0-bd65-d8bb84f61e21":  {
"file": "images\/03-spotting\/galeria_spotting\/watermark\/0350-2.jpg",
"title": "",
"link": "images\/03-spotting\/galeria_spotting\/watermark\/0350-2.jpg",
"target": "0",
"rel": "",
"lightbox_image": "",
"spotlight_effect": "",
"caption": "",
"width": 1024,
"height": 683
},
"f001e203-1af8-455a-ad2f-a3c3abce2b09":  {

},
"fe50247a-0bd5-4620-8798-bb8f7fb90a27":  {
"0":  {
"value": ""
}
}
}

« Última modificación: 18 de Abril 2013, 10:58 por dinasty0 »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #30 en: 18 de Abril 2013, 11:36 »
Haz esta consulta en phpMyAdmin para ver qué es lo que te sale y ponme la imagen para verlo:

SELECT tab1.name AS title, tab2.value AS puntuacion

FROM AC_zoo_item AS tab1 LEFT JOIN AC_zoo_rating as tab2 ON tab1.id = tab2.item_id

WHERE tab2.item_id = 980

ORDER BY tab2.value DESC


En este caso es solo para el item 980 para comprobar cuántas líneas te aparecen

Responsable de departamento de producción aprenderaprogramar.com

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #31 en: 18 de Abril 2013, 12:04 »
Prueba también a ejecutar esto a ver qué te sale:

SELECT AVG(value) AS rating, COUNT(id) AS votos
FROM AC_zoo_rating
WHERE item_id = 980
GROUP BY item_id



¿Hay una tabla que se llama AC_zoo_element? ¿Qué contiene esa tabla?

Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #32 en: 18 de Abril 2013, 13:09 »
Aquí adjunto ambas capturas... la 1º consulta con el titulo de img consulta 980 y la segunda consulta con el titulo consultasegunda980

por cierto no hay ninguna tabla con el nombre AC_zoo_elemnts solo es un campo... de la tabla AC_zoo_item

Ahora tb te adjunto la img con todas las tablas que hay de zoo...

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #33 en: 22 de Abril 2013, 09:38 »
Yo creo que ya prácticamente lo tienes, si haces la consulta que te pongo más abajo deberían aparecerte todos los titles junto a su rating, que es lo que creo te interesa para que se te muestre dentro del módulo.

La consulta sería algo así (hay que probar por si hubiera algún problema, cuando la hayas hecho dime si crees que ha salido bien y ponme la imagen para verla):

SELECT tab1.name AS titulo, tab2.AVG(value) AS rating

FROM AC_zoo_item AS tab1 LEFT JOIN AC_zoo_rating as tab2 ON tab1.id = tab2.item_id

GROUP BY item_id

ORDER BY rating DESC

LIMIT 0, 20


La cláusula LIMIT sería para que solo te muestre cierto número de resultados, en este caso los 20 primeros títulos con mayor rating, pero en vez de 20 podría ponerse que fueran más o menos según prefirieras.

Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #34 en: 22 de Abril 2013, 11:11 »
Se ha producido este error...

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #35 en: 22 de Abril 2013, 22:54 »
Prueba con esta sintaxis a ver si hay suerte:

SELECT tab1.name AS titulo, AVG(tab2.value) AS rating

FROM AC_zoo_item AS tab1 LEFT JOIN AC_zoo_rating as tab2 ON tab1.id = tab2.item_id

GROUP BY item_id

ORDER BY rating DESC

LIMIT 0, 20



Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #36 en: 23 de Abril 2013, 11:14 »
He comprobado la consulta y ahora si funciona lo que pasa es que sale como antes...es decir el nombre y el nº de estrellas es decir solo el 5... y he comprobado si el 1º es realmente el primero y no era asi... habría que poner el nombre, el nº de votos y el rating que tiene...

Aqui te adjunto la img...

Muchas gracias...por todo

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:ordenar por los mas votados
« Respuesta #37 en: 24 de Abril 2013, 11:25 »
Yo creo que ahora sí está funcionando bien, de todas formas si quieres ver el número de votos prueba a hacer la consulta así para ver si muestra el número de votos:

SELECT tab1.name AS titulo, AVG(tab2.value) AS rating, COUNT(tab2.item_id) AS votos

FROM AC_zoo_item AS tab1 LEFT JOIN AC_zoo_rating as tab2 ON tab1.id = tab2.item_id

GROUP BY item_id

ORDER BY rating DESC

LIMIT 0, 30


Responsable de departamento de producción aprenderaprogramar.com

dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #38 en: 24 de Abril 2013, 13:13 »
Ahora funciona perfecto... he modificado el orden del rating por el de votos y si me sale bien...ya lo unico que abria que hacer es sustituir todo el codigo de la otra vez por este que tu me has dado no?¿

Esdecir todo esto lo sustituyo por eltuyo?¿
Código: [Seleccionar]
function GetRatedArticlesList(&$params)
  {
      require_once JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php';
      $db =& JFactory::getDBO();
      $query = "SELECT cc.title AS category, a.id, a.title, DATE_FORMAT(a.created,'%d.%m.%Y') as created,
u.username, a.hits, cc.id as catid, format((r.rating_sum / r.rating_count), 2) as averagerating

      FROM #__content AS a

      LEFT JOIN #__categories AS cc ON a.catid = cc.id

      LEFT JOIN #__users AS u ON u.id = a.created_by

      LEFT JOIN #__content_rating as r ON a.id = r.content_id

      WHERE r.rating_count is not null";


dinasty0

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 28
    • Ver Perfil
Re:ordenar por los mas votados
« Respuesta #39 en: 24 de Abril 2013, 13:25 »
He estado viendo el codigo donde se supone que hace la llamada sql y demás y este es el código entero por que no se si algunas otras partes del código hay que modificarlas...

Codigo.php

Código: [Seleccionar]
<?php
/**
 * @version SVN: $Id$
 * @package    mod_topratedcontentmodule
 * @author     Mathias Hortig {@link http://tuts4you.de/}
 * @license    GNU/GPL
 */

// No direct access
 
defined'_JEXEC' ) or die( 'Restricted access' );
 
jimport'joomla.application.component.model' );
jimport'joomla.html.parameter' );

class 
mod_topratedcontentmodulehelper
{

  function 
GetRatedArticlesList(&$params)
  {
      require_once 
JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php';
      
$db =& JFactory::getDBO();
      
$query "SELECT cc.title AS category, a.id, a.title, DATE_FORMAT(a.created,'%d.%m.%Y') as created,
 u.username, a.hits, cc.id as catid, format((r.rating_sum / r.rating_count), 2) as averagerating

      FROM #__content AS a

      LEFT JOIN #__categories AS cc ON a.catid = cc.id

      LEFT JOIN #__users AS u ON u.id = a.created_by

      LEFT JOIN #__content_rating as r ON a.id = r.content_id

      WHERE r.rating_count is not null"
;

      if(
$params->get('showOnlyPublicPosts') == 0)
      {
       
$query .= " and a.access = 1 ";
      }


      
$query .= 
ORDER BY (r.rating_sum / r.rating_count) desc, rating_count desc"
;
      if(
$params->get('articleCount') != 0)
      {
         
$query .= " LIMIT 0, " $params->get('articleCount');
      }

      
$db->setQuery$query );
        
$table $db->loadObjectList();

        
$html .= '<ul id="topratedcontentmodule">';
foreach($table as $row)
        {
            
$html .= '<li>';
            
$html .= '<a title="' JText::_('MOD_TOPRATEDCONTENTMODULE_AVERAGERATING') . ': ' $row->averagerating '" href="' JRoute::_(ContentHelperRoute::getArticleRoute($row->id$row->catid)) . '">'.$row->title.'</a>';
            
$html .= '</li>';
      }
           
$html .= '</ul>';

return $html;


  }
}


 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".