Come fare per

Questa sezione della guida è dedicata a quei piccoli problemi che ho incontrato durante lo sviluppo con Drupal a cui però non avevo trovato , nei vari forum su Drupal , risposta immediata.

Modificare il titolo del sito

Come amministratore del sito, andando sulla voce di menu amministra->impostazioni compare la pagina con tutte le impostazioni del sito. Su impostazioni generali è possibile definire il titolo del sito, la email e l'icona.

Ripristinare la pagina di login scomparsa

Se è stata disabilitata la visualizzazione del Login , collegarsi con www.miosito.it/user, per far comparire la pagina di login.

Sito off-line:non riesco più ad entrare

Provare in uno di questi modi:

Eseguire il Logout

Per eseguire un Log-out non da menu chiamare la pagina http://miosito.com/logout

Aprire una nuova finestra da menu (target="_blank")

L'apertura di una nuova finestra viene eseguita impostando l'attributo "target" nel tag href.
La funzione di default che prepara il tag href e' la funzione theme_menu_item_link() (contenuta in includes/menu.c).
Dobbiamo quindi creare una delle due seguenti funzioni in modo tale che Drupal le possa chiamare in sostituzione della funzione di default.
Le due funzioni, da inserire nel file template.php, sono:
- miotema_menu_item_link($link)
- phptemplate_menu_item_link($link)
Se esistono entrambe , Drupal darà la precedenza a miotema_menu_item_link($link).
Considerando ad esempio la seconda, possiamo fare in modo che l'attributo Target sia presente se il riferimento al link inizia con "http" indicando un percorso esterno al sito. Ecco il codice.
Per versione 6.x

<?php
 
function phptemplate_menu_item_link($link) {

  if (empty(

$link['localized_options'])) {
   
$link['localized_options'] = array();
  }
if(
strtolower(substr($link['href'],0,4))=="http") {
    
$link['localized_options']['attributes'] = array('target' => '_blank');
}

  return

l($link['title'], $link['href'], $link['localized_options']);
}
?>

In alternativa possiamo sfruttare l'attributo $link[external]=1 che Drupal fornisce nel caso il link sia esterno. Ecco il codice.

<?php
 
function phptemplate_menu_item_link($link) {

  if (empty(

$link['localized_options'])) {
   
$link['localized_options'] = array();
  }
if (
$link['external']==1) {{
    
$link['localized_options']['attributes'] = array('target' => '_blank');
}
  return
l($link['title'], $link['href'], $link['localized_options']);
}
?>

Per versione 5.x

<?php
 
function theme_menu_item_link($item, $link_item) {
$attributes = array();
if (!empty(
$item['description'])) $attributes['title'] = $item['description'];
if(
strtolower(substr($link_item['path'],0,4))=="http") {
    
$attributes['target'] = "_blank";
}
return
l($item['title'], $link_item['path'], $attributes, isset($item['query']) ? $item['query'] : NULL);
}
?>

Attenzione , se il tema che si sta utilizzando implementa la funzione miotema_menu_item_link() nel file template.php, inserire la patch anche in questa funzione.

Il test per abilitare URL semplificati fallisce

Per sistemi Windows e server Apache fare le seguenti modifiche:
in httpd.conf

1. scommentare LoadModule rewrite_module modules/mod_rewrite.so
2. impostare AllowOverride All in ..
<Directory "C:/drupal">
    AllowOverride All
    Options None
    Order allow,deny
    Allow from all
</Directory>

essendo C:/drupal la documentRoot di Apache

Ordinare i contenuti nella prima pagina

Come sono ordinati i contenuti nella rima pagina?
All'avvio di Drupal viene eseguita la funzione node_page_default() , contenuta in includes/node.module. In questa funzione viene eseguita la seguente query per vedere quali contenuti devono essere inseriti in prima pagina.

SELECT n.nid, n.sticky, n.created FROM node n
 WHERE n.promote = 1 AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC

Quindi affinché un contenuto compaia in prima pagina nella tabella NODE si deve avere:
promote = 1 ; cioè promosso in prima pagina.
status = 1; cioè pubblicato.
L'ordinamento è fatto sui due campi: sticky(opzione fisso in cima alla lista ) e created (data creazione) e su entrambi in modo discendente.
Per il campo sticky più è alto il valore più il commento sarà in cima alla lista.
Per il campo created , i commenti più recenti saranno visualizzati per primi.

Quindi, al di là della data di creazione, per portare un commento al primo posto nella pagina, basta assegnarli (direttamente nella tabella NODE) il valore di sticky più alto in assoluto e via via decrescente per i contenuti che devono seguire.
Per tutti i contenuti che si vogliono visualizzare in base alla loro data di creazione, basta mantenere sticky=0.
Attenzione:se ad un contenuto si assegna l'opzioe "fisso in cima alla lista" il valore di sticky sarà posto=1 sovrascrivendo eventuali valori da noi impostati direttamente nella tabella NODE.

Cambiare il proprietario di un contenuto

Ci sono due modi per modificare il proprietario del nodo.
1. Il primo consiste nell'entrare nel nodo del contenuto come amministratore e nelle informazioni sull'autore inserire il nome dell'utente a cui dare la proprietà del nodo.

Attenzione: il nuovo utente potrà ora modificare il contenuto solo se in Controllo accessi ha il permesso amministra filtri nel modulo filter oppure se il formato del contenuto è Filtered HTML. Nel caso non fosse così, permessi non assegnati o formato uguale a PHP code o Full HTML, è necessario o cambiare il permesso o impostare il formato a Filtered HTML.

2. Il secondo metodo consiste nel modificare il campo uid nella tabella node inserendo il valore uid assegnato all'utente (vedere tabella users). Vale la stessa considerazione fatta precedentemente per il formato. Il valore del formato selezionato è comunque indicato nella tabella node_revisions nel campo format per il/i record con campo nid uguale al valore nid del nodo nella tabella node.
La tabella node_revisions ha anche il campo uid che per correttezza dovrebbe essere posto uguale al valore in tabella node, ma anche se mantiene il precedente valore non inficia il cambiamento del proprietario.

Format = 1 Filtered HTML valore di default per tutti gli utenti
Format = 2 PHP code
Format = 3 Full HTML

I fogli di stile non sono caricati

Compare solamente il contenuto senza sidebar intestazione etc.

Usare una vista nel codice PHP

Drupal 6.x
Views 2.0
Supponiamo di avere un modulo che chiama la funzione miomodulo_output () generando un output per il contenuto principale.

<?php
 
function   miomodulo_output () {
  
$output = "Messaggio di prova";
   return
$output;
}
?>

Voglio ora inserire dopo il messaggio il risultato di una vista creata mediante l' interfaccia delle viste.
Il nome della vista è "vista_di_prova" e accetta in ingresso un argomento numerico passato alla funzione miomodulo_output().
Al codice precedente dobbiamo aggiungere una sola riga:

<?php
 
function   miomodulo_output ($arg1) {
  
$output = "Messaggio di prova<br>";
   
$output  .= views_embed_view('vista_di_prova', 'page_1',$arg1);
   return
$output;
}
?>

Dove page_1 è il nome del display_id da visualizzare definito nell'interfaccia della vista.
Per approfondimenti
http://drupal.org/node/48816

Eliminare la data ed il nome utente da una pagina

Come amministratore andare alla pagina delle "impostazioni globali" dei temi. (/admin/build/themes/settings/global)
Per ogni tipo di contenuto presente nella sezione "Mostra le informazioni del contenuto su",
eliminare il segno di spunta sul tipo di contenuto su cui non si vuole mostrare nome e data.

Ripristinare la password di amministratore

Eseguire la query:
UPDATE users SET pass = MD5( 'NUOVAPASSWORD' ) WHERE uid =1;
Per saper il nome associato all'amministratore:
SELECT name FROM users WHERE uid =1;
Ulteriori informazioni possono essere lette direttamente dalla tabella users degli utenti.

Conoscere la directory di ...

global $theme_path

Cosa come
directorydel sito global $base_url
directory di un modulo $path = drupal_get_path('module', 'nomemodulo');
directory di un tema $path = drupal_get_path(theme', 'nometema');
directory di un engine $path = drupal_get_path(theme_engine', 'nomeengine');
directory tema corrente global $theme_path

Utenti: Sapere se un utente appartiene a un ruolo

Per verificare se l'utente corrente appartiene ad uno dei ruoli definiti nella tabella ROLE
definire la seguente funzione:

<?php
/**
* @param $role   Il nome del ruolo da verificare
* @param $user  Oggetto utente
* @return  TRUE se l'utente appartiene al ruolo richiesto , FALSE altrimenti
*/
function user_has_role($role, $user = NULL) {
  if (
$user == NULL) {
    global
$user;
  }
  if (
is_array($user->roles) && in_array($role, array_values($user->roles))) {
    return
TRUE;
  }
  return
FALSE;
}
?>