Fehler beim speichern von Datensätze im eigenen Modul.

  • Hallo zusammen,

    ich bin noch relativ neu im Umgang mit Joomla. Ich habe nach einer Anleitung ein eigenes Modul geschrieben, welches im Frontend eine ganze Reihe von Ansprechpartner darstellen soll.
    Jedem einzelnen Ansprechpartner können über ein Dropdown Menü im Backend Länder zugewiesen werden und es sind nicht gerade wenige Länder.
    Die Datensätze jedes einzelnen Ansprechpartner werden in der Datenbanktabelle in einem Feld "params" gespeichert.

    Nun meine Frage: Kann es sein das es in Joomla sowas wie eine Limit-Funktion gibt? Den ab einer bestimmten Anzahl von Ansprechpartnern speichert Joomla keine neuen Datensätze und leert stattdessen das Tabellenfeld "params". Kann man das irgendwie umgehen? Aus meinem Verständnis heraus sieht es wie ein Bug aus. Oder liegt es an der Datenbank? Das Feld "params" ist vom Typ "Longtext".

    Ich bedanke mich schon einmal für jede Hilfe. :)

  • Kann es sein das es in Joomla sowas wie eine Limit-Funktion gibt?

    Jein. Die params-Felder haben halt datenbankseitig ein Limit. Ich weiß jetzt nicht auswendig, ob "LongText" dein Problem ist, aber riecht ja danach, wie du es oben schreibst.


    Seitens Joomla lehnt man es ab, die params-Felder zu vergrößern (die Frage kommt alle Jahre), weil das die Datenbankabfragen performance-technischt wohl unangenehm verlangsamt. "Das params-Feld ist nicht dafür gedacht, große, eigene Datenmengen zu schreiben."


    Also kein Bug, wenn das der Grund ist für dein Problem.


    Ich verwende bei Beiträgen viele eigene Felder (nicht zu verwechseln mit Joomlas "Eigene Felder") und speichere die Inhalte in eigenen Datenbanktabellen. Als "Brücke" verwende ich ein eigenes System-Plugin, das sowohl die eigenen Felder im Backend-Formular anzeigt, als auch beim Speichern in meine Tabellen schreibt. Dazu Helferklassen, die dann dem Frontend helfen, diese Daten auszulesen.


    Bei Modulen würde ich dann den selben Weg einschlagen, was aber dort bei der geringen Menge an eigenen Felder-Einträgen (noch) nicht nötig ist.


    Ein weiterer Weg wäre vielleicht, die zu speichernden Werte in "Kurzform" zu speichern. Also nicht "Deutschland", sondern "DE", oder, gleich ganz "richtig" als ids, die eine andere Tabelle mit Ländern referenzieren.

  • Danke für deine Antwort ... also, wenn ich über PHPMYADMIN weitere Werte im Params-Feld eintrage, dann funktioniert es und die Datenbank speichert es schön brav ab. Nur wenn ich im Backend über das entsprechende Formular des Moduls speichern möchte, kommt zwar die Meldung das erfolgreich gespeichert wurde, aber auf einmal im Feld "params" keine Daten mehr vorhanden sind - auch die anderen älteren Einträge in "params" wurden automatisch durch das speichern gelöscht. Sowas kann doch nicht sein - es wäre schon schön, wenn Joomla einfach nur eine Fehlermeldung ausgeben würde, aber das das Feld auf einmal komplett geleert wird?

    Oder kennst du ein gutes Tutorial, wo gezeigt wird, wie man ein Modul/Erweiterung bauen kann, damit ich dieses Problem umgehen kann? :)

  • Zitat

    aber auf einmal im Feld "params" keine Daten mehr vorhanden sind - auch die anderen älteren Einträge in "params" wurden automatisch durch das speichern gelöscht. Sowas kann doch nicht sein - es wäre schon schön, wenn Joomla einfach nur eine Fehlermeldung ausgeben würde, aber das das Feld auf einmal komplett geleert wird?

    Ich würde sagen dass du das params Feld in deinem Programm einfach leer übergibst. Hast du denn mal unmittelbar vor dem Speichern geprüft dass das richtige Feld korrekt belegt ist? Joomla löscht nichts von selbst.

  • Oder kannst du mir erklären, wie ich das Modul so abändern kann, dass für die Länder eine eigene Tabelle erstellt werden, wo die Ländern dann abgespeichert werden? Das mit den referenzieren dieser Tabellen musst du mir noch einmal genauer erklären - klingt schonmal sehr interessant.

  • Ich würde sagen dass du das params Feld in deinem Programm einfach leer übergibst. Hast du denn mal unmittelbar vor dem Speichern geprüft dass das richtige Feld korrekt belegt ist? Joomla löscht nichts von selbst.




    Natürlich habe ich das alles geprüft, 33 Ansprechpartner habe ich ja erfolgreich angelegt, nur beim 34 Ansprechpartner verweigert Joomla den Dienst und löscht alles ... :(

  • Joomla löscht nichts von selbst.

    Ich hab das mal debuggt.


    300.000 Loops werden durchlaufen, die das params-Feld füllen. Das Ergebnis ist größer als "mediumtext" (bei mir ist da kein "longtext", sondern "mediumtext", nebenbei. Und nach Joomla-Installations-SQL sollte es eigentlich auch nur "text" sein. Keine Ahnung...).

    Joomla speichert das zwar ohne Meldung, da der Eintrag aber zu lang fürs Feld wird, sind das verstümmelte JSON-Daten (hinten fehlt die geschweifte Klammer).


    Erst danach hängt sich Joomla auf mit: "0 Error decoding JSON data: Control character error, possibly incorrectly encoded"


    Joomla speichert also, aber beim Neuladen der Modul-Edit-Ansicht hängt sich Joomla dann auf bzw. man kann das Modul nicht mehr öffnen.


    In der Datenbank findet sich aber der abgeschnittene params-String.

    Also nicht leer.

  • Es war vorher bei mir vom Typ "text", ich habe es in "Longtext" geändert.
    Diese Funktion ist wahrscheinlich deine eigene, die du bei dir zum debuggen benutzt hast oder?
    Kann ich bei mir nicht auch so was ähnliches einbauen, damit ich die Datensätze in die Datenbank bekomme?
    Wenn ja, wie könnte ich das machen?

  • Diese Funktion ist wahrscheinlich deine eigene, die du bei dir zum debuggen benutzt hast oder?

    Das Gerüst

    Code
    public function onExtensionBeforeSave($context, $table, $isNew, $data = array())
    {
    
    }

    ist eine Joomla-Methode/Funktion, die ich in einem System-Plugin verwende. Das so genannte Plugin-Event "onExtensionBeforeSave", wird u.a. beim Speichern von Modulen von Joomla automatisch durchlaufen; in jedem System-Plugin, in dem die Methode eingebaut ist.


    Also, ja, es wäre grundlegend eine Möglichkeit seitens Speicherung params abzufangen und Teile davon in einer eigenen Tabelle zu speichern.


    "Problem" ist dann aber die Anzeige im Modul-Edit. Damit du die Felder im Formular angezeigt bekommst, benötigst du 2 weitere Methoden

    Code
        public function onContentPrepareForm($form, $data)
        {

    zum Erweitern des Formulars um deine eigene Felder, z.B. durch Hinzuladen einer eigenen Formular-XML-Datei.


    Sowie

    Code
    public function onContentPrepareData($context, $data)
    {

    zum Befüllen der Felder mit deinen eigenen Daten aus eigener DB-Tabelle.


    Nicht ganz ohne und sicherlich in einem Forum zu umfangreich zu erklären (abgesehen von der Zeit ;) ).


    Aber firstlady 's Hinweis, dass ein longtext ja üppig ausreichen sollte sowie meinem Test, dass das Feld dann eben nicht leer ist, zeigt ja, dass grundlegend irgendwas am Modul selbst nicht stimmt. Hast du denn "Fehler berichten" auf "Maximum" stehen, wobei das beim Speichern oft nix bringt, weil ja die Seite automatisch neu geladen wird. Da ist dann die Meldung, die einen interessiert vielleicht shon wieder ungesehen weg.


    Verwendest du ein "Repeatable" bzw. "Subform"-Feld für mehrere Ansprechpartner im Modul oder versteh ich was falsch am Aufbau deines Moduls?


    Kannst ja auch mal das Modul inkl. aller Dateien zippen und posten.

  • Danach hast du nicht gefragt, aber:

    Wenn ich deine Aufgabenstellung richtig verstanden habe würde ich das anders angehen.

    Ich würde die Ansprechpartner als normalen Beitrag im Backen anlegen und die Suche mit dem (kostenpflichtigen) Modul articles-goog-search einbauen.

    Für die Länder kannst du ein ein fertiges Custom Field in diesem kostenfreien Paket nutzen.


    Meiner Meinung nach kannst du so die Ansprechpartner viel übersichtlicher bearbeiten als mit dem wiederholbaren Feld (Repeatable Field).

  • sturmi1976


    Ich konnte problemlos über 35 Einträge speichern.


    Prüfe doch mal unter System > Systeminformationen > PHP-Informationen die Werte für

    max_input_vars (also maximal erlaubte Input-Felder in einem Formular, die gespeichert werden können)


    vielleicht auch:

    post_max_size


    Aber leer ist params danach immer noch nicht., wenn der Wert zu niedrig ist

    Joomla verlässt das Modul-Edit in vielen Fällen und schweigend und in der Übersicht hat das Modul dann ein Schloss.


    Oder es kommt "Warnung

    Der Sicherheitstoken ist falsch. Die Anfrage wurde zurückgewiesen, um eine Sicherheitsverletzung zu verhindern. Bitte die Seite aktualisieren und erneut versuchen."

    ??????? Vielleicht auch wegen meinem grobschlächtigen Debuggen ;)


    In der PHP Error-Log-Datei finde ich dann:

    "PHP Warning: Unknown: Input variables exceeded 1000."

  • In der PHP Error-Log-Datei finde ich dann:

    "PHP Warning: Unknown: Input variables exceeded 1000."

    sturmi1976 Vielleicht solltest du diesem Hinweis von Re:Later noch nachgehen. Als ich mir das Modul eben kurz angesehen habe, sind mir sofort eine Reihe diese Meldungen aufgefallen:


    Code
    Warning: Use of undefined constant Land - assumed 'Land' (this will throw an Error in a future version of PHP) in /var/www/html/joomla-cms/modules/lic-ansprechpartner/tmpl/default.php on line 93
    ...
  • Re:Later Jetzt habe ich aber ein Textarea-Feld, wo sehr viel Text rein muss. Nun erscheint folgende Fehlermeldung: Speichern fehlgeschlagen! Fehler: Der Inhalt überschreitet die zulässige Anzahl von 65535 Zeichen.


    Kann man das irgendwie abschalten, so das es keine Begrenzung mehr gibt?