php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.05.2009, 13:07  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard Ablegung von Controllern mit Methoden in DB

Hi,

ich habe ein kleines MVC-Framework entwickelt (Nein, ich möchte KEIN fertiges Framework verwenden, sondern mein eigenes. hat seine Gründe ).

Es gibt verschiedene Controller mit Aktionen.

Ich möchte jetzt ein Menü erstellen, da so aufgebaut sein soll:

Hauptmenü
Es gibt ein Hauptmenü, über das ich auf andere Seiten wechseln kann (Ein Controller stellt dabei eine Seite dar, Standartaktion ist Index_Action())
Nennen wir das mal Ebene 1.

Untermenü
Auf manchen Seiten gibt es ein Untermenü (Wichtig ist, dass das optional bleibt). In diesem Untermenü gibt es Einträge, die bei jeder Aktion des Controllers im Menü angezeigt werden (Ebene 2 sozusagen).
Dann gibt es Einträge, die nur bei bestimmten Aktionen angezeigt werden, z.B. bei Controller_Index::Linkpartner_Action().
Das ist dann Ebene 3

Das Problem ist jetzt: Wie speichere ich das in der Datenbank ab, so dass ich anhand der URL (Die URL erhält den Namen des Controllers und den Namen der Action) rausfinden kann, welche Einträge ich anzeigen lassen muss?

Bisher habe ich das ohne Datenbank gelöst, über eine Registry.
PHP-Code:
class ViewHelper_Menu implements FW_View_Helper_Interface
{
  private 
$registry;
  const 
REGISTRY_KEY "__SUBMENU_REGISTRY_KEY__ENTRIES_MEN"
  
  public function 
run(array $params = array())
  {
    
$this->registry FW_Registry::getInstance(self::REGISTRY_KEY);
    return 
$this;
  }
  
  public function 
add($name$url$title ""$external false)
  {
    
$entries $this->registry->entries;
    
$entries[] = array(
                          
"name" => $name,
                          
"link" => $url,
                          
"title" => ($title == "") ? $name $title,
                          
"external" => $external
                      
);
    
$this->registry->entries $entries;
    return 
$this;
    
  }
  
  public function 
getEntries()
  {
    return 
$this->registry->entries;
  }

Man kann hier in allen Controllern Einträge zur Registry hinzufügen und sie auch überall wieder auslesen.

In meinem Controller habe ich dann z.B. sowas:

PHP-Code:
class Controller_Index extends FW_Controller_Abstract
{
  public function 
init()
  { 
     
$this->FW_View_Helper_Path()->add("Startseite"$this->ViewHelper_URL("index""index"));
     
     
//Diese EInträge sind auf allen Unterseiten des Controllers zu sehen
     
$this->ViewHelper_Menu()->add("Überall zu sehen""google.de""titel");
     
$this->ViewHelper_Menu()->add("auch Überall zu sehen""google.de""titel");
  }
  
  public function 
index_Action()
  { 
     
$this->FW_View_Helper_Title()->set("Startseite");                  
     
$this->view->addTemplateContent("content"null"index.tpl.php");
     
$this->ViewHelper_Menu()->add("nur in index_Action zu sehen""google.de""titel");
  }
  
  public function 
unterseite_Action()
  { 
     
$this->FW_View_Helper_Title()->set("Unterseite");                  
     
$this->view->addTemplateContent("content"null"index.tpl.php");
     
$this->ViewHelper_Menu()->add("nur auf Unterseite zu sehen""google.de""titel");
  }

Ich habe mir jetzt überlegt, dass ich ein DB-Design anlege, das so aussieht
menu (id, name, parent_id, url, external, title)
action (id, controller_id, name)
controller (id, name)

Aber es ist mir auch nach reichlichen Überlegungen nicht gelungen, wie ich das jetzt richtig auslesen soll. Hat jemand eine Idee?

MfG fat32
fat32 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.05.2009, 15:03  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard

Hat das noch nie jemand gemacht?

Meint ihr, ich brauche unbedingt Nested Sets dazu?
fat32 ist offline  
Alt 24.05.2009, 18:01  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Entweder versteh ich dein Problem nicht, oder hä? Du willst einfach einen Art Kategorie/Navigationsbaum in der Datenbank speichern und wissen in welchen Zweig du bist damit du die Kindknoten auslesen kannst, oder?

Dazu reicht: "menu (id, name, parent_id, url, external, title)" wenn eine URL aufgerufen wird suchst du einfach nach dieser URL in der Datenbank hollst die zugehörige ID und suchst damit die Kinder. Die einzige Anforderung dazu ist das die URL Unique ist.
erc ist offline  
Alt 24.05.2009, 20:17  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Ganz einfach:
Speichere die Daten als Parent-ID-Struktur, halte dir ein SessionSingleton-Model, in dem die geöffneten Menü-Knoten gespeichert sind und lese dieses zum Baum darstellen wieder aus.

Die Trennung in Menü und Untermenü ist nicht sinnvoll, da die Typen, die du hier behandelst nicht wirklich unterscheiden (sind alles Navi-Knoten).

Zitat:
Hat das noch nie jemand gemacht?
Doch, Google liefert hierzu einige gute Ergebnisse.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 24.05.2009, 23:40  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard

Nach was soll ich googeln? Nach verschachtelten Menüs? Das hab ich schon x-mal gemacht, aber ich bin anscheinend zu blöd dazu...

Was ist denn ein SessionSingleton-Model?
Ich hab keine wirkliche Info darüber bei Google gefunden.

Zitat:
Du willst einfach einen Art Kategorie/Navigationsbaum in der Datenbank speichern und wissen in welchen Zweig du bist damit du die Kindknoten auslesen kannst, oder? Dazu reicht: "menu (id, name, parent_id, url, external, title)" wenn eine URL aufgerufen wird suchst du einfach nach dieser URL in der Datenbank hollst die zugehörige ID und suchst damit die Kinder. Die einzige Anforderung dazu ist das die URL Unique ist.
Genau das will ich!

Aber bei mir ist es so, dass ich die URL nicht direkt ablegen möchte, sondern nur den Namen des Controllers und den Namen der Action. Und hier ist dann auch das Problem: Wie?
fat32 ist offline  
Alt 25.05.2009, 09:23  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Zitat:
Zitat von fat32 Beitrag anzeigen
Aber bei mir ist es so, dass ich die URL nicht direkt ablegen möchte, sondern nur den Namen des Controllers und den Namen der Action. Und hier ist dann auch das Problem: Wie?
Dann speichere es so ab:
menu (id, name, parent_id, controller, action)

und beim auslesen suchst du nach controller und action.
erc ist offline  
Alt 25.05.2009, 12:02  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hi,

Zitat:
Zitat von fat32 Beitrag anzeigen
Was ist denn ein SessionSingleton-Model?
Vielleicht doch noch nicht der richtige Zeitpunkt um ein Framework zu entwickeln...

Zitat:
Zitat von fat32 Beitrag anzeigen
Aber bei mir ist es so, dass ich die URL nicht direkt ablegen möchte, sondern nur den Namen des Controllers und den Namen der Action. Und hier ist dann auch das Problem: Wie?
Beides ist von der Vorgehensweise schlecht, denn ein Baum-Knoten sollte nichts von seiner Repräsentation kennen. Wenn du schon MVC anwenden möchtest, solltest du die interne Repräsentation des Baumes in der Datenbank von der in der Business-Schicht und diese wiederum von der Präsentation trennen. Das Handling der Struktur (Aufklappen/Zuklappen) sollte in der Präsentation und der Business-Logik verpackt sein. Damit solltest du den Controller und die Action auch nur in der Präsentation - beim Generieren des Links - kennen und hinzufügen. Andernfalls läufst du Gefahr, den Mechanismus zum Handling eines Menü-Baums nicht wiederverwenden zu können.

In 3-tier-architecture (3TA) + MVC + FrontController (FC) (MVC ist nur ein Spezialisierungspattern der 3TA) würde das so aussehen:

  • Controller bezieht interne Repräsentation aus Business-Schicht und stellt diesen dar.
  • Der generierte Link enthält eine FC-Anweisung, die die zugehörige FC-Action anweist, das Model mit den geöffneten Knoten zu füllen.
  • Nach dem Öffnen kann die Business-Schicht diese Information nutzen um den "richtigen" Baum zu laden, sprich diejenigen Knoten, dich auch dargestellt werden sollen.
  • Um die Datenbank-Repräsentation nochmals zu abstrahieren solltest du noch ein eigenen Datentyp (Klasse) für einen Baum-Knoten einführen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 25.05.2009, 20:43  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo fat32,

können wir noch behilflich sein oder hast du das Problem mit den o.g. Hinweisen gelöst?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 26.05.2009, 13:22  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard

Hi,

ich hatte bisher keine Zeit mehr dazu.
Wenn ich ehrlich bin, ist dein Beitrag auch extrem kompliziert geschrieben. Selbst ein bekannter IT-Student wusste nicht, was du damit sagen möchtest.

Aber ich versuche nochmal, den Beitrag zu verstehen

Simon
fat32 ist offline  
Alt 26.05.2009, 15:38  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Einfach konkrete Fragen stellen, es findet sich schon ein Übersetzer für normalsterbliche
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Thema geschlossen


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Methoden werden nicht vererbt stayInside PHP Tipps 2009 12 15.03.2009 00:24
Kindklasse: Methoden über _call() ergänzen? ciss PHP Tipps 2008 2 29.12.2008 18:08
Java Methoden in PHP -> Performance Zender PHP-Fortgeschrittene 16 09.11.2008 15:43
[Erledigt] Klassen - Dynamisch übergebbare Methoden teQUil4ever PHP-Fortgeschrittene 4 27.10.2008 08:05
[Erledigt] Methoden auf Objekt aufrufen (und fangen), die nicht existieren tsisson PHP Tipps 2008 2 07.10.2008 18:19
Referenzen Private Methoden. notyyy PHP-Fortgeschrittene 5 29.05.2008 09:40
UML - Abstrakte und vererbte Methoden zwingend anzugeben? MaMo-Net Off-Topic Diskussionen 3 17.03.2008 06:04
reflection - wie führe ich alle methoden einer klasse aus... Crypi PHP Tipps 2008 2 20.02.2008 22:51
OOP-Frage: Aufrufproblematik von Methoden MainMan PHP-Fortgeschrittene 11 11.10.2007 12:43
DAO - Methoden dh1sbg PHP-Fortgeschrittene 2 17.12.2006 17:52
Zugriff auf statische methoden oder konstanten nightfreak PHP-Fortgeschrittene 6 14.11.2005 16:56
get udn set Methoden seven-12 PHP Tipps 2005-2 3 23.06.2005 22:19
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
fw_controller_abstract, url datnbank ablegen php, php navigationsbaum in array

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:43 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum