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.