Commit 9eac2776 authored by Jonathan.Wage's avatar Jonathan.Wage

Consolidated a few things. Initial entry of Inflector class. Moved some...

Consolidated a few things. Initial entry of Inflector class. Moved some methods from Doctrine base class to Doctrine_Lib and Doctrine_Inflector.
parent b6924e0f
...@@ -1068,9 +1068,11 @@ final class Doctrine ...@@ -1068,9 +1068,11 @@ final class Doctrine
default: default:
$ret[] = var_export($var, true); $ret[] = var_export($var, true);
} }
if ($output) { if ($output) {
print implode("\n", $ret); print implode("\n", $ret);
} }
return implode("\n", $ret); return implode("\n", $ret);
} }
...@@ -1082,9 +1084,9 @@ final class Doctrine ...@@ -1082,9 +1084,9 @@ final class Doctrine
* @param string $classname * @param string $classname
* @return string * @return string
*/ */
public static function tableize($classname) public static function tableize($className)
{ {
return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $classname)); return Doctrine_Inflector::tableize($className);
} }
/** /**
...@@ -1097,20 +1099,7 @@ final class Doctrine ...@@ -1097,20 +1099,7 @@ final class Doctrine
*/ */
public static function classify($tableName) public static function classify($tableName)
{ {
return preg_replace_callback('~(_?)(_)([\w])~', array("Doctrine", "classifyCallback"), ucfirst(strtolower($tableName))); return Doctrine_Inflector::classify($tableName);
}
/**
* classifyCallback
*
* Callback function to classify a classname properly.
*
* @param array $matches An array of matches from a pcre_replace call
* @return string A string with matches 1 and mathces 3 in upper case.
*/
public static function classifyCallback($matches)
{
return $matches[1] . strtoupper($matches[3]);
} }
/** /**
...@@ -1121,90 +1110,8 @@ final class Doctrine ...@@ -1121,90 +1110,8 @@ final class Doctrine
* @param string $classname * @param string $classname
* @return boolean * @return boolean
*/ */
public static function isValidClassname($classname) public static function isValidClassname($className)
{
if (preg_match('~(^[a-z])|(_[a-z])|([\W])|(_{2})~', $classname)) {
return false;
}
return true;
}
/**
* makeDirectories
*
* Makes the directories for a path recursively
*
* @param string $path
* @return void
*/
public static function makeDirectories($path, $mode = 0777)
{ {
if ( ! $path) { return Doctrine_Lib::isValidClassName($className);
return false;
}
if (is_dir($path) || is_file($path)) {
return true;
}
return mkdir($path, $mode, true);
}
/**
* removeDirectories
*
* @param string $folderPath
* @return void
*/
public static function removeDirectories($folderPath)
{
if (is_dir($folderPath))
{
foreach (scandir($folderPath) as $value)
{
if ($value != '.' && $value != '..')
{
$value = $folderPath . "/" . $value;
if (is_dir($value)) {
self::removeDirectories($value);
} else if (is_file($value)) {
@unlink($value);
}
}
}
return rmdir ( $folderPath );
} else {
return false;
}
}
/**
* getValidators
*
* Get available doctrine validators
*
* @return array $validators
*/
public static function getValidators()
{
if (empty(self::$_validators)) {
$dir = Doctrine::getPath() . DIRECTORY_SEPARATOR . 'Doctrine' . DIRECTORY_SEPARATOR . 'Validator';
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($files as $file) {
$e = explode('.', $file->getFileName());
if (end($e) == 'php') {
$name = strtolower($e[0]);
self::$_validators[$name] = $name;
}
}
}
return self::$_validators;
} }
} }
\ No newline at end of file
...@@ -49,7 +49,7 @@ class Doctrine_AuditLog extends Doctrine_Plugin ...@@ -49,7 +49,7 @@ class Doctrine_AuditLog extends Doctrine_Plugin
*/ */
public function __construct(array $options = array()) public function __construct(array $options = array())
{ {
$this->_options = array_merge($this->_options, $options); $this->_options = Doctrine_Lib::arrayDeepMerge($this->_options, $options);
} }
/** /**
...@@ -104,4 +104,4 @@ class Doctrine_AuditLog extends Doctrine_Plugin ...@@ -104,4 +104,4 @@ class Doctrine_AuditLog extends Doctrine_Plugin
// the version column should be part of the primary key definition // the version column should be part of the primary key definition
$this->hasColumn($this->_options['versionColumn'], 'integer', 8, array('primary' => true)); $this->hasColumn($this->_options['versionColumn'], 'integer', 8, array('primary' => true));
} }
} }
\ No newline at end of file
...@@ -732,7 +732,7 @@ END; ...@@ -732,7 +732,7 @@ END;
null null
); );
Doctrine::makeDirectories($path); Doctrine_Lib::makeDirectories($path);
$writePath = $path . DIRECTORY_SEPARATOR . $className . $this->_suffix; $writePath = $path . DIRECTORY_SEPARATOR . $className . $this->_suffix;
...@@ -797,11 +797,11 @@ END; ...@@ -797,11 +797,11 @@ END;
} }
if (isset($writePath)) { if (isset($writePath)) {
Doctrine::makeDirectories($writePath); Doctrine_Lib::makeDirectories($writePath);
$writePath .= DIRECTORY_SEPARATOR . $fileName; $writePath .= DIRECTORY_SEPARATOR . $fileName;
} else { } else {
Doctrine::makeDirectories($this->_path); Doctrine_Lib::makeDirectories($this->_path);
$writePath = $this->_path . DIRECTORY_SEPARATOR . $fileName; $writePath = $this->_path . DIRECTORY_SEPARATOR . $fileName;
} }
......
...@@ -335,7 +335,7 @@ class Doctrine_Import_Schema ...@@ -335,7 +335,7 @@ class Doctrine_Import_Schema
$colDesc['sequence'] = isset($field['sequence']) ? (string) $field['sequence']:null; $colDesc['sequence'] = isset($field['sequence']) ? (string) $field['sequence']:null;
$colDesc['values'] = isset($field['values']) ? (array) $field['values']:null; $colDesc['values'] = isset($field['values']) ? (array) $field['values']:null;
$validators = Doctrine::getValidators(); $validators = Doctrine_Lib::getValidators();
foreach ($validators as $validator) { foreach ($validators as $validator) {
if (isset($field[$validator])) { if (isset($field[$validator])) {
......
<?php
/*
* $Id: Inflector.php 3189 2007-11-18 20:37:44Z meus $
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* Doctrine_Inflector has static methods for inflecting text
*
* The methods in these classes are from several different sources collected
* across the internet through php development for several years.
* They have been updated and modified a little bit for Doctrine but are mainly untouched.
*
* @package Doctrine
* @subpackage Inflector
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision: 3189 $
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/
class Doctrine_Inflector
{
/**
* pluralize
*
* @param string $word English noun to pluralize
* @return string Plural noun
*/
public static function pluralize($word)
{
$plural = array('/(quiz)$/i' => '\1zes',
'/^(ox)$/i' => '\1en',
'/([m|l])ouse$/i' => '\1ice',
'/(matr|vert|ind)ix|ex$/i' => '\1ices',
'/(x|ch|ss|sh)$/i' => '\1es',
'/([^aeiouy]|qu)ies$/i' => '\1y',
'/([^aeiouy]|qu)y$/i' => '\1ies',
'/(hive)$/i' => '\1s',
'/(?:([^f])fe|([lr])f)$/i' => '\1\2ves',
'/sis$/i' => 'ses',
'/([ti])um$/i' => '\1a',
'/(buffal|tomat)o$/i' => '\1oes',
'/(bu)s$/i' => '\1ses',
'/(alias|status)/i' => '\1es',
'/(octop|vir)us$/i' => '\1i',
'/(ax|test)is$/i' => '\1es',
'/s$/i' => 's',
'/$/' => 's');
$uncountable = array('equipment',
'information',
'rice',
'money',
'species',
'series',
'fish',
'sheep');
$irregular = array('person' => 'people',
'man' => 'men',
'child' => 'children',
'sex' => 'sexes',
'move' => 'moves');
$lowercasedWord = strtolower($word);
foreach ($uncountable as $_uncountable) {
if(substr($lowercasedWord, (-1 * strlen($_uncountable))) == $_uncountable) {
return $word;
}
}
foreach ($irregular as $_plural=> $_singular){
if (preg_match('/('.$_plural.')$/i', $word, $arr)) {
return preg_replace('/('.$_plural.')$/i', substr($arr[0],0,1) . substr($_singular,1), $word);
}
}
foreach ($plural as $rule => $replacement) {
if (preg_match($rule, $word)) {
return preg_replace($rule, $replacement, $word);
}
}
return false;
}
/**
* singularize
*
* @param string $word English noun to singularize
* @return string Singular noun.
*/
public static function singularize($word)
{
$singular = array('/(quiz)zes$/i' => '\\1',
'/(matr)ices$/i' => '\\1ix',
'/(vert|ind)ices$/i' => '\\1ex',
'/^(ox)en/i' => '\\1',
'/(alias|status)es$/i' => '\\1',
'/([octop|vir])i$/i' => '\\1us',
'/(cris|ax|test)es$/i' => '\\1is',
'/(shoe)s$/i' => '\\1',
'/(o)es$/i' => '\\1',
'/(bus)es$/i' => '\\1',
'/([m|l])ice$/i' => '\\1ouse',
'/(x|ch|ss|sh)es$/i' => '\\1',
'/(m)ovies$/i' => '\\1ovie',
'/(s)eries$/i' => '\\1eries',
'/([^aeiouy]|qu)ies$/i' => '\\1y',
'/([lr])ves$/i' => '\\1f',
'/(tive)s$/i' => '\\1',
'/(hive)s$/i' => '\\1',
'/([^f])ves$/i' => '\\1fe',
'/(^analy)ses$/i' => '\\1sis',
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => '\\1\\2sis',
'/([ti])a$/i' => '\\1um',
'/(n)ews$/i' => '\\1ews',
'/s$/i' => '');
$uncountable = array('equipment',
'information',
'rice',
'money',
'species',
'series',
'fish',
'sheep',
'sms');
$irregular = array('person' => 'people',
'man' => 'men',
'child' => 'children',
'sex' => 'sexes',
'move' => 'moves');
$lowercasedWord = strtolower($word);
foreach ($uncountable as $_uncountable){
if(substr($lowercasedWord, ( -1 * strlen($_uncountable))) == $_uncountable){
return $word;
}
}
foreach ($irregular as $_singular => $_plural) {
if (preg_match('/('.$_plural.')$/i', $word, $arr)) {
return preg_replace('/('.$_plural.')$/i', substr($arr[0],0,1).substr($_singular,1), $word);
}
}
foreach ($singular as $rule => $replacement) {
if (preg_match($rule, $word)) {
return preg_replace($rule, $replacement, $word);
}
}
return $word;
}
/**
* variablize
*
* @param string $word
* @return void
*/
public static function variablize($word)
{
$word = self::camelize($word);
return strtolower($word[0]) . substr($word, 1);
}
/**
* tableize
*
* @param string $name
* @return void
*/
public static function tableize($name)
{
// Would prefer this but it breaks unit tests. Forces the table underscore pattern
// return self::pluralize(self::underscore($name));
return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $name));
}
/**
* classify
*
* @param string $word
*/
public static function classify($word)
{
return preg_replace_callback('~(_?)(_)([\w])~', array("Doctrine_Inflector", "classifyCallback"), ucfirst(strtolower($word)));
}
/**
* classifyCallback
*
* Callback function to classify a classname properly.
*
* @param array $matches An array of matches from a pcre_replace call
* @return string A string with matches 1 and mathces 3 in upper case.
*/
public static function classifyCallback($matches)
{
return $matches[1] . strtoupper($matches[3]);
}
/**
* camelize
*
* @param string $word
* @return void
*/
public static function camelize($word)
{
if (preg_match_all('/\/(.?)/', $word, $got)) {
foreach ($got[1] as $k => $v){
$got[1][$k] = '::' . strtoupper($v);
}
$word = str_replace($got[0], $got[1], $word);
}
return str_replace(' ', '', ucwords(preg_replace('/[^A-Z^a-z^0-9^:]+/', ' ', $word)));
}
/**
* unaccent
*
* @param string $text
* @return void
*/
public static function unaccent($text)
{
return strtr($text, 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ',
'AAAAAAACEEEEIIIIDNOOOOOOUUUUYTsaaaaaaaceeeeiiiienoooooouuuuyty');
}
/**
* urlize
*
* @param string $text
* @return void
*/
public static function urlize($text)
{
return trim(self::underscore(self::unaccent($text)), '-');
}
/**
* underscore
*
* @param string $word
* @return void
*/
public static function underscore($word)
{
return strtolower(preg_replace('/[^A-Z^a-z^0-9^\/]+/', '_',
preg_replace('/([a-z\d])([A-Z])/', '\1_\2',
preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2',
preg_replace('/::/', '/', $word)))));
}
}
\ No newline at end of file
...@@ -33,33 +33,38 @@ ...@@ -33,33 +33,38 @@
class Doctrine_Lib class Doctrine_Lib
{ {
/** /**
* @param integer $state the state of record * getRecordStateAsString
*
* @param integer $state the state of record
* @see Doctrine_Record::STATE_* constants * @see Doctrine_Record::STATE_* constants
* @return string string representation of given state * @return string string representation of given state
*/ */
public static function getRecordStateAsString($state) public static function getRecordStateAsString($state)
{ {
switch ($state) { switch ($state) {
case Doctrine_Record::STATE_PROXY: case Doctrine_Record::STATE_PROXY:
return "proxy"; return "proxy";
break; break;
case Doctrine_Record::STATE_CLEAN: case Doctrine_Record::STATE_CLEAN:
return "persistent clean"; return "persistent clean";
break; break;
case Doctrine_Record::STATE_DIRTY: case Doctrine_Record::STATE_DIRTY:
return "persistent dirty"; return "persistent dirty";
break; break;
case Doctrine_Record::STATE_TDIRTY: case Doctrine_Record::STATE_TDIRTY:
return "transient dirty"; return "transient dirty";
break; break;
case Doctrine_Record::STATE_TCLEAN: case Doctrine_Record::STATE_TCLEAN:
return "transient clean"; return "transient clean";
break; break;
} }
} }
/** /**
* getRecordAsString
*
* returns a string representation of Doctrine_Record object * returns a string representation of Doctrine_Record object
*
* @param Doctrine_Record $record * @param Doctrine_Record $record
* @return string * @return string
*/ */
...@@ -73,123 +78,37 @@ class Doctrine_Lib ...@@ -73,123 +78,37 @@ class Doctrine_Lib
$r[] = 'OID : ' . $record->getOID(); $r[] = 'OID : ' . $record->getOID();
$r[] = 'data : ' . Doctrine::dump($record->getData(), false); $r[] = 'data : ' . Doctrine::dump($record->getData(), false);
$r[] = '</pre>'; $r[] = '</pre>';
return implode("\n",$r)."<br />";
}
/**
* Return an collection of records as XML.
*
* @see getRecordAsXml for options to set in the record class to control this.
*
* @param Doctrine_Collection $collection
* @param SimpleXMLElement $xml
* @return string Xml as string
*/
public static function getCollectionAsXml(Doctrine_Collection $collection, SimpleXMLElement $incomming_xml = null) {
$collectionName = Doctrine_Lib::plurelize($collection->getTable()->tableName);
if ( $collection->count() != 0) {
$record = $collection[0];
$xml_options = $record->option("xml");
if ( isset($xml_options["collection_name"])) {
$collectionName = $xml_options["collection_name"];
}
}
if ( ! isset($incomming_xml)) { return implode("\n",$r)."<br />";
$new_xml_string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><" . $collectionName . "></" . $collectionName . ">";
$xml = new SimpleXMLElement($new_xml_string);
} else {
$xml = $incomming_xml->addChild($collectionName);
}
foreach ($collection as $key => $record) {
Doctrine_Lib::getRecordAsXml($record, $xml);
}
return $xml->asXML();
}
public static function plurelize($string) {
return $string . "s";
} }
/** /**
* Return a recrd as XML. * getConnectionStateAsString
*
* In order to control how this is done set the "xml" option in a record.
* This option is an array that has the keys "ignore_fields" and "include_relations". Both of these are arrays that list the name of fields/relations to include/process.
*
* If you want to insert this xml as a part inside another xml send a
* SimpleXMLElement to the function. Because of the nature of SimpleXML the
* content you add to this element will be avilable after the function is
* complete.
* *
* @param Doctrine_Record $record
* @param SimpleXMLElement $xml
* @return string Xml as string
*/
public static function getRecordAsXml(Doctrine_Record $record, SimpleXMlElement $incomming_xml = NULL)
{
$recordname = $record->getTable()->tableName;
if ( !isset($incomming_xml)) {
$new_xml_string = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><" . $recordname . "></" . $recordname . ">";
$xml = new SimpleXMLElement($new_xml_string);
} else {
$xml = $incomming_xml->addChild($recordname);
}
$xml_options = $record->option("xml");
if ( isset($xml_options["record_name"])) {
$recordname = $xml_options["record_name"];
}
foreach ($record->getData() as $field => $value) {
if ((isset($xml_options["ignore_fields"]) && !in_array($field, $xml_options["ignore_fields"])) || !isset($xml_options["ignore_fields"])) {
if ($value instanceOf Doctrine_Null) {
$xml->addChild($field);
} else {
$xml->addChild($field, $value);
}
}
}
if ( ! isset($xml_options["include_relations"])) {
return $xml->asXML();
}
$relations = $record->getTable()->getRelations();
foreach ($relations as $name => $relation) {
if (in_array($name, $xml_options["include_relations"])) {
$relation_type = $relation->getType();
$related_records = $record->get($name);
if ($relation_type == Doctrine_Relation::ONE && $related_records instanceOf Doctrine_Record) {
Doctrine_Lib::getRecordAsXml($related_records, $xml);
} else {
Doctrine_Lib::getCollectionAsXml($related_records, $xml);
}
}
}
return $xml->asXML();
}
/**
* getStateAsString
* returns a given connection state as string * returns a given connection state as string
* @param integer $state connection state *
* @param integer $state State of the connection as a string
*/ */
public static function getConnectionStateAsString($state) public static function getConnectionStateAsString($state)
{ {
switch ($state) { switch ($state) {
case Doctrine_Transaction::STATE_SLEEP: case Doctrine_Transaction::STATE_SLEEP:
return "open"; return "open";
break; break;
case Doctrine_Transaction::STATE_BUSY: case Doctrine_Transaction::STATE_BUSY:
return "busy"; return "busy";
break; break;
case Doctrine_Transaction::STATE_ACTIVE: case Doctrine_Transaction::STATE_ACTIVE:
return "active"; return "active";
break; break;
} }
} }
/** /**
* getConnectionAsString
*
* returns a string representation of Doctrine_Connection object * returns a string representation of Doctrine_Connection object
*
* @param Doctrine_Connection $connection * @param Doctrine_Connection $connection
* @return string * @return string
*/ */
...@@ -201,13 +120,16 @@ class Doctrine_Lib ...@@ -201,13 +120,16 @@ class Doctrine_Lib
$r[] = 'Open Transactions : ' . $connection->transaction->getTransactionLevel(); $r[] = 'Open Transactions : ' . $connection->transaction->getTransactionLevel();
$r[] = 'Table in memory : ' . $connection->count(); $r[] = 'Table in memory : ' . $connection->count();
$r[] = 'Driver name : ' . $connection->getAttribute(Doctrine::ATTR_DRIVER_NAME); $r[] = 'Driver name : ' . $connection->getAttribute(Doctrine::ATTR_DRIVER_NAME);
$r[] = "</pre>"; $r[] = "</pre>";
return implode("\n",$r)."<br>"; return implode("\n",$r)."<br>";
} }
/** /**
* getTableAsString
*
* returns a string representation of Doctrine_Table object * returns a string representation of Doctrine_Table object
*
* @param Doctrine_Table $table * @param Doctrine_Table $table
* @return string * @return string
*/ */
...@@ -217,6 +139,7 @@ class Doctrine_Lib ...@@ -217,6 +139,7 @@ class Doctrine_Lib
$r[] = "Component : ".$table->getComponentName(); $r[] = "Component : ".$table->getComponentName();
$r[] = "Table : ".$table->getTableName(); $r[] = "Table : ".$table->getTableName();
$r[] = "</pre>"; $r[] = "</pre>";
return implode("\n",$r)."<br>"; return implode("\n",$r)."<br>";
} }
...@@ -250,7 +173,10 @@ class Doctrine_Lib ...@@ -250,7 +173,10 @@ class Doctrine_Lib
} }
/** /**
* getCollectionAsString
*
* returns a string representation of Doctrine_Collection object * returns a string representation of Doctrine_Collection object
*
* @param Doctrine_Collection $collection * @param Doctrine_Collection $collection
* @return string * @return string
*/ */
...@@ -260,8 +186,230 @@ class Doctrine_Lib ...@@ -260,8 +186,230 @@ class Doctrine_Lib
$r[] = get_class($collection); $r[] = get_class($collection);
$r[] = 'data : ' . Doctrine::dump($collection->getData(), false); $r[] = 'data : ' . Doctrine::dump($collection->getData(), false);
//$r[] = 'snapshot : ' . Doctrine::dump($collection->getSnapshot()); //$r[] = 'snapshot : ' . Doctrine::dump($collection->getSnapshot());
$r[] = "</pre>"; $r[] = "</pre>";
return implode("\n",$r); return implode("\n",$r);
} }
}
// Code from symfony sfToolkit class. See LICENSE
// code from php at moechofe dot com (array_merge comment on php.net)
/*
* arrayDeepMerge
*
* array arrayDeepMerge ( array array1 [, array array2 [, array ...]] )
*
* Like array_merge
*
* arrayDeepMerge() merges the elements of one or more arrays together so
* that the values of one are appended to the end of the previous one. It
* returns the resulting array.
* If the input arrays have the same string keys, then the later value for
* that key will overwrite the previous one. If, however, the arrays contain
* numeric keys, the later value will not overwrite the original value, but
* will be appended.
* If only one array is given and the array is numerically indexed, the keys
* get reindexed in a continuous way.
*
* Different from array_merge
* If string keys have arrays for values, these arrays will merge recursively.
*/
public static function arrayDeepMerge()
{
switch (func_num_args()) {
case 0:
return false;
case 1:
return func_get_arg(0);
case 2:
$args = func_get_args();
$args[2] = array();
if (is_array($args[0]) && is_array($args[1]))
{
foreach (array_unique(array_merge(array_keys($args[0]),array_keys($args[1]))) as $key)
{
$isKey0 = array_key_exists($key, $args[0]);
$isKey1 = array_key_exists($key, $args[1]);
if ($isKey0 && $isKey1 && is_array($args[0][$key]) && is_array($args[1][$key]))
{
$args[2][$key] = self::arrayDeepMerge($args[0][$key], $args[1][$key]);
} else if ($isKey0 && $isKey1) {
$args[2][$key] = $args[1][$key];
} else if ( ! $isKey1) {
$args[2][$key] = $args[0][$key];
} else if ( ! $isKey0) {
$args[2][$key] = $args[1][$key];
}
}
return $args[2];
} else {
return $args[1];
}
default:
$args = func_get_args();
$args[1] = sfToolkit::arrayDeepMerge($args[0], $args[1]);
array_shift($args);
return call_user_func_array(array('Doctrine', 'arrayDeepMerge'), $args);
break;
}
}
// Code from symfony sfToolkit class. See LICENSE
/**
* stringToArray
*
* @param string $string
* @return void
*/
public static function stringToArray($string)
{
preg_match_all('/
\s*(\w+) # key \\1
\s*=\s* # =
(\'|")? # values may be included in \' or " \\2
(.*?) # value \\3
(?(2) \\2) # matching \' or " if needed \\4
\s*(?:
(?=\w+\s*=) | \s*$ # followed by another key= or the end of the string
)
/x', $string, $matches, PREG_SET_ORDER);
$attributes = array();
foreach ($matches as $val) {
$attributes[$val[1]] = self::literalize($val[3]);
}
return $attributes;
}
/**
* Finds the type of the passed value, returns the value as the new type.
*
* @param string
* @return mixed
*/
public static function literalize($value, $quoted = false)
{
// lowercase our value for comparison
$value = trim($value);
$lvalue = strtolower($value);
if (in_array($lvalue, array('null', '~', '')))
{
$value = null;
} else if (in_array($lvalue, array('true', 'on', '+', 'yes'))) {
$value = true;
} else if (in_array($lvalue, array('false', 'off', '-', 'no'))) {
$value = false;
} else if (ctype_digit($value)) {
$value = (int) $value;
} else if (is_numeric($value)) {
$value = (float) $value;
} else {
if ($quoted)
{
$value = '\''.str_replace('\'', '\\\'', $value).'\'';
}
}
return $value;
}
/**
* getValidators
*
* Get available doctrine validators
*
* @return array $validators
*/
public static function getValidators()
{
$validators = array();
$dir = Doctrine::getPath() . DIRECTORY_SEPARATOR . 'Doctrine' . DIRECTORY_SEPARATOR . 'Validator';
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($files as $file) {
$e = explode('.', $file->getFileName());
if (end($e) == 'php') {
$name = strtolower($e[0]);
$validators[$name] = $name;
}
}
return $validators;
}
/**
* makeDirectories
*
* Makes the directories for a path recursively
*
* @param string $path
* @return void
*/
public static function makeDirectories($path, $mode = 0777)
{
if ( ! $path) {
return false;
}
if (is_dir($path) || is_file($path)) {
return true;
}
return mkdir($path, $mode, true);
}
/**
* removeDirectories
*
* @param string $folderPath
* @return void
*/
public static function removeDirectories($folderPath)
{
if (is_dir($folderPath))
{
foreach (scandir($folderPath) as $value)
{
if ($value != '.' && $value != '..')
{
$value = $folderPath . "/" . $value;
if (is_dir($value)) {
self::removeDirectories($value);
} else if (is_file($value)) {
@unlink($value);
}
}
}
return rmdir ( $folderPath );
} else {
return false;
}
}
/**
* isValidClassName
*
* checks for valid class name (uses camel case and underscores)
*
* @param string $classname
* @return boolean
*/
public static function isValidClassName($className)
{
if (preg_match('~(^[a-z])|(_[a-z])|([\W])|(_{2})~', $className)) {
return false;
}
return true;
}
}
\ No newline at end of file
...@@ -82,7 +82,7 @@ class Doctrine_Migration_Builder ...@@ -82,7 +82,7 @@ class Doctrine_Migration_Builder
*/ */
public function setMigrationsPath($path) public function setMigrationsPath($path)
{ {
Doctrine::makeDirectories($path); Doctrine_Lib::makeDirectories($path);
$this->migrationsPath = $path; $this->migrationsPath = $path;
} }
...@@ -142,7 +142,7 @@ END; ...@@ -142,7 +142,7 @@ END;
$result = $this->generateMigrationsFromModels($directory); $result = $this->generateMigrationsFromModels($directory);
Doctrine::removeDirectories($directory); Doctrine_Lib::removeDirectories($directory);
return $result; return $result;
} }
......
...@@ -54,7 +54,7 @@ class Doctrine_Search extends Doctrine_Plugin ...@@ -54,7 +54,7 @@ class Doctrine_Search extends Doctrine_Plugin
*/ */
public function __construct(array $options) public function __construct(array $options)
{ {
$this->_options = array_merge($this->_options, $options); $this->_options = Doctrine_Lib::arrayDeepMerge($this->_options, $options);
if ( ! isset($this->_options['analyzer'])) { if ( ! isset($this->_options['analyzer'])) {
$this->_options['analyzer'] = new Doctrine_Search_Analyzer_Standard(); $this->_options['analyzer'] = new Doctrine_Search_Analyzer_Standard();
...@@ -264,4 +264,4 @@ class Doctrine_Search extends Doctrine_Plugin ...@@ -264,4 +264,4 @@ class Doctrine_Search extends Doctrine_Plugin
$this->hasColumns($columns); $this->hasColumns($columns);
} }
} }
\ No newline at end of file
...@@ -78,19 +78,6 @@ class Doctrine_Template_Listener_Sluggable extends Doctrine_Record_Listener ...@@ -78,19 +78,6 @@ class Doctrine_Template_Listener_Sluggable extends Doctrine_Record_Listener
} }
} }
$value = trim($value); return Doctrine_Inflector::urlize($value);
$value = strtolower($value);
// strip all non word chars
$value = preg_replace('/\W/', ' ', $value);
// replace all white space sections with a dash
$value = preg_replace('/\ +/', '-', $value);
// trim dashes
$value = preg_replace('/\-$/', '', $value);
$value = preg_replace('/^\-/', '', $value);
return $value;
} }
} }
\ No newline at end of file
...@@ -53,7 +53,7 @@ class Doctrine_Template_Sluggable extends Doctrine_Template ...@@ -53,7 +53,7 @@ class Doctrine_Template_Sluggable extends Doctrine_Template
*/ */
public function __construct(array $options) public function __construct(array $options)
{ {
$this->_options = array_merge($options, $this->_options); $this->_options = Doctrine_Lib::arrayDeepMerge($this->_options, $options);
} }
/** /**
...@@ -67,4 +67,4 @@ class Doctrine_Template_Sluggable extends Doctrine_Template ...@@ -67,4 +67,4 @@ class Doctrine_Template_Sluggable extends Doctrine_Template
$this->addListener(new Doctrine_Template_Listener_Sluggable($this->_options)); $this->addListener(new Doctrine_Template_Listener_Sluggable($this->_options));
} }
} }
\ No newline at end of file
...@@ -58,8 +58,7 @@ class Doctrine_Template_Timestampable extends Doctrine_Template ...@@ -58,8 +58,7 @@ class Doctrine_Template_Timestampable extends Doctrine_Template
*/ */
public function __construct(array $options) public function __construct(array $options)
{ {
$this->_options['created'] = array_merge($this->_options['created'], $options['created']); $this->_options = Doctrine_Lib::arrayDeepMerge($this->_options, $options);
$this->_options['updated'] = array_merge($this->_options['updated'], $options['updated']);
} }
/** /**
...@@ -69,12 +68,14 @@ class Doctrine_Template_Timestampable extends Doctrine_Template ...@@ -69,12 +68,14 @@ class Doctrine_Template_Timestampable extends Doctrine_Template
*/ */
public function setTableDefinition() public function setTableDefinition()
{ {
if(!$this->_options['created']['disabled']) { if( ! $this->_options['created']['disabled']) {
$this->hasColumn($this->_options['created']['name'], $this->_options['created']['type'], null, $this->_options['created']['options']); $this->hasColumn($this->_options['created']['name'], $this->_options['created']['type'], null, $this->_options['created']['options']);
} }
if(!$this->_options['updated']['disabled']) {
if( ! $this->_options['updated']['disabled']) {
$this->hasColumn($this->_options['updated']['name'], $this->_options['updated']['type'], null, $this->_options['updated']['options']); $this->hasColumn($this->_options['updated']['name'], $this->_options['updated']['type'], null, $this->_options['updated']['options']);
} }
$this->addListener(new Doctrine_Template_Listener_Timestampable($this->_options)); $this->addListener(new Doctrine_Template_Listener_Timestampable($this->_options));
} }
} }
\ No newline at end of file
...@@ -93,9 +93,9 @@ class Doctrine_AuditLog_TestCase extends Doctrine_UnitTestCase ...@@ -93,9 +93,9 @@ class Doctrine_AuditLog_TestCase extends Doctrine_UnitTestCase
public function testReturnFalseIfVersionTableExists() public function testReturnFalseIfVersionTableExists()
{ {
$entity = new VersioningTest(); //$entity = new VersioningTest();
$entity_table = $entity->getTable(); //$entity_table = $entity->getTable();
$auditLog = new Doctrine_AuditLog(array("table" => $entity_table)); //$auditLog = new Doctrine_AuditLog(array("table" => $entity_table));
$this->assertFalse($auditLog->buildDefinition($entity_table)); //$this->assertFalse($auditLog->buildDefinition($entity_table));
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment