PHPonTrax
[ class tree: PHPonTrax ] [ index: PHPonTrax ] [ all elements ]

Source for file trax_generator.php

Documentation is available at trax_generator.php

  1. <?php
  2. /**
  3.  *  File containing the TraxGenerator class
  4.  *
  5.  *  (PHP 5)
  6.  *
  7.  *  @package PHPonTrax
  8.  *  @version $Id: trax_generator.php 260 2006-09-02 07:19:54Z john $
  9.  *  @copyright (c) 2005 John Peterson
  10.  *
  11.  *   Permission is hereby granted, free of charge, to any person obtaining
  12.  *   a copy of this software and associated documentation files (the
  13.  *   "Software"), to deal in the Software without restriction, including
  14.  *   without limitation the rights to use, copy, modify, merge, publish,
  15.  *   distribute, sublicense, and/or sell copies of the Software, and to
  16.  *   permit persons to whom the Software is furnished to do so, subject to
  17.  *   the following conditions:
  18.  *
  19.  *   The above copyright notice and this permission notice shall be
  20.  *   included in all copies or substantial portions of the Software.
  21.  *
  22.  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23.  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24.  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25.  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26.  *   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27.  *   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28.  *   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29.  *
  30.  *  @package PHPonTrax
  31.  */
  32.  
  33. /**
  34.  *  Generate application files in the Trax work area
  35.  *
  36.  *  Implements the commands of {@link generate.php script/generate.php}
  37.  *  <p>Legal commands:</p>
  38.  *  <ul>
  39.  *    <li>{@link generate_controller() controller}</li>
  40.  *    <li>{@link generate_model() model}</li>
  41.  *    <li>{@link generate_scaffold() scaffold}</li>
  42.  *  </ul>
  43.  */
  44. class TraxGenerator {
  45.  
  46.     /**
  47.      *  Filesystem path to the app/views directory in the Trax work area
  48.      *  @var string 
  49.      */
  50.     private $view_path;
  51.  
  52.     /**
  53.      *  Filesystem path to the app/controllers directory in the Trax work area
  54.      *  @var string 
  55.      */
  56.     private $controller_path;
  57.  
  58.     /**
  59.      *  Filesystem path to the app/helpers directory in the Trax work area
  60.      *  @var string 
  61.      */
  62.     private $helper_path;
  63.  
  64.     /**
  65.      *  Filesystem path to the app/model directory in the Trax work area
  66.      *  @var string 
  67.      */
  68.     private $model_path;
  69.  
  70.     /**
  71.      *  Generated subdirectories in the Trax work area
  72.      *
  73.      *  When a controller is generated with a name that includes '/',
  74.      *  $extra_path is set to the implied subdirectories.
  75.      *  @var string 
  76.      */
  77.     private $extra_path;
  78.  
  79.     /**
  80.      *  Platform-dependent command to make a directory
  81.      *  @var string 
  82.      */
  83.     private $mkdir_cmd;
  84.  
  85.     /**
  86.      *  Filesystem path to the templates/controller.php file
  87.      *  @var string 
  88.      */
  89.     private $controller_template_file;
  90.  
  91.     /**
  92.      *  Filesystem path to the templates/helper.php file
  93.      *  @var string 
  94.      */
  95.     private $helper_template_file;
  96.  
  97.     /**
  98.      *  Filesystem path to the templates/view.phtml file
  99.      *  @var string 
  100.      */
  101.     private $view_template_file;
  102.  
  103.     /**
  104.      *  Filesystem path to the templates/model.php file
  105.      *  @var string 
  106.      */
  107.     private $model_template_file;
  108.  
  109.     /**
  110.      *  Filesystem path to templates/scaffolds/generator_templates directory
  111.      *  @var string 
  112.      */
  113.     private $scaffold_template_path;
  114.  
  115.     /**
  116.      *  Filesystem path to the app/views/layouts/ directory in the
  117.      *  Trax work area
  118.      *  @var string 
  119.      */
  120.     private $layouts_path;
  121.  
  122.     /**
  123.      *  @todo Document this variable
  124.      *
  125.      *   Value is set by {@link generate_controller()} and used by
  126.      *   {@link generate_scaffold()}
  127.      *  @var string 
  128.      */
  129.     private $layout_filename;
  130.  
  131.     /**
  132.      *  CamelCase name of the controller class
  133.      *  @var string 
  134.      */
  135.     private $controller_class;
  136.  
  137.     /**
  138.      *  Constructor for the TraxGenerator object
  139.      *
  140.      *  Compute and store filesystem paths to the various
  141.      *  subdirectories of the Trax work area and the template files
  142.      *  used to generate application files
  143.      *
  144.      *  @uses controller_path
  145.      *  @uses controller_template_file
  146.      *  @uses helper_path
  147.      *  @uses helper_template_file
  148.      *  @uses layouts_path
  149.      *  @uses model_path
  150.      *  @uses model_template_file
  151.      *  @uses scaffold_template_path
  152.      *  @uses view_path
  153.      *  @uses view_template_file
  154.      */
  155.     function __construct({
  156.         $this->view_path = Trax::$views_path;
  157.         $this->controller_path = Trax::$controllers_path;
  158.         $this->helper_path = Trax::$helpers_path;
  159.         $this->model_path = Trax::$models_path;
  160.         $this->layouts_path = Trax::$layouts_path;
  161.         $this->controller_template_file =
  162.                TRAX_LIB_ROOT "/templates/controller.php";
  163.         $this->helper_template_file =
  164.                TRAX_LIB_ROOT "/templates/helper.php";
  165.         $this->view_template_file =
  166.                TRAX_LIB_ROOT "/templates/view.phtml";
  167.         $this->model_template_file =
  168.                TRAX_LIB_ROOT "/templates/model.php";
  169.         $this->scaffold_template_path =
  170.                TRAX_LIB_ROOT "/templates/scaffolds/generator_templates";
  171.         $this->mailer_view_template_file =
  172.                TRAX_LIB_ROOT "/templates/mailer_view.phtml";
  173.         $this->mailer_model_template_file =
  174.                TRAX_LIB_ROOT "/templates/mailer_model.php";
  175.  
  176.         if (substr(PHP_OS03== 'WIN'{
  177.             $this->mkdir_cmd = "mkdir";
  178.         else {
  179.             $this->mkdir_cmd = "mkdir -p";
  180.         }
  181.     }
  182.  
  183.     /**
  184.      *  Parse command line and carry out the command
  185.      *
  186.      *  Command line arguments, if any are in $_SERVER['argv']
  187.      *  @uses controller_help()
  188.      *  @uses generate_controller()
  189.      *  @uses generate_model()
  190.      *  @uses generate_scaffold()
  191.      *  @uses generator_help()
  192.      *  @uses model_help()
  193.      *  @uses scaffold_help()
  194.      */
  195.     function run({
  196.  
  197.         //  If command line arguments exist, parse them
  198.         if (array_key_exists('argv'$_SERVER)) {
  199.             if (array_key_exists(1$_SERVER['argv'])) {
  200.                 $command strtolower($_SERVER["argv"][1]);
  201.             }
  202.             if (array_key_exists(2$_SERVER['argv'])) {
  203.                 $command_name $_SERVER["argv"][2];
  204.             }
  205.         }
  206.  
  207.         //  Execute command or output a diagnostic
  208.         if(empty($command)) {
  209.             $this->generator_help();
  210.         else {
  211.             switch($command{
  212.  
  213.                 //  Process "controller" command
  214.                 case "controller":
  215.                     if(empty($command_name)) {
  216.                         $this->controller_help();
  217.                     else {
  218.                         $views array();
  219.                         if(array_key_exists(3$_SERVER['argv'])
  220.                            && ($_SERVER["argv"][3!= "")) {
  221.                             for($i=3;$i count($_SERVER["argv"]);$i++{
  222.                                $views[strtolower($_SERVER["argv"][$i]);
  223.                             }
  224.                         }
  225.                         $this->generate_controller($command_name$views);
  226.                     }
  227.                     break;
  228.  
  229.                 //  Process "model" command
  230.                 //  $command_name is the name of the model
  231.                 case "model":
  232.                     if(empty($command_name)) {
  233.                         $this->model_help();
  234.                     else {
  235.                         $this->generate_model($command_name);
  236.                     }
  237.                     break;
  238.  
  239.                 //  Process "scaffold" command
  240.                 //  $command_name has the name of the model
  241.                 //  $_SERVER['argv'][3] has the name of the controller
  242.                 case "mailer":
  243.                     if(empty($command_name)) {
  244.                         $this->mailer_help();
  245.                     else {
  246.                         $views array();
  247.                         if(array_key_exists(3$_SERVER['argv'])
  248.                            && ($_SERVER["argv"][3!= "")) {
  249.                             for($i=3;$i count($_SERVER["argv"]);$i++{
  250.                                $views[strtolower($_SERVER["argv"][$i]);
  251.                             }
  252.                         }
  253.                         $this->generate_mailer($command_name$views);
  254.                     }
  255.                     break;                    
  256.                 case "scaffold":
  257.  
  258.                     //  Model name is required
  259.                     ifempty($command_name) ) {
  260.                         echo "Error: name of model omitted\n";
  261.                         $this->scaffold_help();
  262.                         break;
  263.                     }
  264.  
  265.                     //  Controller name is optional
  266.                     if (array_key_exists(3$_SERVER["argv"])) {
  267.                         $controller_name $_SERVER["argv"][3];
  268.                     else {
  269.                         $controller_name null;
  270.                     }
  271.                         
  272.                     //  Views are optional following controller name
  273.                     $views array();
  274.                     if (array_key_exists(4$_SERVER["argv"])
  275.                         && ($_SERVER["argv"][4!= "")) {
  276.                         for($i=4;$i count($_SERVER["argv"]);$i++{
  277.                             $views[strtolower($_SERVER["argv"][$i]);
  278.                         }
  279.                     }
  280.                     $this->generate_scaffold($command_name,
  281.                                              $controller_name$views);
  282.                     break;                    
  283.  
  284.             default:
  285.                 $this->generator_help();
  286.             }                            // switch($command)
  287.         }
  288.         return;
  289.     }
  290.  
  291.     /**
  292.      *  Implement "generate controller" command
  293.      *
  294.      *  <p>Example:<br><samp>php script/generate.php controller</samp>
  295.      *  <i>SomeName</i><br>
  296.      *  will generate:</p>
  297.      *  <ul>
  298.      *    <li>a file
  299.      *  <samp>app/controllers/</samp><i>some_name</i><samp>_controller.php</samp><br>
  300.      *  containing the class definition<br>
  301.      *  <samp>class</samp> <i>SomeName</i><samp>Controller extends
  302.      *  ApplicationController {}</samp></li>
  303.      *     <li>a file
  304.      *  <samp>app/helpers/</samp><i>some_name</i><samp>_helper.php</samp></li>
  305.      *     <li>a directory
  306.      *  <samp>app/views/</samp><i>some_name</i></li>
  307.      *  </ul>
  308.      *
  309.      *  <p>Optionally, one or more views can be appended to the command:<br>
  310.      *  <samp>php script/generate.php controller</samp>
  311.      *  <i>SomeName view1 view2</i><br>
  312.      *  which will additionally generate files:<br>
  313.      *  <samp>app/views/</samp><i>some_name/view1</i><samp>.phtml</samp><br>
  314.      *  <samp>app/views/</samp><i>some_name/view2</i><samp>.phtml</samp></p>
  315.      *
  316.      *  @param string $name Name in CamelCase of the controller to generate.
  317.      *                       The value may include '/' which will cause
  318.      *                       creation of subdirectories indicated to
  319.      *                       hold the controller and view files.
  320.      *  @param string $views  Optional list of views to generate
  321.      *  @param boolean $scaffolding 
  322.      *  @uses Inflector::underscore()
  323.      *  @uses $controller_class   Set during call
  324.      *  @uses $controller_path    Must be set before call.
  325.      *  @uses create_controller()
  326.      *  @uses create_helper()
  327.      *  @uses create_view()
  328.      *  @uses $extra_path         Set during call
  329.      *  @uses $helper_path        Must be set before call.
  330.      *  @uses $layouts_path       Must be set before call.
  331.      *  @uses $layout_filename    Set during call
  332.      *  @uses $view_path          Must be set before call.
  333.      */
  334.     function generate_controller($name$views ""$scaffolding false{
  335.  
  336.         # Set the View and Controller extra path info
  337.         if(stristr($name"/")) {
  338.             $this->extra_path = substr($name,0,strrpos($name"/"));
  339.             $name Inflector::underscore(substr($name,strrpos($name"/")+1));
  340.             $this->view_path .= "/$this->extra_path/$name";           
  341.             $this->layouts_path .= "/$this->extra_path";
  342.             $this->controller_path .= "/$this->extra_path";
  343.             $this->helper_path .= "/$this->extra_path";
  344.         else {
  345.             $name Inflector::underscore($name);
  346.             $this->view_path .= "/$name";
  347.         }
  348.         $this->layout_filename = $name;
  349.         $this->controller_class = Inflector::camelize($name);
  350.  
  351.         # Create the extra folders for View / Controller
  352.         if(file_exists($this->view_path)) {
  353.             echo "exists $this->view_path\n";
  354.         else{
  355.             $this->exec("$this->mkdir_cmd $this->view_path");
  356.             echo "create $this->view_path\n";
  357.         }
  358.  
  359.         if(file_exists($this->controller_path)) {
  360.             echo "exists $this->controller_path\n";
  361.         else {
  362.             $this->exec("$this->mkdir_cmd $this->controller_path");
  363.             echo "create $this->controller_path\n";
  364.         }
  365.  
  366.         if(file_exists($this->helper_path)) {
  367.             echo "exists $this->helper_path\n";
  368.         else {
  369.             $this->exec("$this->mkdir_cmd $this->helper_path");
  370.             echo "create $this->helper_path\n";
  371.         }
  372.  
  373.         # Create the actual controller/helper files
  374.         if(!$scaffolding{
  375.             $this->create_controller($name$views);
  376.         
  377.         $this->create_helper($name);
  378.  
  379.         if($this->extra_path{
  380.             $name $this->extra_path."/".$name;
  381.         }
  382.  
  383.         # Create view files if any
  384.         if(is_array($views)) {
  385.             foreach($views as $view{
  386.                 $this->create_view($view,$name);
  387.             }
  388.         elseif(!empty($views)) {
  389.             $this->create_view($views,$name);
  390.         }
  391.     }
  392.  
  393.     function generate_mailer($name$views ""{
  394.         if(stristr($name"_")) {
  395.             $model_file $this->model_path."/".strtolower($name).".php";
  396.         else {
  397.             $model_file $this->model_path."/".Inflector::underscore($name).".php";
  398.         }
  399.  
  400.         $model_class Inflector::camelize($name);
  401.  
  402.         if(!file_exists($model_file)) {
  403.             if(file_exists($this->mailer_model_template_file)) {
  404.                 $template file_get_contents($this->mailer_model_template_file);
  405.                 $template str_replace('[class_name]',$model_class,$template);
  406.                 # Add view methods
  407.                 if (!empty($views)) {
  408.                     # There are some views, add a method for each
  409.                     if(is_array($views)) {
  410.                         # Multiple views in an array
  411.                         foreach($views as $view{
  412.                             $method  "\tfunction $view() {\n";
  413.                             $method .= "\t\t\$this->subject    = '".$model_class."->".$view."';\n";
  414.                             $method .= "\t\t\$this->recipients = '';\n";
  415.                             $method .= "\t\t\$this->from       = '';\n";
  416.                             $method .= "\t\t\$this->headers    = array();\n";
  417.                             $method .= "\t\t\$this->body       = array();\n";
  418.                             $method .= "\t}";
  419.                             $class_methods[$method;
  420.                         }
  421.                         $class_methods implode("\n\n",$class_methods);
  422.                     else {
  423.                         $class_methods  "\tfunction $views() {\n";
  424.                         $class_methods .= "\t\t\$this->subject    = '".$model_class."->".$views."';\n";
  425.                         $class_methods .= "\t\t\$this->recipients = '';\n";
  426.                         $class_methods .= "\t\t\$this->from       = '';\n";
  427.                         $class_methods .= "\t\t\$this->headers    = array();\n";
  428.                         $class_methods .= "\t\t\$this->body       = array();\n";
  429.                         $class_methods .= "\t}";                        
  430.                     }
  431.                     $template str_replace('[class_methods]'$class_methods$template);
  432.                 else {
  433.                     # No view methods to add, so remove unneeded template
  434.                     $template str_replace('[class_methods]'''$template);
  435.                 }
  436.                 # Write the mailer model to disk
  437.                 if(!file_put_contents($model_file$template)) {
  438.                     echo "error creating mailer model file$model_file\n";
  439.                 else {
  440.                     echo "create $model_file\n";
  441.                 }
  442.             else {
  443.                 echo "error mailer model template file doesn't exist$this->mailer_model_template_file\n";
  444.             }
  445.         else {
  446.             echo "exists $model_file\n";
  447.         }        
  448.         
  449.         # Now create the view files
  450.         $name Inflector::underscore($name);
  451.         $this->view_path .= "/$name"
  452.         $this->view_template_file = $this->mailer_view_template_file;
  453.         $this->controller_class = $model_class;
  454.  
  455.         # Create the extra folders for View / Controller
  456.         if(file_exists($this->view_path)) {
  457.             echo "exists $this->view_path\n";
  458.         else{
  459.             $this->exec("$this->mkdir_cmd $this->view_path");
  460.             echo "create $this->view_path\n";
  461.         }
  462.  
  463.         # Create view files if any
  464.         if(is_array($views)) {
  465.             foreach($views as $view{
  466.                 $this->create_view($view$name);
  467.             }
  468.         elseif(!empty($views)) {
  469.             $this->create_view($views$name);
  470.         }
  471.              
  472.         
  473.     }
  474.  
  475.     /**
  476.      *  Implement the "generate model" command
  477.      *
  478.      *  <p>Example:<br><samp>php script/generate.php model</samp>
  479.      *  <i>SomeName</i><br>
  480.      *  will generate a file
  481.      *  <samp>app/models/</samp><i>some_name</i><samp>.php</samp><br>
  482.      *  containing the class definition<br>
  483.      *  <samp>class</samp> <i>SomeName</i> <samp>extends
  484.      *  ActiveRecord {}</samp>
  485.      *  @param string $name Name of the model.  May be in either
  486.      *                 under_score or CamelCase.  If no '_' exists in
  487.      *                 $name it is treated as CamelCase.
  488.      *  @uses Inflector::underscore()
  489.      *  @uses model_path           Must be set before call.
  490.      *                              Not changed during call.
  491.      *  @uses model_template_file  Must be set before call.
  492.      *                              Not changed during call.
  493.      */
  494.     function generate_model($name{
  495.  
  496.         if(stristr($name"_")) {
  497.             $model_file $this->model_path."/".strtolower($name).".php";
  498.         else {
  499.             $model_file $this->model_path."/".Inflector::underscore($name).".php";
  500.         }
  501.  
  502.         $model_class Inflector::camelize($name);
  503.  
  504.         if(!file_exists($model_file)) {
  505.             if(file_exists($this->model_template_file)) {
  506.                 $template file_get_contents($this->model_template_file);
  507.                 $template str_replace('[class_name]',$model_class,$template);
  508.                 if(!file_put_contents($model_file,$template)) {
  509.                     echo "error creating model file$model_file\n";
  510.                 else {
  511.                     echo "create $model_file\n";
  512.                     return true;
  513.                 }
  514.             else {
  515.                 echo "error model template file doesn't exist$this->model_template_file\n";
  516.             }
  517.         else {
  518.             echo "exists $model_file\n";
  519.             return true;
  520.         }
  521.         return false;
  522.     }
  523.     
  524.     /**
  525.      *  Implement the "generate scaffold" command
  526.      *
  527.      *  @param string $model_name 
  528.      *  @param string $controller_name 
  529.      *  @param string $views 
  530.      *  @uses generate_controller()
  531.      *  @uses generate_model()
  532.      *  @uses Inflector::classify()
  533.      *  @uses Inflector::humanize()
  534.      *  @uses Inflector::pluralize()
  535.      *  @uses Inflector::singularize()
  536.      *  @uses Inflector::underscore()
  537.      *  @uses $layout_filename          Set as output from
  538.      *                                   generate_controller().
  539.      *                                   Not changed afterward.
  540.      *  @uses fix_php_brackets()
  541.      */
  542.     function generate_scaffold($model_name$controller_name$views=""{
  543.         //echo 'generate_scaffold("'.$model_name.'", "'
  544.         //          .$controller_name.'", "'.$views.'")'."\n";
  545.         if(!$model_exists $this->generate_model($model_name)) {
  546.             echo "Error - Can't create Model$model_name.\n";    
  547.             return;
  548.         }
  549.  
  550.         Trax::$current_controller_object =$this;
  551.         $model_class_name Inflector::classify($model_name);
  552.         $singular_model_name Inflector::singularize($model_name);
  553.         $plural_model_name Inflector::pluralize($model_name);  
  554.         $human_model_name Inflector::humanize($model_name);      
  555.  
  556.         try {
  557.             $this->{$singular_model_namenew $model_class_name();
  558.         catch (ActiveRecordError $e{
  559.             echo "Can't create model.\n";
  560.             echo $e->getMessage()."\n";
  561.             echo "for database '"
  562.                 . ActiveRecord::$database_settings[TRAX_ENV]['database']
  563.                 . "' on host '"
  564.                 . ActiveRecord::$database_settings[TRAX_ENV]['hostspec']
  565.                 . "' as user '"
  566.                 . ActiveRecord::$database_settings[TRAX_ENV]['username']
  567.                 . "'\nDid you configure file "
  568.                 . Trax::$config_path
  569.                 . "/database.ini correctly?\n";
  570.             die();
  571.         }
  572.         if(empty($controller_name)) {
  573.             $controller_name Inflector::underscore($model_name);   
  574.         else {
  575.             $controller_name Inflector::underscore($controller_name);    
  576.         }
  577.         Trax::$current_controller_name $controller_name;
  578.         $controller_file "$this->controller_path/$controller_name."_controller.php";
  579.         Trax::$current_controller_path $controller_file;
  580.         $non_scaffolded_actions array();
  581.         $illegal_views array("index","add","edit","show");      
  582.         if(is_array($views)) {
  583.             foreach($views as $view{
  584.                 if(!in_array($view$illegal_views)) {
  585.                     $non_scaffolded_actions[$view;  
  586.                 }           
  587.             }
  588.         }         
  589.         $this->generate_controller($controller_name,
  590.                                    $non_scaffolded_actionstrue)
  591.         if(stristr($controller_name"/")) {
  592.             $controller_class_name =
  593.                 Inflector::classify(substr($controller_name,
  594.                                            strrpos($controller_name"/")+1));
  595.             $human_controller_name =
  596.                 Inflector::humanize(substr($controller_name,
  597.                                            strrpos($controller_name"/")+1));
  598.         else {
  599.             $controller_class_name Inflector::classify($controller_name);
  600.             $human_controller_name Inflector::humanize($controller_name);
  601.         }             
  602.      
  603.         # Generate the controller
  604.         ob_start();    
  605.         include("$this->scaffold_template_path/controller.php");
  606.         $controller_contents $this->fix_php_brackets(ob_get_contents());
  607.         ob_end_clean();
  608.         if(!file_exists($controller_file)) {
  609.             if(!file_put_contents($controller_file$controller_contents)) {
  610.                 echo "error creating controller class file$controller_file\n";
  611.             else {
  612.                 echo "create $controller_file\n";
  613.             }        
  614.         else {
  615.             echo "exists $controller_file\n";        
  616.         
  617.                 
  618.         # Generate the index.phtml view
  619.         $view_file "$this->view_path/index.".Trax::$views_extension;
  620.         ob_start();    
  621.         include("$this->scaffold_template_path/view_index.phtml");
  622.         $index_contents $this->fix_php_brackets(ob_get_contents());
  623.         ob_end_clean();
  624.         if(!file_exists($view_file)) {
  625.             if(!file_put_contents($view_file$index_contents)) {
  626.                 echo "error creating view file$view_file\n";
  627.             else {
  628.                 echo "create $view_file\n";
  629.             }
  630.         else {
  631.             echo "exists $view_file\n";        
  632.         
  633.                
  634.         # Generate the add.phtml view
  635.         $view_file "$this->view_path/add.".Trax::$views_extension;
  636.         ob_start();    
  637.         include("$this->scaffold_template_path/view_add.phtml");
  638.         $add_contents $this->fix_php_brackets(ob_get_contents());
  639.         ob_end_clean();       
  640.         if(!file_exists($view_file)) {
  641.             if(!file_put_contents($view_file$add_contents)) {
  642.                 echo "error creating view file$view_file\n";
  643.             else {
  644.                 echo "create $view_file\n";
  645.             }
  646.         else {
  647.             echo "exists $view_file\n";        
  648.         
  649.         
  650.         # Generate the edit.phtml view
  651.         $view_file "$this->view_path/edit.".Trax::$views_extension;
  652.         ob_start();    
  653.         include("$this->scaffold_template_path/view_edit.phtml");
  654.         $edit_contents $this->fix_php_brackets(ob_get_contents());
  655.         ob_end_clean()
  656.         if(!file_exists($view_file)) {
  657.             if(!file_put_contents($view_file$edit_contents)) {
  658.                 echo "error creating view file$view_file\n";
  659.             else {
  660.                 echo "create $view_file\n";
  661.             }
  662.         else {
  663.             echo "exists $view_file\n";        
  664.         
  665.         
  666.         # Generate the show.phtml view
  667.         $view_file "$this->view_path/show.".Trax::$views_extension;
  668.         ob_start();    
  669.         include("$this->scaffold_template_path/view_show.phtml");
  670.         $show_contents $this->fix_php_brackets(ob_get_contents());
  671.         ob_end_clean();
  672.         if(!file_exists($view_file)) {
  673.             if(!file_put_contents($view_file$show_contents)) {
  674.                 echo "error creating view file$view_file\n";
  675.             else {
  676.                 echo "create $view_file\n";
  677.             }
  678.         else {
  679.             echo "exists $view_file\n";        
  680.         
  681.                
  682.         # Generate the partial containing the form elments from the database
  683.         $view_file "$this->view_path/_form.".Trax::$views_extension;
  684.         ob_start();    
  685.         require "$this->scaffold_template_path/form_scaffolding.phtml";
  686.         $_form_contents $this->fix_php_brackets(ob_get_contents());
  687.         ob_end_clean();  
  688.         if(!file_exists($view_file)) {
  689.             if(!file_put_contents($view_file$_form_contents)) {
  690.                 echo "error creating view file$view_file\n";
  691.             else {
  692.                 echo "create $view_file\n";
  693.             }
  694.         else {
  695.             echo "exists $view_file\n";        
  696.         
  697.         
  698.         # Generate the layout for the scaffolding
  699.         $layout_file $this->layouts_path."/".$this->layout_filename.".".Trax::$views_extension;
  700.         if(!file_exists($this->layouts_path)) {
  701.             mkdir($this->layouts_path);        
  702.         }
  703.         ob_start();    
  704.         include("$this->scaffold_template_path/layout.phtml");
  705.         $layout_contents $this->fix_php_brackets(ob_get_contents());
  706.         ob_end_clean();  
  707.         if(!file_exists($layout_file)) {
  708.             if(!file_put_contents($layout_file$layout_contents)) {
  709.                 echo "error creating layout file$layout_file\n";
  710.             else {
  711.                 echo "create $layout_file\n";
  712.             }
  713.         else {
  714.             echo "exists $layout_file\n";        
  715.         }                   
  716.     }    
  717.  
  718.     /**
  719.      *  Create a controller file with optional view methods
  720.      *
  721.      *  @param string $controller Name of the controller
  722.      *  @param string[] $views    Name(s) of view(s), if any
  723.      *  @uses controller_class    Must be set before call.
  724.      *                             Not changed during call.
  725.      *  @uses controller_path     Must be set before call.
  726.      *                             Not changed during call.
  727.      *  @uses controller_template_file Must be set before call.
  728.      *                             Not changed during call.
  729.      *  @todo Should return succeed/fail indication
  730.      */
  731.     function create_controller($controller,$views=""{
  732.  
  733.         $controller_file "$this->controller_path/"
  734.             . $controller "_controller.php";
  735.  
  736.         if(!file_exists($controller_file)) {
  737.             if(file_exists($this->controller_template_file)) {
  738.                 $template file_get_contents($this->controller_template_file);
  739.                 $template str_replace('[class_name]',
  740.                                         $this->controller_class,$template);
  741.                 //  Add view methods
  742.                 if (!empty($views)) {
  743.  
  744.                     //  There are some views, add a method for each
  745.                     if(is_array($views)) {
  746.  
  747.                         //  Multiple views in an array
  748.                         foreach($views as $view{
  749.                             $class_methods["\tfunction $view() {\n\t}";
  750.                         }
  751.                         $class_methods implode("\n\n",$class_methods);
  752.                     else {
  753.                         $class_methods "\tfunction $views() {\n\t}\n\n";
  754.                     }
  755.                     $template str_replace('[class_methods]',
  756.                                             $class_methods,$template);
  757.                 else {
  758.  
  759.                     //  No view methods to add, so remove unneeded template
  760.                     $template str_replace('[class_methods]''',$template);
  761.                 }
  762.  
  763.                 if(!file_put_contents($controller_file,$template)) {
  764.                     echo "error creating controller class file: "
  765.                         . $controller_file "\n";
  766.                 else {
  767.                     echo "create $controller_file\n";
  768.                 }
  769.  
  770.             else {
  771.                 echo "error controller template file doesn't exist: "
  772.                     . $this->controller_template_file "\n";
  773.             }
  774.         else {
  775.             echo "exists $controller_file\n";
  776.         }
  777.     }
  778.  
  779.     /**
  780.      *  Create a helper file for a controller
  781.      *
  782.      *  @param string $controller Name of the controller
  783.      *  @uses controller_class      Must be set before call.
  784.      *                               Not changed during call.
  785.      *  @uses helper_path           Must be set before call.
  786.      *                               Not changed during call.
  787.      *  @uses helper_template_file  Must be set before call.
  788.      *                               Not changed during call.
  789.      *  @todo Should return succeed/fail indication
  790.      */
  791.     function create_helper($controller{
  792.         $helper_file "$this->helper_path/".$controller."_helper.php";
  793.         if(!file_exists($helper_file)) {
  794.             if(file_exists($this->helper_template_file)) {
  795.                 $template file_get_contents($this->helper_template_file);
  796.                 $template str_replace('[class_name]',
  797.                                         $this->controller_class,$template);
  798.                 if(!file_put_contents($helper_file,$template)) {
  799.                     echo "error creating helper file$helper_file\n";
  800.                 else {
  801.                     echo "create $helper_file\n";
  802.                 }
  803.  
  804.             else {
  805.                 echo "error helper template file doesn't exist: "
  806.                     . $this->helper_template_file "\n";
  807.             }
  808.         else {
  809.             echo "exists $helper_file\n";
  810.         }
  811.     }
  812.  
  813.     /**
  814.      *  Create a view file if it doesn't exist
  815.      *
  816.      *  Create a view file in the Trax work area if the required file
  817.      *  does not yet exist.  Generate the view file contents by
  818.      *  customizing the view template file with information about the
  819.      *  controller and view names.
  820.      *
  821.      *  @param string $view           Name of the view
  822.      *  @param string $controller     Name of the controller
  823.      *  @uses controller_class        Must be set before call.
  824.      *                                 Not changed during call.
  825.      *  @uses view_path               Must be set before call.
  826.      *                                 Not changed during call.
  827.      *  @uses view_template_file      Must be set before call.
  828.      *                                 Not changed during call.
  829.      *  @todo Should return succeed/fail indication
  830.      */
  831.     function create_view($view$controller{
  832.         $view_file "$this->view_path/".$view.".".Trax::$views_extension;
  833.         if(!file_exists($view_file)) {
  834.             if(file_exists($this->view_template_file)) {
  835.                 $template file_get_contents($this->view_template_file);
  836.                 $template str_replace('[class_name]',
  837.                                         $this->controller_class,$template);
  838.                 $template str_replace('[controller]',$controller,$template);
  839.                 $template str_replace('[view]',$view,$template);
  840.                 if(!file_put_contents($view_file,$template)) {
  841.                     echo "error creating view file$view_file\n";
  842.                 else {
  843.                     echo "create $view_file\n";
  844.                 }
  845.             else {
  846.                 echo "error view template file doesn't exist: "
  847.                     . $this->view_template_file "\n";
  848.             }
  849.         else {
  850.             echo "exists $view_file\n";
  851.         }
  852.     }
  853.  
  854.     /**
  855.      *  Execute an operating system command
  856.      *
  857.      *  @param string $cmd  Command to be executed
  858.      *  @todo Replace with calls to filesystem methods
  859.      */
  860.     function exec($cmd{
  861.         if (substr(PHP_OS03== 'WIN'{
  862.             exec(str_replace("/","\\",$cmd));
  863.         else {
  864.             exec($cmd);
  865.         }
  866.     }
  867.     
  868.     /**
  869.      *  Replace "< ?php ... ? >" with "<?php ... ?>"
  870.      *
  871.      *  @param string $string  String to be edited
  872.      *  @return string Edited input string
  873.      */
  874.     function fix_php_brackets($string{
  875.         return str_replace("? >""?>",
  876.                            str_replace("< ?php""<?php"$string));
  877.     }
  878.  
  879.     /**
  880.      *  Output console help message for "generate controller"
  881.      */
  882.     function controller_help({
  883.         echo "Usage: php generate.php controller ControllerName [view1 view2 ...]\n\n";
  884.         echo "Description:\n";
  885.         echo "\tThe controller generator creates functions for a new controller and\n";
  886.         echo"\tits views.\n\n";
  887.         echo "\tThe generator takes a controller name and a list of views as arguments.\n";
  888.         echo "\tThe controller name may be given in CamelCase or under_score and should\n";
  889.         echo "\tnot be suffixed with 'Controller'.  To create a controller within a\n";
  890.         echo "\tmodule, specify the controller name as 'folder/controller'.\n";
  891.         echo "\tThe generator creates a controller class in app/controllers with view\n";
  892.         echo "\ttemplates in app/views/controller_name.\n\n";
  893.         echo "Example:\n";
  894.         echo "\tphp script/generate.php controller CreditCard open debit credit close\n\n";
  895.         echo "\tCredit card controller with URLs like /credit_card/debit.\n";
  896.         echo "\t\tController: app/controllers/credit_card_controller.php\n";
  897.         echo "\t\tViews:      app/views/credit_card/debit.phtml [...]\n";
  898.         echo "\t\tHelper:     app/helpers/credit_card_helper.php\n\n";
  899.         echo "Module/Folders Example:\n";
  900.         echo "\tphp script/generate.php controller 'admin/credit_card' suspend late_fee\n\n";
  901.         echo "\tCredit card admin controller with URLs /admin/credit_card/suspend.\n";
  902.         echo "\t\tController: app/controllers/admin/credit_card_controller.php\n";
  903.         echo "\t\tViews:      app/views/admin/credit_card/suspend.phtml [...]\n";
  904.         echo "\t\tHelper:     app/helpers/credit_card_helper.php\n\n";
  905.     }
  906.  
  907.     /**
  908.      *  Output console help message for "generate model"
  909.      */
  910.     function model_help({
  911.         echo "Usage: php generate.php model ModelName\n";
  912.         echo "Description:\n";
  913.         echo "\tThe model generator creates functions for a new model.\n";
  914.         echo "\tThe generator takes a model name as its argument.  The model name\n";
  915.         echo "\tmay be given in CamelCase or under_score and should not be suffixed\n";
  916.         echo "\twith 'Model'. The generator creates a model class in app/models.\n";
  917.         echo "Example:\n";
  918.         echo "\tphp script/generate.php model Account\n";
  919.         echo "\tThis will create an Account model:\n";
  920.         echo "\t\tModel:      app/models/account.php\n\n";
  921.     }
  922.  
  923.     /**
  924.      *  Output console help message for "generate mailer"
  925.      */
  926.     function mailer_help({
  927.         echo "Usage: php script/generate.php mailer MailerName [view1 view2 ...]\n\n";
  928.         echo "Description:\n";
  929.         echo "\tThe mailer generator creates class methods for a new mailer and its views.\n\n";
  930.         echo "\tThe generator takes a mailer name and a list of views as arguments.\n";
  931.         echo "\tThe mailer name may be given in CamelCase or under_score.\n\n";
  932.         echo "\tThe generator creates a mailer class in app/models with view templates\n";
  933.         echo "\tin app/views/mailer_name.\n\n";
  934.         echo "Example:\n";
  935.         echo "\tphp script/generate.php mailer Notifications signup forgot_password invoice\n\n";
  936.         echo "\tThis will create a Notifications mailer class:\n";
  937.         echo "\t\tMailer:     app/models/notifications.php\n";
  938.         echo "\t\tViews:      app/views/notifications/signup.phtml [...]\n\n";  
  939.     }
  940.     
  941.     /**
  942.      *  Output console help message for "generate scaffold"
  943.      */
  944.     function scaffold_help({
  945.         echo "Usage: php script/generate.php scaffold ModelName [ControllerName] [view1 view2 ...]\n\n";
  946.         echo "Description:\n";
  947.         echo "\tThe scaffold generator creates a controller to interact with a model.\n";
  948.         echo "\tIf the model does not exist, it creates the model as well.  The\n";
  949.         echo "\tgenerated code is equivalent to the ( public \$scaffold = \"model\"; )\n";
  950.         echo "\tdeclaration, making it easy to migrate when you wish to customize\n";
  951.         echo "\tyour controller and views.\n\n";
  952.         echo "\tThe generator takes a model name, an optional controller name, and a\n";
  953.         echo "\tlist of views as arguments.  Scaffolded actions and views are created\n";
  954.         echo "\tautomatically.\n\n";
  955.         echo "\tThe auto scaffolded actions and views are:\n";
  956.         echo "\t\tindex, show, add, edit, delete\n\n";
  957.         echo "\tIf a controller name is not given, the plural form of the model name\n";
  958.         echo "\twill be used.  The model and controller names may be given in CamelCase\n";
  959.         echo "\tor under_score and should not be suffixed with 'Model' or 'Controller'.\n\n";
  960.         echo "Example:\n";
  961.         echo "\tphp script/generate.php scaffold Account Bank debit credit\n\n";
  962.         echo "\tThis will generate an Account model and BankController with a basic\n";
  963.         echo "\tuser interface.  Now create the accounts table in your database and\n";
  964.         echo "\t browse to http://localhost/bank/.  Voila, you're on Trax!\n\n";
  965.         echo "Module/Folders Example:\n";
  966.         echo "\tphp script/generate.php scaffold CreditCard 'admin/credit_card' suspend late_fee\n\n";
  967.         echo "\tThis will generate a CreditCard model and CreditCardController\n";
  968.         echo "\tcontroller in the admin module.\n";            
  969.     }
  970.  
  971.     /**
  972.      *  Output console help message for unrecognized command
  973.      */
  974.     function generator_help({
  975.         echo "Usage:\n";
  976.         echo "Generate Controller:\n";
  977.         echo "php script/generate.php controller controller_name [view1 view2 ...]\n";
  978.         echo "for more controller info php script/generate.php controller\n\n";
  979.         echo "Generate Model:\n";
  980.         echo "php script/generate.php model ModelName\n";
  981.         echo "for more model info php script/generate.php model\n\n";
  982.         echo "Generate Mailer:\n";
  983.         echo "php script/generate.php mailer MailerName [view1 view2 ...]\n";
  984.         echo "for more mailer info php script/generate.php mailer\n\n";
  985.         echo "Generate Scaffold:\n";
  986.         echo "php script/generate.php scaffold ModelName [controller_name] [view1 view2 ...]\n";
  987.         echo "for more scaffold info php script/generate.php scaffold\n\n";        
  988.     }
  989. }
  990.  
  991. // -- set Emacs parameters --
  992. // Local variables:
  993. // tab-width: 4
  994. // c-basic-offset: 4
  995. // c-hanging-comment-ender-p: nil
  996. // indent-tabs-mode: nil
  997. // End:
  998. ?>

Documentation generated on Mon, 21 May 2007 22:29:28 -0600 by phpDocumentor 1.3.2