| 134 | | $modelNames = $this->loadModels(); |
|---|
| 135 | | |
|---|
| 136 | | $relations = array(); |
|---|
| 137 | | foreach($modelNames as $modelName) |
|---|
| 138 | | { |
|---|
| 139 | | $table = Doctrine::getTable($modelName); |
|---|
| 140 | | foreach ($table->getRelations() as $relation) |
|---|
| 141 | | { |
|---|
| 142 | | if ($relation->getType() === Doctrine_Relation::MANY && isset($relation['refTable'])) |
|---|
| 143 | | { |
|---|
| 144 | | $relations[] = $relation['refTable']->name; |
|---|
| 145 | | } |
|---|
| 146 | | } |
|---|
| 147 | | } |
|---|
| 148 | | |
|---|
| 149 | | $entites = array(); |
|---|
| 150 | | $assocs = array(); |
|---|
| 151 | | $lines = array(); |
|---|
| 152 | | $gens = array(); |
|---|
| 153 | | |
|---|
| 154 | | foreach($modelNames as $modelName) |
|---|
| 155 | | { |
|---|
| 156 | | $table = Doctrine::getTable($modelName); |
|---|
| 157 | | $entites[$modelName] = array(); |
|---|
| 158 | | $entites[$modelName] = $this->listColumns($table); |
|---|
| 159 | | if (count($entites[$modelName]) === 0) |
|---|
| 160 | | { |
|---|
| 161 | | unset($entites[$modelName]); |
|---|
| 162 | | $relations[] = $modelName; |
|---|
| 163 | | } |
|---|
| 164 | | } |
|---|
| 165 | | |
|---|
| 166 | | $relations = array_unique($relations); |
|---|
| 167 | | foreach($relations as $relation) |
|---|
| 168 | | { |
|---|
| 169 | | unset($modelNames[array_search($relation, $modelNames)]); |
|---|
| 170 | | } |
|---|
| 171 | | |
|---|
| 172 | | foreach($relations as $modelName) |
|---|
| 173 | | { |
|---|
| 174 | | $table = Doctrine::getTable($modelName); |
|---|
| 175 | | $assocs[$modelName] = array(); |
|---|
| 176 | | $assocs[$modelName] = $this->listColumns($table); |
|---|
| 177 | | } |
|---|
| 178 | | |
|---|
| 179 | | foreach($relations as $modelName) |
|---|
| 180 | | { |
|---|
| 181 | | $table = Doctrine::getTable($modelName); |
|---|
| 182 | | foreach ($table->getRelations() as $name => $relation) |
|---|
| 183 | | { |
|---|
| 184 | | if ($relation instanceof Doctrine_Relation_LocalKey) |
|---|
| 185 | | { |
|---|
| 186 | | $lines[] = array($modelName, $relation->getTable()->name, '0,n', $relation->getAlias()); |
|---|
| 187 | | } |
|---|
| 188 | | } |
|---|
| 189 | | } |
|---|
| 190 | | |
|---|
| 191 | | foreach($modelNames as $modelName) |
|---|
| 192 | | { |
|---|
| 193 | | $table = Doctrine::getTable($modelName); |
|---|
| 194 | | foreach ($table->getRelations() as $name => $relation) |
|---|
| 195 | | { |
|---|
| 196 | | if (!in_array($relation->getTable()->getTableName(), $relations)) |
|---|
| 197 | | { |
|---|
| 198 | | if ($relation instanceof Doctrine_Relation_LocalKey) |
|---|
| 199 | | { |
|---|
| 200 | | if ($relation->getTable()->hasRelation($modelName) |
|---|
| 201 | | && !$relation->getTable()->getRelation($modelName)->isOneToOne()) |
|---|
| 202 | | { |
|---|
| 203 | | $assocName = $modelName . $relation->getTable()->name; |
|---|
| 204 | | $lines[] = array($assocName, $relation->getTable()->name, '0,n', $relation->getAlias()); |
|---|
| 205 | | } |
|---|
| 206 | | } |
|---|
| 207 | | else if ($relation instanceof Doctrine_Relation_ForeignKey) |
|---|
| 208 | | { |
|---|
| 209 | | if ($relation->isOneToOne()) |
|---|
| 210 | | { |
|---|
| 211 | | $gens[] = array($modelName, $relation->getTable()->name); |
|---|
| 212 | | } |
|---|
| 213 | | else |
|---|
| 214 | | { |
|---|
| 215 | | $assocName = $relation->getTable()->name . $modelName; |
|---|
| 216 | | $lines[] = array($modelName, $relation->getTable()->name, '0,1', $relation->getAlias()); |
|---|
| 217 | | } |
|---|
| 218 | | } |
|---|
| 219 | | } |
|---|
| 220 | | } |
|---|
| 221 | | } |
|---|
| 222 | | |
|---|
| 223 | | foreach($lines as $line) |
|---|
| 224 | | { |
|---|
| 225 | | if (false === isset($assocs[$line[0]])) |
|---|
| 226 | | { |
|---|
| 227 | | $assocs[$line[0]] = array(); |
|---|
| 228 | | } |
|---|
| 229 | | } |
|---|
| 230 | | |
|---|
| 231 | | $digraph="graph G {edge [ len=2 labeldistance=2 ];overlap=false;splines=true;" . self::EOL; |
|---|
| 232 | | foreach($entites as $entite => $champs) |
|---|
| 233 | | { |
|---|
| 234 | | $digraph .= sprintf("node%s [label=\"{<table>%s|<cols>%s}\", shape=record];" . self::EOL, |
|---|
| 235 | | $entite, |
|---|
| 236 | | $entite, |
|---|
| 237 | | implode("\l", $champs)); |
|---|
| 238 | | } |
|---|
| 239 | | $digraph .= self::EOL; |
|---|
| 240 | | |
|---|
| 241 | | foreach($assocs as $assoc => $champs) |
|---|
| 242 | | { |
|---|
| 243 | | $digraph .= sprintf("node%s [label=\"{<table>%s|<cols>%s}\", shape=Mrecord];" . self::EOL, |
|---|
| 244 | | $assoc, |
|---|
| 245 | | $assoc, |
|---|
| 246 | | implode("\l", $champs)); |
|---|
| 247 | | } |
|---|
| 248 | | $digraph .= self::EOL; |
|---|
| 249 | | |
|---|
| 250 | | foreach($lines as $line) |
|---|
| 251 | | { |
|---|
| 252 | | if ($line[3] == $line[1]) |
|---|
| 253 | | { |
|---|
| 254 | | $line[3] = ''; |
|---|
| 255 | | } |
|---|
| 256 | | else |
|---|
| 257 | | { |
|---|
| 258 | | $line[3] = "(" . $line[3] . ")"; |
|---|
| 259 | | } |
|---|
| 260 | | |
|---|
| 261 | | $digraph .= vsprintf("node%s -- node%s [headlabel=\"%s\",label=\"%s\",labeldistance=3];" . self::EOL, $line); |
|---|
| 262 | | } |
|---|
| 263 | | $digraph .= self::EOL; |
|---|
| 264 | | |
|---|
| 265 | | foreach($gens as $gen) |
|---|
| 266 | | { |
|---|
| 267 | | $digraph .= sprintf("node%s -- node%s [arrowhead=normal];" . self::EOL, $gen[0], $gen[1]); |
|---|
| 268 | | } |
|---|
| 269 | | $digraph .= "}"; |
|---|
| 270 | | |
|---|
| 271 | | return $digraph; |
|---|
| | 102 | $mcdGenerator = new doctrineGraphvizMcdGenerator(); |
|---|
| | 103 | return $mcdGenerator->generate($this->loadModels())->getBuffer(); |
|---|
| 281 | | $moduleNames = $this->loadModels(); |
|---|
| 282 | | |
|---|
| 283 | | $digraph = "digraph G {edge [ len=2 labeldistance=2 ];overlap=false;splines=true;" . self::EOL; |
|---|
| 284 | | foreach($moduleNames as $moduleName) |
|---|
| 285 | | { |
|---|
| 286 | | $table = Doctrine::getTable($moduleName); |
|---|
| 287 | | $digraph .= sprintf("node%s [label=\"{<table>%s|<cols>", $table->name, $table->tableName); |
|---|
| 288 | | foreach ($table->getColumns() as $name => $column) |
|---|
| 289 | | { |
|---|
| 290 | | $digraph .= sprintf("%s (%s)%s\l", |
|---|
| 291 | | $name, |
|---|
| 292 | | $column['type'], |
|---|
| 293 | | (false === empty($column['primary']) ? ' [PK]' : '')); |
|---|
| 294 | | } |
|---|
| 295 | | $digraph .= "}\", shape=record];" . self::EOL; |
|---|
| 296 | | } |
|---|
| 297 | | |
|---|
| 298 | | $digraph .= self::EOL; |
|---|
| 299 | | |
|---|
| 300 | | $rel = array(); |
|---|
| 301 | | foreach($moduleNames as $moduleName) |
|---|
| 302 | | { |
|---|
| 303 | | $table = Doctrine::getTable($moduleName); |
|---|
| 304 | | foreach ($table->getRelations() as $name => $relation) |
|---|
| 305 | | { |
|---|
| 306 | | if ($relation instanceof Doctrine_Relation_LocalKey) |
|---|
| 307 | | { |
|---|
| 308 | | $rel[] = sprintf("node%s:cols -> node%s:table [label=\"%s=%s\"];", |
|---|
| 309 | | $table->name, |
|---|
| 310 | | $relation->getTable()->name, |
|---|
| 311 | | $relation->getLocal(), |
|---|
| 312 | | $relation->getForeign()); |
|---|
| 313 | | } |
|---|
| 314 | | } |
|---|
| 315 | | } |
|---|
| 316 | | $rel = array_unique($rel); |
|---|
| 317 | | |
|---|
| 318 | | return $digraph . implode(self::EOL, $rel) . self::EOL . "}"; |
|---|
| | 113 | $mldGenerator = new doctrineGraphvizMldGenerator(); |
|---|
| | 114 | return $mldGenerator->generate($this->loadModels())->getBuffer(); |
|---|