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.


Bookmark and Share

8 Commenti al post “Mostare tab di CB soltanto su alcuni profili utente”

antonio Says:

Ciao, ho provato ad utilizzare il codice che hai proposto, che ho trovato interessantissimo, ma richiamando una qualsiasi voce di CB mi da un “parse error” nel file admin.comprofiler.controller.php alla seconda riga del codice “$_CB_database->setQuery( $query );” Premetto che non ho creato un componente per popolare la nuove tabelle, ma ho cercato di farlo a mano. Forse l’errore sta li.

Antonio

Copes Flavio Says:

Ciao Antonio, sicuro che il codice sia scritto giusto? Forse nello scrivere il codice HTML l’editor mi ha mangiato qualche tag.. dovrei riguardarlo, caso mai fammi sapere, posso inviarti il file zippato se ti interessa.

antonio Says:

Ciao Flavio, ti ringrazio molto per la risposta.
Stavo lavorando proprio al codice. In realtà, oltre ai file che mi farebbero proprio comodo, sarei curioso di avere qualche dritta per il componente che hai creato per popolare le tabelle dal Backend. Lo usergroup manager è molto interesante. Popolarle da SQL è da pazzi, soprattutto se hai molti utenti.
Cmq, ancora grazie.

antonio Says:

Ciao Flavio. Volevo chiederti se potevi passarmi quei files.
Non sono un mago del php ed sql, e non riesco ad uscirne.
Sono da tre giorni chiuso in casa ad impazzire con il codice.
Se poi potessi indirizzarmi su quel componente per popolare le tabelle, te ne sarei grato.

Francesco Says:

Nel mio caso, apportando tutte le modifiche descritte, quando provo a fare il login in cb dal frontend, o accedere a una qualsiasi pagina di gestione di cb nel backend, ricevo una pagina bianca..

..ma la cosa più bella è che se tolgo tutte le modifiche, la pagine rimangono bianche e devo ricarcarle da capo, dal paccehtto “vergine”..

..:-s ..che sarà^ ..dottorreeee.. ..sto mmmaleee :-s

;-)

Francesco Says:

..risolto in parte, è colpa dell’ascii di “>”..

..ora però mi appare la riga “”, invece di apparire il form a lista…

..ce la farò?

Marco Says:

Ciao Flavio.
Volevo chiederti se potevi passarmi questi files in quanto non riesco a fare correttamente le modifiche (ignoranza mia).
Grazie Marco

Flavio Says:

Ciao Marco, purtroppo non li ho più a disposizione!

Lascia un commento

Nome (obbligatorio)

Mail (non sarà pubblicata) (obbligatoria)

Sito web