News:

Want to get involved in developing SMF, then why not lend a hand on our github!

Main Menu

Modifica menu a capo, su più linee

Started by OS, January 23, 2013, 12:02:21 PM

Previous topic - Next topic

OS

C'è un modo semplice per mettere il menu su più linee??

Una cosa del tipo:

Index - Ricerca - Profilo - MP - ... - Esci
(a capo)
Amministra - Modera - ...


Magari recuperando i bottoni singoli, o modificando la funzione e crearne un'altra per avere dei bottoni specifici per ognuna (solo che non so né come, né da che parte iniziare : P).


Grazie.
SMF 2.0.x

emanuele

In teoria non dovrebbe essere molto difficile (poi ovviamente tutto si può complicare a piacimento! :P), ho visto almeno un tema che lo fa:
http://www.skinmod.eu/index.php?topic=2581.0
non ho guardato come ottiene l'effetto, ma magari puoi prendere spunto. ;)


Take a peek at what I'm doing! ;D




Hai bisogno di supporto in Italiano?

Aiutateci ad aiutarvi: spiegate bene il vostro problema: no, "non funziona" non è una spiegazione!!
1) Cosa fai,
2) cosa ti aspetti,
3) cosa ottieni.

OS

Quote from: emanuele on January 24, 2013, 06:00:57 AM
In teoria non dovrebbe essere molto difficile (poi ovviamente tutto si può complicare a piacimento! :P), ho visto almeno un tema che lo fa:
http://www.skinmod.eu/index.php?topic=2581.0
non ho guardato come ottiene l'effetto, ma magari puoi prendere spunto. ;)

Grazie, ho dato un'occhiata, ma in pratica non hanno fatto altro che aggiungere un if che discrimina se il pulsante ha un sottomenu oppure no, nel primo caso va nella seconda riga, altrimenti risulta in prima...

SMF 2.0.x

emanuele

E' quel che farei anch'io.
Tu avevi in mente qualcosa di diverso?


Take a peek at what I'm doing! ;D




Hai bisogno di supporto in Italiano?

Aiutateci ad aiutarvi: spiegate bene il vostro problema: no, "non funziona" non è una spiegazione!!
1) Cosa fai,
2) cosa ti aspetti,
3) cosa ottieni.

OS

Quote from: emanuele on January 24, 2013, 08:27:45 AM
E' quel che farei anch'io.
Tu avevi in mente qualcosa di diverso?

Così facendo non si avrebbe un reale controllo e alcuni pulsanti che vorrei in prima linea (es.: messaggi privati) andrebbero automaticamente in seconda.


Non si potrebbe discriminare direttamente partendo dal nome dei singoli pulsanti??


SMF 2.0.x

OS

Ho fatto una pazzia, "pazzia" perché mi sembra fin troppo semplice come soluzione (già solo per il fatto che sia mia +_+), quindi la domanda che sorge spontanea è: qualche errore, qualche rischio di appesantimento del forum, ho dato inizio alla fine del mondo con un mese di ritardo?? °_°

Preso:
foreach ($context['menu_buttons'] as $act => $button)
{


Aggiunto sotto:

$sup = array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout');
if (in_array($act, $sup))
{


poi copiato tutto il codice da:
echo '
<div id="main_menu">
<ul class="dropmenu" id="menu_nav">';

foreach ($context['menu_buttons'] as $act => $button)


a:
echo '
</ul>
</div>';


e l'ho raddoppiato cambiando i nomi dei pulsanti dell'array con quelli da fare uscire in seconda linea.


Visivamente la cosa sembra funzionare, bisogna solo vedere se regge anche a livello di codice...
SMF 2.0.x

emanuele

E' sostanzialmente quello che avrei fatto io. ;)

Unica cosa, se ho capito bene hai fatto qualcosa tipo:
$sup = array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout');
if (in_array($act, $sup))
{

}

$sup = array('admin', 'moderate', '...altro...');
if (in_array($act, $sup))
{

}


dato che hai solo due righe puoi semplicemente fare:
$sup = array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout');
if (in_array($act, $sup))
{

}
else
{

}


Take a peek at what I'm doing! ;D




Hai bisogno di supporto in Italiano?

Aiutateci ad aiutarvi: spiegate bene il vostro problema: no, "non funziona" non è una spiegazione!!
1) Cosa fai,
2) cosa ti aspetti,
3) cosa ottieni.

OS

Quote from: emanuele on January 25, 2013, 03:40:26 AM
E' sostanzialmente quello che avrei fatto io. ;)

Unica cosa, se ho capito bene hai fatto qualcosa tipo:
$sup = array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout');
if (in_array($act, $sup))
{

}

$sup = array('admin', 'moderate', '...altro...');
if (in_array($act, $sup))
{

}


dato che hai solo due righe puoi semplicemente fare:
$sup = array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout');
if (in_array($act, $sup))
{

}
else
{

}


Il problema è che c'è una parte esterna dopo il primo if, quella che chiude <ul> e apre il "nuovo" menu.

echo '
</ul>
</div>';


echo '
<div id="main_menu2">
<ul class="dropmenu2" id="menu_nav">';

foreach ($context['menu_buttons'] as $act => $button)
{
$inf = array('database', 'media', 'admin', 'moderate');
if (in_array($act, $inf))
{



In pratica raddoppio tutto il codice e cambio solo il contenuto dell'array.

function template_menu()
{
global $context, $settings, $options, $scripturl, $txt;

echo '
<div id="main_menu">
<ul class="dropmenu" id="menu_nav">';

foreach ($context['menu_buttons'] as $act => $button)
{
$sup = array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout');
if (in_array($act, $sup))
{
echo '
<li id="button_', $act, '">
<a class="', $button['active_button'] ? 'active ' : '', 'firstlevel" href="', $button['href'], '"', isset($button['target']) ? ' target="' . $button['target'] . '"' : '', '>
<span class="', isset($button['is_last']) ? 'last ' : '', 'firstlevel">', $button['title'], '</span>
</a>';
if (!empty($button['sub_buttons']))
{
echo '
<ul>';

foreach ($button['sub_buttons'] as $childbutton)
{
echo '
<li>
<a href="', $childbutton['href'], '"', isset($childbutton['target']) ? ' target="' . $childbutton['target'] . '"' : '', '>
<span', isset($childbutton['is_last']) ? ' class="last"' : '', '>', $childbutton['title'], !empty($childbutton['sub_buttons']) ? '...' : '', '</span>
</a>';
// 3rd level menus :)
if (!empty($childbutton['sub_buttons']))
{
echo '
<ul>';

foreach ($childbutton['sub_buttons'] as $grandchildbutton)
echo '
<li>
<a href="', $grandchildbutton['href'], '"', isset($grandchildbutton['target']) ? ' target="' . $grandchildbutton['target'] . '"' : '', '>
<span', isset($grandchildbutton['is_last']) ? ' class="last"' : '', '>', $grandchildbutton['title'], '</span>
</a>
</li>';

echo '
</ul>';
}

echo '
</li>';
}
echo '
</ul>';
}
echo '
</li>';
}
}

echo '
</ul>
</div>';


echo '
<div id="main_menu2">
<ul class="dropmenu2" id="menu_nav">';

foreach ($context['menu_buttons'] as $act => $button)
{
$inf = array('database', 'media', 'admin', 'moderate');
if (in_array($act, $inf))
{
echo '
<li id="button_', $act, '">
<a class="', $button['active_button'] ? 'active ' : '', 'firstlevel" href="', $button['href'], '"', isset($button['target']) ? ' target="' . $button['target'] . '"' : '', '>
<span class="', isset($button['is_last']) ? 'last ' : '', 'firstlevel">', $button['title'], '</span>
</a>';
if (!empty($button['sub_buttons']))
{
echo '
<ul>';

foreach ($button['sub_buttons'] as $childbutton)
{
echo '
<li>
<a href="', $childbutton['href'], '"', isset($childbutton['target']) ? ' target="' . $childbutton['target'] . '"' : '', '>
<span', isset($childbutton['is_last']) ? ' class="last"' : '', '>', $childbutton['title'], !empty($childbutton['sub_buttons']) ? '...' : '', '</span>
</a>';
// 3rd level menus :)
if (!empty($childbutton['sub_buttons']))
{
echo '
<ul>';

foreach ($childbutton['sub_buttons'] as $grandchildbutton)
echo '
<li>
<a href="', $grandchildbutton['href'], '"', isset($grandchildbutton['target']) ? ' target="' . $grandchildbutton['target'] . '"' : '', '>
<span', isset($grandchildbutton['is_last']) ? ' class="last"' : '', '>', $grandchildbutton['title'], '</span>
</a>
</li>';

echo '
</ul>';
}

echo '
</li>';
}
echo '
</ul>';
}
echo '
</li>';
}
}

echo '
</ul>
</div>';


}



SMF 2.0.x

emanuele

Prova così.

function template_menu()
{
global $context, $settings, $options, $scripturl, $txt;

$menu_items = array();
// Qui sotto elenchi quello che va nei due (o più) livelli
$menu_levels = array(
'inf' => array('database', 'media', 'admin', 'moderate'),
'default' => array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout')
);
$count = 1;

// Questo fa in modo che l'ordine finale non dipenda da altri fattori.
foreach (array_reverse(array_keys($menu_levels)) as $key)
$menu_items[$key] = array();

// Riordina i menù a seconda di quanto impostato sopra. Default è il livello più alto in questo caso
foreach ($context['menu_buttons'] as $act => $button)
foreach ($menu_levels as $key => $menus)
if (in_array($act, $menus) || $key == 'default')
$menu_items[$key][$act] = $button;

// Ed infine fuori tutti i menù
foreach ($menu_items as $key => $menus)
{
echo '
<div id="main_menu"', $count == 1 ? '' : $count, '>
<ul class="dropmenu', $count == 1 ? '' : $count, '" id="menu_nav">';

foreach ($menus as $act => $button)
{
echo '
<li id="button_', $act, '">
<a class="', $button['active_button'] ? 'active ' : '', 'firstlevel" href="', $button['href'], '"', isset($button['target']) ? ' target="' . $button['target'] . '"' : '', '>
<span class="', isset($button['is_last']) ? 'last ' : '', 'firstlevel">', $button['title'], '</span>
</a>';
if (!empty($button['sub_buttons']))
{
echo '
<ul>';

foreach ($button['sub_buttons'] as $childbutton)
{
echo '
<li>
<a href="', $childbutton['href'], '"', isset($childbutton['target']) ? ' target="' . $childbutton['target'] . '"' : '', '>
<span', isset($childbutton['is_last']) ? ' class="last"' : '', '>', $childbutton['title'], !empty($childbutton['sub_buttons']) ? '...' : '', '</span>
</a>';
// 3rd level menus :)
if (!empty($childbutton['sub_buttons']))
{
echo '
<ul>';

foreach ($childbutton['sub_buttons'] as $grandchildbutton)
echo '
<li>
<a href="', $grandchildbutton['href'], '"', isset($grandchildbutton['target']) ? ' target="' . $grandchildbutton['target'] . '"' : '', '>
<span', isset($grandchildbutton['is_last']) ? ' class="last"' : '', '>', $grandchildbutton['title'], '</span>
</a>
</li>';

echo '
</ul>';
}

echo '
</li>';
}
echo '
</ul>';
}
echo '
</li>';
}

echo '
</ul>
</div>';

$count++;
}

}


Take a peek at what I'm doing! ;D




Hai bisogno di supporto in Italiano?

Aiutateci ad aiutarvi: spiegate bene il vostro problema: no, "non funziona" non è una spiegazione!!
1) Cosa fai,
2) cosa ti aspetti,
3) cosa ottieni.

OS

Quote from: emanuele on January 25, 2013, 03:35:25 PM
Prova così.

function template_menu()
{
global $context, $settings, $options, $scripturl, $txt;

$menu_items = array();
// Qui sotto elenchi quello che va nei due (o più) livelli
$menu_levels = array(
'inf' => array('database', 'media', 'admin', 'moderate'),
'default' => array('home', 'forum', 'help', 'search', 'profile', 'pm', 'calendar', 'mlist', 'login', 'register', 'logout')
);
$count = 1;

// Questo fa in modo che l'ordine finale non dipenda da altri fattori.
foreach (array_reverse(array_keys($menu_levels)) as $key)
$menu_items[$key] = array();

// Riordina i menù a seconda di quanto impostato sopra. Default è il livello più alto in questo caso
foreach ($context['menu_buttons'] as $act => $button)
foreach ($menu_levels as $key => $menus)
if (in_array($act, $menus) || $key == 'default')
$menu_items[$key][$act] = $button;

// Ed infine fuori tutti i menù
foreach ($menu_items as $key => $menus)
{
echo '
<div id="main_menu"', $count == 1 ? '' : $count, '>
<ul class="dropmenu', $count == 1 ? '' : $count, '" id="menu_nav">';

foreach ($menus as $act => $button)
{
echo '
<li id="button_', $act, '">
<a class="', $button['active_button'] ? 'active ' : '', 'firstlevel" href="', $button['href'], '"', isset($button['target']) ? ' target="' . $button['target'] . '"' : '', '>
<span class="', isset($button['is_last']) ? 'last ' : '', 'firstlevel">', $button['title'], '</span>
</a>';
if (!empty($button['sub_buttons']))
{
echo '
<ul>';

foreach ($button['sub_buttons'] as $childbutton)
{
echo '
<li>
<a href="', $childbutton['href'], '"', isset($childbutton['target']) ? ' target="' . $childbutton['target'] . '"' : '', '>
<span', isset($childbutton['is_last']) ? ' class="last"' : '', '>', $childbutton['title'], !empty($childbutton['sub_buttons']) ? '...' : '', '</span>
</a>';
// 3rd level menus :)
if (!empty($childbutton['sub_buttons']))
{
echo '
<ul>';

foreach ($childbutton['sub_buttons'] as $grandchildbutton)
echo '
<li>
<a href="', $grandchildbutton['href'], '"', isset($grandchildbutton['target']) ? ' target="' . $grandchildbutton['target'] . '"' : '', '>
<span', isset($grandchildbutton['is_last']) ? ' class="last"' : '', '>', $grandchildbutton['title'], '</span>
</a>
</li>';

echo '
</ul>';
}

echo '
</li>';
}
echo '
</ul>';
}
echo '
</li>';
}

echo '
</ul>
</div>';

$count++;
}

}


C'è qualcosa che non va...così sopra appare tutto il menu come apparirebbe normalmente (compresi i pulsanti di quello sotto), invece il menu inferiore appare correttamente.



SMF 2.0.x

emanuele

Yups...quando fai tre cose contemporaneamente almeno due vengono male...
// Riordina i menù a seconda di quanto impostato sopra. Default è il livello più alto in questo caso
foreach ($context['menu_buttons'] as $act => $button)
foreach ($menu_levels as $key => $menus)
if (in_array($act, $menus) || $key == 'default')
{
$menu_items[$key][$act] = $button;
break;
}

al posto del codice equivalente.


Take a peek at what I'm doing! ;D




Hai bisogno di supporto in Italiano?

Aiutateci ad aiutarvi: spiegate bene il vostro problema: no, "non funziona" non è una spiegazione!!
1) Cosa fai,
2) cosa ti aspetti,
3) cosa ottieni.

OS

Quote from: emanuele on January 25, 2013, 06:36:44 PM
Yups...quando fai tre cose contemporaneamente almeno due vengono male...
// Riordina i menù a seconda di quanto impostato sopra. Default è il livello più alto in questo caso
foreach ($context['menu_buttons'] as $act => $button)
foreach ($menu_levels as $key => $menus)
if (in_array($act, $menus) || $key == 'default')
{
$menu_items[$key][$act] = $button;
break;
}

al posto del codice equivalente.

OK, sembra funzionare, grazie.


C'è solo un errore della posizione delle "

<div id="main_menu"', $count == 1 ? '' : $count, '>

<div id="main_menu', $count == 1 ? '' : $count, '">
SMF 2.0.x

emanuele



Take a peek at what I'm doing! ;D




Hai bisogno di supporto in Italiano?

Aiutateci ad aiutarvi: spiegate bene il vostro problema: no, "non funziona" non è una spiegazione!!
1) Cosa fai,
2) cosa ti aspetti,
3) cosa ottieni.

Advertisement: