Problema con include en bloque

Problema con include en bloque

de Alvaro Soriano Moll -
Número de respuestas: 10
Hola,

Me estoy haciendo un bloque que sirve para realizar notificaciones sobre la recepción de correos en mi plataforma. Tengo en la carpeta dos archivos:

-notificaciones.php
-notificaciones_querys.inc.php

en notificaciones_querys.inc.php almaceno 3 variables con 3 consultas a la BD, y lo que intento es acceder a ellas utilizando un include desde notificaciones.php. He probado con include, require y require_once y nada, y al estar en la misma carpeta, sólo tendría que poner por ejemplo include('notificaciones_querys.inc.php'); pero nada, no hay forma y no lo entiendo porque es lo más sencillo del mundo.

Tampoco puedo acceder a las variables CFG del archivo config.php de la carpeta principal del sistema. ¿Alguien me puede echar un cable?

Muchas gracias,
Alvaro Soriano Moll
Promedio de valoraciones: -
En respuesta a Alvaro Soriano Moll

Re: Problema con include en bloque

de Xavier Paz -
Para la primera cuestión tienes un ejemplo de como hacer el include en el bloque feedback.

...
if(is_file($CFG->dirroot.'/mod/feedback/lib.php')) {
require_once($CFG->dirroot.'/mod/feedback/lib.php');
define('FEEDBACK_BLOCK_LIB_IS_OK', true);
}
class block_feedback extends block_base {
...
...
...

Observa que primero comprueba que el fichero existe y después lo incluye con require_once. A continuación comienza a definir la clase de su bloque que hereda de la principal.

En cuanto a la segunda cuestión, para acceder a $CFG o cualquier otra variable global hay que declararla como tal al inicio de cada método de la clase del bloque o entre los atributos de la clase.

Ejemplos:
function open_folder($visiblename) {
global $CFG;
$strfolderopened = s(get_string('folderopened'));
....
....
...
}

En general, te recomendaría que buscases ejemplos entre los bloques que vienen por defecto en Moodle.

P.D: solo por curiosidad, ¿por qué almacenas las consultas en un fichero aparte? ¿estás usando las funciones de consulta que te proporciona Moodle o son consulta SQL en crudo?
En respuesta a Xavier Paz

Re: Problema con include en bloque

de Alvaro Soriano Moll -
Hola Xavier,

Muchas gracias por tu contestación, creo que ya podré tirar de ahí con mi proyecto.

El tema de las consultas SQL es que tenemos un módulo de correo interno de las asignaturas, necesito hacer un bloque que avise a los usuarios de la plataforma de cuándo tienen correo sin leer y cuántos son. Por ello accedo a la BD con estas consultas, muestro el resultado y obtengo el id de la carpeta de entrantes para la url a la que nos dirigirá el enlace. Estas consultas las quiero tener separadas más que nada por comodidad a la hora de desarrollar.

¿Creeis que está mal hecho o habría una solución mejor?

Un saludo y muchas gracias
En respuesta a Alvaro Soriano Moll

Re: Problema con include en bloque

de Xavier Paz -
Personalmente, usaría las funciones propias de Moodle para obtener los registros necesarios, más que usar consultas SQL puras y duras. Por un lado te aseguras la compatibilidad futura y generalmente están optimizadas.

Si pones el código aquí tal vez te podamos ayudar.. sonrisa
En respuesta a Xavier Paz

Re: Problema con include en bloque

de Alvaro Soriano Moll -
<?php

class block_notificarcorreointerno extends block_base {
function init() {
$this->title = "Notificaciones Correo";
$this->version = 2004111200;
}
function get_content() {
if ($this->content !== NULL) {
return $this->content;
}
Global $USER;
Global $CFG;
$id_course = $_GET['id'];

$return_unread = "SELECT COUNT(mdl_mail_messages.id)
FROM mdl_mail, mdl_mail_folder, mdl_mail_messages
WHERE mdl_mail_folder.id = mdl_mail_messages.folderid AND
mdl_mail.id = mdl_mail_folder.mailid AND
mdl_mail_folder.mailid = mdl_mail_messages.mailid AND
mdl_mail.id = mdl_mail_messages.mailid AND
mdl_mail_messages.userid = '".$USER->id."'
AND mdl_mail_messages.leido = '0'
AND mdl_mail.course='".$id_course."'";

$mail_course = "SELECT mdl_mail_folder.id
FROM mdl_mail, mdl_mail_folder
WHERE mdl_mail.id = mdl_mail_folder.mailid
AND mdl_mail.course = '".$id_course."'
AND mdl_mail_folder.type='E'";

$return_unread_bycourse="SELECT mdl_course.id, mdl_course.fullname, COUNT(mdl_mail_messages.id), mdl_mail_folder.id
FROM mdl_mail, mdl_mail_folder, mdl_mail_messages, mdl_course
WHERE mdl_course.id = mdl_mail.course AND
mdl_mail.id = mdl_mail_folder.mailid AND
mdl_mail.id = mdl_mail_messages.mailid AND
mdl_mail_folder.mailid = mdl_mail_messages.mailid AND
mdl_mail_folder.id = mdl_mail_messages.folderid AND
mdl_mail_messages.leido = '0' AND
mdl_mail_messages.userid = '".$USER->id."'
GROUP BY mdl_course.id";
$this->content = new stdClass;

if(!($link=mysql_connect($CFG->dbhost,$CFG->dbuser,$CFG->dbpass)))
{
$this->content->text = "No se pudo conectar a la BD";
}
else
{
if($_GET['id'] == null)
{
$result = mysql_query($return_unread_bycourse,$link);
$this->content->text="";
while($row = mysql_fetch_row($result))
{
$this->content->text.=$row[1]."<br />";
}
return $this->content;
}
else
{
$result = mysql_query($return_unread,$link);
$row=mysql_fetch_row($result);

$result2 = mysql_query($mail_course,$link);
$id_mail = mysql_fetch_row($result2);

$mail_count = (int)$row[0];

if($mail_count == 0)
{
$this->content->text = "<div class='event'>No tienes ningún mensaje nuevo.</div>";
}
else
{
$this->content->text = "<div class='event'><img src='http://localhost/moodle/blocks/notificarcorreointerno/img/exclamacion.gif' /><a href='http://localhost/moodle/mod/mail/messages.php?f=".$id_mail[0]."'> Tiene (".$row[0].") mensajes nuevos</a></div>";
}
}

mysql_close($link);
}
return $this->content;
}

}

?>

Este es el codigo del bloque completo. ¿Cómo podría utilizar las funciones propias de moodle a las que haces referencia? Soy bastante novato en esto y de momento era la opción que había intentado. Un saludo
En respuesta a Alvaro Soriano Moll

Re: Problema con include en bloque

de Xavier Paz -
Si no me equivoco, lo que hace es listar los mensajes no leídos por el usuario ¿no? ¿obtiene los datos de tablas estandar de Moodle, o las has creado tú? ¿hace uso de tablas de algún módulo extra? Lo digo porque no consigo encontrar las tablas con prefijo mail.

Te comento un detalle. Por razones de seguridad, no es recomendable usar $_GET ni $_POST, sino la funcion required_param() y optional_param() para recuperar parámetros mediante URL. En este caso en concreto no hace falta ya que el id del curso actual está accesible a través de la variable global $COURSE.

Por tanto, yo cambiaría esto:

$id_course = $_GET['id'];

por esto otro:

$id_course = $COURSE->id;1

En respuesta a Xavier Paz

Re: Problema con include en bloque

de Alvaro Soriano Moll -
Hola Xavier,

Las tablas de la BD son de un módulo de correo creado por la comunidad. El problema es que no notifica cuando tienes correos nuevos, por lo que utilizo estas sentencias para obtener los ids, la cuenta de mensajes sin leer y el codigo de la asignatura.

He estado buscando la alternativa que me comentaste para no incluir las querys en el código php, pero no lo encuentro por ningún sitio. ¿De dónde podría sacar información para continuar con esto?

Un saludo y gracias
En respuesta a Alvaro Soriano Moll

Re: Problema con include en bloque

de Raul Garcia Canet -
Hola Alvaro,
Tienes una referncia completa de la API de moodle en:

http://xref.moodle.org/nav.html?index.html

Está un poco obsoleta, pero a mi me sirve de bastante ayuda. Las búsquedas no funcionan demasido bien, a menos que pongas lo que "exactamente" quieres buscar.
O sea, que no vale con poner get_sql y que te busque las coincidencias. Hay que noner la función concreta, por ejemplo: get_record_sql()

Como pista:
En el fichero /lib/dmllib.php suelen estar todas la funciones para consultas a la BD.

No obstante, para localizar definiciones de variables, llamadas a funciones y demás, es estupenda.

Hasta pronto,
Salu2
J: Raul (juagarc4) guay
En respuesta a Alvaro Soriano Moll

Re: Problema con include en bloque

de Xavier Paz -
Ya veo. Probablemente ese módulo tenga ya implementadas una serie de funciones que permitan llevar a cabo eso que pretendes. Yo buscaría algún fichero llamado lib.php, locallib.php o similar, porque seguro que existe.

Por cierto ¿tienes el enlace de descarga del módulo de correo? Es por echarle un vistazo.
En respuesta a Xavier Paz

Re: Problema con include en bloque

de Alvaro Soriano Moll -
Te subo el módulo de correo por aquí que no lo encuentro. El desarrollo del bloque necesario para ver los correos nuevos ya lo tengo, lo único que me queda el tema de las querys que miraré mañana. Ya lo tengo aprobado para incluirlo en el portal para el que lo estoy realizando.

Muchas gracias a los dos, voy a mirarme un poco los contenidos de la referencia que me pasais y si tengo alguna dudilla más os comento.
En respuesta a Alvaro Soriano Moll

Re: Problema con include en bloque

de Xavier Paz -
Echando un vistazo a las funciones que hay dentro del archivo locallib.php incluido en el adjunto, tienes varias bastante interesantes que te pueden servir, aunque probablemente tengas que alterarlas o al menos copiar el método que usan para obtener la información.

mail_get_messages_noread() obtiene la cantidad de mensajes no leídos por el usuario, a nivel global.

Por otro lado, la función mail_get_messages_course_noread() hace lo mismo pero únicamente con los mensajes relativos a un curso.

Ambas devuelven el número de mensajes no leídos, pero si quieres obtener información extra de la consulta, me refiero a otros campos, bastaria con cambiar el count_records, que sirve para contar la cantidad de registros resultantes de la consulta, por get_records, manteniendo las tablas, los campos y valores que actúan como parámetros de la consulta.