/** * Check object $field field value as $table column * and if database table does not have it - create. * $field is not set in object - error returns * * @param object $object Pointer to object to get field names data * @param string $table Database table name * @param string $field Object field name * @param string $type Database column name * * @return bool True if database table has field or field has been created */ public function createField($object, $table, $field, $type = 'INT') { // Check if db identifier field is configured if (class_exists($table)) { if (strlen($object->{$field})) { // Variable to get all social table attributes $attributes = array(); // Get table attributes - PHP 5.2 compatible eval('$attributes = ' . $table . '::$_attributes;'); // Remove namespaces $table = \samson\core\AutoLoader::getOnlyClass($table); // Make keys lowercase $attributes = array_change_key_case_unicode($attributes); // If table does not have defined identifier field if (!isset($attributes[strtolower($object->{$field})])) { // Add identifier field to social users table $this->simple_query('ALTER TABLE `' . $table . '` ADD `' . $object->{$field} . '` ' . $type . ' '); } return true; } else { // Signal error return e('Cannot load "' . get_class($object) . '" module - no $' . $field . ' is configured'); } } }
/** * Constructor * @param string $base_class Base class in relation * @param string $table_name Name/alias of table in relation * @param string $relation_class Classname that has to be created on joining * @param boolean $ignore Flag for not creating object instances for this class */ public function __construct($base_class, $table_name_simple, $relation_class = null, $ignore = false) { // If table name passed without namespace consider it as activerecord namespace $table_name = \samson\core\AutoLoader::className($table_name_simple, 'samson\\activerecord'); // If relation class not specified if (!isset($relation_class)) { // if there is no class exists for table name specified if (!class_exists($table_name, false)) { // PHP < 5.3 get relation aliases eval('$_relation_alias = ' . $base_class . '::$_relation_alias;'); // Try to find classname in relation aliases if (isset($_relation_alias[$table_name_simple])) { $relation_class = \samson\core\AutoLoader::className($_relation_alias[$table_name_simple], __NAMESPACE__); } else { if (isset($_relation_alias[$table_name])) { $relation_class = \samson\core\AutoLoader::className($_relation_alias[$table_name], __NAMESPACE__); } else { // use thi table name as class $relation_class = $table_name; } } } else { $relation_class = $table_name; } // Try to find closest parent class to dbRecord class $parent_class = get_parent_class($relation_class); if ($parent_class != \samson\core\AutoLoader::className('dbRecord', 'samson\\activerecord')) { $table_name = \samson\core\AutoLoader::getOnlyClass($parent_class); } } // Set defined class fields $this->base = $base_class; $this->relation = $relation_class; $this->table = \samson\core\AutoLoader::getOnlyClass($table_name); $this->ignore = $ignore; // TODO: fix this problem $this->table = str_replace('samson_activerecord_', '', $this->table); }
/** * Remove all USE statements and replace class shortcuts to full class names * * @param string $code Code to work with * @param array $classes Array of class names to replace * * @return bool|mixed|string */ private function removeUSEStatement($code, array $classes) { // Iterate found use statements foreach (array_unique($classes) as $full_class) { // Ignore trait uses if (trait_exists($full_class)) { continue; } // Get class shortcut $class_name = \samson\core\AutoLoader::getOnlyClass($full_class); // Check class existance if (!class_exists($full_class) && !interface_exists($full_class)) { //return e('Found USE statement for undeclared class ##', E_SAMSON_FATAL_ERROR, $full_class); continue; } // Replace class static call $code = preg_replace('/([^\\\\a-z])' . $class_name . '::/i', '$1' . $full_class . '::', $code); // Replace class implements calls $code = preg_replace('/\\s+implements(.*\\W)' . $class_name . '([^\\\\])/i', ' implements $1' . $full_class . '$2 ', $code); // Handle instanceof operator $code = preg_replace('/instanceof\\s+' . $class_name . '/i', 'instanceof ' . $full_class . '', $code); // Replace class extends calls $code = preg_replace('/extends\\s+' . $class_name . '/i', 'extends ' . $full_class . '', $code); // Replace multiple class extends calls $code = preg_replace('/\\s+extends(.*\\W),?\\s' . $class_name . '([^\\\\])/i', ' extends $1' . $full_class . '$2 ', $code); // Replace class hint calls $code = preg_replace('/(\\(|\\s|\\,)\\s*' . $class_name . '\\s*(&|$)/i', '$1' . $full_class . ' $2', $code); // Replace class creation call $code = preg_replace('/new\\s+' . $class_name . '\\s*\\(/i', 'new ' . $full_class . '(', $code); // Replace annotations $code = preg_replace('/([, (])' . $class_name . '\\s\\$/i', '$1 $2' . $full_class . ' $', $code); } return $code; }