[RISOLTO] Un token per il path dell'utente che si sta vedendo...

6 contenuti / 0 new
Ultimo contenuto
[RISOLTO] Un token per il path dell'utente che si sta vedendo...

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?

Versione 2...

<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:

Purtroppo il tuo codice al punto 2 mi da WSOD. continuo a indagare ma non capisco bene perchè.

Questo perchè non avevo testato, scusa.
<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:

[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?


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:

  • ho inserito !is_null(arg(1)) e tutto fila liscio (per ora); per quanto belt and braces mi sembra una condizione non superflua
  • ho un po' modificato il tuo codice per la generazione dei token perchè interferiva con i prefissi di lingua e perchè mi serve in realtà solo l'alias dell'account utente. quindi
    $values['account-contact'] = $account->uid ? url("user/$account->uid/contact") : '';

    è diventato
    $values['account-alias'] = $account->uid ? drupal_get_path_alias("user/$account->uid") : '';
  • inoltre, grazie alla modifica in custom_breadcrumb.module, tutti i token di tipo "user" hanno ora un comportamento più coerente e quindi posso utilizzare, ad esempio, [user] per ottenere l'username dell'utente di cui si sta vedendo il profilo
  • mi rimane un dubbio: posso sovrascrivere la funzione function 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?
  • per quanto riguarda la tua domanda, il mio obiettivo era collegare il breadcrumb del nome utente con il suo profilo nella pagina di contatto e quindi ho creato un custom BC per il path 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 :)

<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:
Allora:
ho inserito !is_null(arg(1)) e tutto fila liscio (per ora); per quanto belt and braces mi sembra una condizione non superflua

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...

<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:
ho un po' modificato il tuo codice per la generazione dei token perchè interferiva con i prefissi di lingua e perchè mi serve in realtà solo l'alias dell'account utente. quindi
$values['account-contact'] = $account->uid ? url("user/$account->uid/contact") : '';

è diventato
$values['account-alias'] = $account->uid ? drupal_get_path_alias("user/$account->uid") : '';

Mi sa che Obiwan la conoscienza del Yoda superando sta ...

<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:
inoltre, grazie alla modifica in custom_breadcrumb.module, tutti i token di tipo "user" hanno ora un comportamento più coerente e quindi posso utilizzare, ad esempio, [user] per ottenere l'username dell'utente di cui si sta vedendo il profilo

mi rimane un dubbio: posso sovrascrivere la funzione function 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?


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)
<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:
per quanto riguarda la tua domanda, il mio obiettivo era collegare il breadcrumb del nome utente con il suo profilo nella pagina di contatto e quindi ho creato un custom BC per il path 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

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&#039; at syger</a></div>
quindi lui prende l'URL interno ed applica l'alias: <a href="/users/syger">Lookin&#039; at syger</a> così mi sembra, caro Obiwan, che anche il tuo token account-alias è superfluo

Più imparo, più dubito.