A typical Developer Blog
by Gordon Franke
Icon

Wie kann ich user attribute in meinem Functional test überschreiben?

Manch mal hängt der code von einem user attribute ab, also will man das user attribute in seinem functional test überschreiben.

Das Problem ist das die doCall Methode in der sfBrowser Klasse den context neuerstellt und am ende die shutdown Methode für den user und die storage Objekte , zum schreiben der Session daten, aufruft.

Also muss man seine eigene Browser Klasse erstellen und die doCall Methode überschreiben und den code an den Anfang verschieben.

Browser Klasse:

class myBrowser extends sfBrowser
{
  /**
   * Calls a request to a uri.
   */
  protected function doCall()
  {
    // manually shutdown user to save current session data
    if (isset($this->context) AND $this->context->getUser())
    {
      $this->context->getUser()->shutdown();
      $this->context->getStorage()->shutdown();
    }
 
    // recycle our context object
    $this->context = $this->getContext(true);
 
    sfConfig::set('sf_test', true);
 
    // we register a fake rendering filter
    sfConfig::set('sf_rendering_filter', array('sfFakeRenderingFilter', null));
 
    $this->resetCurrentException();
 
    // dispatch our request
    ob_start();
    $this->context->getController()->dispatch();
    $retval = ob_get_clean();
 
    // append retval to the response content
    $this->context->getResponse()->setContent($retval);
  }
}

Test code:

include dirname(__FILE__).'/../../bootstrap/functional.php';
 
$browser = new sfTestFunctional(new myBrowser());
 
$browser->
  get('/site-one');
 
// override the session data
$browser->getUser()->setAttribute('key', $value);
 
$browser->
  get('/site-one');

Symfony und die kompilierte version von doctrine

In einem neuen symfony Projekt habe ich nun mal doctrine in der kompilierten version getestet. Seit version 1.3.7 von symfony wird dies unterstützt.

http://www.symfony-project.org/blog/2010/09/22/symfony-1-3-7-1-4-7

Dabei habe ich zwei Dinge gelernt

Erstens sollte man die option –driver verwenden. Mit mysql kann man so ~15% der Dateigröße sparen.

Zweitens sollte man Doctrine_Core und nicht Doctrine verwenden, da dies sonst zu fatal errors führt, da die Klasse deprecated ist und nicht mit kompiliert wird.
Um den Klassennamen automatisch zu fixen siehe:
Wechseln von Doctrine to Doctrine_Core mit einem Befehl

Simples skript zum finden fehlender Übersetzungen

Woher bekomme ich das “Pro Git” Buch als pdf?

Als erstes das git repository ausschecken

git clone git://github.com/progit/progit.git

Wenn du Ubuntu benutzt musste du ein paar Pakete nachinstallieren

sudo aptitude install ruby pandoc texlive-xetex texlive-latex-recommended

anschließend kannst du das PDF in deiner bevorzugten Sprache erstellen lassen. Führe im latex Verzeichnis folgendes Kommando aus.

ruby makepdf en

Wie kann man in symfony 1.3 einfach alle Formular Pflichtfelder kennzeichnen?

Erstelle eine Funktion in deiner BaseForm Klasse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static function listenToPostConfigure($event)
{
  $form            = $event->getSubject();
  $widgetSchema    = $form->getWidgetSchema();
  $validatorSchema = $form->getValidatorSchema();
 
  $fields = $form->getFormFieldSchema()->getWidget()->getFields();
  foreach ($fields as $key => $object)
  {
    $label = $form->getFormFieldSchema()->offsetGet($key)->renderLabelName();
    if (isset($validatorSchema[$key]) and $validatorSchema[$key]->getOption('required') == true)
    {
      $title  = $key . '_field_is_required';
      $label .= '<sup>getFormFormatter()->translate($title) . '">*</sup>';
    }
    $widgetSchema->setLabel($key, $label);
  }
}

Add a listener to the form.post_configure event with your function

1
2
$dispatcher = $this->getEventDispatcher();
$dispatcher->connect('form.post_configure', array('BaseForm', 'listenToPostConfigure'));

Wie kann ich das netbeans Farbschema anpassen um auszusehen wie in den symfony Dokumentationen?

Einfach folgende Datei in das Verzeichnis netbeans-6.8/nb6.8 entpacken:
SymfonyColorScheme.zip

Danke an Ze Technology für das Farbschema

http://www.ze-technology.com/2009/12/11/netbeans-aux-couleurs-de-symfony/

Wechseln von Doctrine to Doctrine_Core mit einem Befehl

Um deinen Code von Doctrine auf Doctrine_Core umzustellen kannst du folgenden Befehl verwenden

1
for fl in `find apps/ config/ lib/ test/ -name *.php`; do mv $fl $fl.old; sed 's/Doctrine::/Doctrine_Core::/g' $fl.old > $fl; rm -f $fl.old; done

Wenn du ein Plugin hast benutze folgenden Befehl

1
for fl in `find . -name *.php`; do mv $fl $fl.old; sed 's/Doctrine::/Doctrine_Core::/g' $fl.old > $fl; rm -f $fl.old; done

Wie kann ich alle Zimbra datenbanken und tabellen überprüfen und optimieren?

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#
 
source ~zimbra/bin/zmshutil || exit 1
zmsetvars zimbra_home mysql_directory mysql_socket mysql_root_password
 
echo ${mysql_root_password}
 
${mysql_directory}/bin/mysqlcheck --all-databases --optimize -h localhost -P 7306 --protocol=tcp \
        --user=root --password=${mysql_root_password} $*

Wie kann ich alle von symfony generierten base Dateien vom svn löschen?

Dieses im Projekt root Verzeichnis aufrufen.

for DIR in `find lib -name base -type d`; do svn propset svn:ignore base $DIR/..;svn rm $DIR; done;

Wie kann ich mehrere Instanzen von memcached auf einem Server laufen lassen?

Problem

Ich brauche mehr als einen Memcached Server.

Lösung

Virtuellemaschinen

Ich kann für jeden memcached server eine Virtuellemaschine erstellen.

Probleme

  • mehr speicher (system+memcached)
  • eine ip addresse pro Instanz
  • mehr Aufwand

Multiple Instanzen mithilfe von Ports

Dafür müssen die Skripte init.d und start-memcached gepatched werden um Multiple Instanzen zum laufen zubekommen.

Nach dem patch sucht es nach Konfigurationsdateien die folgendem Muster entsprechen /etc/memcached_*.conf. Wenn es keine Dateien findet benutzt es die /etc/memcached.conf Konfigurationsdatei. Es ist also rückwärtskompatibel.

Wenn du nun 2 memached Instanzen erstellen möchtest kopiere die Konfigurationsdatei und ändere den Port, Speicher …

cp /etc/memcached.conf /etc/memcached_myserver_1.conf
cp /etc/memcached.conf /etc/memcached_myserver_2.conf

Befehle

startet alle Server

/etc/init.d/memcached start

startet nur einen bestimmten Server

/etc/init.d/memcached start myserver_1

stopt alle Server

/etc/init.d/memcached stop

stopt nur einen bestimmten Server

/etc/init.d/memcached stop myserver_1

Die Änderungen

/usr/share/memcached/scripts/start-memcached

26,30d25
> if (scalar(@ARGV) == 2) {
> 	$etcfile = shift(@ARGV);
> 	$pidfile = shift(@ARGV);
> }
>

/etc/init.d/memcached

16a17
> DAEMONNAME=memcached
18d18
< NAME=memcached
20d19
< PIDFILE=/var/run/$NAME.pid
26a26,63
> FILES=(/etc/memcached_*.conf);
> # check for alternative config schema
> if [ -r "${FILES[0]}" ]; then
>   CONFIGS=();
>   for FILE in "${FILES[@]}";
>   do
>     # remove prefix
>     NAME=${FILE#/etc/};
>     # remove suffix
>     NAME=${NAME%.conf};
>
>     # check optional second param
>     if [ $# -ne 2 ];
>     then
>       # add to config array
>       CONFIGS+=($NAME);
>     elif [ "memcached_$2" == "$NAME" ];
>     then
>       # use only one memcached
>       CONFIGS=($NAME);
>       break;
>     fi;
>   done;
>
>   if [ ${#CONFIGS[@]} == 0 ];
>   then
>     echo "Config not exist for: $2" >&2;
>     exit 1;
>   fi;
> else
>   CONFIGS=(memcached);
> fi;
>
> CONFIG_NUM=${#CONFIGS[@]};
> for ((i=0; i < $CONFIG_NUM; i++)); do
>   NAME=${CONFIGS[${i}]};
>   PIDFILE="/var/run/${NAME}.pid";
>
30c67
<       start-stop-daemon --start --quiet --exec $DAEMONBOOTSTRAP
---
>       start-stop-daemon --start --quiet --exec "$DAEMONBOOTSTRAP" -- /etc/${NAME}.conf $PIDFILE
50c87
<       start-stop-daemon --start --quiet --exec $DAEMONBOOTSTRAP
---
>       start-stop-daemon --start --quiet --exec "$DAEMONBOOTSTRAP" -- /etc/${NAME}.conf $PIDFILE
54c91
<       N=/etc/init.d/$NAME
---
>       N=/etc/init.d/$DAEMONNAME
59a97
> done;