[RISOLTO ]Disabillitare una voce di menu

11 contenuti / 0 new
Ultimo contenuto
[RISOLTO ]Disabillitare una voce di menu

Salve a tutti,
Ho un problema che credevo semplice, ma temo che mi stia perdendo in un bicchiere d'acqua!!
Ho creato un nuovo menu del tipo:

Miomenu
voce1
voce2
voce3

visualizzato sul footer.
Ho generato un nuovo tipo di contenuto:miotipo.
Ora la voce1 di Miomenu deve essere visibile solo se il contenuto del nodo visualizzato è di tipo miotipo.
Come posso fare, senza disattivare tutto il menu?
Grazie

forse ti conviene usare views, ed aggiungere più filtri...

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Ciao kiuz, forse, però ho provato ad usare la classica funzione phptemplate_menu_item_link($link) in template.php
Ad esempio, senza considerare il tipo nodo, volendo disabilitare una voce , ho provato con

<?php
 
if ($link['menu_name']=="menu-menumiomenu" && $link['title']== t('voce1'))  {
 
$link['hidden']=1;
 }
 
?>

ma "hidden" non funziona. La cosa strana è che se metto :
$link['title']="nuovo titolo" , il titolo viene modificato, quindi la chiamata alla funzione è corretta e ci si passa.

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

Anch'io credo che la soluzione proposta da kiuz sia la strada meno doloroso.
Anche se non hai ancora affrontato la parte difficile (prendere il nid per interrogare il db sul tipo di contenuto), possiamo remediare un pò di codice qui. Ma questo

<?php
 $link
['hidden']
?>
è roba tua?
Il codice di default in includes/menu.inc dice:
function theme_menu_item_link($link) {
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
  return l($link['title'], $link['href'], $link['localized_options']);
}

La funziona l() scrive il link. Quindi se esistono quelli altri proprietà in $link (non lo so, potresti provare a vedere con dsm($link) - e Devel abilitato), allora non devi chiamare l(), altrimenti si.

Però tutti i menù che ho visto io in Drupal sono avolti in <ul><li>. Penso che stai guardando troppo a vale. Vedi theme_menu_tree sempre in includes/menu.inc. E no, non so neanch'io cosa c'è dentro $tree - managgia a questi strutture di dati non documentati...

Più imparo, più dubito.

Ciao jhk,
si è roba mia e sta in template.php, usa sia la funzione di default che hai detto sia la mia.
La scrivo meglio e completa ...

<?php
function phptemplate_menu_item_link($link) {
  if (
$link['menu_name']=="menu-menutest"  && $link['title']== t('voce1')) {
   
$link['hidden']=1;
  }
  return
theme_menu_item_link($link);  // chiama la funzione di default
}
?>

ma non funziona , anche se non capisco perchè.
Probabilmente l'array $link non essendo passata per riferimento non posso modificarla.

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

enzodrup wrote:
si è roba mia e sta in template.php, usa sia la funzione di default che hai detto sia la mia.
La scrivo meglio e completa ...
ma non funziona , anche se non capisco perchè.
Probabilmente l'array $link non essendo passata per riferimento non posso modificarla.

Allora si, non essendo di riferimento non puoi modifiare $link, ma anche se forse possibile?
Se 'inventi' una proprietà (per quello chiedevo se era roba tua) di $link nuovo, perchè il vecchio codice di Drupal dovrebbe riconoscerlo? O 'sapere' cosa farne?
Ho già postato il codice di quel funzione - vedi dove fa il test per $link['hidden']? Neanch'io...

Sequi il consiglio di kiuz, views sono molto potenti per questo tipo di operato. Vedi anche http://drupal.org/project/menu_node_views o http://drupal.org/project/taxonomy_menu

Più imparo, più dubito.

Aspetta mi sono espresso male , è mia la funzione phptemplate_menu_item_link() non il parametro $link['hidden'], quello è di Drupal.
Comunque grazie per il consiglio, se non trovo la soluzione mi orienterò come dite voi sulle views.

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

enzodrup wrote:
Ciao jhk,
si è roba mia e sta in template.php, usa sia la funzione di default che hai detto sia la mia.
La scrivo meglio e completa ...
<?php
function phptemplate_menu_item_link($link) {
  if (
$link['menu_name']=="menu-menutest"  && $link['title']== t('voce1')) {
   
$link['hidden']=1;
  }
  return
theme_menu_item_link($link);  // chiama la funzione di default
}
?>

ma non funziona , anche se non capisco perchè.
Probabilmente l'array $link non essendo passata per riferimento non posso modificarla.

probabilmente è una soluzione che funziona, ma personalmente ho dovuto affrontare un problema simile, con l'aggiunta di un testo aggiuntivo per ogni voce del menu che doveva essere indipendente dal testo del reale contenuto a cui puntava il link...

la soluzione meno dolorosa (cit. Jhon) è senza dubbio views, poi dipende sempre da cosa ci devi fare :)

appena il sito in cui ho affrontato il problema poche righe sopra entra in fase di produzione ti mostro come views probabilmente è la soluzione migliore

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Salve, alla fine ho risolto in questo modo:
1) Ho fatto un piccolo modulo miomodulo.module con dentro la funzione miomodulo_nodeapi che viene invocata quando si visualizza un nodo

<?php
function miomodulo_nodeapi(&$node, $op, $teaser,$page) {
     
$_SESSION['NODE_TYPE_MIOTIPO']="N";
    if (
$node->type == 'miotipo' && $op!='view') {
       
$_SESSION['NODE_TYPE_MIOTIPO']="S";
       }
}
 
?>

2) Ho modificato la funzione phptemplate_menu_item_link($link) in template.php
in modo tale che se si sta elaborando l'item 'voce1' e la variabile di sessione mi dice che il tipo non è miotipo
il link al menu torna vuoto, cioè eliminato, altrimenti torna il valore normale.
<?php
function phptemplate_menu_item_link($link) {
  if ( 
$link['menu_name']=='menu-miomenu'
       
&& $link['link_title']==t('voce1')) {
            if (
$_SESSION['NODE_TYPE_MIOTIPO']=="N")  return '';
    }
return
l($link['title'], $link['href']);
 
?>

Funziona!!
Sarei comunque interessato a capire come risolvere il problema con le View.

P.S.
Ho dovuto mettere una variabile di sessione perchè quando si entra in phptemplate_menu_item_link($link) le informazioni
sul nodo (oggetto $node) non sono disponibili e quindi non conosco $node->type.
Qualcuno sa se c'è modo per conoscerle?

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

Avendo usato grep un pò meglio, trovo che hai ragione - 'hidden' viene usato nel core. Sorry. Ottimo sapere del uso di $_SESSION[]. Per chi c'è l'ha: Pro Drupal Development, Capitolo 16, pp 365. E credevo di aver letto quel libro, sigh. Bravo Enzo

Più imparo, più dubito.

enzodrup: ti sconsiglio VIVAMENTE di usare $_SESSION, gli effetti collaterali che ne conseguiranno saranno catastrofici :D

a parte gli scherzi, fai attenzione che la session se non viene rimossa viene serializzata nel DB portando a una crescita dei dati in tabella che (se in questo caso) è minima, in altre situazioni puà essere disastrosa (io proprio in questi giorni sto litigando con il modulo spam che fa una cosa del genere con effetti devastanti per il DB).

Ciao
Marco
--
My blog
Working at @agavee