Esempio n. 1
0
 /**
  * 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');
         }
     }
 }
Esempio n. 2
0
 /**
  * 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);
 }
Esempio n. 3
0
 /**
  * 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;
 }