Ergebnis 1 bis 7 von 7

Thema: Bei einem DCA-Update ein Spalte in der DB auf 1 setzen

  1. #1
    Contao-Nutzer
    Registriert seit
    14.06.2010.
    Beiträge
    81

    Standard Bei einem DCA-Update ein Spalte in der DB auf 1 setzen

    Hallo,

    ich habe eine kleine Frage bezüglich dem Update eines DCA-Eintrages im Backend.
    Ich würde gerne nach einem Update eines DCA-Eintrages (aber nur dann wenn auch ein Feld geändert wurde) gerne bei diesem Eintrag ein Datenbankfeld auf 1 setzen.

    Wenn ein User auf Speichern klickt, ohne ein Feld geändert zu haben, wird automatisch der Tstamp neu gesetzt. Aus diesem Grund kann ich mit dem tstamp nichts anfangen.

    Kann es sein, dass ich bei jedem Element den save_callback verwenden muss? Aber wie bekomme ich dann den alten Wert? Da ist ja nur der neue Wert und das dca. Aber soweit ich weiß ist im DCA der alte Wert nicht drinnen.

    Vielen Dank

    Danke Ludi

  2. #2
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  3. #3
    Contao-Nutzer
    Registriert seit
    14.06.2010.
    Beiträge
    81

    Standard

    Vielen Dank für die Antwort.
    Der Ansatz ist gut, aber komischerweise erhalte ich bei meiner onsubmit_callback Funktion beim Lesen von der Datenbank noch die alten Werte. Kann es sein, dass es da irgendwie die Werte von der Session verwendet?

    laut Webseite muessten die daten bei onsubmit_callback schon gespeichert sein.
    Ruft eine Callback-Funktion nach der Aktualisierung eines Datensatzes auf und übergibt das DataContainer-Objekt als Argument.
    kann es sein, dass es irgendwo gecached wird?
    Geändert von ludi (21.05.2011 um 19:46 Uhr)

  4. #4
    Contao-Nutzer
    Registriert seit
    14.06.2010.
    Beiträge
    81

    Standard

    Ich habe gerade den Fehler gefunden. Die Datenbank lieferte mir die Daten vom Cache zurück. Ich musste folgendes ersetzen, dann ist es gegangen.

    $objTest = $this->Database->query("SELECT * FROM table WHERE id=".$dc->id);
    anstatt
    $objTest = $this->Database->prepare("SELECT * FROM tl_zv_drawing WHERE id=?")->execute($dc->id);

    Ist das vielleicht ein Bug? Es ist nicht ganz logisch für mich.

  5. #5
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.613
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Versuch es mit dem $dc->activeRecord, der müsste die neusten Daten enthalten.
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  6. #6
    Contao-Nutzer
    Registriert seit
    14.06.2010.
    Beiträge
    81

    Standard

    Mein obiges Problem ist wieder aufgetreten. Es hat zwar schon mal funktioniert, aber jetzt geht es wieder nicht mehr.

    Für mich ist es wichtig, dass ich erkenne ob beim Speichern auch wirklich Daten verändert wurden. Wenn ja wird ein Flag gesetzt.

    Folgendes habe ich jetzt gemacht:
    1) onsubmit_callback und onload_callback eingebaut
    Code:
    'onload_callback' => array
    		(
    			array('tl_zv_drawing', 'cacheData')
    		),
    		'onsubmit_callback' => array
    		(
    			array('tl_zv_drawing', 'checkData')
    		),
    2) cacheData speichert mir die alten Werte in der Session
    Code:
    public function cacheData($dc)
    	{
    		
    		$row = $this->Database->prepare("SELECT * FROM tl_zv_drawing WHERE id=?")
    							  ->execute($this->Input->get('id'))
    							  ->fetchAssoc();
    		//echo $row['drawingType'];
    		$this->Session->set('tl_zv_drawing.drawNumber', $row['drawNumber']);
    		$this->Session->set('tl_zv_drawing.drawingType', $row['drawingType']);
    		$this->Session->set('tl_zv_drawing.idProject', $row['idProject']);
    		$this->Session->set('tl_zv_drawing.date', $row['date']);
    //....
    }
    Wenn ich danach gleich print_r($this->Session); ausgebe, sehe ich, dass die alten Werte gesetzt sind.

    4) check Data Funktion ueberprueft einfach die alten Werte der Session mit den aktuell gespeicherten
    Code:
    public function checkData($dc)
    	{
    		$objTest = $dc->activeRecord;
    if(
    		 	$this->Session->get('tl_zv_drawing.drawNumber') !== $objTest->drawNumber ||
    			$this->Session->get('tl_zv_drawing.drawingType') !== $objTest->drawingType || 
    			$this->Session->get('tl_zv_drawing.idProject') !== $objTest->idProject || 
    			$this->Session->get('tl_zv_drawing.date') !== $objTest->date ) {
    $this->Database->prepare("UPDATE tl_zv_drawing SET isChanged=1 WHERE id=?")
    						   ->execute( $this->Input->get('id'));		
    
    }

    Wenn ein Backend User bei diesem DCA Eintrag auf speichern klickt, wird zuerst ja die cacheData noch einmal aufgerufen (hier wird noch der alte Wert in die Session gespeichert). Danach wird später checkData aufgerufen. Hier steht aber jetzt komischerweise in der Session nicht der alte Wert drinnen. Es sieht so aus als ob es ein uralter Wert ist. Gibt es hier irgendwo ein Cache für DCA Einträge?

    Hier bin ich echt langsam ratlos.
    Danke für eure Hilfe.

  7. #7
    Contao-Nutzer
    Registriert seit
    14.06.2010.
    Beiträge
    81

    Standard

    Ich habe jetzt statt $this->Session->set und $this->Session->get
    $_SESSION['BE_DATA']['tl_zv_drawing.cache'] verwendet, also direkt in die Session gespeichert.

    cacheData Funktion:
    Code:
    $row = $this->Database->prepare("SELECT * FROM tl_zv_drawing WHERE id=?")
    							  ->execute($this->Input->get('id'))
    						          ->fetchAssoc();
    $_SESSION['BE_DATA']['tl_zv_drawing.cache'] = $row;
    und checkData Funktion:
    Code:
    $objTest = $dc->activeRecord;
    $drawingCache = $_SESSION['BE_DATA']['tl_zv_drawing.cache'];
    
    if(
    		 	$drawingCache['drawNumber'] !== $objTest->drawNumber ||
    			$drawingCache['drawingType'] !== $objTest->drawingType || 
    			$drawingCache['idProject'] !== $objTest->idProject || 
    			$drawingCache['date'] !== $objTest->date) {
       $this->Database->prepare("UPDATE tl_zv_drawing SET isChanged=1 WHERE id=?")
    						   ->execute( $this->Input->get('id'));		
    }

    So funktioniert es. Warum geht es mit $this->Session nicht? Verstehe ich da etwas noch nicht?

    Danke

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

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