mmofacts.com

Vorlage umsetzen

gepostet vor 14 Jahre, 10 Monate von BlackScorp

Hi leute ich habe ein kleine Problemchen. Ich habe mir ein Admininterface erstellt damit ich einfach neue scripts / users / userrechte / sprachen / texte bequem darüber anlegen kann ohne das alles per hand über phpmyadmin zu machen. habe das bis jetzt so gehandhabt:

ich erstelle eine hauptklasse welche je nach button klick eine methode aufruft zb:

if(isset($_POST["add"])){

return $this->addSiteVew();

}elseif(isset($_POST["edit"]){

return $this->editSiteVew();

}else{

return $this->showAllSites();

und habe dazu eine helper klasse erstellt welche parent von der "hauptklasse"(also die, die eigentlich aufgerufen wird und nicht die, welche die methoden zur verfügung stellt) ist. und in der helperklasse sind halt alle methoden mit dem quellcode.

nun aber will ich ja Seiten / Texte / Benutzer/ Rechte etc anzeigen, neu erstellen, bearbeiten ,löschen . Nachdem ich nun für jede "hauptklasse" die helperklassen erstellt, ist mir dabei aufgefallen das im grunde alles 1 zu 1 kopiert werden kann nur dass einige parameter geändert werden müssen.

Habe danach eine gesamte helper klasse erstellt mit einer methode setSettings und übergebe ihr settings. beim Anzeigen,Sortieren der Texte und Seiten klappt das wunderbar aber wenn ich nun einen neuen Text einfügen will oder bearbeiten da happerts nun. Mein Problem dabei ist, dass ich beim bearbeiten nicht einfach so vorhandene werte in der datenbank überschreiben will sondern davor prüfen ob kein feld leer ist und/oder ob die selben werte bereits in der datenbank stehen.

Beispiel für meine Seitenprüfung:

 private function checkSiteName()
    {
        $query = "SELECT id FROM ".Defines::$tablePrefix."scripts "
        ."WHERE name = '%s' AND project_id = %d AND path='%s' AND rights = '%s'";
        $result = DataBase::getInstance()->sql($query,

$this->siteName,

$this->prId,

$this->path,

$this->rights);

        if(count($result) > 0){
            return false;
        }else{
            return true;
        }
    }

wenn ich nun aber texte überprüfen will mit der datenbank muss ich ja ganz andere spalten namen verwenden und ich kann die ja an die settings übergeben , das wäre zu viel bei manchen tabellen. also meine frage wäre jetzt

wie kann ich eine universelle query erstellen ohne die spalten namen vorher zu kennen oder die spalten namen mit parameter übergeben? das einzige was ich kenne, sind die daten, welche über eingabefelder geschickt werden und bei settingseinstellungen die tabelle, die angesprochen werden kann.

hoffe ihr könnt mir da weiterhelfen

MFG

PS: die seite kann man unter http://cccpmik.wmw.cc aufrufen (user:admin , pw:test)

gepostet vor 14 Jahre, 10 Monate von Redrick

wenn die die form-felder die mit db abgeglichen werden sollen entsprechend benennst (und natürlich je nach bedarf von anderen, die nicht reingehören wegfilterst), dann musst du nur noch Tabellenname vorgeben und schwups

entsprechend benennst meine ich, dass wenn Formfeld "path"  heisst, irgendwo auch eine Tabellenspalte "path" heissen muss, natürlich kann diese auch tabellenname_path heissen, dann müssten halt entsprechend dynamisch anpassen, aber sonst sehe ich da keine probleme

gepostet vor 14 Jahre, 10 Monate von BlackScorp

naja ich kenne aber auch leider nicht die anzahl der felder. also die werte sollen variabel sein:

  • tabellen spalten
  • werte für die spalten
  • anzahl der spalten

fix ist/soll

  • tabellen name
gepostet vor 14 Jahre, 10 Monate von knalli

$db->select('tabelle', array('a', 'b', 'c')?

Wenn ich das jetzt richtig verstanden habe, willst du in deinem ACP quasi einen Teilbereich eines Tabelleneditors haben.. quasi eine Art Mini-PhpMyAdmin? Dann schlage ich zwei Optionen vor: Entweder du ermittelst die Informationen über das DataDictionary (wie viele Spalten, usw.) oder du legst die Informationen (bspw. als XML) intern ab und liest es aus. Wahlweise lässt sich beides auch zu einem geeigneten Caching verbinden.

gepostet vor 14 Jahre, 10 Monate von BlackScorp

hm.. db->select('tabellen_spalte',array('wert1','wer2',..)); kling nice ich denke ich werde das auch so umsetzen muss halt dann nur drauf achten dass die werte, die selbe spalten reihenfolge haben wie das array. ja ich denke ich werde das mal so umsetzen vielen dank für die hilfe

gepostet vor 14 Jahre, 10 Monate von knalli

Die Reihenfolge ist doch egal.. du wirst doch eh mit einer Map/Assoziativ-Array arbeiten?

gepostet vor 14 Jahre, 10 Monate von Redrick

Original von BlackScorp

naja ich kenne aber auch leider nicht die anzahl der felder. also die werte sollen variabel sein:

  • tabellen spalten
  • werte für die spalten
  • anzahl der spalten

die sachen wirst du doch bei einem tabellennamen doch per SHOW COLUMNS oder wie auch immer auslesen können, oder? Ich meine wenn du komplett konfigfrei arbeiten willst, wirst du schon hier und da zugeständnisse machen müssen

gepostet vor 14 Jahre, 10 Monate von BlackScorp

Original von knalli

Die Reihenfolge ist doch egal.. du wirst doch eh mit einer Map/Assoziativ-Array arbeiten?

hm.. meinste etwa

$values = array(

'foo=' => $foo,

'bar LIKE' => $bar

);

$db->select('tabelle',$values);

das?

mensch dann wird ja das ganze noch einfacher:D hatte vor alle spalten aus der tabelle auszulesen und dann ein string zusammen bauen mit den namen der spalten und den übergebenen werten.

gepostet vor 14 Jahre, 10 Monate von knalli

Ähm, auch hier würde ich atomare Daten immer bevorzugen. Das ist doch sonst alles Käse. Was du suchst, sind eigentlich Criteria, aber in PHP..?

Was ich eigentlich meinte, war: array(array('a' => 1, 'b' => 'Text1'), array('a' => 2, 'b' => 'Text 2') := $db->select('tabelle', array('a', 'b'), array('c' => 1)); // SELECT a, b FROM tabelle WHERE c = 1

Wofür brauchst du in dem Editor Like?

gepostet vor 14 Jahre, 10 Monate von BlackScorp

naja ich brauche es um texte/scripte/user etc einzutagen. ich klicke auf ein button und eine template datei wird ausgegeben. die template datei hat unterscheidlich viele eingabefelder

beispiel:

für die Texte habe ich ein Eingabefeld name(der name womit ich den text aus der db hole),typ(welcher typ ist es zb überschrift, navigation, meldung,text),sprache(ist klar),text(ist auch klar)

für die scripte habe ich aber ein andere anzahl an eingabefelder

scriptpfad

scriptname

und rechte

dennoch möchte sowohl texte als auch scripte nur über die eine und die selbe methode in die datenbank eintragen. damit ich nicht für scripte, texte etc immer eine neue methode erstellen muss welche die daten in db einträgt.

array(array('a' => 1, 'b' => 'Text1'), array('a' => 2, 'b' => 'Text 2') := $db->select('tabelle', array('a', 'b'), array('c' => 1)); // SELECT a, b FROM tabelle WHERE c = 1

naja aber ich muss ja auch irgendwie die operatoren mit übergeben da es ja nicht immer  = sein muss sondern auch mal like. naja ich denke ein wenig config muss schon sein also werde ich mal ein paar configurationen einstellen. ansonsten danke für die tipps

MFG

gepostet vor 14 Jahre, 10 Monate von knalli

Nochmal: Wofür brauchst du diesem Falle von Formularfeldern für die Bearbeitung von Tabellen? Wenn es dafür keinen Grund gibt (den erfrage ich ja), würde ich nicht zu kompliziert anfangen. Scaffolding in RD-Frameworks ist nicht ohne Grund easy..

Auf diese Diskussion antworten