Appendix B - Custom Installer Example

The following PHP code is a custom installer used in Chapter 06:

<?php
 
$this->logSection('install', 'default to sqlite');
$this->runTask('configure:database', sprintf("'sqlite:%s/database.db'", sfConfig::get('sf_data_dir')));
 
$this->logSection('install', 'create an application');
$this->runTask('generate:app', 'frontend');
 
$this->setConfiguration($this->createConfiguration('frontend', 'dev'));
 
$this->logSection('install', 'publish assets');
$this->runTask('plugin:publish-assets');
if (file_exists($dir = sfConfig::get('sf_symfony_lib_dir').'/../data'))
{
  $this->installDir($dir);
}
 
$this->logSection('install', 'create the database schema');
file_put_contents(sfConfig::get('sf_config_dir').'/doctrine/schema.yml', <<<EOF
Product:
  columns:
    name:           { type: string(255), notnull: true }
    price:          { type: decimal, notnull: true }
 
ProductPhoto:
  columns:
    product_id:     { type: integer }
    filename:       { type: string(255) }
    caption:        { type: string(255), notnull: true }
  relations:
    Product:
      alias:        Product
      foreignType:  many
      foreignAlias: Photos
      onDelete:     cascade
EOF
);
 
$this->logSection('install', 'add some fixtures');
file_put_contents(sfConfig::get('sf_data_dir').'/fixtures/fixtures.yml', <<<EOF
Product:
  product_1:
    name:  Product Name
    price: 25.95
EOF
);
 
$this->logSection('install', 'build the model');
$this->runTask('doctrine:build', '--all --and-load --no-confirmation');
 
$this->logSection('install', 'create a simple CRUD module');
$this->runTask('doctrine:generate-module', 'frontend product Product --non-verbose-templates');
 
$this->logSection('install', 'fix sqlite database permissions');
chmod(sfConfig::get('sf_data_dir'), 0777);
chmod(sfConfig::get('sf_data_dir').'/database.db', 0777);