Mostare tab di CB soltanto su alcuni profili utente

Community Builder organizzare la propria interfaccia attraverso blocchi denominati tab.

Ogni tab mostra informazioni specifiche, e può integrare i profili utente con estensioni come FireBoard, Mamblog e molte altre, in modo da rendere più coese le informazioni presenti sul sito.

tab di Community Builder

L'amministrazione di CB consente per default di decidere a quali utenti visualizzare ciascun tab, ovvero decidere quali tab mostrare in base al login dell'utente che visualizza il profilo.

La form che permette di scegliere il livello di accesso dei visitatori

Questa è una funzionalità decisiamente utile, e siamo tutti d'accordo. Ma cosa possiamo fare se vogliamo mostrare dei tab solo sul profilo di alcuni utenti?

Innanzitutto l'ACL di Joomla ci và stretta. Vogliamo impostare diversi gruppi di utenti, per gestire una competizione: alcuni utenti resteranno al primo livello, altri avanzeranno al "secondo round", diverranno finalisti e per finire avremo dei vincitori.

Altri utenti saranno giudici della competizione.

Vediamo come possiamo realizzare questo tipo di funzionalità.

Parlo di Joomla 1.5 e CB 1.2 Stable.

Creiamo le tabelle del database

Ci servono almeno tre tabelle,

jos_jc_user_groups: definisce i gruppi utente.

jos_jc_user_groups_users: associa gli utenti della tabella jos_users con i gruppi della tabella jos_jc_user_groups.

jos_jc_cb_tabs_groups: serve a gestire le relazioni tra i tab di cb e i gruppi di utenti.

CREATE TABLE `jos_jc_cb_tabs_groups` (
`id_group` int(11) NOT NULL,
`id_tab` int(11) NOT NULL,
PRIMARY KEY (`id_group`,`id_tab`)
)
 
CREATE TABLE `jos_jc_user_groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
 
CREATE TABLE `jos_jc_user_groups_users` (
`userid` int(11) NOT NULL,
`id_group` int(11) NOT NULL,
PRIMARY KEY (`userid`,`id_group`)
)

Dobbiamo popolare queste tabelle aggiungendo nuovi gruppi in jos_jc_user_groups ed associando a questi gruppi degli utenti, usando jos_jc_user_groups_users. Possiamo creare un componente per la gestione di queste due tabelle, oppure possiamo lavorare direttamente sul database. Per la mia soluzione, ho preferito la prima ipotesi.

Gestione gruppi utenti

Scelta del gruppo utente

Modifichiamo il codice di CB

File administrator/components/com_comprofiler/admin.comprofiler.html.php

Cerchiamo la funzione editTab, intorno alla linea 1843, e dopo la definizione della form "User Group to allow access to" inseriamo il codice


User Group that displays this tab:
< ?php echo $lists['groupstabs']; ?>
You can select multiple groups.

che in sostanza dice a CB di visualizzare nella pagina di modifica di un tab la form che permette di scegliere in quali profili utente (che poi modificheremo) mostrare tale tab.

File administrator/components/com_comprofiler/admin.comprofiler.controller.php

Agiamo ora sul controller, nella funzione editTab intorno alla linea 1407

$query="SELECT id_group from #__jc_cb_tabs_groups WHERE id_tab=".(int) $tid;
$_CB_database-&gt;setQuery( $query );
$gruppi = $_CB_database-&gt;loadResultArray();
 
for ($i = 0; $i &lt; sizeof($array); $i++) {
$types[]                =    moscomprofilerHTML::makeOption( $array[$i][0], $array[$i][1] );
}
$lists['groupstabs']= moscomprofilerHTML::selectList( $types, 'groupstabs[]', 'size="9" MULTIPLE', 'value', 'text', $gruppi, 2 );

Nella funzione saveTab, poche righe più sotto, ci occupiamo di gestire l'inserimento dei dati nel database

$query="DELETE FROM jos_jc_cb_tabs_groups WHERE id_tab=".$_POST['tabid'];
$_CB_database-&gt;setQuery( $query );
$_CB_database-&gt;query();
 
foreach ( $_POST['groupstabs'] as $group ) {
$query="INSERT INTO jos_jc_cb_tabs_groups VALUES('".$group."', '".$_POST['tabid']."')";
$_CB_database-&gt;setQuery( $query );
$_CB_database-&gt;query();
}

File administrator/components/com_comprofiler/comprofiler.class.php

In questo file è presente intorno alla linea 3032 la funzione _loadTabsList, che decide quali tab mostrare nel profilo utente. Lo fa attraverso una query SQL, che noi modifichiamo per tenere conto dei gruppi utente.

La vecchia query:

//            $_CB_database-&gt;setQuery( "SELECT * FROM #__comprofiler_tabs t"
//            . "\n WHERE t.enabled=1"
//            . ( $position == '' ? "" : "\n AND t.position = " . $_CB_database-&gt;Quote( $position ) )
//            . "\n AND t.useraccessgroupid IN (".implode(',',getChildGIDS(userGID( $_CB_framework-&gt;myId() ))).")"
//            . "\n ORDER BY t.position, t.ordering" );

La nuova query:

$_CB_database-&gt;setQuery( "SELECT * FROM #__comprofiler_tabs t"
."\n JOIN #__jc_cb_tabs_groups jctg on jctg.id_tab=t.tabid"
."\n JOIN #__jc_user_groups_users jcugu on jcugu.id_group=jctg.id_group"
. "\n WHERE t.enabled=1"
. "\n AND jcugu.userid=".$user-&gt;user_id
. ( $position == '' ? "" : "\n AND t.position = " . $_CB_database-&gt;Quote( $position ) )
. "\n AND t.useraccessgroupid IN (".implode(',',getChildGIDS(userGID( $_CB_framework-&gt;myId() ))).")"
. "\n ORDER BY t.position, t.ordering");

Finish!

A questo punto il pannello della gestione dei tab di Community Builder mostrerà tra le opzioni la scelta (multipla) dei gruppi in cui vogliamo mostrare ciascun tab.

img-5

Scegliendo i gruppi desiderati ed aggiungendo gli utenti a questi gruppi, potremo gestire completamente la distribuzione dei tab all'interno dei profili.