Today I will provide a tutorial, setting up a (propel-based)
playground with some best practices I came up with so far. (If you
prefer Doctrine, you can still follow the tutorial, but of course need
to setup a Doctrine schema and use the Doctrine plugins)

If you want to see where all the fuzz is about, peak ahead and look at
the size of the controller and the template!
All configuration can be done in an extended

Lets begin with a new (Symfony 1.4) Project:

Tip: create a new repository on your svn-server and check this out!
(this is useful since we are using a lot of plugins from svn, that can
be updated all at once by using svn:externals )

  svn co your.svn.server/playground-project playground
or, when not using svn
  mkdir playground


  cd playground
  php /symfony14/data/bin/symfony generate:project --orm=propel
playground


we now have a new propel-based syfmony 1.4 project. Lets start by
adding all required Plugins:

  svn propedit svn:externals .


and add the following lines to it:

plugins/sfPropel15Plugin 
http://svn.symfony-project.com/plugins/sfPropel15Plugin/trunk
plugins/sfPropelObjectPathBehaviorPlugin
http://svn.symfony-project.com/plugins/sfPropelObjectPathBehaviorPlugin/branches/1.5
plugins/sfDataSourcePlugin  
http://svn.symfony-project.com/plugins/sfDataSourcePlugin/trunk
plugins/sfGridPlugin http://svn.symfony-project.com/plugins/sfGridPlugin/trunk


Now we enable our plugins, first by editing our Project configuration,

edit config/ProjectConfiguration.class.php
and enable your plugins in the setup-function:

    $this->enablePlugins(
        'sfPropel15Plugin',
        'sfPropelObjectPathBehaviorPlugin',

//      'sfExtjs3Plugin', // soon people

      'sfDataSourcePlugin',
      'sfGridPlugin' //,
//      'sfGridExtjsPlugin' // soon.... Just teasing ;)
    );


Setup propel, by editing propel.ini
please note propel1.5 is requiring different behavior-paths and we are
enabling the object-path plugin:
So the behaviors section should look like this:


; behaviors
propel.behavior.default                        =
symfony,symfony_i18n,object_path

propel.behavior.symfony.class                  =
plugins.sfPropel15Plugin.lib.behavior.SfPropelBehaviorSymfony
propel.behavior.symfony_i18n.class             =
plugins.sfPropel15Plugin.lib.behavior.SfPropelBehaviorI18n
propel.behavior.symfony_i18n_translation.class =
plugins.sfPropel15Plugin.lib.behavior.SfPropelBehaviorI18nTranslation
propel.behavior.symfony_behaviors.class        =
plugins.sfPropel15Plugin.lib.behavior.SfPropelBehaviorSymfonyBehaviors
propel.behavior.symfony_timestampable.class    =
plugins.sfPropel15Plugin.lib.behavior.SfPropelBehaviorTimestampable

propel.behavior.object_path.class              =
plugins.sfPropelObjectPathBehaviorPlugin.lib.ObjectPathBehavior


Currently I have a simple schema as an example:

propel:
  city:
    id:
    name:       varchar(255)
    country_id:
    created_at:

  country:
    id:
    name:      varchar(255)
    created_at:


lets build the model

  ./symfony propel:build-all


Add an application and empty module:

  ./symfony generate:app frontend
  ./symfony generate: frontend cityGrid


Now add a grid folder to your lib-folder and add a CityGrid.php file

  mkdir lib/grid
  edit lib/grid/CityGrid.php


and add the following code to it:

<?php
class CityGrid extends sfWebGrid  // soon you can extend the
sfGridExtjs3 - class
{
  /**
   *
   * @param sfWebRequest $request
   */
  public function __construct(sfWebRequest $request)
  {
    $cityDataSource = new sfDataSourcePropel('City');
    parent::__construct($cityDataSource);

    $this->setDefaultSort('Country.Name', sfGrid::ASC);

    $this->setColumns(array(
      'Id',
      'Country.Name',
      'Name'
    ));

    $this->setColumnTitles(array(
      'Country.Name' => 'Country',
      'Name'         => 'City'
    ));
    $this->setSortable(sfGrid::ALL);

    $this->getPager()->setMaxPerPage(2);
    $this->bind($request);
  }
}



Now you can add the following to your controller:

edit actions.class.php

 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)

    $this->grid = new CityGrid($request);

  }

And edit your template, indexSuccess.php

<?php $grid = $sf_data->getRaw('grid'); ?>
<div id="grid-example">
  <table>
   <?php echo $grid->render() ?>
  </table>
</div>


clear your cache

  ./symfony cc


add some data to your database, use fixtures, or the following:

// initialize database
$country_nl = new Country();
$country_nl->setName('the Netherlands');

$country_fr = new Country();
$country_fr->setName('France');

$country_be = new Country();
$country_be->setName('Belgium');


$city_ams = new City();
$city_ams->setCountry($country_nl);
$city_ams->setName('Amsterdam');
$city_ams->save();

$city_rdm = new City();
$city_rdm->setCountry($country_nl);
$city_rdm->setName('Rotterdam');
$city_rdm->save();

$city_rdm = new City();
$city_rdm->setCountry($country_nl);
$city_rdm->setName('Den Haag');
$city_rdm->save();

$city_prs = new City;
$city_prs->setName('Paris');
$city_prs->setCountry($country_fr);
$city_prs->save();

$city_bdx = new City;
$city_bdx->setCountry($country_fr);
$city_bdx->setName('Bordeaux');
$city_bdx->save();

$city_brs = new City();
$city_brs->setCountry($country_be);
$city_brs->setName('Brussel');
$city_brs->save();







next time I will release the extjsGrid. Then I will transform this
example to ExtJS, with only minor changes to the module and the
CityGrid-class.The CityGrid will specialize the ExtjsGrid, providing
it the capabilities to generate not only HTML, but JSON and JS output
as well. The controller currently needs to be altered to add support
to handle .js and .json requests, but I am going to make the routing
engine take care of that. The template currently needs to be extended
as well, to start the initial extjs-application, but this will be
moved to the extjs-grid-plugin soon as well.

For now I would be happy to get feedback about the current HTML
formatter.
I didn't explained how to modify the (row)formatter yet and how to
define and write widgets, but you should be aware that these are the
key to modifying the HTML rendering (for example to add css-classes
and truncate your texts or format currencies) to your liking.

-- 
If you want to report a vulnerability issue on symfony, please send it to 
security at symfony-project.com

You received this message because you are subscribed to the Google
Groups "symfony users" group.
To post to this group, send email to symfony-users@googlegroups.com
To unsubscribe from this group, send email to
symfony-users+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/symfony-users?hl=en

To unsubscribe, reply using "remove me" as the subject.

Reply via email to