Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA: Korrekturen zum Before Store und meinem Video

Korrekturen zum Before Store und meinem Video 30 Sep 2014 03:03 #1598

  • Whykiki
  • Whykikis Avatar
  • OFFLINE
  • Beiträge: 74
  • Dank erhalten: 33
3. Korrekturen zum Before Store

Nach wie vor eine Granate. Aber ich muss hier mal ein paar Dinge aus meinem letzten Video klarstellen, weil ich scheinbar erst JETZT so RICHTIG verstanden habe, was das Ding eigentlich macht.
Ihr erinnert euch vielleicht: Ich habe mit diesem Feld Werte in eine eigene Tabelle gespeichert. Ich habe es zum Beispiel genutzt, um die aktuelle User ID auszulesen und sie in die Datenbank zu schreiben usw.

Z.b.
$user = JFactory::getUser();
if (!$user->guest) {
$user_id = $user->get('id');
$user_name = $user->get('name');
}
$name = $fields['name']->value;

$data->user_id=  $user_id;
$data->user_name =  $user_name;
$data->name=  $name;

$db = JFactory::getDBO();      
        try
        {
            $ret = $db->insertObject($db->escape('meine-tabelle'), $data);
        } catch (JException $e)
        {
            $this->setError($e->getMessage());
            return false;
        }
Ich hole mir also den Wert des Feldes "name", die Id und den Usernamen und speichere es in den entsprechenden Feldern der DB

Das funktioniert so lange gut, wie man mit dem "BeforeStore" Feld eben ALLES SPEICHERT. Somit also die Funktion der Felder im ContentTyp überflüssig macht (dienen dann nur dem Auslesen).
Genau DAS war bei mir ja aber was spezielles, weil ich Werte aus zwei Tabellen zusammengeführt habe. Heisst: Im Grunde braucht man das relativ selten. Es macht auch eigentlich gar keinen Sinn alle seine Felder mit BeforeStore zu speichern (das würde ja das Felderkonzept iwie über den HAufen werfen).
Aber es gibt Fälle, wie den meinen, wo das Sinn machen KANN.

ABER: Das ist mir damals nicht aufgefallen, weil ich ja eben ALLES habe speichern lassen, also ist auch immer nur eine Zeile in der DB gelandet.

WENN man aber nun zum Beispiel einen ContentType erstellt und man liest spasseshalber die User Id aus oder das heutige Datum oder was man auch immer mit BeforeStore so alles berechnen kann und speichert dieses dann in der DB.
Zusätzlich hat man dann noch echte Felder in die was eingetragen werden kann. Das BeforeStore würde somit also nur dazu dienen, Werte zu speichern, die ich NICHT über meine Felder erfassen kann.
Was nun pasiert ist folgendes. Alle Werte werden gespeichert, das BS, meine Felder.... Klappt alles so weit.....
ABER es werden zwei Reihen gespeichert!!!
Eine Reihe mit den Werten aus dem BeforeStore Feld und eine Reihe mit den Werten der Felder.

WARUM?:
Und jetzt kommt ich zum Punkt und zur Korrektur meines Videos:
Das Feld wird ja VOR dem Speichern in der Datenbank ausgeführt und im Code-Bereich habe ich ein DB-insert stehen( siehe oben), so dass also BEVOR meine Felddaten in die DB geschrieben werden, schon das Insert aus dem BeforeStore ausgeführt wurde.

Man könnte das nun auch hier wieder umgehen und alle Werte aller Felder des ContentTypen ziehen, deren Storage jeweils auf None setzen und dann mit dem BS Werte in die DB schreiben.
Is aber, wie ja jetzt mehrfach erwähnt, absoluter Käse. Warum so schwer, wenn es auch einfach geht.

Also, ich bin nach wie vor ein von After und BeforeStore, aber das hier hat mich eines besseren belehrt.
Denn ich hab das für mich jetzt als Allrounder gesehen. Mal eben so mir nix dir nix jeden beliebigen Wert in meinem Content ablegen.
Ja, geht grundsätzlich, aber eben nur nacheinander....

Übrigens: Nutzt man "AfterStore" legt das Script die Reihe NACH meinen Felder an :-) Klar, logisch...aber erst jetzt :-) Is ja auch nachem Speichern :-) Erst dann wird das insert ausgeführt.

Ich hoffe das passt hier alles noch so zusammen. Ich hab mir damit irgendwie grad so'n bisschen den Frust von der Seele geschrieben. SEBLOD® is soooo geil, aber manchmal auch soooo extrem ärgerlich.
Diese megakrasse Verzahnung mit den Joomla-Artikeln macht einem manchmal echt das Leben schwer. Ich würd SEBLOD® am liebsten als Standalone haben :-)

Klar kann man diese ganze Kacke auch selber proggen, aber alleine die ganzen Filterungsoptionen, Pagination usw....ach jaaaaa

Edit: bitte in richtige Kategorie verschieben, hab im eifer nicht aufgepasst :-)
Letzte Änderung: 30 Sep 2014 03:10 von Whykiki.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Korrekturen zum Before Store und meinem Video 30 Sep 2014 10:04 #1601

  • Cappu
  • Cappus Avatar
  • OFFLINE
  • Beiträge: 146
  • Dank erhalten: 29
Hallo Kiki,

Kein Grund für Frust auf Before Store und After Store!

Beides sind doch nur Slots, die Dir helfen Code vor und nach dem Speichern auszuführen. - Nun liegt es natürlich an Deinem Code, ob er das macht, was Du willst - oder nicht. -

Damit Dein Code im Before Store Feld nicht bei jedem Speichern einen neuen Datensatz anlegt, ist natürlich zu gucken, ob schon einer angelegt wurde. - Ich habe das für ein Projekt mit einer zusätzlichen Datenbankabfrage gelöst (relative low tech) - aber Speichern kommt in meinem Fall - relativ gesehen - selten vor. Hier versuche ich das mal an Dein Beispiel anzupassen:
$user = JFactory::getUser();
$db = JFactory::getDBO();      

$query = $db->getQuery(true);

// mal gucken, ob wir den User schon kennen
$query->select('COUNT(`id`)');
$query->from($db->escape('#__meine-tabelle'));
$query->where("`user_name`='".$user_name."'");
try
{
    $db->setQuery((string) $query);
} catch (JException $e)
{
    $this->setError($e->getMessage());
    return false;
}   

$is_user = $db->loadResult();

if ($is_user== 0) { // keine User bekannt; jetzt kanns'te loslegen mit Deinem Code
	if (!$user->guest) {
		$user_id = $user->get('id');
		$user_name = $user->get('name');
	}
	$name = $fields['name']->value;

	$data->user_id=  $user_id;
	$data->user_name =  $user_name;
	$data->name =  $name;


    try
    {
        $ret = $db->insertObject($db->escape('meine-tabelle'), $data);
    } catch (JException $e)
    {
        $this->setError($e->getMessage());
        return false;
    }
}

Bernhard
Letzte Änderung: 30 Sep 2014 10:06 von Cappu.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Korrekturen zum Before Store und meinem Video 30 Sep 2014 17:44 #1606

  • Whykiki
  • Whykikis Avatar
  • OFFLINE
  • Beiträge: 74
  • Dank erhalten: 33
Holla,

vielen Dank für den Ansatz, das ist schon mal ne gute Sache.
Aber auch damit umgehe ich ja nicht, dass BeforeStore vor dem Speichern den Wert in die Datenbank schreibt.

Aber auch hier gibt es eine grundsätzliche Möglichkeit, die Cappu mir aufgezeigt hat. Man kann den Wert den man benötigt mit BeforeStore auslesen und in ein Hidden-Field schreiben und das wiederum dann speichern.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Korrekturen zum Before Store und meinem Video 01 Okt 2014 13:19 #1620

  • Anonymus
  • Anonymuss Avatar
Hallo,

was bedeutet den "BeforeStore" ?

Das sagt doch nur: mach etwas bevor du Speicherst.

Nun man muss ja an dieser Stelle nicht Speichern oder?
man kann doch auch das $item an dieser Stelle um die nicht enthaltenen Felder/Werte erweitern und dann "normal" speichern lassen.

Der einzige Sinn der Speicherung in BeforeStore/AfterStore ist der, das ich in zusätzliche tabellen speichern könnte.
Wenn alles in dieselbe kommt macht es meiner Meinung wenig Sinn hier schon mal zu Speichern, da ist es Sinnvoller das $item Array zu erweitern.

LG
Paul
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Korrekturen zum Before Store und meinem Video 15 Dez 2014 02:34 #2092

  • redback
  • redbacks Avatar
  • OFFLINE
  • Beiträge: 11
  • Dank erhalten: 18
Hallo,

man kann auch einfach den Array manipulieren bevor es gespeichert wird. So spart man die MySQL Anweisungen.

Habe mal eine generelle kurze Anleitung auf SEBLOD®.com zum BeforeRender Plugin geschrieben.

http://www.seblod.com/community/forums/fields-plug-ins/beforestore-plugin-code-pack-change-value#post21654
Der Administrator hat öffentliche Schreibrechte deaktiviert.
Folgende Benutzer bedankten sich: time4mambo, Cappu, Whykiki

Korrekturen zum Before Store und meinem Video 28 Mai 2015 14:10 #2866

  • Whykiki
  • Whykikis Avatar
  • OFFLINE
  • Beiträge: 74
  • Dank erhalten: 33
Hallo,

vielen Dank erst einmal für deine Antwort und das Feedback.

Dazu hab ich aber nun noch einmal eine Frage, denn laut deinem Post scheint es ja so, als wenn du das Problem so hättest lösen können.
Wenn ich das jedoch richtig sehe, dann passiert bei dir eben das gleiche, wie auch in meinem Fall:
Das BeforeStore schreibt den Wert in die Datenbank BEVOR davon gefolgt dann in quasi einem zweiten Step, der Joomla-Speichervorgang folgt.

Arbeitet man nun rein mit eigenen Tabellen und nutzt somit im Grunde grosse Teile der Joomla-Logik nicht, was ja durchaus sein kann, dann ist es total super dieses Feld zu haben :-) Denn auf Basis SEBLOD®/Joomla kann man ja ne Menge machen und ich brauche ggf. die Joomla-Artikel nicht.

Wenn ich jedoch meine Seiten im Grunde mit SEBLOD® aufbohre und meine SEBLOD®-Contents so speichere, wie es eigentlich gedacht ist, dann macht es das KEINEN Sinn.
Denn sobald du dein BeforeStore in einem Contenttypen einsetzt, der in der Joomla-Logik speichert (z.B. Standard->Artikel), dann bekommst du ab sofort zwei Zeilen in deine Tabelle gespeichert:

- zuerst die paar Felder, die du mit BeforeStore in die Storage schreibst (vllt sogar nur eines....)
- 1x den Datensatz der ganz normal via SEBLOD® abgelegt wurde

Auch das ist noch nicht einmal das schlimmste Problem, denn irgendwie findet man in so Tabellen immer Werte anhand derer man joinen oder vergleichen kann.
ABER: mit jeder Zeile, die dein BeforeStore in die SEBLOD® / Joomla-Mapping-Tabelle schreibt, wird in deinem Backend quasi eine Art leerer Artikel erzeugt UND alle ID's und Co verschieben sich.
Auf den ersten Blick sieht alles gut aus, öffnet man einen Beitrag aber nach dem ersten Speichern ein weiteres Mal, dann stellt man fest, dass der Beitrag der vorher mit XYZ gefüllt war nun die die Werte des Beitrages davor oder danach hat.

Wie gesagt, ich denke, dass deine dort aufgeführte LÖsung genau das gleiche tut.


Ich werde gleich aber auch noch mal das Before Render ausprobieren.....aus der Diskussion von Cappu, dir und den anderen Jungs :-) kamk mir die Idee, das BeforeRender mal genau so zu befüllen, aber eben KEINEN Speicvhervorgang zu machen. Sondern diesen dann erst später mit Joomla. Ich melde mich dazu noch mal.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Korrekturen zum Before Store und meinem Video 29 Mai 2015 17:25 #2871

  • time4mambo
  • time4mambos Avatar
  • OFFLINE
  • Mal gucken ob was passiert...
  • Beiträge: 901
  • Dank erhalten: 176
Vermutlich denke ich viel zu unkompliziert und verstehe eh nur die Hälfte...
Aber: BeforeStore bedeutet doch nicht, dass du vor dem Speichern schon was speicherst, sondern in diesem "Zwischenbereich" von "Forumlar ist fertig" und "jetzt speichern wir" noch was berechnen, abprüfen, sonstwas erzeugen kannst. Mehr ist das doch nicht.

Somit ist mir völlig unklar, wieso sich da IDs, etc. verschieben und du 2x die gleiche Zeile in der DB-Tabelle stehen hast?


Axel
Das SEBLOD®-Handbuch auf Amazon
Tutorials zu Joomla und MS-Office: www.time4joomla.de
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Korrekturen zum Before Store und meinem Video 30 Mai 2015 01:12 #2874

  • Whykiki
  • Whykikis Avatar
  • OFFLINE
  • Beiträge: 74
  • Dank erhalten: 33
Hahahaha neeee du denkst schon genau richtig. Alles vollkommen korrekt....

Aber zu dem Zeitpunkt als Cappu und ich daran wurschtelten war das Problem eben, dass ich den Wert aus deinem einen Feld für eine Berechnung nutzen musste, um ihn dann in einem anderen Feld abzulegen.
Vermutlich hätte ich das heute so gelöst, dass ich anstatt die Berechnung mit PHP zu machen, dann ggf. jQuery genommen hätte, denn dann wäre das Problem so nicht aufgetreten.

Aber logischerweise (so weit hab ich da an der Stelle halt damals nicht gedacht), muss für eine Berechnung in PHP die Seite einmal abgesendet werden oder ansonsten halt Ajax nutzen, was mir damals ebenso nicht geläufig war. Heute würd ich das eh alles anders lösen, weil ich SEBLOD® wieder deutlich besser verstehe als noch im letzten Jahr.

Aber ich musste damals eben einen ContentType anlegen, der gleichzeitig was in den ContentTyp schreibt und gleichzeitig in die Komponente dpcalendar soweit ich mich erinnere. Ich hab aber auch wiederum Daten aus dpcalendar gezogen und wiederum in die Tabelle meines ContentTypes geschrieben. Das wiederum hatte dann aber eben obiges Verhalte zur Folge.

Heisst also, weil ich hier schon wieder so viel geschwurbelt habe:

Es gab letztens Endes zwei Speichervorgänge in der #__content Tabelle, den BeforeStore und eben den "normalen" Joomla-Store Vorgang. Und damit war dann alles im Arsch.

Ich dachte also: BeforeStore is die eierlegende Wollmilchsau der SEBLOD®-Felder :-)
Der Administrator hat öffentliche Schreibrechte deaktiviert.
nach oben