Dropdown Menüs mit Conpresso

Fragen zur Implementierung und/oder Anpassung von ConPresso 4 werden in diesem Forum diskutiert.
Antworten
flofloflo
ConPresso-User
Beiträge: 44
Registriert: 31.07.2006 22:50
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Dropdown Menüs mit Conpresso

Beitrag von flofloflo »

Für ein Projekt mit sehr vielen Menüpunkten wollte ich ein Dropdown-Menü implementieren.
Da die Zahl der sich dafür eignenden Menüs sehr spärlich ist, habe ich die Infinite Menus von Open Cube genommen. Diese werden als <li> Tags ausgegeben und die Formatierungen werden fast vollständig in CSS Files außerhalb abgelegt.
Dafür habe ich die printNavigation angepasst und ein paar zusätzliche Variablen eingefügt, um vor, zwischen und nach Menüpunkten der jeweiligen Ebenen HTML-Stücke einfügen zu können.

Mit etwas Geschick sollte man damit auch andere Scripte einbinden können.
Auf Anfrage gerne mehr zu den Funktionen im Detail. Es sollen noch ein paar mehr Funktionen dazukommen, um die Anpassung allgemeiner zu gestalten für die verschiedensten Zwecke.

Auf dieser URL läuft mein eingebundenes Script
http:// new . meiller . com / _de

So sieht die angepasste printNavigation in meinem Fall aus:

Code: Alles auswählen

<?php 
function getActiveElements($navi='', $activeRubric=0)

{

    if ($navi=='') $navi = getNavigation();

    if (empty($navi)) return false;



    if ($activeRubric==0) $activeRubric = $GLOBALS['cpoRubric']['id'];



    $naviElements = array();

    $actElements  = array();

    $currLevels   = array();

    foreach ($navi as $k=>$v) {

        $currLevels[$v['level']] = $v['id'];



        $naviElements[$v['id']] = $v; 



        if ($v['rubric']['id']==$activeRubric) {

            $actElements = array_splice($currLevels, 0, $v['level']);

        }

    }

    // add an element at position 0, 

    // so that $actElements[Y] makes Y equal the level

    array_unshift($actElements, 'X'); 



    return $actElements;

}





// $navi = getNavigation();

// $activeRubric = $cpoRubric['id'];

// $levels: how many levels to display

// $parent: which element to start with

// $activeOnly: do not print inactive sublevels

function printNavigation($navi = '', $activeRubric = 0, $levels = 99, $parent = 0, $activeOnly = false, $target = '', $ebeneANZ = 2)

{

global $levelALT;

global $lstatus1;

global $lstatus2;



$lstatus1 = $levelALT;





// --------------- Konfiguration --------------- 



// Header-Strings, erste oder tiefere Ebene, beliebig viele Glieder hinzufuegbar

$ebeneHEADER = array(

1 => '',

2 => '<div><div style="display:none;width:1200px;"><ul id="imenus0">',

3 => '<div><div style="width:140px;top:-1px;left:2px;"><ul style=""><li>',

4 => '<div><div style="width:140px;top:-21px;left:139px;"><ul style=""><li>'

);



// Header-Strings, hoehere Ebene, beliebig viele Glieder hinzufuegbar

$ebeneHEADERback = array(

1 => '',

2 => '',

3 => '<li>',

4 => '<li>'

);



// Praefix fuer jeden Menuepunkt

$ebenePRAEFIXpunkt = array(

1 => '',

2 => '<li style="width:80px;">',

3 => '',

4 => ''

);



// Footer-Strings, beliebig viele Glieder hinzufuegbar

$ebeneFOOTER = array(

1 => '',

2 => '</ul><div style="clear:left;"></div></div></div>',

3 => '</ul></div></div>',

4 => '</ul></div></div>'

);



// Strings zwischen den Menuepunkten einer Ebene

$ebeneDAZWISCHEN = array(

1 => '',

2 => '',

3 => '<li>',

4 => '<li>'

);



// Listeneintragssuffix (i. d. R. </li>)

$endeLISTE = '</li>';



// ------------- Ende Konfiguration ------------- 





    if ($navi=='') $navi = getNavigation();

    if (empty($navi)) return false;



    if ($activeRubric==0) $activeRubric = $GLOBALS['cpoRubric']['id'];



    $actLevels = getActiveElements($navi, $activeRubric);



    $level = 0;

    if ($parent==0) $level = 1; // start with first level



    $ulstart = '<ul>';

    $ulend  = '';

    foreach ($navi as $k=>$v) {

    	



        if ($v['level']<$level) $level = 0;            // printed all childs of active parent => clear $level

        if ($v['id']==$parent) $level = $v['level']+1; // found active parent => save $level

        if ($v['level']!=$level) continue;             // not the active level => continue

        if ($v['rubric']['seclevel']==SECLEVEL_CLOSED) {

            if (empty($_SESSION['SID_user']['id'])) continue;

            $db = new DB;

            $db->query("SELECT COUNT(*) FROM ".CPO_RUBRIC_PERMISSION." "

                      ."WHERE rubric_id='".(int)$v['rubric']['id']."' "

                      ."AND usergroups_id='".(int)$_SESSION['SID_user']['usergroups_id']."'");

            $db->next_record();



            if ($db->v('COUNT(*)')<=0 && $_SESSION['SID_user']['admin']!=ROLE_ADMIN) continue;

        }





	$lstatus2 = $level;





	// Index fuer dazwischen-Anzeige setzen (wenn kein Wechsel auf andere Ebene oder akt Ebene nicht angezeigt werden soll)

	//	if ($lstatus1 != $lstatus2 || $lstatus2 < $ebeneANZ) {

		if ($lstatus1 != $lstatus2) {

		$daz = 1;

		$levelALT = $level;

	} else {

		$daz = 0;

	}





	// Header-Strings ausgeben

	if ($ulstart != "") {

		$praefixHEADER = $ebeneHEADER[$level];

		} else {

		$praefixHEADER = "";

		}



    if ($lstatus2 >= $ebeneANZ) {

    	

    	$ebenenWECHSEL = $lstatus2-$lstatus1;	// negativ: Wechsel auf hoehere Ebene hat stattgefunden, positiv: umgekehrt

    	if ($ebenenWECHSEL < 0) {echo $ebeneHEADERback[$level];}

    	else {echo $praefixHEADER;};



    	}

        $ulstart = '';





	// Footer-String vorbereiten

        $ulend = ''.$ebeneFOOTER[$level];

	



        // build link

        $link = $v['navigation']['externalURL'];



        $_target = $target;

        // externalURLTarget can be used to override the setting

        if (!empty($v['navigation']['externalURLTarget']))

            $_target = $v['navigation']['externalURLTarget'];



        if (isset($v['rubric']['directory']))

            $link = BASE_URL.$v['rubric']['directory'].'/index.php?rubric='.urlencode($v['rubric']['name']);



        // mark active list elements

        if ($actLevels[$level]==$v['id']) {

        	

        	// dazwischen-String als Praefix festlegen

        	if ($daz == 0) {$dazPRE = $ebeneDAZWISCHEN[$level];} else {

        	$dazPRE = "";

        	}	

	

    if ($lstatus2 >= $ebeneANZ) {echo $dazPRE.'';}

	}



        else {

        	// dazwischen-String als Praefix festlegen

        	if ($daz == 0) {$dazPRE = $ebeneDAZWISCHEN[$level];} else {

        	$dazPRE = "";

        	}				              

                

    if ($lstatus2 >= $ebeneANZ) {echo $dazPRE.'';}

        

	}

        // print caption 

        if (empty($link))

    {if ($lstatus2 >= $ebeneANZ) {echo htmlspecialchars($v['caption']);}}

        else {

    if ($lstatus2 >= $ebeneANZ) {

    	    echo $ebenePRAEFIXpunkt[$lstatus2].'<a ';

            echo 'href="'.htmlspecialchars($link).'"';

            if ($_target!='') echo ' target="'.htmlspecialchars($_target).'"';

            echo '>'.htmlspecialchars($v['caption']).'</a>';

            }

        }



        // RECURSION!

        if (

            (!$activeOnly || $actLevels[$level]==$v['id']) && // print only active sublevels

            $levels-1>0 // maximum number of levels to print

        ) printNavigation($navi, $activeRubric, $levels-1, $v['id'], $activeOnly, $target, $ebeneANZ); 

	

    if ($lstatus2 >= $ebeneANZ) {echo $endeLISTE;}

        

	// Nummer der zuletzt dargestellten Ebene sichern

        if ($levelALT != $level) {$levelALT = $level;}

    }

    if ($lstatus2 >= $ebeneANZ) {echo $ulend;}

}

?>
Benutzeravatar
Feuer112
ConPresso-User
Beiträge: 56
Registriert: 02.10.2006 15:08
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Dropdown Menüs mit Conpresso

Beitrag von Feuer112 »

Hallo,

hab mir eben mal dein Menü auf der Homepage angeschaut. Finde es richtig Klasse :!: , da ich momentan auch auf der Suche bin ein solches Menü mit Conpresso zu realisieren.

Leider komm ich mit der ganzen "print Navigation" nicht wirklich klar.

Kannst du mir sagen was ich benötige um dieses Menü auch bei mir zum laufen zu bekommen, bzw. wie ich dann auch die Farben anpassen kann!?!

Ich wäre sehr dankbar :D
flofloflo
ConPresso-User
Beiträge: 44
Registriert: 31.07.2006 22:50
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von flofloflo »

Ich hatte mir so ziemlich alle Scripte angeschaut, die ich finden konnte. Dabei gibt es nicht sehr viele, die die Menüs mit list-Elementen aufbauen. Da die printnavigation auch aus list-Elementen aufbaut, ist das notwendig.
Das Script, was ich letztlich verwendet habe ist "Infinite Menus". Du kannst dort mal auf die Website schauen. Leider verlangen die nicht gerade wenig, allerdings ist das Menü wirklich system- und browserübergreifend funktionsfähig.
Die Erstellung der Farben und die Gestaltung erfolgt über einen mitgelieferten Editor. Du erstellst dort Dein gewünschtes Menü und überträgst die Elemente des erstellten Quellcodes in Conpresso und die abgewandelte printnavigation.

Theoretisch funktioniert die Implementierung auch mit anderen Scripten, die auf den list-Tags aufbauen.

PS: wenn du dich für ein Script entschieden hast kann ich dir Hilfestellung geben...
Benutzeravatar
Feuer112
ConPresso-User
Beiträge: 56
Registriert: 02.10.2006 15:08
Hat sich bedankt: 8 Mal
Danksagung erhalten: 3 Mal

Beitrag von Feuer112 »

So hab mir nun mal den "Visual Infinitve Menus" editor runtergeladen und ein Testmenü (horizontal) generiert.

Des weiteren habe ich den kompletten Code welchen ich über "File" -> "Publish menü" erhalte in den global.header.inc eingefügt.

Wie muss ich nun weiter machen :?:
flofloflo
ConPresso-User
Beiträge: 44
Registriert: 31.07.2006 22:50
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Beitrag von flofloflo »

1. Du legst in Conpresso die Menüstruktur/Navigation ganz normal im Backend an, zum Test zB ein paar Hauptpunkte mit Unterpunkten.

2. Du baust den ausgegebenen Quellcode aus dem Infinite-Menu-Editor an die Stelle im CPO-Rubrik-header ein, wo du das Menü haben möchtest.

3. Die Ausgabe der Menüpunkte, also die <li> Tags löschst du komplett raus, du behältst nur das was zur Ansteuerung des Scriptes nötig ist (CSS styles etc), also alles was davor und danach steht.

4. Statt dem Inhalt baust du die printnavigation Abfrage ein: z.B.:

<?php printNavigation('',0,99,0,false,0,1); ?>

5. Du machst eine Sicherheitskopie deiner printnavigation.php und nimmst stattdessen die abgewandelte von mir (Endung .txt löschen!).

Wichtig zur Info:
In meiner abgewandelten printnavigation werden die zusätzlichen Quelltextteile, die das Script benötigt hinzugefügt. Die 7. Variable beim Aufruf der printnavigation bewirkt, dass die alternative Ausführung geschieht. Wenn die printnavigation normal, ohne diese variable aufgerufen wird, funktioniert sie wieder so, wie ursprünglich in Conpresso gedacht.

6. Die Pixelbreiten der Hauptmenü-Punkte müssen leider manuell angegeben werden. printnavigation abZeile 90:

// Praefix fuer jeden Menuepunkt

$ebenePRAEFIXpunkt[1] = array(2 => '<li style="width:60px;">'); // home
$ebenePRAEFIXpunkt[2] = array(2 => '<li style="width:105px;">'); // unternehmen
$ebenePRAEFIXpunkt[3] = array(2 => '<li style="width:80px;">'); // produkte
usw...


klingt alles komplizierter als es ist!
PS: notfalls poste mal deine url
Dateianhänge
printnavigation.inc.php.txt
(11.33 KiB) 715-mal heruntergeladen
Antworten