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;
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;
Du hast ein Registrierungsformular mit einem Feld account_type und zwei eingebetteten Formularen Company und Address.
Du willst das eingebettete Company Formular entfernen, wenn das Feld account_type sfGuardUserProfile::TYPE_PRIVATE entspricht, andernfalls willst du das eingebettete Address Formular entfernen.
Die Lösung ist die bind Methode in deinem Formular zu überschreiben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public function bind(array $taintedValues = null, array $taintedFiles = null)
{
// unset request param and validator
if($taintedValues['account_type'] == sfGuardUserProfile::TYPE_PRIVATE)
{
unset(
$taintedValues['Company'],
$this->validatorSchema['Company']
);
}
else
{
unset(
$taintedValues['Address'],
$this->validatorSchema['Address']
);
}
parent::bind($taintedValues, $taintedFiles);
} |
Erstelle die Datei lib/gfFormHerlp.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <?php
/**
* Some usefull form helper
*
* @package symfony
* @subpackage helper
* @author Gordon Franke <gfranke@nevalon.de>
* @link http://www.nevalon.de
*/
class gfFormHelper
{
/**
* Add * to required field labels
*
* @param sfForm $form
* @param string $symbol
* @param string $title
*
* @return void
*/
public static function addRequiredToLabel(sfForm $form, $symbol = '*', $title = 'This field is mandatory.')
{
$widgetSchema = $form->getWidgetSchema();
$validatorSchema = $form->getValidatorSchema();
foreach($form->getFormFieldSchema()->getWidget()->getFields() as $key => $object)
{
$label = $form->getFormFieldSchema()->offsetGet($key)->renderLabelName();
if(isset($validatorSchema[$key]) and $validatorSchema[$key]->getOption('required') == true) {
$label .= '<sup title="' . $widgetSchema->getFormFormatter()->translate($title) . '">' . $symbol . '</sup>';
}
$widgetSchema->setLabel($key, $label);
}
}
} |
Füge folgendes am ende deiner Formular in der setup oder besser wenn du Unterformulare hast in der configure Methode ein
1
| gfFormHelper::addRequiredToLabel($this); |
Benutze dies in deinem Testcode um das User Objekt zu erstellen
1
2
3
4
5
6
7
8
| $_SERVER['session_id'] = 'test';
$dispatcher = new sfEventDispatcher();
$sessionPath = sfToolkit::getTmpDir().'/sessions_'.rand(11111, 99999);
$storage = new sfSessionTestStorage(array('session_path' => $sessionPath));
$myUser = new myUser($dispatcher, $storage);
$myUser->setAttribute('user_id', 1, 'sfGuardSecurityUser'); |
Letzte Kommentare