Felder created_by und updated_by automatisch setzten

Bei grösseren Webanwendungen muss häufig eine einfache Änderungsverfolgung für die Daten implementiert werden. Wenn nur wichtig ist wer den Datensatz angelegt oder geändert hat muss keine vollständige Erfassung von Änderungsbelegen erfolgen, sondern es reichen die Felder created_by und updated_by.

Symfony füllt die Felder created_at und updated_at automatisch. Mit der folgenden Anpassung von Boris Duin werden auch die Felder created_by und updated_by automatisch befüllt.

Die Änderunge ist im Symfony Code Snippet 142 beschrieben und hier Code der bei mir funktioniert:

<?php
/* I recomend put this class out Symfony Folder.
*  If you put this class in some project folder
* you can use include_once 'symfony/addon/propel/builder/SfObjectBuilder.php'
*
* Änderungen:
*   created_by und updated_by sind foreign keys auf die sf_guard_user tabelle
*   Die Datei propel.ini muss geändert werden.
*
* @author     Boris Duin
*/
require_once 'symfony/addon/propel/builder/SfObjectBuilder.php';
class SfObjectAdvancedBuilder extends SfObjectBuilder
{
  // Extend Method addSave
  protected function addSave(&$script)
  {
    $tmp = '';
    parent::addSave($tmp);

    $date_script = '";
    if ($this->isNew() && !$this->isColumnModified('created_by'))
    {
      $user = sfContext::getInstance()->getUser();
      if ($user instanceof sfGuardSecurityUser)
        $this->setCreatedby($user->getId());
    }
";
      }
      else if (!$user_updated && $clo == 'updated_by')
      {
       $user_updated = true;
        $date_script .= "
    if ($this->isModified() && !$this->isColumnModified('updated_by'))
    {
      $user = sfContext::getInstance()->getUser();
      if ($user instanceof sfGuardSecurityUser)
        $this->setUpdatedby($user->getId());
    }
";
      }
    }

    $tmp = preg_replace('/{/', '{'.$date_script, $tmp, 1);
    $script .= $tmp;
  }
}

Noch ein kurzer Nachtrag: Fixtures für Tabellen, die created_by und updated_by enthalten, werden bei mir momentan nicht geladen.