rosehill/scripts/generateLists.php

139 lines
4.0 KiB
PHP

<?php
/**
* Generates a Collection class for each the ActiveRecord objects
*
* @copyright 2006-2009 City of Bloomington, Indiana
* @license http://www.gnu.org/licenses/agpl.txt GNU/AGPL, see LICENSE.txt
* @author Cliff Ingham <inghamn@bloomington.in.gov>
*/
include '../configuration.inc';
$zend_db = Database::getConnection();
foreach ($zend_db->listTables() as $tableName) {
$fields = array();
$primary_keys = array();
foreach ($zend_db->describeTable($tableName) as $row) {
$type = preg_replace("/[^a-z]/","",strtolower($row['DATA_TYPE']));
// Translate database datatypes into PHP datatypes
if (preg_match('/int/',$type)) {
$type = 'int';
}
if (preg_match('/enum/',$type) || preg_match('/varchar/',$type)) {
$type = 'string';
}
$fields[] = array('field'=>$row['COLUMN_NAME'],'type'=>$type);
if ($row['PRIMARY']) {
$primary_keys[] = $row['COLUMN_NAME'];
}
}
// Only generate code for tables that have a single-column primary key
// Code for other tables will need to be created by hand
if (count($primary_keys) != 1) {
continue;
}
$key = $primary_keys[0];
$tableName = strtolower($tableName);
$className = Inflector::classify($tableName);
//--------------------------------------------------------------------------
// Output the class
//--------------------------------------------------------------------------
$contents = "<?php
/**
* A collection class for $className objects
*
* This class creates a zend_db select statement.
* ZendDbResultIterator handles iterating and paginating those results.
* As the results are iterated over, ZendDbResultIterator will pass each desired
* row back to this class's loadResult() which will be responsible for hydrating
* each $className object
*
* Beyond the basic \$fields handled, you will need to write your own handling
* of whatever extra \$fields you need
*/
";
$contents.= COPYRIGHT;
$contents.="
class {$className}List extends ZendDbResultIterator
{
/**
* Creates a basic select statement for the collection.
*
* Populates the collection if you pass in \$fields
* Setting itemsPerPage turns on pagination mode
* In pagination mode, this will only load the results for one page
*
* @param array \$fields
* @param int \$itemsPerPage Turns on Pagination
* @param int \$currentPage
*/
public function __construct(\$fields=null,\$itemsPerPage=null,\$currentPage=null)
{
parent::__construct(\$itemsPerPage,\$currentPage);
if (is_array(\$fields)) {
\$this->find(\$fields);
}
}
/**
* Populates the collection
*
* @param array \$fields
* @param string|array \$order Multi-column sort should be given as an array
* @param int \$limit
* @param string|array \$groupBy Multi-column group by should be given as an array
*/
public function find(\$fields=null,\$order='$key',\$limit=null,\$groupBy=null)
{
\$this->select->from('$tableName');
// Finding on fields from the $tableName table is handled here
if (count(\$fields)) {
foreach (\$fields as \$key=>\$value) {
\$this->select->where(\"\$key=?\",\$value);
}
}
// Finding on fields from other tables requires joining those tables.
// You can handle fields from other tables by adding the joins here
// If you add more joins you probably want to make sure that the
// above foreach only handles fields from the $tableName table.
\$this->select->order(\$order);
if (\$limit) {
\$this->select->limit(\$limit);
}
if (\$groupBy) {
\$this->select->group(\$groupBy);
}
\$this->populateList();
}
/**
* Hydrates all the $className objects from a database result set
*
* This is a callback function, called from ZendDbResultIterator. It is
* called once per row of the result.
*
* @param int \$key The index of the result row to load
* @return $className
*/
protected function loadResult(\$key)
{
return new $className(\$this->result[\$key]);
}
}
";
$dir = APPLICATION_HOME.'/scripts/stubs/classes';
if (!is_dir($dir)) {
mkdir($dir,0770,true);
}
file_put_contents("$dir/{$className}List.php",$contents);
echo "$className\n";
}