non riesco a trovare o definire un token per l'URL dell'utente del quale sto vedendo il profilo.
Mi spiego:
il modulo custom_breadcrumbs permette di costruire le briciole di pane sulla base di diversi parametri tra cui, appunto, i token.
come spesso accade alla pagina del profilo utente ho alcune tabs come ad esempio "contact".
Ora, io vorrei che
1 - quando il visitatore (anonimo o loggato) si trova alla pagina del profilo i breadcrumb sono del tipo home >> persone >> tizio
2 - quando il visitatore si trova nella tab "contact" i breadcrumbs dovrebbero essere home >> persone >> tizio >> contatto
; inoltre in quest'ultimo breadcrumb il nome utente dovrebbe essere linkato alla pagina del profilo, ovvero quella al punto 1.
Purtroppo tutti i token di tipo "user" forniscono informazioni relative all'utente loggato e non all'utente di cui sto vedendo il profilo...
Per il momento ho risolto con drupal_set_breadcrumb() ma vorrei sapere se si può ottenere anche con un token....
grazie in advance
Presumo che stai usando la 6.x-2.0-beta3. Mi sa che non c'è - per due motivi.
1. In sites/all/modules/token/token_user.inc non viene creato un token per la pagina contatto. Per l'account [account-url], ed editing [account-edit] si, ma non per il contatto. Ma forse qualche altro modulo lo fa...
Questo puoi sistemare con un modulo tuo, aggiungendo il token necessario:
/**
* Implementation of hook_token_values().
*/
function MIOMODULO_token_values($type, $object = NULL, $options = array()) {
$values = array();
switch ($type) {
case 'user':
if (isset($object)) {
$account = $object;
}
else {
global $user;
$account = user_load(array('uid' => $user->uid));
}
$values['account-contact'] = $account->uid ? url("user/$account->uid/contact") : '';
break;
}
return $values;
}
/**
* Implementation of hook_token_list().
*/
function MIOMODULO_token_list($type = 'all') {
if ($type == 'user' || $type == 'all') {
$tokens['user']['account-contact'] = t("The URL of the user's contact page.");
return $tokens;
}
}
2. Il modulo cc legge l'oggetto sbagliato (nel tuo caso). In sites/all/modules/custom_breadcrumbs/custom_breadcrumbs.module c'è una funzione custom_breadcrumbs_token_types che aggiunge l'oggetto $user se viene usato un token del tipo user. Ma $user è sempre l'utente loggato.
Non sembra che questo è stato osservato o richiesto nel issue queue. Strano.
Prova cambiare il codice da:
function custom_breadcrumbs_token_types($objs = array()) {
if (!isset($objs['user'])) {
global $user;
if ($user->uid) {
$user = user_load(array('uid' => $user->uid));
}
$objs['user'] = $user;
}
$objs['global'] = NULL;
return $objs;
}
a:
function custom_breadcrumbs_token_types($objs = array()) {
if (!isset($objs['user'])) {
global $user;
$account = $user;
if (arg(0) == 'user' && isset(arg(1)) && is_numeric(arg(1))) {
$account = user_load(array('uid' => arg(1)));
}
else if ($user->uid) {
$account = user_load(array('uid' => $user->uid));
}
$objs['user'] = $account;
}
$objs['global'] = NULL;
return $objs;
}
HTH
John
Più imparo, più dubito.
Ciao John, grazie!
avevo già provato il punto 1 ma mi era completamente sfuggito il punto 2 (ecco perchè non funzionava!).
Purtroppo il tuo codice al punto 2 mi da WSOD. continuo a indagare ma non capisco bene perchè.
mannaggia!
[EDIT]: la causa del WSOD è questa:
array(4) { ["type"]=> int(64) ["message"]=> string(48) "Can't use function return value in write context" ["file"]=> string(73) "(...)/sites/all/modules/custom_breadcrumbs/custom_breadcrumbs.module" ["line"]=> int(484) } n/a
la riga 484 è questa:
if (arg(0) == 'user' && isset(arg(1)) && is_numeric(arg(1))) {
[EDIT II] sembra che il problema sia in questa condizione:
isset(arg(1))
rimuovendola tutto funziona (almeno per ora):
if (arg(0) == 'user' && is_numeric(arg(1))) {
in realtà, quando servirebbe quella condizione? solo alla pagina di login credo: miosito/user. o no?
Certified to Rock
Versione 2...
Questo perchè non avevo testato, scusa.
Si probabilmente va bene così. Non dovevo usare
isset(arg(1))
, ma!is_null(arg(1))
Il test in più e semplicemente "belt and braces" (cinture e brattelle)La condizione serve quando stai guardando una pagina utente (user/*) allora così prende il uid della pagina e non quello del utente loggato - il motivo perchè dicevo che stava prendendo l'oggetto sbagliato (nel tuo caso).
P.S. Ho provato testare, ma non conoscendo cc non ero riuscito a creare il breadcrumb per user/* - cos'hai usato?
Più imparo, più dubito.
Allora:
!is_null(arg(1))
e tutto fila liscio (per ora); per quanto belt and braces mi sembra una condizione non superflua$values['account-contact'] = $account->uid ? url("user/$account->uid/contact") : '';
è diventato
$values['account-alias'] = $account->uid ? drupal_get_path_alias("user/$account->uid") : '';
[user]
per ottenere l'username dell'utente di cui si sta vedendo il profilofunction custom_breadcrumbs_token_types()
in un mio modulo o devo per forza patchare il modulo custom_breadcrumbs? nel secondo caso: pensi che valga la pena di proporre un patch nella issue queue?persone/*/contact
fatto cosìTitles:
-------
Persone
[user]
Contatto
Paths:
-------
persone
[account-alias]
<none>
Dimenticavo: per usare le wildcards (*) bisogna attivare un'opzione apposita in admin/settings/custom-breadcrumbs
Grazie ancora :)
Certified to Rock
forse lo è superfluo perche credo che is_numeric() restruisce FALSE se il variabile è NULL. Ma dovro leggere un pò di documentazioni...
EDIT: Letto, sembra davvero superfluo...
Mi sa che Obiwan la conoscienza del Yoda superando sta ...
Purtroppo devi patchare - non puoi creare due funzioni con la stessa nome. Con un pò più testing forse vale la pena offrirlo come patch (ma mi sembra un errore così grossolana, che è strano che nessuno l'hai mai notato prima)
Denghiù.
EDIT: Io ho notato due cose:
1. CC non segue l'URL interno di Drupal (user/1) ma quello del alias (users/syger) - mi sembra problematico questo. OK, devo fare il CC path users/* suppongo (ed anche user/*)
2. Mettendo:
Specific Path:
-------
user/*
Titles:
-------
USER
Lookin' at [user]
Paths:
-------
user
user/[uid]
non cambia niente per users/syger (user/1), ma per user/21/contact scrive:
<div class="breadcrumb"><a href="/">Home</a> › <a href="/user">USER</a> › <a href="/users/syger">Lookin' at syger</a></div>
quindi lui prende l'URL interno ed applica l'alias:
<a href="/users/syger">Lookin' at syger</a>
così mi sembra, caro Obiwan, che anche il tuo token account-alias è superfluoPiù imparo, più dubito.