11762 use doctrine for schema creation and update
[tine20] / tine20 / Tinebase / Record / DoctrineMappingDriver.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @subpackage  Record
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @author      Cornelius Weiss <c.weiss@metaways.de>
10  */
11
12 use Doctrine\Common\Persistence\Mapping\ClassMetadata;
13 use Doctrine\Common\Persistence\Mapping\MappingException;
14
15 /**
16  * Tinebase_Record_DoctrineMappingDriver
17  *
18  * @package     Tinebase
19  * @subpackage  Record
20  */
21 class Tinebase_Record_DoctrineMappingDriver implements Doctrine\Common\Persistence\Mapping\Driver\MappingDriver
22 {
23     /**
24      * @var array modelConfigType => Doctrine2Type
25      */
26     protected static $_typeMap= array(
27         'string'    => 'string',
28         'text'      => 'text',
29         'datetime'  => 'datetime',
30         'date'      => 'datetime',
31         'time'      => 'datetime',
32         'integer'   => 'integer',
33         'json'      => 'text',
34         'container' => 'integer',
35         'record'    => 'string',
36         'keyfield'  => 'string',
37         'user'      => 'string',
38         'boolean'   => 'boolean',
39     );
40
41     /**
42      * Loads the metadata for the specified class into the provided container.
43      *
44      * @param string        $className
45      * @param ClassMetadata $metadata
46      *
47      * @return void
48      */
49     public function loadMetadataForClass($className, ClassMetadata $metadata)
50     {
51         if (! $this->isTransient($className)) {
52             throw new MappingException('Class ' . $className . 'has no appropriate ModelConfiguration');
53         }
54
55         $modelConfig = $className::getConfiguration();
56
57         $table = $modelConfig->getTable();
58         $table['name'] = SQL_TABLE_PREFIX . $table['name'];
59         $metadata->setPrimaryTable($table);
60         foreach ($modelConfig->getFields() as $fieldName => $config) {
61             self::mapTypes($config);
62
63             if (! $config['doctrineIgnore']) {
64                 $metadata->mapField($config);
65             }
66         }
67     }
68
69     /**
70      * map modelconfig type to doctrine type
71      *
72      * @param $config
73      */
74     public static function mapTypes(&$config)
75     {
76         $config['doctrineIgnore'] = true;
77         if (isset(self::$_typeMap[$config['type']])) {
78             $config['type'] = self::$_typeMap[$config['type']];
79             $config['doctrineIgnore'] = false;
80         }
81     }
82
83     /**
84      * Gets the names of all mapped classes known to this driver.
85      *
86      * @return array The names of all mapped classes known to this driver.
87      */
88     public function getAllClassNames()
89     {
90         // @TODO Walk all models, check for modelconfig with version OR
91         //       Walk all Controllers, ask for models and do the above
92         return array();
93     }
94
95     /**
96      * Returns whether the class with the specified name should have its metadata loaded.
97      * This is only the case if it is either mapped as an Entity or a MappedSuperclass.
98      *
99      * @param string $className
100      *
101      * @return boolean
102      */
103     public function isTransient($className)
104     {
105         $modelConfig = $className::getConfiguration();
106
107         return $modelConfig && is_int($modelConfig->getVersion());
108     }
109 }