Inserire gli attributi accesskey per i primary link

Sempre più spesso si sente parlare di accessibilità, degli enormi vantaggi che derivano dal suo utilizzo e sopratutto dalla necessità dei siti della PA di rispettare le regole che sono inserite nella famosa legge Stanca che obbligano a rispettare le direttive WAI (o per lo meno dovrebbe essere così, anche se vedendo alcuni siti.. ma lasciamo perdere, non voglio entrare in polemica).
Una tra le varie caratteristiche che devono essere presente nel sito è la necessità che i link (per lo meno i più importanti) abbiano l'attributo accesskey che permette ai diversamente abili di poter visitare il link senza doverlo selezionare con un mouse, ma semplicemente il tasto della tastiera corrispondente alla lettera che è stata assegnata.
Ovviamente non è possibile che all'interno della stessa pagina ci siano due attributi accesskey con lo stesso valore, così come l'attributo accesskey deve essere facilmente comprensibile e collegabile al link. Per poter facilmente capire qule è l'accesskey spesso
si ricorre ad un piccolo stratagemma, ovvero di inserire la lettera corrispondente tra parentesi quadre. Noi sfrutteremo proprio questa peculiarità per la gestione degli accesskey.
Per oggi ci limitiamo a inserire l'attributo per i primary e secondary link, più avanti vedremo come applicare questo anche ai menu.
Come prima cosa apriamo il file template.php presente nella directory del nostro tema e, se non è già presente una funzione che si chiama nometema_links dove, ovviamente, nometema è il nome del tema che state utilizzando. Se così non fosse copiate al suo interno il seguente codice e modificate nometema con il nome del vostro tema.function nometema_links($links, $attributes = array('class' => 'links')) {
$output = '';
if (count($links) > 0) {
$output = '<ul'. drupal_attributes($attributes) .'>';
$num_links = count($links);
$i = 1;
foreach ($links as $key => $link) {
$class = '';
if (isset($link['attributes']) && isset($link['attributes']['class'])) {
$link['attributes']['class'] .= ' ' . $key;
$class = $key;
}
else {
$link['attributes']['class'] = $key;
$class = $key;
}
$extra_class = '';
if ($i == 1) {
$extra_class .= 'first ';
}
if ($i == $num_links) {
$extra_class .= 'last ';
}
$output .= '<li class="'. $extra_class . $class .'">';
$html = isset($link['html']) && $link['html'];
$link['query'] = isset($link['query']) ? $link['query'] : NULL;
$link['fragment'] = isset($link['fragment']) ? $link['fragment'] : NULL;
if (isset($link['href'])) {
$output .= l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], FALSE, $html);
}
else if ($link['title']) {
if (!$html) {
$link['title'] = check_plain($link['title']);
}
$output .= '<span'. drupal_attributes($link['attributes']) .'>'. $link['title'] .'</span>';
}
$i++;
$output .= "</li>\n";
}
$output .= '</ul>';
}
return $output;
}
Dopo aver inserito questo codice salvate il file e controllate che aprendo una qualsiasi pagina del vostro sito (in cui sono presenti dei primary o secondary link non vi siano errori. Se tutto è andato bene possiamo proseguire andando a modificare la riga $output .= l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], FALSE, $html);
con il seguente codice$pos_start = strrpos($link['title'], '[');
$output .= l($link['title'],
$link['href'],
($pos_start) ? $link['attributes'][] = array('accesskey' => strtolower($link['title']{$pos_start + 1})) : $link['attributes'],
$link['query'],
$link['fragment'],
FALSE,
$html);
Ora per abilitare l'accesskey ai menu è sufficiente andare nella sezione di amministrazione, nella sezione del menu e modificare le voci per cui vogliamo attivare l'accesskey, ponendo la lettera che deve essere utilizzata come valore dell'attributo tra parentesi quadre.

Vediamo ora che lettera usare e come visualizzarla.

Innanzitutto è preferibile utilizzare lettere che abbiano attinenza con il link, quindi se per esempio vogliamo visualizzare il link al Forum potremmo scegliere la lettera F, così come per la Home Page una buona scelta sarebbe la H, la E per l'e-mail dell'amministratore e così via. Ovviamente bisogna ricordarsi che non possono essere due lettere uguali, quindi se usiamo la E per il link Esempi non possiamo utilizzarlo per e-mail e così via.
Per la visualizzazione potremmo non volere visualizzare la lettera da utilizzare, visto che con alcuni browser l'evidenziazione delle lettere dell'accesskey avviene in automatico, ma non è l'atteggiamento da preferire, sono invece preferibili le seguenti strade:

  • Porre la lettera tra parentesi quadre prima del nome del link (per esempio [F] Forum)
  • Porre la lettera tra parentesi quadre dopo del nome del link (per esempio Forum [F])
  • Porre la lettera tra parentesi quadre nel nome del link (per esempio [F]orum)

La scelta è a discrezione dell'amministratore del sito. Prossimamente vedremo come rimuovere la lettera tra parentesi all'interno del link (cosa che sconsiglio fortemente) e come andare a far si che appaiano gli accesskey anche per i menu.

Comments

Ciao, ma vale anche per

Ciao, ma vale anche per drupal 5? Perche' a me non funziona...

piu' che altro non ho

piu' che altro non ho proprio capito in che modo aggiungere l' attributo.
Nella pagina per l' amministrazionde dei menu posso solo modificare titolo, descrizione, percorso e peso...

Si, funziona anche su Drupal

Si, funziona anche su Drupal 5.3 (come questo sito :) ); prova a scrivere un titolo con una lettera (o un numero) racchiuso tra [ e ], per esempio:Home Page [h]

niente da fare

continua a non funzionare... :-/

nel mio file template.php e' presente una funziona phptemplate_links.
Ho provato a modificare il codice di quella, ma non funziona.
Ho provato a creare la funzione nomedelmiotema_links, ma nn funziona...

Deve funzionare,

probabilmente il tuo tema fa qualche cosa di strano, prova a inserire (o mandami per mail) il pezzo di phptemplate con il codice e vediamo dove è il problema.

Il tema e' questo:

Il tema e' questo: http://drupal.org/project/barron

O per lo meno, la base, poi sto facendo alcune modifiche, ma solo a livello di html e css, non penso sia questo il problema.

Allora...

tagliando la testa al toro ho provato con lo stesso tuo tema, il garland, e... continua a non funzionare. Quindi il problema e' da ricercare altrove. Ma dove?

Ecco quello che io ho fatto:

Ho editato il file template.php del tema garland e ho inserito la funzione

function garland_links($links, $attributes = array('class' => 'links'))

contente il codice da te postato, poi ho modificato la riga di $output e salvato.

I nomi dei primary links sono:

[h] home, [i] info, [c] contatti

ma l' attributo accesskey non viene aggiunto al codice.

Dove sbaglio?

Nessuno e' in grado di dirmi

Nessuno e' in grado di dirmi come mai, nonostante la mia procedura, non vengano attivati?

Mandami per mail il tema

Mandami per mail il tema zippato che vedo se trovo il problema, purtroppo senza avere la minima idea del codice che stai usando la cosa risulta un pò difficile :P

C'e' il link del tema nei

C'e' il link del tema nei miei commenti precedenti! E comunque, ho provato pure col tuo stesso tema, il garland, quindi, il problema e' altrove.

hemm...

Si, ma al tema hai detto di aver apportato delle modifiche, se mi mandi il tema con le modifiche controllo che qualcuna delle modifiche che hai apportato non crei problemi. ti posso garantire che il codice che ho inserito funziona con Garland (puoi vederlo tu stesso), ripeto, se mi mandi il pacchetto con il tema che usi tu (con le tue modifiche) che non funziona ci do un occhio.

:)

Io lo vedo che a te funziona con garland, ma a me no :)

Quindi per questo ti chiedevo di guardare la mia produra per capire dove sbaglio. Con la procedura che ho descritto in qualche commento precedente con drupal appena estratto, e tema garland non modificato, a me non crea i giusti attributi...

Boh, va beh, alla fine per soli 4 link, mi sa che li mettero' a mano direttamente nel template, e faccio prima :)

Trovato l'inghippo!

Ci ho messo un pò, ma alla fine il problema è stato trovato, metti uno spazio all'inizio e in questo modo dovrebbe andare tutto (in pratica la [ non può essere il primo carattere del contenuto, altrimenti la condizione if vede il risultato come falso... vedrò di ovviare prossimamente).

acceskey

Mavino,
ho letto quanto hai scritto per gli accessskey.
Attento,però, l'uso delle lettere non è sempre indicato: spesso entrano in conflitto con le combinazioni degli screen reader.
A parte l'H che per convenzione identifica la Home page, per gli altri, secondo il parere di diversi esperti in accessibilità è meglio usare i numeri e spesso suggeriscono molta parsimonia.
Ciao, grazie per l'ottimo lavoro

Ciao Luisa,

Purtroppo quello che dice è vero, anche se PURTROPPO non esiste una vera convenzione per l'associazione tra lettere/numeri e funzionalità, quindi la cosa è abbastanza complicata. In ogni caso sto sviluppando un modulo per Drupal che si integri e permetta di inserire direttamente gli accesskey e creerà una mappa riassuntiva dei vari accesskey disponibili e le diverse funzionalità che offrono... purtroppo il tempo è tiranno :|

Grazie comunque per il commento ;)

Ottimo!

Ottimo il tuo post!
Forse si potrebbe anhce creare un modulo apposito che permetta l'inserimento delle acceskeys direttamente durante la creazione dei Menu (forse tramite l'hook form_alter() .. che ne dici?)

In ogni caso grazie per il commento sul mio "modulo" Iconizer, fammi sapere se hai trovato qualche problema o bug (ps: ho aggiunto qualche altra icona, tra cui lo stesso Iconizer e GoogleAnalytics)!

Ciao!

Ci penserò, anche se non

Ci penserò, anche se non assicuro nulla ;)
Per quanto riguarda l'inserimento direttamente nelle voci del menù è facilmente fattibile, il problema è che non si possono avere accesskey duplicati, quindi un menu che complessivamente deve avere meno di 36 voci è un pò piccolo, per questo sto lavorando per generare gli accesskey dinamicamente, in questo modo ci si limita a un 36 voci di menu visibili per volta (limite decisamente più accettabile).

ciao

ottimo!

davvero un bel tutorial, grazie!

Grazie a te per essere

Grazie a te per essere passato...

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <table> <td> <tr> <img> <h2> <h3>
  • Lines and paragraphs break automatically.

More information about formatting options

Syndicate content