entweder in der ProjectConfiguration oder im BaseForm:
sfValidatorBase::setDefaultMessage('required', 'Field required');
entweder in der ProjectConfiguration oder im BaseForm:
sfValidatorBase::setDefaultMessage('required', 'Field required');
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));
.
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();
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;
}
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;
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; ?>
Die Javascript Variante von function_exists.
So kann man prüfen, ob die Funktion meineFunktion() existiert:
if(window.meineFunktion){ ... }
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);
..
$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
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)