+ Antworten
Ergebnis 1 bis 8 von 8

Thema: Suche: Anleitung J!-Komponente erstellen mit Datenbankanbindung

  1. #1
    War schon öfter hier
    Registriert seit
    12.08.2007
    Beiträge
    142
    Bedankte sich
    12
    Erhielt 10 Danksagungen
    in 9 Beiträgen

    Standard Suche: Anleitung J!-Komponente erstellen mit Datenbankanbindung

    Hallo!

    Ich muss für ein Projekt im Rahmen meines Studiums eine kleine Datenbankanwendung programmieren, Basis soll Joomla sein. Nachdem ich an und für sich schon seit etlichen Jahren mit Joomla arbeite und auch schon Plugins programmiert habe dachte ich, ich wage mich an eine Komponente, dann lern ich dabei auch gleich etwas.

    Leider habe ich bis jetzt keine brauchbare Dokumentation bzw. Tutorial gefunden zur Erstellung einer Komponente das bei der Datenbankanbindung über ein "SELECT" hinausgeht. Super, das SELECT funktioniert bei mir auch, aber die User sollen im FE auch neue Einträge schreiben können (INSERT INTO) bzw. ihre Datensätze bearbeiten (UPDATE).

    Das einzige was bisher funktioniert hat war wenn ich das ganze hardcoded reinschreibe, dann werden neue Datensätze angelegt, aber das ist nicht Sinn der Sache.

    Was ich will ist ein einfaches Formular, wenn man auf "Absenden" klickt werden die Sachen in die entsprechende Tabelle eingefügt. Ohne Joomla eine Arbeit von max. 10 Minuten.

    Wie definiere ich hier ein action= beim Formular ohne dass ein "Restricted Access" kommt? Am schönsten wärs natürlich mit AJAX aber wenn ich auf eine neue Seite komme auf der Steht "Daten erfolgreich eingefügt" ist mir das auch egal.

  2. #2
    Joomla Guru Avatar von elkuku
    Registriert seit
    14.06.2006
    Ort
    Guayaquil - Südamerika
    Beiträge
    1.689
    Bedankte sich
    74
    Erhielt 517 Danksagungen
    in 397 Beiträgen

    Standard

    Zitat Zitat von RemoteC Beitrag anzeigen
    ...Ohne Joomla eine Arbeit von max. 10 Minuten....
    wenn dem so ist und Du für so etwas tatsächlich nur 10 min benötigst, sollten es im J! Framework lediglich 5 sein - einschließlich der obligatorischen Validierung

    Wie das geht siehst Du entweder in den Corekomponenten oder in diversen Tutorials überall im Netz - aber über diese bist Du wahrscheinlich in den etlichen Jahren in denen Du Dich bereits mit J! beschäftigst selbst gestolpert
    Gruß,
    Nikolai
    Hilf mit: Deutsche Joomla! Dokumentation Help testing: EasyCreator Noch Fragen ? Forum.Joomla-Nafu.de

  3. #3
    War schon öfter hier
    Registriert seit
    12.08.2007
    Beiträge
    142
    Bedankte sich
    12
    Erhielt 10 Danksagungen
    in 9 Beiträgen

    Standard

    Danke für den konstruktiven Beitrag

    Möglich dass es mit J! kürzer dauert wenn man das Framework durchschaut hat. Warum sitze ich sonst schon seit mehreren Tagen dran und bringe es nicht zum laufen?

    Ohne Joomla im primitivsten Fall:
    formular.html:
    HTML-Code:
    [...]<form action="auswerten.php" method="POST">[...]
    auswerten.php:
    PHP-Code:
    <?php
    /* Datenbank + User definieren */
    $query "INSERT INTO Tabelle (wert1, wert2, wert3)
    VALUES
    ('$_POST[wert1]','$_POST[wert2]','$_POST[wert3]')"
    ;
    if (!
    mysql_query($query,/* Datenbankverbindung */))
      {
      die(
    'Error: ' mysql_error());
      }
    echo 
    "Eintrag erfolgreich hinzugefügt";
    ?>
    Also ja: 10 Minuten ist durchaus realistisch um so etwas zu machen
    Der Code ist nur symbolisch was ich machen will.

    Und ich finde einfach kein Tutorial das genau so etwas beschreibt. Bei wiki.joomla-nafu.de endet das Tutorial genau bei diesem Punkt; docs.joomla.org wird nur ein SELECT beschrieben (welches bei mir auch problemlos läuft), ebenfalls im Galileo OpenBook über Joomla.

    De facto soll meine Komponente etwas ähnliches können wie Thread "Angelkomponente erstellen": In mehreren Tabellen in einer Datenbank werden Daten gespeichert, über das FE sollen diese Daten verknüpft und dargestellt werden. Und natürlich sollen neue Datensätze erstellt werden können.

    lg

  4. #4
    Hat hier eine Zweitwohnung
    Registriert seit
    14.01.2006
    Ort
    Nienburg
    Alter
    32
    Beiträge
    1.237
    Bedankte sich
    115
    Erhielt 471 Danksagungen
    in 368 Beiträgen

    Standard

    was haste denn bislang versucht ? beispielcode ? wo haengst du - mit welcher/n fehlermeldung/en hast du zu tun ? haeng doch deine komponente einfach mal an.

    auch wenns nur nen beispielcode ist, das werden unter umstaenden teure 10 minuten.
    Geändert von Matrikular (03.06.2011 um 22:34 Uhr)

  5. #5
    Joomla Guru Avatar von elkuku
    Registriert seit
    14.06.2006
    Ort
    Guayaquil - Südamerika
    Beiträge
    1.689
    Bedankte sich
    74
    Erhielt 517 Danksagungen
    in 397 Beiträgen

    Standard

    Diese Hallo Welt Tutorials machen nur Sinn, wenn man sie von Anfang an liest - Ich bin mir fast ganz sicher, dass Du dies nicht getan hast
    Zum Bleistift steht hier ein INSERT - wenn natürlich auch nicht direkt, da hierfür die Klasse JTable genutzt wird
    http://docs.joomla.org/Developing_a_...aving_a_Record
    Und wenn es für 1.6 sein darf und auf deutsch sein soll dann steht das dort:
    http://wiki.joomla-nafu.de/joomla-do...len_Controller
    auch wenn man es hier noch weniger sieht, da dort ausschließlich die Corefunktionen genutzt werden.

    Es kann wohl kaum von einer Hallo Welt Komponente erwartet werden, dass sie Dir beibringt wie ein MySQL JOIN funktioniert
    Gruß,
    Nikolai
    Hilf mit: Deutsche Joomla! Dokumentation Help testing: EasyCreator Noch Fragen ? Forum.Joomla-Nafu.de

  6. #6
    War schon öfter hier
    Registriert seit
    12.08.2007
    Beiträge
    142
    Bedankte sich
    12
    Erhielt 10 Danksagungen
    in 9 Beiträgen

    Standard

    Zitat Zitat von Matrikular Beitrag anzeigen
    was haste denn bislang versucht ? beispielcode ? wo haengst du - mit welcher/n fehlermeldung/en hast du zu tun ? haeng doch deine komponente einfach mal an.
    Was ich bis jetzt habe sind verschieden Views die jeweils alle Einträge bestimmter Tabellen der Datenbank ausgeben.
    Woran ich hänge ist ein View mit dem es möglich ist einen neuen Eintrag zu erstellen und im weiteren einen mit dem es möglich ist vorhandene Einträge zu bearbeiten. (beides im FE)
    Was ich bisher habe:
    View mit Formular fürs neu anlegen
    PHP-Code:
    <?php defined('_JEXEC')or die('Restricted access'); ?>

    <div align="center">
    <h1>neuen Arzt anlegen</h1>
    <form action="<?php JRoute::_('index.php?option=com_patienten'); ?>" method="post" name="newarzt">
    angestelltennummer:<input name="angestelltennummer" type="text"><br />
    nachname:<input name="nachname" type="text"><br />
    vorname:<input name="vorname" type="text"><br />
    email:<input name="email" type="text"><br />
    geschlecht:<input name="geschlecht" type="text"><br />
    geburtsdatum:<input name="geburtsdatum" type="text"><br />
    strasse:<input name="strasse" type="text"><br />
    hausnummer:<input name="hausnummer" type="text"><br />
    postleitzahl:<input name="postleitzahl" type="text"><br />
    ort:<input name="ort" type="text"><br />
    passwort:<input name="passwort" type="password"><br />
    <input type="submit" value="Absenden">
    <input type="hidden" name="task" value="save" />
        <!-- Verstecktes Feld für die Tokenüberprüfung -->
        <?php echo JHTML::_'form.token' ); ?>

    </form> 
    </div>
    Funktion in /models/aerzte.php
    PHP-Code:
     function insertAerztestammdaten($values) {
        
    $db =& JFactory::getDBO(); 
        
    $query "INSERT INTO #__aerztestammdaten VALUES ($_POST[angestelltennummer], '$_POST[nachname]','$_POST[vorname]','$_POST[email]','$_POST[geschlecht]','$_POST[geburtsdatum]','$_POST[strasse]','$_POST[hausnummer]','$_POST[postleitzahl]','$_POST[ort]','$_POST[passwort]');"
        
    $db->setQuery($query);
        
    $db->query();
        } 
    Wenn ich das hardcoded in den View schreibe und statt $_POST irgendwelche Werte nehme wird ein neuer Eintrag angelegt, also denk ich dass das vom Ansatz so passt.

    Mein Problem ist nun: Wie mache ich das beim Formular mit action=""? In irgendeinem Tutorial habe ich gefunden, dass es ausreicht die index.php (eben mit JRoute) zu nennen, woanders dass der Link zur Komponenten oder gleich zu einem View gehen soll.

    Das Weiterleiten auf einen anderen View funktioniert nicht, dann steht - mit Tokenüberprüfung - "invalid token", ohne Überprüfung "Restricted access" (sprich der View bekommt nicht mit dass er von einer anderen J!-Seite aufgerufen wird).
    Zitat Zitat von Matrikular Beitrag anzeigen
    auch wenns nur nen beispielcode ist, das werden unter umstaenden teure 10 minuten.
    ?!

    Zitat Zitat von elkuku Beitrag anzeigen
    [...]wenn natürlich auch nicht direkt, da hierfür die Klasse JTable genutzt wird
    http://docs.joomla.org/Developing_a_...aving_a_Record[...]
    Es kann wohl kaum von einer Hallo Welt Komponente erwartet werden, dass sie Dir beibringt wie ein MySQL JOIN funktioniert
    Dass es hierfür Klassen gibt ist mir klar, aber ich scheitere ja schon daran die Formulardaten abzuschicken ... und da bringt mir ein "The Joomla! framework takes care of a lot of this for you. " nicht viel Danke trotzdem für den Link, vielleicht kann ich mir da irgendwas zambasteln aber sonderlich motivierend ist das nicht wenn man nicht weiß was genau man macht und nur mit try&error eine Lösung findet ...
    Und was hat das ganze mit einem MySQL JOIN zu tun? Wie eine SELECT funktioniert steht auch in (fast) jedem Tutorial über Komponentenerstellung und mein INSERT INTO funktioniert grundsätzlich nur was mir fehlt - und das habe ich bisher noch nirgendwo gefunden - ist eben das Absenden des Formulars und die Weitergabe des Daten an eine Datei die das INSERT durchführt, das geht logischerweise nicht in einem Schritt bzw. mit einer Datei.

    Im Anhang das was ich bisher habe ... in den Views sind überall noch var_dumps() u.dgl. drinnen zum debugen Interessant ist eigentlich nur alles mit "aerzte", bei den anderen Sachen soll das ganze dann analog dazu ablaufen.

    Edit: Habe mich jetzt noch ein wenig mit dem JTable gespielt --> neuen Ordner "tables" angelegt und darin eine "aerzte.php" sowie die Funktionen in Model + Controller eingefügt. Ergebnis: Wenn ich auf Absenden klicke verschwindet alles aus dem Formular, keine Weiterleitung, kein Fehler und es wird auch nix eingetragen ... Im Anhang die 2te Datei
    Angehängte Dateien
    Geändert von RemoteC (04.06.2011 um 11:55 Uhr)

  7. #7
    Hat hier eine Zweitwohnung
    Registriert seit
    14.01.2006
    Ort
    Nienburg
    Alter
    32
    Beiträge
    1.237
    Bedankte sich
    115
    Erhielt 471 Danksagungen
    in 368 Beiträgen

    Standard

    vielen dank fuers aufzeigen deiner bisherigen arbeit und dem anhaengen der dateien.
    mein hinweis bezueglich der "teuren 10 minuten" bezog sich auf die validierung. ein solches formular funktioniert sicher, waere aber eine einladung fuer jeden hacker.

    erneut, als beispiel - nicht das thema. aber sowas willst du nicht wirklich machen, mehr noch - ich hoffe kein php script von dir ausserhalb von joomla verwendet dieses prinzip.

    PHP-Code:
    $query "INSERT INTO #__aerztestammdaten VALUES ($_POST[angestelltennummer], '$_POST[nachname]','$_POST[vorname]','$_POST[email]','$_POST[geschlecht]','$_POST[geburtsdatum]','$_POST[strasse]','$_POST[hausnummer]','$_POST[postleitzahl]','$_POST[ort]','$_POST[passwort]');"
    sofern du mit vollem error reporting arbeitest duerfte es bei der verwendung notices hageln, darueber hinaus sind alle insert values leer, warum ist klar ?

    zuerst einmal benoetigst du eine jtable klasse, bzw. eine die von jtable abgeleitet ist und ueber deren properties (member variablen) ein abbild der felder deiner tabelle erzeugt wird. den aufbau findest du in den core komponenten, oder auch in den von nikolai verlinkten tutorials.

    nachfolgend zum vergleich das grobe schema:
    - im layout der aufgerufen view ein formular erstellen - action attribut <?php echo JFactory::getUri()->toString(); ?> - hidden field/s "task" | "controller" (optional) | "token"

    - wird das formular abgeschickt, landet der "request" im controller, und zwar genau in dem definierten task - sofern du deine felder "gruppiert" hast (... name="gruppe[name]" ...), werden sie nach dem token check mit der jrequest methode aufgefangen JRequest::get('post'); || JRequest::getVar('gruppe', Array(), 'post', 'array');

    - jetzt holst du das entsprechende model und uebergibst das array, haeufig wird hier eine methode "store" verwendet.

    - im model holst du dir eine jtable instanz und reichst das array weiter (JTable::save() bzw. $table->save($data)) // validierungen oder anpassungen der einzelnen felder/felddaten sollten in einer ueberladenen bind & check methode in einer jtable instanz vorgenommen werden. um die eigentlichen inserts brauchst du dich nicht kuemmern. das binden der uebergebenen daten an die properties deiner jtable instanz ist die halbe miete, jtable::save erledigt den rest (active record pattern, martin fowler).

    - anschliessend werden status, bzw. fehlermeldungen zurueck an das model gereicht, vom model an den controller uebergeben und ggf. mit einer weiterleitung ausgegeben.

    hinweise:
    die jtable klasse sollte sich im backend befinden (fuer die verwendung im frontend den jtable include path setzen)

    dein controller aufbau entspricht nicht den vorgaben die in den tutorials zu finden sind. (patientencontroller, aertzecontroller in einer controller.php?)

    wie willst du mit $controller->execute( true ) den task verarbeiten ?

    die ganzen controller im root der komponente ? die sollten eigentlich, wenn sie denn ueberhaupt alle gebraucht werden, im vereichnis controllers liegen und entsprechend des requests zur anwendung kommen.

    usw.

    ich kuerze das mal ab:
    ich glaube, du willst fuer den anfang zu viel - gehe die tutorials schritt fuer schritt durch und wenn du etwas nicht verstehst, nimm dir nen moment - aber spring nicht zum naechsten punkt der eventuell nur fragen aufwirft. zugegeben, einige tutorials sind nicht mehr aktuell, best practise, oder sie unterscheiden in der beschreibung. mit ein wenig hintergrundwissen zu oop wird jedoch schnell klar wann etwas sinn macht und wann nicht.

    ich weiss es klingt bloed, aber - fang besser nochmal von vorn an. gerade bei stammdaten sollte kein zweifel an der sicherheit deiner komponente aufkommen. das faengt bereits bei der konzeption deiner tabellen in der datenbank an, wo du "keine" unique auto increment ids fuer jeden record vorsiehst, fast alle felder als typ text speicherst und auch die hilfen seitens des frameworks in verbindung mit dem datumsformat nicht wahrnimmst. die speicherung von passwoertern in der datenbank als klartext string ist, als tuepfelchen ein absolutes no-go.

    fuer jeden "anfaenger" (im sinne von: noch nicht mit dem framework gearbeitet oder unerfahren mit oop/mvc) ist es ein ganzen stueck arbeit die zusammenhaenge zu verstehen. entweder laesst man sich drauf ein und beginnt umzudenken, was einem mit einer guten und neuen sichtweise im bezug auf die art der entwicklung von erweiterungen gedankt wird, oder man laesst es. was nicht funktioniert ist, so weiterzumachen wie bisher. erwarte von dir selbst nicht zu viel und beantworte fuer dich die frage, ob du die zeit aufbringen kannst und willst dich notwendigerweise ausgiebig mit dem thema auseinanderzusetzen.

    ps, ja, ich weiss du hast einige von mir beschriebene punkte bereits in deiner komponente umgesetzt, ich habe jedoch das gefuehl, dass die zusammenhaenge noch nicht klar sind.
    Geändert von Matrikular (04.06.2011 um 16:25 Uhr)

  8. Erhielt Danksagungen von:


  9. #8
    War schon öfter hier
    Registriert seit
    12.08.2007
    Beiträge
    142
    Bedankte sich
    12
    Erhielt 10 Danksagungen
    in 9 Beiträgen

    Standard

    Vielen Dank dass du dir die Zeit genommen hast dir meine Komponenten anzuschauen und mir diese ausführliche Antwort zu posten

    Dass ich normalerweise sämtliche Usereingaben validiere ist klar, ich verwende hierzu stripslash() und mysql_real_escape_string(); Was Verschlüsselung angeht verwende ich normalerweise md5 mit einem Salt, da gibts vom PHP Manual fertige Funktionen. Ich hoffe das ist nach wie vor State-of-the-Art. Ich lerne gerne etwas dazu und was Sicherheit angeht ist das auf jeden Fall auch wichtig Meine Applikationen müssen ja nicht so Enden wie Sonypictures.com ^.^
    Allerdings baue ich solche Sachen zwecks Debuggen erst ein wenn ich mir sicher bin, dass alles funktioniert. Umso weniger Funktionen, umso weniger potentielle Fehler.

    Du hast Recht damit, dass ich das ganze Framework nicht verstanden habe, ich habe mir einzelne Tutorials und Code-Snippets zusammengesammelt und so schaut halt leider auch das fertig programmierte aus Das liegt sicher auch an der falschen Zielsetzung von mir: Ich wollte die Aufgabenstellung erfüllen, sprich es sollte funktionieren, und habe daher etliche Teile von Tutorials, die ich nicht unmittelbar für meine Komponente brauche, nicht zu Herzen genommen. Mea culpa!

    Was die unique auto increment IDs angeht: Anscheinend gehen hier die Meinungen auseinander was "richtig" ist: Bei der Prüfung "Datenbanken" letztes Semester gab es Punkteabzug wenn man künstliche IDs bei Tabellen verwendet hat. Eine Sozialversicherungsnummer oder Produktnummer ist genauso unique, also warum noch ein weiteres Feld einfügen? Von mir erfundene Nummern (Bildnummer, Befundnummer) haben ein auto increment ...

    Ich werde mir jetzt noch einmal die "hello-world" Komponenten von docs.joomla.org zu Herzen nehmen.

    Nochmals vielen Dank! Falls du noch gute Tutorials oder auch Bücher/Videotutorials kennst die das Thema behandeln nur her damit Die meisten sind leider für einfache User gemacht wo beschrieben wird wie das BE von Joomla funktioniert und evtl. noch wie ein Template erstellt wird :-\

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein