Default Validation Messages überschreiben

entweder in der ProjectConfiguration oder im BaseForm:


sfValidatorBase::setDefaultMessage('required', 'Field required');
Veröffentlicht unter Symfony 1.4 | Verschlagwortet mit

Statische Datei aus dem Web-Verzeichniss verlinken

Gestern musste ich bei einem Projekt eine PDF-Datei aus dem Web-Verzeichniss verlinken.
mit dem link_to oder url_for Helper wird das nicht funktionieren. Oder besser gesagt,
es würde funktionieren aber nur wenn der Front-Controller unterdrück wird also unter Produktivumgebung.

.

     // Produktivumgebung
     // Ausgabe <a href="/downloads/example_pdf_file.pdf">PDF-File</a>
     // Würde funktionieren aber nur durch Zuffal.
     echo link_to('PDF-File', 'downloads/example_pdf_file.pdf');

     // Devumgebung
     // Ausgabe <a href="/frontend_dev.php/downloads/example_pdf_file.pdf">PDF-File</a>
     // Wird nicht funktionieren
     echo link_to('PDF-File', 'downloads/example_pdf_file.pdf');

.

Die Lösung: ein weiterer Helper => public_path()

.

 /**
 * Returns a URL rooted at the web root
 *
 * @param   string  $path     The route to append
 * @param   bool    $absolute If true, an absolute path is returned (optional)
 * @return  The web URL root
 */
function public_path($path, $absolute = false)
{
 ..............

.

Hier das Ergebniss

.

     // Produktivumgebung
     // Ausgabe <a href="/downloads/example_pdf_file.pdf">PDF-File</a>
     echo link_to('PDF-File', public_path('downloads/example_pdf_file.pdf'));

     // Devumgebung
     // Ausgabe <a href="/downloads/example_pdf_file.pdf">PDF-File</a>
     echo link_to('PDF-File', public_path('downloads/example_pdf_file.pdf'));

     // Oder mit dem absoluten Path
     // Ausgabe <a href="http://myprojekt.tld/downloads/example_pdf_file.pdf">PDF-File</a>
     echo link_to('PDF-File', public_path('downloads/example_pdf_file.pdf',true));

.
Veröffentlicht unter Helper, Symfony 1.4 |

Pdo-Connection unter Propel 1.4 & Doctrine 1.2

Manchmal ist es sinnvoll mit der Datenbank direkt über PDO zu kommunizieren ohne dabei Doctrine zu benutzen.

Mit diesem Code-Snippet holt man sich die PDO-Connection:

   // Anstelle von Doctrine kann man jede beliebige Connection angeben die in der databases.yml hinterlegt ist
   $o_pdo_connection = Doctrine_Manager::getInstance()->getConnection('doctrine')->getDbh();
Veröffentlicht unter CodeSnippet, Dorctrine, Symfony 1.4 | Verschlagwortet mit

Partial Exists helper (hasPartial)

Hier ein kleiner Helper, mit dem geprüft wird ob ein Partial im Filesystem existiert.

/**
 * Mit diesem Helper kann geprüft werden ob ein Partial existiert
 *
 * @param string $s_partial_name      # Name vom Partial => modul/partial oder einfach nur "partial"
 *
 * @return bool
 */
function hasPartial($s_partial_name)
{
    $o_context = sfContext::getInstance();

    // Prüfen ob das Partial in der Form "module/action" angegeben wurde
    if(FALSE !== strpos($s_partial_name, '/'))
    {
        $a_module_action = explode('/', $s_partial_name);
        $s_module_name = $a_module_action[0];
        $s_partial_name = $a_module_action[1];
    }
    // Nur Partial-Name übergeben
    else
    {
        // Aktuelles Modul bestimmen
        $s_module_name = $o_context->getActionStack()->getLastEntry()->getModuleName();
    }

    // Für das aktuelle Modul muss die Modulkonfiguration ausgelesen werden, um zu
    // bestimmen welche View-Klasse benutzt wird
    $s_config = sfConfig::get('mod_' . strtolower($s_module_name) . '_partial_view_class');
    // Keine Konfiguration gefunden. Standard-Konfiguration laden
    if(empty($s_config))
    {
        require($o_context->getConfigCache()->checkConfig('modules/' . $s_module_name . '/config/module.yml', true));
        $s_config = sfConfig::get('mod_' . strtolower($s_module_name) . '_partial_view_class', 'sf');
    }
    $s_class = $s_config . 'PartialView';
    $o_view = new $s_class($o_context, $s_module_name, $s_partial_name, '');

    $s_partial_name = '_' . $s_partial_name . $o_view->getExtension();

    //Nun wird geprüft ob die Datei existiert
    $b_directory = (boolean) $o_context->getConfiguration()->getTemplateDir($s_module_name, $s_partial_name);

    if(FALSE !== $b_directory)
    {
        return true;
    }

    return false;
}
Veröffentlicht unter Allgemein, CodeSnippet, Helper, Symfony 1.4, Tips & Tricks | Verschlagwortet mit , ,

Doctrine 1.2 Cross-Database Join

Heute musste ich bei einem Projekt (Symfony 1.4 / Doctrine 1.2) eine komplexe DB-Abfrage mit einem Join zwischen 2 Datenbanken in DQL abbilden.
Die beiden Datenbanken liegen auf dem selben MySql-Server, somit sollte dies kein Problem darstellen.
Meine Überlegung war, das Doctrine anhand der Connection aus der schema.yml das richtige SQL-Statement zusammen stellt. Das hat jedoch nicht funktioniert.

Nach ein wenig Recherche hab ich folgendes gefunden:
http://www.doctrine-project.org/blog/cross-database-joins

Das ist schon mal nicht schlecht. Ich wollte diese Option jedoch nicht global festlegen (wer weiß was sich dadurch alles ändert), sondern nur bei dem Query wo es wirklich gebraucht wird.

hier mein Ansatz:

 // Tabellen Objekt holen
 $o_table = Doctrine_Core::getTable('TabelleA');
 // Tabellen-Namen setzen. Dabei wird als Prefix der DB-Name angehängt
 $o_table->setTableName('db1.tabelle_a');
 // Query erstellen
 $q = $o_table->createQuery('a');

 // Ab hier folgt die ganz normale DQL-Abfrage.
 $q->select('*')->from('TabelleA a');
 $q->leftJoin('a.TabelleB b')
 $q->where('a.id = 10');
 $q->getSqlQuery();

Das Query sollte ungefähr so aussehen:

 SELECT * FROM db1.tabelle_a AS a LEFT JOIN tabelle_b AS b ON a.id = b.tabelle_a_id WHERE a.id = 10;
Veröffentlicht unter Dorctrine, Symfony 1.4, Tips & Tricks | Verschlagwortet mit

Zuweisung einer CSS-Klasse an sfWidgets anhand der Feldtypen

Da es in letzter Zeit öfters vorkam, dass wir Formularfelder in einer Schleife ausgeben mussten -aus welchen Gründen auch immer- und ich hier im Team der „Designerfuzzi“ bin, der das Ganze auch noch schön aussehen lassen soll, musste ein Konstrukt her das die Vergabe der CSS-Klassen je nach Feldtyp übernimmt.

In folgender Schleife werden alle Felder, ob es nun ein Radio, Checkbox, Textfeld oder eine Textarea ist, ausgeben.

<?php foreach($a_field_names AS $field): ?>
    <?php echo $form[$field]->render(array('class' => 'classname')); ?>
<?php endforeach; ?>

Weiterlesen

Veröffentlicht unter Helper, Symfony 1.4 |

Javascript: Prüfen ob eine Funktion existiert

Die Javascript Variante von function_exists.

So kann man prüfen, ob die Funktion meineFunktion() existiert:

if(window.meineFunktion){ ... }
Veröffentlicht unter Tips & Tricks | Verschlagwortet mit

PHP, Leere Arrayeinträge entfernen

Um leere Arrayeinträge zu entfernen bietet sich die Funktion array_filter() an.
Sie erwartet als 2. Parameter eine Callback-Funktion um das Array zu filtern. Gibt man jedoch keine Callback-Funktion an, lautet der 2. Parameter per Default FALSE.
Da leere Arrayelemente nach FALSE gecastet werden, werden diese entfernt.

$a_clean_array = array_filter($a_array);
Veröffentlicht unter Allgemein, Tips & Tricks | Verschlagwortet mit ,

Symfony Forms – ausgabe von Label-Namen ohne die Label Tags

     ..
     $o_form['example_field']->renderLabel();

     // Erzeugt folgende Ausgabe
     // <label>Example Field</label>

Will man nur den Label-Namen ausgeben geht es wie folgt:

    ..
    $o_form['example_field']->renderLabelName();

    // Erzeugt folgende Ausgabe
    // Example Field
Veröffentlicht unter CodeSnippet, Forms in Action, Symfony 1.4 | Verschlagwortet mit , ,

Criteria OR bei Propel <= V 1.4

Kurzer CodeSnippet wie bei Criteria (Propel <= v. 1.4) eine ODER Anweisung zu benutzen ist.


$o_criteria = new Criteria();
$o_criteria->add(ExamplePeer::STATUS,1);

$o_criteria_tmp_one = $c->getNewCriterion(ExamplePeer::CREATED_FROM, 2);
$o_criteria_tmp_two = $c->getNewCriterion(ExamplePeer::UPDATED_FROM, 2);

$o_criteria_tmp_one->addOr($o_criteria_tmp_two)
$o_criteria->add($o_criteria_tmp_one);

$a_example = ExamplePeer::doSelect($o_criteria);

Folgendes SQL-Statement müsste Propel bei dieser Abfrage generieren.

SELECT * FROM example WHERE status = 1 AND (created_from = 2 OR updated_from = 2)
Veröffentlicht unter CodeSnippet, Propel, Symfony 1.4 | Verschlagwortet mit ,