amiket sokat kerestem, hogy többet ne kelljen 🙂

[code lang=”php”]
//sfGuardUser ID:
sfContext::getInstance()->getUser()->getGuardUser()->getId()

//Hogyan alakitsuk egy objetum name tulajdonságát id ‘formátumura’:
get_id_from_name($name)

// form formázása (<p> stílus):
// http://www.thatsquality.com/articles/7-days-of-symfony-1-1-forms-widgets-and-validators-day7
$formatter = $this->getWidgetSchema()->getFormFormatter();
$formatter->setErrorRowFormat(‘%errors%’);
$formatter->setErrorListFormatInARow("%errors%\n");
$formatter->setErrorRowFormatInARow("<p class=’error-message’>%error%</p>");
$formatter->setRowFormat("%error%<p>%label%%field%%help%%hidden_fields%</p>\n");
// ez alapból nem hívodik meg. De ha a formatter használja, pl: embeddformnál:
$formatter->setDecoratorFormat(‘<table class="tgTextSlot">%content%</table>’);

// hogyan adjunk egy form elemnek classt:
// formban :
$this->WidgetSchema[‘name’]->setAttribute(‘class’, ‘classname’);
// templateben 1:
echo $form->render(array(‘name’ => array(‘class’ => ‘classname’), ‘name2’ => array(‘class’=>’classname’))) ;
// templateben 2:
echo $form[‘name’]->renderRow(array(‘class’ => ‘classname’));

//formban widget mozgatása:
$this->getWidgetSchema()->moveField(‘widget_name’, sfWidgetFormSchema::AFTER, ‘last_name’);

//$this változóinak lekérdezése
$this->getVarHolder()->getAll()

//SF_ENVIRONMENT 1.2 alatt:
sfConfig::get(‘sf_environment’)

// összes request paraméter lekérése
$this->getRequest()->getParameterHolder()->getAll();
sfContext::getInstance()->getRequest()->getParameterHolder()->getAll()

// egy bizonyos request paraméter lekérése
$this->getRequestParameter(‘parameter’, false);
sfContext::getInstance()->getRequest()->getParameter(‘parameter’);

// controllerben helper használata
sfLoader::loadHelpers(array(‘Tag’, ‘Url’));
sfContext::getInstance()->getConfiguration()->loadHelpers(array(‘Tag’, ‘Url’));

//i18N akárhol:
sfContext::getInstance()->getI18N()->__(‘Nincs kiválasztva’)

i18N formban:
$this->getWidgetSchema()->getFormFormatter()->translate(‘szoveg’);

Csrf Token fordítása (baseFormba tegyük bele):
public function addCSRFProtection($secret = null)
{
parent::addCSRFProtection($secret);
if (isset($this->validatorSchema[self::$CSRFFieldName])) {
$this->validatorSchema[self::$CSRFFieldName]->setMessage(‘csrf_attack’, $this->widgetSchema->getFormFormatter()->translate(‘CSRF attack detected.’));
}
}

// Ez inkább propel. A model osztályból, annak sql neve:
constant(get_class($this->getPeer()).’::TABLE_NAME’)

// ajax link
echo link_to_remote(‘postolunk’, array(
‘update’ => ‘a div id-ja amibe a visszatérő adatokat kapjuk’,
‘url’ => ‘az ajaxos url’,
‘method’ => ‘post’,
//ez meghívja a validate javascript függvényt:
‘condition’ => "validate(Form.serialize(‘formId’))",
//és a legfontosabb, így lehet a form adatait is elküldeni:
‘submit’ => "formId"
))

// A form mezői:
$this->getWidgetSchema()->getPositions()

// egy form hibát dob, de az épp rejtett, akkor irassuk ki.
$this->form->getErrorSchema()
foreach($this->form->getErrorSchema()->getErrors() as $key => $error)
{
echo ‘<p>’ . $key . ‘: ‘ . $error . ‘</p>’;
}

// absolute url:
link_to(__(‘szöveg’, array(), ‘messages’), ‘@url’, array(‘absolute’=>true))
[/code]

Callback validator

[code lang=”php”]
class aForm extends aBaseForm
{
public function configure()
{
parent::configure() ; //esetleg ez nem fontos
$this->validatorSchema->setPostValidator(new sfValidatorCallback(array(‘callback’ => array($this, ‘fuggvenyneve’))));
}

public function fuggvenyneve(sfValidatorBase $validator, array $values)
{
// $values tartalmazza az összes adatot, feldolgozod és a $hibavan-nak ennek függvényében értéket adsz:
if ($hibavan)
{
$error = new sfValidatorError($validator, ‘hiba üzenet’);
throw new sfValidatorErrorSchema($validator, array(‘mezoneve’ => $error));

/**
// ha embed formról van szó
$field_name = ‘mezoneve’;
$message = ‘invalid’;
$embed_form_name = ”embedformname’;
$key = 0;

$error = new sfValidatorError($validator, $message);
$errorschema = new sfValidatorErrorSchema($validator);
$errorschema->addError(new sfValidatorErrorSchema($validator, new sfValidatorErrorSchema($validator, array($field_name => $error))), (string) $key);
throw new sfValidatorErrorSchema($validator, array($embed_form_name => $errorschema));

*/

}
return $values;
}
[/code]

Propel

[code lang=”php”]
$c = new Criteria();
$c->addJoin(
array(ReaderFavoritePeer::BOOK_ID,ReaderFavoritePeer::READER_ID),
array(BookOpinionPeer::BOOK_ID,BookOpinionPeer::READER_ID))

// és irassuk is ki a criteriát SQL-ben
echo $criteria->toString();

// szerezzük meg az ID-kat egy táblából.
$c = new Criteria();
$c->addSelectColumn(MyClassPeer::ID);
$res = BasePeer::doSelect($c);
$Ids = $res->fetchAll(PDO::FETCH_COLUMN,0);

// SELECT FROM `tabla` WHERE (tabla.mezo1=’string1′ OR (tabla.mezo1=’string2′ AND tabla.mezo2=’0′))
$c = new Criteria();
$cr1 = $c->getNewCriterion(TablePeer::MEZO1, ‘string1’);
$cr2 = $c->getNewCriterion(TablePeer::MEZO1, ‘string2’);
$cr3 = $c->getNewCriterion(TablePeer::MEZO2, ‘0’);
$cr2->addAnd($cr3);
$cr1->addOr($cr2);
$c->add($cr1);
$c->toString();
[/code]

Task

[code lang=”php”]
./symfony i18n:extract frontend hu –auto-save
./symfony i18n:extract frontend hu –display-new
[/code]

Internationalization

[code lang=”php”]
//http://www.php.net/manual/en/function.strftime.php
fb(format_date(time(), ‘f’),’f’);
fb(format_date(time(), ‘G’),’G’);
fb(format_date(time(), ‘y’),’y’);
fb(format_date(time(), ‘M’),’M’);
fb(format_date(time(), ‘d’),’d’);
fb(format_date(time(), ‘h’),’h’);
fb(format_date(time(), ‘H’),’H’);
fb(format_date(time(), ‘m’),’m’);
fb(format_date(time(), ‘s’),’s’);
fb(format_date(time(), ‘E’),’E’);
fb(format_date(time(), ‘D’),’D’);
fb(format_date(time(), ‘F’),’F’);
fb(format_date(time(), ‘W’),’W’);
fb(format_date(time(), ‘w’),’w’);
fb(format_date(time(), ‘a’),’a’);
fb(format_date(time(), ‘k’),’k’);
fb(format_date(time(), ‘K’),’K’);
fb(format_date(time(), ‘z’),’z’);
[/code]

A smarty egyszerű 🙂

[code lang=”php”]
{assign var=’createdat’ value=$current_page->getCreatedAt()}
{assign var=’createdat’ value=$createdat|strtotime}
{capture assign=’createdat’}
{format_date date=$createdat format="D"}
{/capture}
<p class="date">{$createdat}</p>

// Mert PHP-ban ennyi:
<?php echo format_date(strtotime($current_page->getCreatedAt())), ‘D’); ?>
[/code]


Add a custom filter field for generated admin

[code lang=”php”]
public function configure() {

$this->widgetSchema[‘title’] = new sfWidgetFormFilterInput();

$this->validatorSchema[‘title’] = new sfValidatorPass(array(‘required’ => false));
}//configure

public function getFields() {
return array_merge(array(
‘title’=> ‘Title’,
), parent::getFields()
);
} //getFields

protected function addTitleColumnCriteria(Criteria $criteria, $field, $values) {

// $values[‘text’] contains the field value, use it to change $criteria object

// es. $criteria->add (‘column’, $values[‘text’])

}//addTitleColumnCriteria
[/code]

loggolás külön fájlba.

[code lang=”php”]
$text = var_export($this->getObject()->toArray(), true);
$file = sfConfig::get(‘sf_log_dir’).DIRECTORY_SEPARATOR.’debug.log’;
$dispatcher = sfContext::getInstance()->getEventDispatcher();
$logger = new sfFileLogger($dispatcher, array(‘file’ => $file) );
$dispatcher->disconnect(‘application.log’, array($logger, ‘listenToLogEvent’));
$logger->err($text);
$logger->notice($text);
$logger->info($text);
[/code]

Doctrine:

nativ sql query
[code lang=”php”]
//kapcsolt táblák lekérdezése:
foreach (Doctrine_Core::getTable(‘CompanyLog’)->getRelations() as $name => $relation)
{
echo $name . ":\n"; echo "Local – " . $relation->getLocal() . "\n"; echo "Foreign – " . $relation->getForeign() . "\n\n";
}

//nativ sql query
$statement = Doctrine_Manager::getInstance()->connection();
$results = $statement->execute("SELECT * FROM users WHERE id = ?", array(1));
var_dump($results->fetchAll());

//Assume you have got a running connection again…
$q = new Doctrine_RawSql(Doctrine_Manager::getInstance()->connection());
$q->select(‘{u.*}, {p.*}’) //Check that it’s between curly braces…
->from(‘user u, phonenumbers p’)
->where(‘u.id = p.user_id AND u.id = ?’)
->addComponent(‘u’, ‘User u’) //Dont forget to associate tables with Doctrine classes…
->addComponent(‘p’, ‘u.Phonenumber p’);
/* Notice how Im relating the phonenumbers and users. This means that user has a many-to-many relation with phonenumber and phonenumbers can be called as User->Phonenumber!! (just like Doctrine style!) */
$users = $q->execute(array(1));
var_dump($users);
[/code]

hogyan formázzunk egy sfWidgetFormChoice widgetet?

[code lang=”php”]
// a widget
$this->widgetSchema [‘my_widget’] = new sfWidgetFormChoice(array(‘multiple’ => true, ‘expanded’ => true, ‘choices’ => my_choices, ‘renderer_class’ => ‘sfWidgetFormSelectCheckbox’, ‘renderer_options’ => array(‘formatter’ => array(‘MyForm’, ‘MyFormatter’))));

$this->validatorSchema [‘my_widget’] = new sfValidatorChoice(array(‘multiple’ => true, ‘choices’ => array_keys(my_choices), ‘required’ => false));

// és a formban:
public static function MyFormatter($widget, $inputs) {
$result = ‘<table>’;
foreach ($inputs as $input) {
$result .= ‘<tr><td>’ . $input [‘label’] . ‘ ‘ . $input [‘input’] . ‘</td></tr>’;
}
$result .= ‘</table>’;
return $result;
}

[/code]

néha szükségünk lehet egy olyan widgetre, ami egy tömböt/listát tartalmaz.
Én most egy két dimenziós tömböt fogok megjeleníteni:

[code lang=”php”]

protected function getWidgetFormSchemaForMyField($choices)
{
$widget = new sfWidgetFormSchema(array(
‘mezo1’ => new sfWidgetFormPlain(),
‘mezo2’ => new sfWidgetFormInputHidden(),
‘mezo3’ => new sfWidgetFormChoice(array(‘choices’=>$choices))
));

// a mezők a táblázat egyes cellái lesznek, tehát egymás mellett lesznek:
$widget->getFormFormatter()->setRowFormat(‘<td>%error%%field%%help%%hidden_fields%</td>’);
return $widget;
}

public function configure()
{

// itt le kell kérni a rekordokat
// a choices tömbnek is értéket kell adni

$widgetrows = array();
foreach ($records as $key=>$record)
{
$widgetrows[$key] = $this->getWidgetFormSchemaForMyField($choices);
}
$widget = new sfWidgetFormSchema($widgetrows);
$formatter = $widget->getFormFormatter();
// a táblázat egyes sorai (a fenti három mező egy sorban, de azokból több sor lesz):
$formatter->setRowFormat(‘<tr>%error%%field%%help%%hidden_fields%</tr>’);

$this->widgetSchema[‘mezo’] = new sfWidgetFormSchema(array($widget));
$formatter = $this->widgetSchema[‘mezo’]->getFormFormatter();
// bele kell tenni az egészet egy táblázatba:
$formatter->setRowFormat(‘<table>%error%%field%%help%%hidden_fields%</table>’);


}
[/code]

Egy jó postvalidator leírás:

blog.codeclarity.com/2010/03/09/conditional-validation-in-symfony-forms/