primary_linkks

17 contenuti / 0 new
Ultimo contenuto
primary_linkks

Ciao a tutti, per creare un effetto rollover utilizzando la tecnica B.I.R. ho la necessità di aggiungere un tag al codice html che viene generato dall'array $primary_links. Sono alle prime armi in PHP e vi chiedo gentilmente di indicarmi come posso aggiungere questo tag al codice html che genera la variabile $primary_links. Grazie mille a tutti, stò impazzendo....

Bisogna modificare la funzione di theming per gli links dei menù...

In Zen (presumo che riferisci all'altro post http://www.drupalitalia.org/node/10087) questo funzione si trova in template.php:85 function zen_menu_item_link($link)...

Il problema però è che non sai 'chi' sta chiamando questo funzione - potrebb'essere un qualunque menù, non solo 'Primary'.

Io ho avuto la necessità di modificare (aggiungere markup per lightbox) ad un singolo item del menù. Sono andati a cercare quello col path giusto e poi ho aggiunto il codice sempre in quel funzione:

  if ($link['link_path'] == 'node/1841') {
    $link['href'] ='lightbox/processo-non-evento';
    if (empty($link['localized_options']['attributes'])) {
      $link['localized_options']['attributes'] = array();
    }
    $link['localized_options']['attributes']['rel'] = 'lightframe[pne|scrolling: auto;]';
  }

Lo considero un hack - anche delle specie peggiori, perchè inefficiente (a dire poco) ed inelegante... Ma almeno funziona...
Forse qualcun'altro offrirà una soluzione meno puzzolente ;-)

John

Più imparo, più dubito.

Grazie mille jhl, io ho trovato la funzione in template.php:100 questa funzione

function zen_menu_local_tasks() {
  $output = '';
  if ($primary = menu_primary_local_tasks()) {
    $output .= '<ul class="tabs primary clear-block">' . $primary . '</ul>';
  }
  if ($secondary = menu_secondary_local_tasks()) {
    $output .= '<ul class="tabs secondary clear-block">' . $secondary . '</ul>';
  }
  return $output;
}

la $output mi da l'inizio del menu con il tag "<ul>" e la $primary mi restituirà il resto ( "<li><a .........>voce1</a></li>"). Ora dove posso andare per editare il codice html che è proprio di $primary così da poter aggiungere il mio (<li><a .........><span>voce1</span></a></li>)?

Ho anche provato a installare il modulo devel ma smbra non essere cambiato nulla.....

Il duro lavoro fatto con passione, ripaga sempre!!!!

Segui il sorgente, Luke. http://api.drupal.org/api/function/menu_primary_local_tasks/6 poi http://api.drupal.org/api/function/menu_local_tasks/6 dove trovi

$link = theme('menu_item_link', array('href' => $tasks[$p]['href']) + $item);
$tabs_current .= theme('menu_local_task', $link, TRUE);

Quindi zen_menu_item_link() per il primo, e zen_menu_local_task() per il secondo. Il primo ti l'avevo già indicato in questo thread. Il secondo non esiste, quindi usi http://api.drupal.org/api/function/theme_menu_local_task/6 come esempio...

Visto questo? http://www.drupalitalia.org/node/9714

John

Più imparo, più dubito.

Grazie jhl, ti premetto che sono alle primissime armi sia con drupal che in php. In questa pagina "http://www.drupalitalia.org/node/9714" che ho letto al volo, se non ho capito male mi dici di inserire i moduli devil e theme develope e apportare le modifiche che mi indichi al codice di includes/theme.inc giusto? Ultima domanda è come posso poi modificare il codice ed aggiungere i miei tanto sospirati <span>? Scusami della domanda ma veramente sono agli inizi. Grazie mille!!!

Il duro lavoro fatto con passione, ripaga sempre!!!!

Hai letto male ;-)

nextpic wrote:
Grazie jhl, ti premetto che sono alle primissime armi sia con drupal che in php. In questa pagina "http://www.drupalitalia.org/node/9714" che ho letto al volo, se non ho capito male mi dici di inserire i moduli devil e theme develope e apportare le modifiche che mi indichi al codice di includes/theme.inc giusto?

No, solo apportare le modifiche. Ma era solo per far vedere il 'come' Big D fa il rendering. La parte interessante era:
  theme(start): help
    theme(start): menu_item_link
    theme(end): menu_item_link = <a href="/content/fourth-page" class="active">Mostra</a>
    theme(start): menu_local_task
    theme(end): menu_local_task = <li class="active" ><a href="/content/fourth-page" class="active">Mostra</a></li>
    theme(start): menu_item_link
    theme(end): menu_item_link = <a href="/node/61/edit">Modifica</a>
    theme(start): menu_local_task
    theme(end): menu_local_task = <li ><a href="/node/61/edit">Modifica</a></li>
  theme(end): help =

nextpic wrote:
Ultima domanda è come posso poi modificare il codice ed aggiungere i miei tanto sospirati <span>? Scusami della domanda ma veramente sono agli inizi. Grazie mille!!!

Sperimentando in quei funzioni che ti ho indicato...

Più imparo, più dubito.

Mi sono perso.... non ci capisco più nulla... Jhl perdonami se tiu stresso ma mi potresti guidare passo passo su cosa devo fare, come e dove modificare quelle funzioni per mettere i tanto sospirati <span>? Grazie

Il duro lavoro fatto con passione, ripaga sempre!!!!

mi sono letto la documentazione e credo che la funzione che costruisce il menu sia "menu_local_tasks" giusto? Ora è possibile che debba andare a modificare i dati nel database per aggiungere questi cavolo di span....?

Il duro lavoro fatto con passione, ripaga sempre!!!!

Jhl forse ci sono.....+/- ;-). la funzione che devo modificare per aggiongere il mio <span> in modo da avere <a ..........><span>Voce1</span></a>, come mi dicevi tu all'inizio ma io non comprendevo, è la theme_menu_item_link giusto?
Poichè la funzione:

function theme_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
  $class = ($menu ? 'expanded' : ($has_children ? 'collapsed' : 'leaf'));
  if (!empty($extra_class)) {
    $class .= ' '. $extra_class;
  }
  if ($in_active_trail) {
    $class .= ' active-trail';
  }
  return '<li class="'. $class .'">'. $link . $menu ."</li>\n";
}

non mi permettere di inserire <span> se non all'interno del tag <li>.....</li> devo necessariamente lavorare sulla variabile $link e questa è la funzione:
function theme_menu_item_link($link) {
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
  return l($link['title'], $link['href'], $link['localized_options']);
}

come posso ora inserire i tag <span>?
Oppure devo lavorare sulla funzione l di common.inc:1584?
grazie ancora

Il duro lavoro fatto con passione, ripaga sempre!!!!

risolto!!!!!!! Ho modificato la funzione "l" sita in include\common.inc:1584 come segue:

function l($text, $path, $options = array()) {
  global $language;
  // Merge in defaults.
  $options += array(
      'attributes' => array(),
      'html' => FALSE,
    );
  // Append active class.
  if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) &&
      (empty($options['language']) || $options['language']->language == $language->language)) {
    if (isset($options['attributes']['class'])) {
      $options['attributes']['class'] .= ' active';
    }
    else {
      $options['attributes']['class'] = 'active';
    }
  }
  // Remove all HTML and PHP tags from a tooltip. For best performance, we act only
  // if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive).
  if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) {
    $options['attributes']['title'] = strip_tags($options['attributes']['title']);
  }
  return '<a href="'. check_url(url($path, $options)) .'"'. drupal_attributes($options['attributes']) .'>'<strong>.'<span>'</strong>. ($options['html'] ? $text : check_plain($text)) <strong>.'</span>'</strong> .'</a>';
}

Ovviemante il tag <span> verrà inserito su tutti i link.... Può essere un problema?

Il duro lavoro fatto con passione, ripaga sempre!!!!

Ciao nextpic, ho letto il tuo risultato finale. Vorrei solo dirti questo, se mi permetti:
E' buona regola non modificare mai le funzioni nel core del sistema, tipo l() in common.inc come hai fatto tu, sia per il motivo che hai detto , ma soprattutto perchè al prossimo aggiornamento di Drupal che farai non ti funzionerà più niente, visto che il nuovo file common.inc ricoprirà la tua modifica. Allora dovrai rifare le modifiche, ma ti sembra un buon modo di lavorare?
Drupal mette a dispozione trigger , eventi, file template , moduli , impariamo ad usare quelli.
Ciao e buon lavoro

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

Enzodrup grazie per il consiglio, ma come posso allora risolvere il mio problema?

Il duro lavoro fatto con passione, ripaga sempre!!!!

Credo che potresti personalizzare la funzione theme_links() ,che prepara il menu primary_links ed è contenuta in includes/theme.inc.
La copi e la metti nel file template.php chiamandola miotema_links o phptemplate_links.
In questo modo la funzione originale non è toccata ma replicata da un'altra parte, e Drupal le da precedenza rispetto a quella originale che rimane sempre al suo posto.
La funzione theme_links() è chiamata in page.tpl.php, vedi tema Garland. Verifica che il tuo tema usi lo stesso metodo.
Ciao

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

per caso la funzione a cui ti riferisci è questa:

function theme_links($links, $attributes = array('class' => 'links')) {
  global $language;
  $output = '';
  if (count($links) > 0) {
    $output = '<ul'. drupal_attributes($attributes) .'>';
    $num_links = count($links);
    $i = 1;
    foreach ($links as $key => $link) {
      $class = $key;
      // Add first, last and active classes to the list of links to help out themers.
      if ($i == 1) {
        $class .= ' first';
      }
      if ($i == $num_links) {
        $class .= ' last';
      }
      if (isset($link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page()))
          && (empty($link['language']) || $link['language']->language == $language->language)) {
        $class .= ' active';
      }
      $output .= '<li'. drupal_attributes(array('class' => $class)) .'>';
      if (isset($link['href'])) {
        // Pass in $link as $options, they share the same keys.
        $output .= l($link['title'], $link['href'], $link);
      }
      else if (!empty($link['title'])) {
        // Some links are actually not links, but we wrap these in <span> for adding title and class attributes
        if (empty($link['html'])) {
          $link['title'] = check_plain($link['title']);
        }
        $span_attributes = '';
        if (isset($link['attributes'])) {
          $span_attributes = drupal_attributes($link['attributes']);
        }
        $output .= '<span'. $span_attributes .'>'. $link['title'] .'</span>';
      }
      $i++;
      $output .= "</li>\n";
    }
    $output .= '</ul>';
  }
  return $output;
}

in page.tpl.php, nello zen, non c'è la chiamata a theme_links()...

Come dovrei modificare questa funzione in modo da aggiungere il dag <span> solo ai <li> dei primary_links?

Mi viene da dire che se non aggiorno mai drupal, una volta creato il sito, faccio prima.....

Il duro lavoro fatto con passione, ripaga sempre!!!!

Si è quella.
Se usi lo zen è come per il tema Garland: se cerchi bene troverai questo pezzo di codice

            <div id="primary">
              <?php print theme('links', $primary_links); ?>
            </div> <!-- /#primary -->

In Drupal la funzione theme('links', $primary_links) viene risolta in una delle seguenti chiamate; la prima che trova:

  • phptemplate_links($primary_links)
  • miotema_links($primary_links)
  • theme_links($primary_links) che esiste sempre

Inoltre come vedi dalla chiamata la variabile $links della funzione corrisponde al contenuto dell'array $primary_links. Se segui il codice troverai i vari tag <li> e </li> etc e quindi potrai fare le modifiche che riterrai più opportune.
Comunque il mio è solo un consiglio, se pensi di fare prima nell'altro modo, nessuno lo vieta, naturalmente.
Ciao e buon lavoro

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

Mi sono perso scusami. Su quale file trovo il codice da te inserito:

<div id="primary">
              <?php print theme('links', $primary_links); ?>
            </div> <!-- /#primary -->

e su quali file posso trovare le chiamate di funzione che mi indichi? MI potresti spiegare come posso seguire il codice? (sono alle primissime armi).

Io ho provato a girovagare per il codice, ma l'unica funzione che ho trovato che mi permette di modificare $link è la funzione "l". Io lo spam lo devo inserire all'interno del tag <a>, così: <li .......><a......><span>Home Page</span></a></li>. Non riesco a capire cosa altro possa fare...

Il duro lavoro fatto con passione, ripaga sempre!!!!

Quote:
Su quale file trovo il codice da te inserito
Sul file page.tpl.php del tema zen
Quote:
e su quali file posso trovare le chiamate di funzione che mi indichi?
Quelle funzioni non esistono, le devi creare tu. Se le crei Drupal non usa la sua funzione theme_links() ma una delle tue.
Però si devono chiamare nel modo che Drupal vuole e sa riconoscere:

  • themename_links(), quindi nel tuo caso: zen_links()
  • enginename_links(), quindi nel tuo caso: phptemplate_links()

e generalmente si mettono nel file template.php della directory del tuo tema.

Però forse ti sto confondendo le idee , mi spiace.
Se la tua modifica alla funzione l() , funziona usa quella.
Poi però studia un po' la "tematizzazione delle funzioni", cerca di capire bene come funziona quella funzione l() etc etc. Leggi qui , http://drupal.org/node/173880 o nella documentazione di drupalitalia.
Ciao

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it