[Error]  Configurar permisos en modulo de Proportal
* URL del foro: www.Infomaster21.com * Versión del foro: 1.6 * Actualización: --- Buenas, el problema que tengo es que el modulo del Proportal lla...


Buenas, el problema que tengo es que el modulo del Proportal llamado block_latestposts.php muestra todos los temas nuevos, inclusive los temas que fueron creados en una seccion privada oculta.

Que debo editar para que solo muestre los temas que pueden ver segun su grupo?.

El contenido del Php es:
Código PHP:
Código PHP:
// Get latest news announcements
// First validate announcement fids:
$announcementsfids explode(','$proportal->settings['announcementsfid2']);
if(
is_array($announcementsfids))
{
    foreach(
$announcementsfids as $fid)
    {
        
$fid_array[] = intval($fid);
    }
    
$announcementsfids implode(','$fid_array);
}
// And get them!
$query $db->simple_select("forums""*""fid IN (".$announcementsfids.")");
while(
$forumrow $db->fetch_array($query))
{
    
$forum[$forumrow['fid']] = $forumrow;
}

// Let's add pagination
$annnum $db->fetch_field($db->simple_select('threads''COUNT(*) AS annnum'"fid IN (".$proportal->settings['announcementsfid2'].") AND visible='1' AND closed NOT LIKE 'moved|%'"), 'annnum');
$pagenum intval($mybb->input['page']);
$totalpage ceil($annnum $proportal->settings['numannouncements']);
if(
$pagenum || !$pagenum || $pagenum $totalpage){ $pagenum 1; }
$multipage multipage($annnum$proportal->settings['numannouncements'], $pagenum$mybb->settings['bburl'].'/portal.php');

$pids '';
$tids '';
$comma '';
$query $db->query("
    SELECT p.pid, p.message, p.tid
    FROM "
.TABLE_PREFIX."posts p
    LEFT JOIN "
.TABLE_PREFIX."threads t ON (t.tid=p.tid)
    WHERE t.fid IN ("
.$announcementsfids.") AND t.visible='1' AND t.closed NOT LIKE 'moved|%' AND t.firstpost=p.pid
    ORDER BY t.dateline DESC 
    LIMIT "
.(($pagenum-1)*$proportal->settings['numannouncements']).", ".$proportal->settings['numannouncements']
);
while(
$getid $db->fetch_array($query))
{
    
$pids .= ",'{$getid['pid']}'";
    
$tids .= ",'{$getid['tid']}'";
    
$posts[$getid['tid']] = $getid;
}
$pids "pid IN(0{$pids})";
// Now lets fetch all of the attachments for these posts
$query $db->simple_select("attachments""*"$pids);
while(
$attachment $db->fetch_array($query))
{
    
$attachcache[$attachment['pid']][$attachment['aid']] = $attachment;
}

if(
is_array($forum))
{
    foreach(
$forum as $fid => $forumrow)
    {
        
$forumpermissions[$fid] = forum_permissions($fid);
    }
}

$icon_cache $cache->read("posticons");

$announcements '';
$query $db->query("
    SELECT t.*, t.username AS threadusername, u.username, u.avatar, u.avatardimensions
    FROM "
.TABLE_PREFIX."threads t
    LEFT JOIN "
.TABLE_PREFIX."users u ON (u.uid = t.uid)
    WHERE t.fid IN ("
.$announcementsfids.") AND t.tid IN (0{$tids}) AND t.visible='1' AND t.closed NOT LIKE 'moved|%'
    ORDER BY t.dateline DESC
    LIMIT 0, "
.$proportal->settings['numannouncements']
); 

Saludos!.
Última modificación: 23 Dec, 2011, 4:48 pm por YondaimeKuba.
A ver si Dark Neo o algún otro usuario que sepa de PHP se pasa por aquí y te echa una mano, que yo de PHP casi no sé. Smile
La cosa no es tan sencilla como parece, pero se puede hacer, la cuestion es de mirar detenidamente el código, pero se puede usar algo como las siguientes funciones.

if ($mybb->usergroup[gid] == "x")

Mostrar estos temas ....

else if ($mybb->usergroup[gid] == "y")

Mostrar estos otros temas

else

No mostrar nada... xD.

Si me pones el enlace de donde bajaste tu mod para bajarlo y mirar el código en forma para ver la mejor manera de adaptarlo, ya que hay muchas condicionales como el valor isadmin o el valor ismod.

Pero hay que mandara traer las variables globales que utilizan estas variables y algun codigo extra, pero me parece que la cosa esta por esta parte...

Código PHP:
// And get them!
$query $db->simple_select("forums""*""fid IN (".$announcementsfids.")");
while(
$forumrow $db->fetch_array($query))
{
    
$forum[$forumrow['fid']] = $forumrow;


Por ejemplo para que elimines los foros privados, miramos las ids de estos y los grupos a los que se les asignaran, por nombre, grupo, etc.

Código PHP:
// And get them!
if ($mybb->usergroup[gid] == "5")
{
$query $db("SELECT * FROM forums WHERE fid = '".$announcementsfids."' AND fid <> '17');
while(
$forumrow = $db->fetch_array($query))
{
    
$forum[$forumrow['fid']] = $forumrow;
}


Es una idea sólo nada en concreto, pues siempre hay que trabajar bien los códigos. Pero con esto yo estaría mandando a traer los foros que tu pusiste manden las ultimas noticias, pero para el grupo de usuarios 5, yo estaría ocultando la información del foro con la id 17. Que sería un foro privado o algo asi, y el grupo 5, sería el que no deseo lo mire, luego se añade más código y si tienes mas de un grupo, y más de un foro privado se incluiría un array a nuestro código, dependiendo de como lo queremos mostrar, bueno son muchas cosas, pero lo ideal sería tener el mismo codigo para que se puedan ir haciendo los cambios y funcione en el tuyo como el mio, si tienes idea de php o sql, dime que cosa para ver si te digo ideas, o si mejor te ayudo a corregir el código, ya tu me dices como usas el portal, y que cosas quieres que se oculten, etc, para que así pueda trabajar en ello sin problema. O te doy las ideas como aqui, si tienes un poco de idea, seguro que co lo que te digo le das al clavo, pues siempre te comentan casi que hace cada cosa que ponen en los códigos. Por eso te marco la sección que a simple vista yo pienso es la que nos puede ayudar con tu propósito.

Saludos...
Última modificación: 24 Dec, 2011, 9:48 pm por Naruteitor.
En mi foro tengo 3 secciones:

1)_ Privada, que no tiene que figurar en ningun lado.
2)_ Semi Privada, solo un grupo de usuario tiene acceso.
3)_ Publica.

Lo que necesitaria:
Opcion 1: Que sea mostrado los post nuevos solo a quienes pueden verlo (grupo x -> foros x).
Opcion 2: Que muestre para todos solo la seccion publica.
Opcion 3: Que muestre todos los foros menos el privado.

------------------------------
Segun tu ejemplo, el modo mas practico es hacer que realice una pregunta por cada grupo de usuarios, y me parece logico.

A ver, teniendo en cuenta eso acabo de hacer las siguientes modificaciones (de acuerdo a mis grupos de usuarios):

Agregue al archivo portal_settings.lang.php:
Código PHP:
$l['portal_novedades'] = "Configuración de Modulo novedades";
$l['portal_settings_desc'] = "ID de los foros que NO se mostraran";
$l['portal_settings_grupo1'] = "Invitados";
$l['portal_settings_grupo2'] = "Registrados";
$l['portal_settings_grupo3'] = "SuperModeradores";
$l['portal_settings_grupo4'] = "Administradores";
$l['portal_settings_grupo5'] = "Esperando Activacion";
$l['portal_settings_grupo6'] = "Moderadores";
$l['portal_settings_grupo7'] = "Suspendidos";
$l['portal_settings_grupo11'] = "Privado"

Agregue al archivo settings.php del ProPortal:
Código PHP:
    $form_container = new FormContainer($lang->portal_novedades);
    
$form_container->output_row($lang->portal_settings_grupo1$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo1]'$settings_data['grupo1'], array('id' => 'grupo1')), 'grupo1');
    
$form_container->output_row($lang->portal_settings_grupo2$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo2]'$settings_data['grupo2'], array('id' => 'grupo2')), 'grupo2');
    
$form_container->output_row($lang->portal_settings_grupo3$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo3]'$settings_data['grupo3'], array('id' => 'grupo3')), 'grupo3');
    
$form_container->output_row($lang->portal_settings_grupo4$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo4]'$settings_data['grupo4'], array('id' => 'grupo4')), 'grupo4');
    
$form_container->output_row($lang->portal_settings_grupo5$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo5]'$settings_data['grupo5'], array('id' => 'grupo5')), 'grupo5');
    
$form_container->output_row($lang->portal_settings_grupo6$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo6]'$settings_data['grupo6'], array('id' => 'grupo6')), 'grupo6');
    
$form_container->output_row($lang->portal_settings_grupo7$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo7]'$settings_data['grupo7'], array('id' => 'grupo7')), 'grupo7');
    
$form_container->output_row($lang->portal_settings_grupo11$lang->portal_settings_desc$form->generate_text_box('upsetting[grupo11]'$settings_data['grupo11'], array('id' => 'grupo11')), 'grupo11');
    
$form_container->end(); 

Luego agregue en la tabla mybb_portal_settings de la BD los 8 grupos mios.

La pagina de configuracion me quedo asi: http://www.imagengratis.org/images/capef9te.jpg

Ahora faltaria hacer que el codigo que mensionaste busque estos valores en la BD y los aplique con algun ciclo, pero no domino tanto el Php.

Como sigo?.
Última modificación: 25 Dec, 2011, 3:36 pm por YondaimeKuba.
Ok, con esto ya tienes toda la idea, ahora lo que nos faltaría sería ir al archivo del plugin, para agregar todas las funciones y sentencias, asi como los enlaces donde se ejecuta dicha sentencia.

Ahora lo que tienes es el esqueleto, solo faltaría agregar en el plugin mandando al llamado de la variable global $lang, para que respete los cambios que has echo. Luego agregar el array asociativo a cada uno de tus grupos, en la parte que te menciono de los grupos es una variable directa de MyBB, esta ya contiene los grupos, solo falta mirar las ids de cada uno, para separarlo por comas, y que haga el array al contenido de dicho cuadro de texto.

Pero para que funcionen las cosas ya tienes variables con lenguaje, solo falta agregarlas al archivo principal y darles valores a cada una mediante código. Puedes usar lo que te menciono previamente, o en su caso como ya tienes las opciones de lenguaje, le dices que a ese contenido de la variable se le agrega la id de los foros contenidos dentro del cuadro de texto.

Por ejemplo:

Primero llamamos a las variable globales que utilizaremos.

Código PHP:
//Las variables a utilizar son las de mybb para los grupos de usuarios o funciones asociadas con MyBB, para ahorrarnos algo de código, la funcion db, para los llamados y consultas a los datos de la base de datos, la funcion lang, para que tome los valores del archivo de idiomas del mismo plugin.

global $db$mybb$lang;

$lang->load("nombredelplugin"falsetrue); 

$grupos $lang->portal_settings_grupo1_desc;

if(
in_array($mybb->user['usergroup'], array($grupos)))
{
$query $db("SELECT * FROM forums WHERE fid <> '17'");
while(
$forumrow $db->fetch_array($query))
{
    
$forum[$forumrow['fid']] = $forumrow;
}


Asi estaríamos trayendo los datos de los foros excepto el de la id 17 a los usuarios de las opciones...

Solo habría que cambiar algunas partes, ya que esto...

$form_container->output_row($lang->portal_settings_grupo1, $lang->portal_settings_grupo1_desc, $form->generate_text_box('upsetting[grupo1]', $settings_data['grupo1'], array('id' => 'grupo1')), 'grupo1');

Para que asigne el valor a uno del lenguaje distinto, en lenguaje debería tener el valor x por defecto o vacio para que lo tome y solo agregue los valores del contenido en estos textos. Pero es mejor hacer desde el plugin directo y meter los arrays a las tablas en valores directos, ya que si lo haces como mencionas, las ids deberían meterse en los archivos de php y estar haciendo un write a dichos archivos cada vez que pasa, esto es peligroso porque si obtienes acceso a los archivos cuando estas poniendo permisos para escribir antes de volverlos a poner de solo lectura, es peligroso.

Lo mejor es ir sobre el plugin directamente y meter los valores dentro de la base de datos.
O en su caso que no esten en un archivo directamente para evitar que accedan a ellos.
Última modificación: 25 Dec, 2011, 8:42 pm por Naruteitor.
Ehm... pero no es un simple plugin, es un portal que se integra al Foro.

Mira este enlace: http://www.soportemybb.com/tema_Integrac...-Proportal

Ahi trata sobre el modulo block_announcements (que muestra las novedades en el portal), ese modulo lee las configuraciones desde la BD y en base a ello muestra para cada usuario. De ese codigo no puedes copiar la metodologia que utiliza?.
Bueno parece que ya tienes la configuración solo cambia el codigo, las primeras lineas por las de la nueva opcion, quedar+ia mas o menos asi:

Código PHP:
// Get latest news announcements
// First validate announcement fids:
$announcementsfids explode(','$proportal->settings['announcementsfid2']);
if(
is_array($announcementsfids2))
{
    foreach(
$announcementsfids2 as $fid)
    {
        
$fid_array[] = intval($fid);
    }
    
$announcementsfids2 implode(','$fid_array);
}
// And get them!
$query $db->simple_select("forums""*""fid IN (".$announcementsfids2.")");
while(
$forumrow $db->fetch_array($query))
{
    
$forum[$forumrow['fid']] = $forumrow;
}

// Let's add pagination
$annnum $db->fetch_field($db->simple_select('threads''COUNT(*) AS annnum'"fid IN (".$proportal->settings['announcementsfid2'].") AND visible='1' AND closed NOT LIKE 'moved|%'"), 'annnum');
$pagenum intval($mybb->input['page']);
$totalpage ceil($annnum $proportal->settings['numannouncements']);
if(
$pagenum || !$pagenum || $pagenum $totalpage){ $pagenum 1; }
$multipage multipage($annnum$proportal->settings['numannouncements'], $pagenum$mybb->settings['bburl'].'/portal.php');

$pids '';
$tids '';
$comma '';
$query $db->query("
    SELECT p.pid, p.message, p.tid
    FROM "
.TABLE_PREFIX."posts p
    LEFT JOIN "
.TABLE_PREFIX."threads t ON (t.tid=p.tid)
    WHERE t.fid IN ("
.$announcementsfids2.") AND t.visible='1' AND t.closed NOT LIKE 'moved|%' AND t.firstpost=p.pid
    ORDER BY t.dateline DESC 
    LIMIT "
.(($pagenum-1)*$proportal->settings['numannouncements']).", ".$proportal->settings['numannouncements']
);
while(
$getid $db->fetch_array($query))
{
    
$pids .= ",'{$getid['pid']}'";
    
$tids .= ",'{$getid['tid']}'";
    
$posts[$getid['tid']] = $getid;
}
$pids "pid IN(0{$pids})";
// Now lets fetch all of the attachments for these posts
$query $db->simple_select("attachments""*"$pids);
while(
$attachment $db->fetch_array($query))
{
    
$attachcache[$attachment['pid']][$attachment['aid']] = $attachment;
}

if(
is_array($forum))
{
    foreach(
$forum as $fid => $forumrow)
    {
        
$forumpermissions[$fid] = forum_permissions($fid);
    }
}

$icon_cache $cache->read("posticons");

$announcements '';
$query $db->query("
    SELECT t.*, t.username AS threadusername, u.username, u.avatar, u.avatardimensions
    FROM "
.TABLE_PREFIX."threads t
    LEFT JOIN "
.TABLE_PREFIX."users u ON (u.uid = t.uid)
    WHERE t.fid IN ("
.$announcementsfids2.") AND t.tid IN (0{$tids}) AND t.visible='1' AND t.closed NOT LIKE 'moved|%'
    ORDER BY t.dateline DESC
    LIMIT 0, "
.$proportal->settings['numannouncements']
); 

No tengo dicho modulo, asi que no he podido probarlo, pero por lo del tema anterior parece que solo asignan a la nueva variable los valores, pero baje una versión que es totalmente diferente es la de aqui del foro v1.1.

Pero los códigos de los bloques no coinciden con los que exponen aqui, o no he mirado a fondo, pero me parece que en los archivos que encontre el código es totalmente distinto.
Última modificación: 26 Dec, 2011, 12:48 pm por Naruteitor.
Ups... me confundi de codigo, empezamos devuelta si?.

El Proportal lo baje hace tiempo de la web del autor, pero a los meses dejo de existir esa web (http://www.promybb.com/).

Por favor ingresa a mi web, es esta: http://www.infomaster21.com/foros/portal.php
Vas a ver 3 columnas, la central pertenece al block_announcements.php (codigo que te pase antes por error), este codigo tomalo como ejemplo, no lo modificaremos.

Mira la columna de la derecha, hay una caja llamada "Ultimos Mensajes", donde muestra los ultimos 5 mensajes que se crearon en el foro. Esta caja pertenece al archivo block_latestposts.php, y sobre este debemos trabajar. Aqui el codigo:

Código PHP:
<?php
if (!defined("IN_PORTAL")) {
    die(
"<div style=\"border:1px solid #CC0000; padding:3px; margin:0; font-family:Tahoma; width:250px; font-size:12px;\"><strong>Error:</strong> This file cannot be viewed directly!</div>");
}

// Get forums user cannot view
$unviewable get_unviewable_forums();
if(
$unviewable)
{
    
$unviewwhere " AND fid NOT IN ($unviewable)";
}

$altbg alt_trow();
$threadlist '';
$showlimit 5;
$query $db->query("
    SELECT p.*, u.username
    FROM "
.TABLE_PREFIX."posts p
    LEFT JOIN "
.TABLE_PREFIX."users u ON (u.uid=p.uid)
    WHERE p.visible='1' 
$unviewwhere
    ORDER BY p.dateline DESC 
    LIMIT 0, "
.$showlimit
);
while(
$thread $db->fetch_array($query))
{
    
$lastpostdate my_date($mybb->settings['dateformat'], $thread['dateline']);
    
$lastposttime my_date($mybb->settings['timeformat'], $thread['dateline']);
    
// Don't link to guest's profiles (they have no profile).
    
if($thread['uid'] == 0)
    {
        
$lastposterlink $thread['username'];
    }
    else
    {
        
$lastposterlink build_profile_link($thread['username'], $thread['uid']);
    }
    if(
my_strlen($thread['subject']) > 20)
    {
        
$thread['subject'] = my_substr($thread['subject'], 020) . "...";
    }
    
$thread['subject'] = htmlspecialchars_uni($parser->parse_badwords($thread['subject']));
    
$thread['threadlink'] = get_post_link($thread['pid'],$thread['tid']);
    
$threadlist .= "<tr>
<td class=\"
$altbg\">
<strong><a href=\""
.$mybb->settings['bburl']."/".$thread['threadlink']."#pid".$thread['pid']."\">$thread[subject]</a></strong>
<span class=\"smalltext\"><br />
$lang->posted_by <em>$lastposterlink</em><br />
$lastpostdate $lastposttime
</span>
</td>
</tr>"
;
    
$altbg alt_trow();
}
if(
$threadlist)

    
// Show the table only if there are threads
    
$latestposts "<table border=\"0\" cellspacing=\"".$theme['borderwidth']."\" cellpadding=\"".$theme['tablespace']."\" class=\"tborder\">
        <tr>
            <td class=\"thead\"><div class=\"expcolimage\"><img src=\"
{$mybb->settings['bburl']}/{$theme['imgdir']}/{$expcolimage}\" id=\"block_{$result_blocks['id']}_img\" class=\"expander\" alt=\"{$expaltext}\" title=\"{$expaltext}\" /></div><strong>Ultimos Mensajes</strong></td>
        </tr>
        <tbody style=\"
{$expdisplay}\" id=\"block_{$result_blocks['id']}_e\">
        
{$threadlist}
        </tbody>
    </table>"
;
}
else
{
    
$latestposts "<table border=\"0\" cellspacing=\"".$theme['borderwidth']."\" cellpadding=\"".$theme['tablespace']."\" class=\"tborder\">
        <tr>
            <td class=\"thead\"><div class=\"expcolimage\"><img src=\"
{$mybb->settings['bburl']}/{$theme['imgdir']}/{$expcolimage}\" id=\"block_{$result_blocks['id']}_img\" class=\"expander\" alt=\"{$expaltext}\" title=\"{$expaltext}\" /></div><strong>Ultimos Mensajes</strong></td>
        </tr>
        <tbody style=\"
{$expdisplay}\" id=\"block_{$result_blocks['id']}_e\">
        <tr>
        <td class=\"
$altbg\">No Post</td>
        </tr>
        </tbody>
    </table>"
;
}

echo 
$latestposts;
?>

Disculpa, jejeje, es que desde un principio me confundi de codigo...
Última modificación: 26 Dec, 2011, 2:59 pm por YondaimeKuba.
Este modulo ya funciona con los permisos del foro, ve al panel de admin y en los foros en cuestion asigna los permisos a los grupos de usuario, en este caso para que no vean el contenido, con esto actua ya solo el modulo, lo he probado y si funciona, ya veo que es el mismo portal. Pero igual se puede hacer un array, sin embargo es mejor poner los permisos y debe tomarlos automáticamente. Saludos...