Wir planen ein größeres Upgrade der Forensoftware. Weitere Infos: Upgrade der Forensoftware + Downtime. Sobald die neue Version veröffentlicht wurde werde wir euch erneut informieren.

1. Modul-Entwicklung: Frontend Eingabefeld mit Ausgabe im Frontend

    1. Modul-Entwicklung: Frontend Eingabefeld mit Ausgabe im Frontend

    Hallo liebe Mitglieder,
    ich bin neu hier, auch neu in der Joomla-Welt und schon habe ich die erste Frage, welche sich um die Modul-Entwicklung dreht.

    Um die Module-Erstellerung zu verstehen habe ich bereits das Simple Module vom joomla-Tutorial durchgemacht.
    docs.joomla.org/J3.x:Creating_…Developing_a_Basic_Module

    Der nächste Schritt in den Tutorials geht mir jedoch viel zu weit (Datenbankzugriff).

    Ich möchte für meine Test-Joomla-Seite ein Module entwickeln, welches mir ein Eingabefeld im Frontend anzeigt, hier schreibe ich einen Laufwerkspfad rein und via Button „senden“ wird dieser Pfad an eine Funktion geschickt, welche aus mir aus dem Pfad sämtliche Dateien auflistet.

    In PHP direkt habe ich diese Funktion und Seite letztlich schon geschrieben und sie funktioniert.

    Jetzt möchte ich diese Funktion in ein Modul für joomla packen.
    Leider komme ich gerade nicht weiter.

    Die reine PHP-Funktion/Seite ist diese hier:
    Spoiler anzeigen

    PHP-Quellcode

    1. <html>
    2. <h1>Pfadangabe</h1>
    3. <p>Bitte den Pfad zur Datei angeben</p>
    4. <form action="indexphp.php" method="post">
    5. <p>Dateipfad: <input type="text" name="pfad" /></p>
    6. <p><input type="submit" /></p>
    7. </form>
    8. <?php
    9. //Fehler anezigen:
    10. ini_set('display_errors', 1);
    11. error_reporting(E_ALL);
    12. //Pfadeingabe-Formular in Variable übernehmen:
    13. $uebergabe=$_POST['pfad'];
    14. //Funktionsaufruf und Ausgabe des Inhalts:
    15. echo Dateiausgabe($uebergabe);
    16. function Dateiausgabe($dir)
    17. {
    18. //Prüfung: Wenn Übergebener String kein Verzeichnis ist: Ausgabe leerer String:
    19. if (!is_dir($dir))
    20. {
    21. return '';
    22. }
    23. //Variable mit leerem String generieren:
    24. $ausgabe ='';
    25. //Speichern des Pfad-/Ordner-Inhalts in ein Array
    26. $inhalt=scandir($dir);
    27. //Durchlaufen des Array und speichern des aktuellen Elements in Variable $ele)
    28. foreach($inhalt as $ele)
    29. {
    30. if($ele=='.' OR $ele=='..')
    31. {
    32. continue;
    33. }
    34. //Ausgabe des Elements als Listenpunkt in HTML
    35. if (is_dir($dir.'/'.$ele)) //Prüfen ob Element ein Verzeichnis ist
    36. {
    37. continue;
    38. }
    39. //Es sollen nur PDF-Dateien und Word-Dateien ausgegeben werden (Test):
    40. if (strtolower(pathinfo($dir.'/'.$ele,PATHINFO_EXTENSION))=='pdf' OR strtolower(pathinfo($dir.'/'.$ele,PATHINFO_EXTENSION))=='doc' OR strtolower(pathinfo($dir.'/'.$ele,PATHINFO_EXTENSION))=='docx')
    41. {
    42. if (is_file($dir.'/'.$ele)) //Prüfen ob Element ein File ist
    43. {
    44. $ausgabe .='<li><a href="'.$dir.'/'.$ele.'">'.$ele.'</a></li>';
    45. }
    46. }
    47. }
    48. if($ausgabe)
    49. {
    50. $ausgabe ='<ul>'.$ausgabe.'</ul>';
    51. }
    52. return $ausgabe;
    53. }
    54. ?>
    55. </html>




    Ich habe nach meinen Überlegungen die reine PHP-Funktion (Übernahme Pfad und Generierung des Strings (beinhaltet Namen der im Pfad enthaltenen Dateien) für die spätere Ausgabe in die helper.php geschrieben.
    Code der helper.php:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. /**
    3. * Helper class for Dateiauflister module
    4. *
    5. * @package Joomla.Tutorials
    6. * @subpackage Modules
    7. * @link http://docs.joomla.org/J3.x:Creating_a_simple_module/Developing_a_Basic_Module
    8. * @license GNU/GPL, see LICENSE.php
    9. * mod_helloworld is free software. This version may have been modified pursuant
    10. * to the GNU General Public License, and as distributed it includes or
    11. * is derivative of works licensed under the GNU General Public License or
    12. * other free or open source software licenses.
    13. */
    14. class modTest2
    15. {
    16. /**
    17. * Empfängt Übergabestring für den Pfad und schreibt als HTML-String Auflistung der Dateien
    18. *
    19. * @param array $params An object containing the module parameters
    20. *
    21. * @access public
    22. */
    23. public static function getDatei($params)
    24. {
    25. //Wenn Übergebener String kein Verzeichnis ist: Ausgabe leerer String:
    26. $dir=$params;
    27. if (!is_dir($dir))
    28. {
    29. return '';
    30. }
    31. //Variable mit leerem String:
    32. $ausgabe ='';
    33. //Speichern des Inhalts in Array
    34. $inhalt=scandir($dir);
    35. //Durchlaufen des Array und speichern des aktuellen Elements in Variable $ele)
    36. foreach($inhalt as $ele)
    37. {
    38. if($ele=='.' OR $ele=='..')
    39. {
    40. continue;
    41. }
    42. //Ausgabe des Elements als Listenpunkt in HTML
    43. if (is_dir($dir.'/'.$ele)) //Prüfen ob Element ein Verzeichnis ist
    44. {
    45. continue;
    46. }
    47. if (strtolower(pathinfo($dir.'/'.$ele,PATHINFO_EXTENSION))=='pdf' OR strtolower(pathinfo($dir.'/'.$ele,PATHINFO_EXTENSION))=='doc' OR strtolower(pathinfo($dir.'/'.$ele,PATHINFO_EXTENSION))=='docx')
    48. {
    49. if (is_file($dir.'/'.$ele)) //Prüfen ob Element ein File ist
    50. {
    51. $ausgabe .='<li><a href="'.$dir.'/'.$ele.'">'.$ele.'</a></li>';
    52. }
    53. }
    54. }
    55. if($ausgabe)
    56. {
    57. $ausgabe ='<ul>'.$ausgabe.'</ul>';
    58. }
    59. return $ausgabe;
    60. }
    61. }


    Meine mod_test2.php Eintrittspunkt-Datei beinhaltet diesen Code:

    PHP-Quellcode

    1. <?php
    2. /**
    3. * Dateiauflister Module Entry Point
    4. *
    5. * @package Joomla.Tutorials
    6. * @subpackage Modules
    7. * @license GNU/GPL, see LICENSE.php
    8. * @link http://docs.joomla.org/J3.x:Creating_a_simple_module/Developing_a_Basic_Module
    9. * mod_helloworld is free software. This version may have been modified pursuant
    10. * to the GNU General Public License, and as distributed it includes or
    11. * is derivative of works licensed under the GNU General Public License or
    12. * other free or open source software licenses.
    13. */
    14. // No direct access
    15. defined('_JEXEC') or die;
    16. // Include the syndicate functions only once
    17. require_once dirname(__FILE__) . '/helper.php';
    18. $ausgabevariable = modTest2::getDatei($uebergabe);
    19. //$hello = modHelloWorldHelper::getHello($params);
    20. require JModuleHelper::getLayoutPath('mod_test2');



    Meine default.php (Ausgabedatei im tmpl-Verzeichnis des Moduls) habe ich mit dem Eingabefeld als HTML-Formular und dem Button versehen.
    Ebenso erfolgt im PHP-Tag die Übergabe des Pfades in eine Variable und die Ausgabe der Ausgabevariable.
    Die default.php im tmpl-Verzeichnis (Ausgabe Frontend) beinhaltet diesen Code:

    PHP-Quellcode

    1. <?php
    2. // No direct access
    3. defined('_JEXEC') or die; ?>
    4. <h1>Pfadangabe</h1>
    5. <p>Bitte den Pfad zur Datei angeben</p>
    6. <form action="default.php" method="post">
    7. <p>Dateipfad: <input type="text" name="pfad" /></p>
    8. <p><input type="submit" /></p>
    9. </form>
    10. <?php $uebergabe=$_POST['pfad'];
    11. echo $ausgabevariable;
    12. ?>


    Zur Vollständigkeit meine mod_test2.xml Inhaltsbeschreibung:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <extension type="module" version="3.1.0" client="site" method="upgrade">
    3. <name>Dateiauflister</name>
    4. <author></author>
    5. <version>1.0.0</version>
    6. <description>Dateiauflister</description>
    7. <files>
    8. <filename>mod_test2.xml</filename>
    9. <filename module="mod_test2">mod_test2.php</filename>
    10. <filename>index.html</filename>
    11. <filename>helper.php</filename>
    12. <filename>tmpl/default.php</filename>
    13. <filename>tmpl/index.html</filename>
    14. </files>
    15. <config>
    16. </config>
    17. </extension>



    Im Frontend wird mir, nach Installation und Konfiguration des Moduls, zwar das Eingabefeld und der Button angezeigt, jedoch erhalte ich Fehlermeldungen und es funktioniert letztlich nicht - obwohl es ohne CMS in PHP funktionierte.
    Fehler:
    Notice: Undefined variable: uebergabe in C:\inetpub\wwwroot\Joomla\modules\mod_test2\mod_test2.php on line 20




    Mein Modul-Ordner "mod_test2)beinhaltet die Strukur:
    • tmpl-Verzeichnis/index.html (blanko Seite wegen Sicherheitsaspekt)
    • tmpl-Verzeichnis/default.php (Ausgabe PHP-Seite)
    • helper.php (Berechnung)
    • index.html(Blanko-Seite Sicherheitsaspekt)
    • mod_test2.php (Verknüpfungsphp für joomla)
    • mod_test2.xml (Beschreibungsxml für joomla) welche auch als vorlage für eine Intranetseite dienen soll, welche die Möglichkeit bietet Usern im Frontend Dateienhochzuladen und anzuzeigen.
    Wo liegt der Fehler?
    Bzw. wo rufe ich meine PHP-Funktion auf, wo übergebe ich ihm die Variable des Eingabefeldes, wo kann ich die Berechnung ausgeben bzw. wo liegen die Verknüpfungspunkte?

    Ich habe leider kein Tutorial gefunden, welches z. B. als Modul im Frontend ein Eingabefeld anzeigt, der User kann dort etwas reinschreiben, via Button wird die Eingabe im Frontend als HTML-Ausgabe wieder ausgegeben und ggf. mit einem Datum versehen (damit in helper.php irgendwas berechnet wird und ggf. Übergabevariablen behandelt werden).
    Leider greifen die bisherigen Tutorials entweder nur "Hallo Welt" auf oder aber führen mit Datenbankanbindung/auslesung etc. zu weit.

    Um Hilfe wäre ich für diesen Einstieg sehr dankbar.
    Beste Grüße
    Maximilian

    Edit by @Indigo66: Langen Code im Spoiler formatieren.

    das ist schon mal falsch woher soll denn die '$uebergabe' Kommen du wirst hier auch ein notis Meldung beckommen.

    Quellcode

    1. $ausgabevariable = modTest2::getDatei($uebergabe);


    du musst $params übergeben das kommt von Joomla direckt

    Quellcode

    1. $ausgabevariable = modTest2::getDatei($params);


    und diene werde holst du dir Über;

    Quellcode

    1. $dir=$params->get('pfad', 'opsolaner default wert');


    alternativ kannst du auch

    Quellcode

    1. $params->getString();

    Quellcode

    1. $params->getInt();

    Quellcode

    1. $params->getArray;


    benützen
    Du hast mehrere Denkfehler.

    Der gravierendste:
    Zuerst wird mod_test2.php ausgeführt, dann erst default.php. Eine Variablenermittlung $uebergabe in default.php wird deshalb nie in mod_test2.php ankommen.
    Den Teil musst also nach mod_test2.php verschieben (wenn du bei deinem eingeschalgenen Weg bleiben willst) und anschließend kann default.php das dann ausgeben.
    (Ich würde die POST-Abfrage wahrscheinlich gleich in die helper.php verschieben, weil dann kannst die modTest2::getDatei() sowohl in der mod_test2.php als auch default.php direjt und ohne Übergabeparameter aufrufen. Dabei auch gleich prüfen, ob der POST-Wert überhaupt existiert und ggf. abbrechen.

    Und wegen Hinweis zu $params oben. $params enthält NICHT Formulardaten, die im Frontend eingegeben wurden, sondern Konfigurationsdaten des Moduls.
    Klar könnte man in $params temporär auch den im Frontend eingeg. Pfad ablegen. (Muss man aber bei diesem Code-Schnipsel nicht, da getDatei() sowieso keine weiteren Konfigurationsparameter verwendet.

    Quellcode

    1. $params->set('uebergabe', $_POST['pfad']);
    2. $ausgabevariable = modTest2::getDatei($params);

    und kannst dann wie Robox schreibt in getDatei() auslesen.

    Das hier wird nebenbei ziemlich sehr vermutlich auch nicht funktionieren, da du die deafult.php des Moduls gar nicht direkt aufrufen kannst, selbst wenn der Pfad stimmen würde, was er nicht tut

    Quellcode

    1. <form action="default.php" method="post">

    Du musst unter der action den Pfad der aktuellen Seite hinterlegen, wo das Modul angezeigt wird. Gar nichts geht glaub ich auch.

    Und noch als Tipp, da arbeiten mit $_POST in Joomla "unschön" ist: So macht man korrekt und hat den Vorteil, dass man $_POST['xaz'] gar nicht mehr prüfen muss, sondern einfach einen leeren Wert als Defaultwert eintragen kann und Joomla prüft für dich.
    docs.joomla.org/Retrieving_request_data_using_JInput

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Re:Later“ ()

    $_POST alleine ohne entsprechende Überprüfung wird so auch nicht Funktionieren das hat aber nichts mit joomla Zutun sondern hat mit php.

    Quellcode

    1. $params->set('uebergabe', $_POST['pfad']);


    am einfachsten machst du das mit

    Quellcode

    1. $app = JFactory::getApplication();
    2. $app->input->get('name', ''Defaultwert');

forum.joomla.de is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters the trademark holder in the United States and other countries.