amiket sokat kerestem, hogy többet ne kelljen :-)

//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');

// 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))

Callback validator

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)
    {
      throw new sfValidatorError($validator, 'hibaüzenet');
    }

    return $values;
  }
}

Propel

$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();

Task

./symfony i18n:extract frontend hu --auto-save
./symfony i18n:extract frontend hu --display-new

Internationalization

      //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');

A smarty egyszerű :-)

        {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'); ?>


Add a custom filter field for generated admin

  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

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

    $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);

Doctrine:

//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";
}

hogyan formázzunk egy sfWidgetFormChoice widgetet?

// 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;
}

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:


    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>');

        ...
    }

Egy jó postvalidator leírás:

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