11762 use doctrine for schema creation and update
[tine20] / tine20 / Tinebase / ModelConfiguration.php
index 6589560..f3adfc4 100644 (file)
@@ -5,7 +5,7 @@
  * @package     Tinebase
  * @subpackage  Configuration
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
- * @copyright   Copyright (c) 2013-2015 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2013-2016 Metaways Infosystems GmbH (http://www.metaways.de)
  * @author      Alexander Stintzing <a.stintzing@metaways.de>
  */
 
@@ -31,6 +31,20 @@ class Tinebase_ModelConfiguration {
      * @var string
      */
     protected $_idProperty = 'id';
+
+    /**
+     * table definition
+     *
+     * @var array
+     */
+    protected $_table = array();
+
+    /**
+     * model version
+     *
+     * @var integer
+     */
+    protected $_version = null;
     
     // legacy
     protected $_identifier;
@@ -284,11 +298,11 @@ class Tinebase_ModelConfiguration {
      * boolean                   Boolean             boolean  bool                          bool              Tinebase_Model_Filter_Bool
      * integer                   Integer             integer  integer                       int               Tinebase_Model_Filter_Int                 number
      * integer     bytes         Bytes               integer  integer                       int               Tinebase_Model_Filter_Int
-     * integer     usMoney       Dollar in Cent      integer  integer                       int               Tinebase_Model_Filter_Int
-     * integer     euMoney       Euro in Cent        integer  integer                       int               Tinebase_Model_Filter_Int
      * integer     seconds       Seconds             integer  integer                       int               Tinebase_Model_Filter_Int
      * integer     minutes       Minutes             integer  integer                       int               Tinebase_Model_Filter_Int
      * float                     Float               float    float                         float             Tinebase_Model_Filter_Int
+     * float       usMoney       Dollar in Cent      float    float                         int               Tinebase_Model_Filter_Int
+     * float       euMoney       Euro in Cent        float    float                         int               Tinebase_Model_Filter_Int
      * json                      Json String         text     string                        array             Tinebase_Model_Filter_Text
      * container                 Container           string   Tine.Tinebase.Model.Container Tinebase_Model_Container                                    tine.widget.container.filtermodel
      * tag tinebase.tag
@@ -304,7 +318,7 @@ class Tinebase_ModelConfiguration {
      * the key will be used for the classname of a singleton (callable by getInstance),
      * the value will be used as method name.
      * 
-     * * record/foreign (legacy) 1:1 - Relation      text     Tine.<APP>.Model.<MODEL>      Tinebase_Record_Abstract  Tinebase_Model_Filter_ForeignId   Tine.widgets.grid.ForeignRecordFilter
+     * * record                  1:1 - Relation      text     Tine.<APP>.Model.<MODEL>      Tinebase_Record_Abstract  Tinebase_Model_Filter_ForeignId   Tine.widgets.grid.ForeignRecordFilter
      * * records                 1:n - Relation      -        Array of Record.data Objects  Tinebase_Record_RecordSet -                                 -
      * * relation                m:m - Relation      -        Tinebase.Model.Relation       Tinebase_Model_Relation   Tinebase_Model_Filter_Relation
      * * keyfield                String              string   <as defined>                  string            Tinebase_Model_Filter_Text
@@ -694,13 +708,16 @@ class Tinebase_ModelConfiguration {
         $this->_modelName   = $modelClassConfiguration['modelName'];
         $this->_idProperty  = $this->_identifier = (isset($modelClassConfiguration['idProperty']) || array_key_exists('idProperty', $modelClassConfiguration)) ? $modelClassConfiguration['idProperty'] : 'id';
 
+        $this->_table = isset($modelClassConfiguration['table']) ? $modelClassConfiguration['table'] : $this->_table;
+        $this->_version = isset($modelClassConfiguration['version']) ? $modelClassConfiguration['version'] : $this->_version;
+
         // some cruid validating
         foreach ($modelClassConfiguration as $propertyName => $propertyValue) {
             $this->{'_' . $propertyName} = $propertyValue;
         }
         
         $this->_filters = array();
-        $this->_fields[$this->_idProperty] = array('label' => NULL, 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true));
+        $this->_fields[$this->_idProperty] = array('id' => true, 'label' => NULL, 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'length' => 40);
 
         if ($this->_hasCustomFields) {
             $this->_fields['customfields'] = array('label' => NULL, 'type' => 'custom', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => NULL));
@@ -712,6 +729,8 @@ class Tinebase_ModelConfiguration {
 
         if ($this->_containerProperty) {
             $this->_fields[$this->_containerProperty] = array(
+                'nullable'         => true,
+                'unsigned'         => true,
                 'label'            => $this->_containerUsesFilter ? $this->_containerName : NULL,
                 'shy'              => true,
                 'type'             => 'container',
@@ -755,16 +774,16 @@ class Tinebase_ModelConfiguration {
         if ($this->_modlogActive) {
             // notes are needed if modlog is active
             $this->_fields['notes']              = array('label' => NULL,                 'type' => 'note',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => NULL), 'useGlobalTranslation' => TRUE);
-            $this->_fields['created_by']         = array('label' => 'Created By',         'type' => 'user',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE);
-            $this->_fields['creation_time']      = array('label' => 'Creation Time',      'type' => 'datetime', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE);
-            $this->_fields['last_modified_by']   = array('label' => 'Last Modified By',   'type' => 'user',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE);
-            $this->_fields['last_modified_time'] = array('label' => 'Last Modified Time', 'type' => 'datetime', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE);
-            $this->_fields['seq']                = array('label' => NULL,                 'type' => 'integer',  'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE);
+            $this->_fields['created_by']         = array('label' => 'Created By',         'type' => 'user',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE, 'length' => 40, 'nullable' => true);
+            $this->_fields['creation_time']      = array('label' => 'Creation Time',      'type' => 'datetime', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE, 'nullable' => true);
+            $this->_fields['last_modified_by']   = array('label' => 'Last Modified By',   'type' => 'user',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE, 'length' => 40, 'nullable' => true);
+            $this->_fields['last_modified_time'] = array('label' => 'Last Modified Time', 'type' => 'datetime', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE, 'nullable' => true);
+            $this->_fields['seq']                = array('label' => NULL,                 'type' => 'integer',  'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'shy' => true, 'useGlobalTranslation' => TRUE, 'default' => 0, 'unsigned' => true);
             
             // don't show deleted information
-            $this->_fields['deleted_by']         = array('label' => NULL, 'type' => 'user',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'useGlobalTranslation' => TRUE);
-            $this->_fields['deleted_time']       = array('label' => NULL, 'type' => 'datetime', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'useGlobalTranslation' => TRUE);
-            $this->_fields['is_deleted']         = array('label' => NULL, 'type' => 'boolean',  'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'useGlobalTranslation' => TRUE);
+            $this->_fields['deleted_by']         = array('label' => NULL, 'type' => 'user',     'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'useGlobalTranslation' => TRUE, 'length' => 40, 'nullable' => true);
+            $this->_fields['deleted_time']       = array('label' => NULL, 'type' => 'datetime', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'useGlobalTranslation' => TRUE, 'nullable' => true);
+            $this->_fields['is_deleted']         = array('label' => NULL, 'type' => 'boolean',  'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true), 'useGlobalTranslation' => TRUE, 'default' => false);
 
         } elseif ($this->_hasNotes) {
             $this->_fields['notes'] = array('label' => NULL, 'type' => 'note', 'validators' => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => NULL));
@@ -774,6 +793,8 @@ class Tinebase_ModelConfiguration {
         $queryFilters = array();
         
         foreach ($this->_fields as $fieldKey => &$fieldDef) {
+            $fieldDef['fieldName'] = $fieldKey;
+
             // set default type to string, if no type is given
             if (! (isset($fieldDef['type']) || array_key_exists('type', $fieldDef))) {
                 $fieldDef['type'] = 'string';
@@ -793,6 +814,10 @@ class Tinebase_ModelConfiguration {
                 $this->_useGroups = TRUE;
             }
 
+            if ($fieldDef['type'] == 'keyfield') {
+                $fieldDef['length'] = 40;
+            }
+
             if ($fieldDef['type'] == 'virtual') {
                 $fieldDef = isset($fieldDef['config']) ? $fieldDef['config'] : array();
                 $fieldDef['key'] = $fieldKey;
@@ -804,7 +829,8 @@ class Tinebase_ModelConfiguration {
                 $this->_virtualFields[] = $fieldDef;
                 continue;
             }
-            
+
+
             // set default value
             // TODO: implement complex default values
             if ((isset($fieldDef['default']))) {
@@ -938,6 +964,31 @@ class Tinebase_ModelConfiguration {
         $this->_filterModel['query'] = $queryFilterData;
     }
 
+    public function getIdProperty()
+    {
+        return $this->_idProperty;
+    }
+
+    public function getTable()
+    {
+        return $this->_table;
+    }
+
+    public function getVersion()
+    {
+        return $this->_version;
+    }
+
+    public function getApplName()
+    {
+        return $this->_appName;
+    }
+
+    public function getModelName()
+    {
+        return $this->_modelName;
+    }
+
     /**
      * populate model config properties
      * 
@@ -974,6 +1025,7 @@ class Tinebase_ModelConfiguration {
             case 'user':
                 $fieldDef['config'] = array(
                     'refIdField'              => 'id',
+                    'length'                  => 40,
                     'appName'                 => 'Addressbook',
                     'modelName'               => 'Contact',
                     'recordClassName'         => 'Addressbook_Model_Contact',
@@ -993,6 +1045,7 @@ class Tinebase_ModelConfiguration {
                 $fieldDef['config']['controllerClassName'] = (isset($fieldDef['config']['controllerClassName']) || array_key_exists('controllerClassName', $fieldDef['config'])) ? $fieldDef['config']['controllerClassName'] : $this->_getPhpClassName($fieldDef['config'], 'Controller');
                 $fieldDef['config']['filterClassName']     = (isset($fieldDef['config']['filterClassName']) || array_key_exists('filterClassName', $fieldDef['config']))     ? $fieldDef['config']['filterClassName']     : $this->_getPhpClassName($fieldDef['config']) . 'Filter';
                 if ($fieldDef['type'] == 'record') {
+                    $fieldDef['config']['length'] = 40;
                     $this->_recordFields[$fieldKey] = $fieldDef;
                 } else {
                     $fieldDef['config']['dependentRecords'] = (isset($fieldDef['config']['dependentRecords']) || array_key_exists('dependentRecords', $fieldDef['config'])) ? $fieldDef['config']['dependentRecords'] : FALSE;