mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
Added simple model viewer at dev/viewmodel
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@67414 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
712e46652c
commit
c7c06951bd
@ -72,6 +72,10 @@ class DevelopmentAdmin extends Controller {
|
||||
return new ModuleManager();
|
||||
}
|
||||
|
||||
function viewmodel() {
|
||||
return new ModelViewer();
|
||||
}
|
||||
|
||||
function build() {
|
||||
$renderer = new DebugView();
|
||||
$renderer->writeHeader();
|
||||
|
135
dev/ModelViewer.php
Normal file
135
dev/ModelViewer.php
Normal file
@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Gives you a nice way of viewing your data model.
|
||||
* Access at dev/viewmodel
|
||||
*/
|
||||
class ModelViewer extends Controller {
|
||||
function init() {
|
||||
parent::init();
|
||||
if(!Permission::check("ADMIN")) Security::permissionFailure();
|
||||
}
|
||||
|
||||
/**
|
||||
* Model classes
|
||||
*/
|
||||
function Models() {
|
||||
$classes = ClassInfo::subclassesFor('DataObject');
|
||||
array_shift($classes);
|
||||
$output = new DataObjectSet();
|
||||
foreach($classes as $class) {
|
||||
$output->push(new ModelViewer_Model($class));
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Model classes, grouped by Module
|
||||
*/
|
||||
function Modules() {
|
||||
$classes = ClassInfo::subclassesFor('DataObject');
|
||||
array_shift($classes);
|
||||
|
||||
$modules = array();
|
||||
foreach($classes as $class) {
|
||||
$model = new ModelViewer_Model($class);
|
||||
if(!isset($modules[$model->Module])) $modules[$model->Module] = new DataObjectSet();
|
||||
$modules[$model->Module]->push($model);
|
||||
}
|
||||
ksort($modules);
|
||||
|
||||
if(isset($this->urlParams['Action']) && isset($modules[$this->urlParams['Action']])) {
|
||||
$module = $this->urlParams['Action'];
|
||||
$modules = array($module => $modules[$module]);
|
||||
}
|
||||
|
||||
$output = new DataObjectSet();
|
||||
foreach($modules as $moduleName => $models) {
|
||||
$output->push(new ArrayData(array(
|
||||
'Name' => $moduleName,
|
||||
'Models' => $models,
|
||||
)));
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a single model in the model viewer
|
||||
*/
|
||||
class ModelViewer_Model extends ViewableData {
|
||||
protected $className;
|
||||
|
||||
function __construct($className) {
|
||||
$this->className = $className;
|
||||
}
|
||||
|
||||
function getModule() {
|
||||
global $_CLASS_MANIFEST;
|
||||
$className = $this->className;
|
||||
if(($pos = strpos($className,'_')) !== false) $className = substr($className,0,$pos);
|
||||
if(isset($_CLASS_MANIFEST[$className])) {
|
||||
if(preg_match('/^'.str_replace('/','\/',preg_quote(BASE_PATH)).'\/([^\/]+)\//', $_CLASS_MANIFEST[$className], $matches)) {
|
||||
return $matches[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getName() {
|
||||
return $this->className;
|
||||
}
|
||||
|
||||
function getParentModel() {
|
||||
$parentClass = get_parent_class($this->className);
|
||||
if($parentClass != "DataObject") return $parentClass;
|
||||
}
|
||||
|
||||
function Fields() {
|
||||
$db = singleton($this->className)->db();
|
||||
$output = new DataObjectSet();
|
||||
$output->push(new ModelViewer_Field('ID', 'PrimaryKey'));
|
||||
$output->push(new ModelViewer_Field('Created', 'Datetime'));
|
||||
$output->push(new ModelViewer_Field('LastEdited', 'Datetime'));
|
||||
foreach($db as $k => $v) {
|
||||
$output->push(new ModelViewer_Field($k, $v));
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
function Relations() {
|
||||
$output = new DataObjectSet();
|
||||
|
||||
foreach(array('has_one','has_many','many_many') as $relType) {
|
||||
$items = singleton($this->className)->$relType();
|
||||
foreach($items as $k => $v) {
|
||||
$output->push(new ModelViewer_Relation($k, $v, $relType));
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
class ModelViewer_Field extends ViewableData {
|
||||
public $Name, $Type;
|
||||
|
||||
function __construct($name, $type) {
|
||||
$this->Name = $name;
|
||||
$this->Type = $type;
|
||||
}
|
||||
}
|
||||
|
||||
class ModelViewer_Relation extends ViewableData {
|
||||
public $Name, $RelationType, $RelatedClass;
|
||||
|
||||
function __construct($name, $relatedClass, $relationType) {
|
||||
$this->Name = $name;
|
||||
$this->RelatedClass = $relatedClass;
|
||||
$this->RelationType = $relationType;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
31
templates/ModelViewer.ss
Normal file
31
templates/ModelViewer.ss
Normal file
@ -0,0 +1,31 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Data Model</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Data Model for your project</h1>
|
||||
|
||||
<% control Modules %>
|
||||
<h1>Module $Name</h1>
|
||||
|
||||
<% control Models %>
|
||||
<h2>$Name <% if ParentModel %> (subclass of $ParentModel)<% end_if %></h2>
|
||||
<h4>Fields</h4>
|
||||
<ul>
|
||||
<% control Fields %>
|
||||
<li>$Name - $Type</li>
|
||||
<% end_control %>
|
||||
</ul>
|
||||
|
||||
<h4>Relations</h4>
|
||||
<ul>
|
||||
<% control Relations %>
|
||||
<li>$Name $RelationType $RelatedClass</li>
|
||||
<% end_control %>
|
||||
</ul>
|
||||
<% end_control %>
|
||||
<% end_control %>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
x
Reference in New Issue
Block a user