2010-07-28 6 views
5

Mi sto tirando fuori i capelli cercando di capirlo. Non riesco a far funzionare correttamente Bootstrap al di fuori della directory di Drupal. Funziona bene se eseguo questo codice nella directory Drupal, ma un livello superiore non funziona.Drupal - utilizzo di boostrap per controllare che l'utente che ha effettuato l'accesso al di fuori di Drupal non funzioni

Il mio percorso Drupal è/public_html/drupal /. Lo script che sto utilizzando è in/public_html.

$ utente non sta restituendo l'utente connesso. Ho verificato che non si tratti di un problema interdominio (ad esempio, www.dominio.com e dominio.com).

chdir('/path/to/drupal'); 

include_once('./includes/bootstrap.inc'); 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 
global $user; 

if ($user->uid) { 
    print "Logged in"; 
} else { 
    print "Logged out"; 
} 
+0

Penso che si possa fare un drupal_bootstrap (BOOTSTRAP_SESSION). Dovrebbe essere molto più veloce. – gagarine

risposta

6

Se la u. ser non è riconosciuto da Drupal nel tuo script separato, è molto probabile che non riceva il cookie di sessione corretto. Dovresti controllare i cookie impostati dalla normale installazione di Drupal e vedere se vengono inviati anche al tuo script. In caso contrario, controlla la variabile $cookie_domain nelle impostazioni di Drupals.php - normalmente è commentato, ma potresti aver bisogno di impostarlo esplicitamente nel tuo caso.

+0

Grazie! Imposta $ cookie_domain su "mydomain.com" e ha funzionato come un incantesimo! –

+0

Grazie. Non l'avrei mai trovato!Il mio script è sullo stesso dominio, quindi perché cookie_domain dovrebbe essere impostato in modo errato è un mistero. Veniva impostato su ".example.org" (si noti l'interlinea.), E bisognava correggerlo per far funzionare gli altri script. – artfulrobot

2

Drupal utilizza un sacco di magia pesante per capire quale ambiente da utilizzare: in parte perché ci potrebbero essere più siti nella stessa Drupal installare.

Una cosa che ti manca è $base_url. Questo deve essere impostato sull'URL del sito Drupal che vuoi boostrap (ad esempio $base_url = "http://example.com").

L'altra cosa che incontrerai, ma sembra che tu ce l'abbia già fatta, è che lo script e Drupal devono avere lo stesso FQDN. Inserire lo script su http://foo.example.com e avere Drupal live su http://example.com non funzionerà. Quindi, a meno che Drupal non sia su http://example.com/drupal e il tuo script stia vivendo su http://example.com, lo script restituirà sempre l'oggetto utente anonimo.


Modifica

È potrebbe avere lo script in un nome di dominio completo che non è la stessa di Drupal (come, ad esempio, avere un sito Drupal in http://drupal.example.com che punta a /var/www/drupal e avere lo script a http://external.example.com/test.php che punta a /var/www/test.php, ma, in questo caso, avresti bisogno di aver effettuato l'accesso a http://external.example.com/drupal invece di http://drupal.example.com

+0

Ne hai bisogno prima del bootstrap.inc include. Drupal lo utilizza durante il bootstrap per determinarne l'ambiente. –

+0

Hmm - la variabile '$ base_url' dovrebbe essere definita nel file settings.php, che viene letta dalla logica di bootstrap, quindi non ci dovrebbe essere bisogno di definirlo/sovrascriverlo nello script. –

+0

$ base_url deve essere definito in modo esplicito in settings.php; altrimenti, Drupal suppone basato su $ _SERVER ['HTTP_HOST'], che non verrà impostato correttamente per uno script al di fuori della directory Drupal. Impostandolo nello script, l'installazione di Drupal rimane intatta. Questo è particolarmente utile quando hai un sito, http://example.com, in/var/www/drupal, e il tuo script è http://foo.com/script.php che punta a/var/www/script .php. –