139 lines
4.0 KiB
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/copyleft/gpl.html GNU/GPL, 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";
|
|
}
|