mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
95 lines
2.4 KiB
PHP
95 lines
2.4 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace SilverStripe\View;
|
||
|
|
||
|
use ReflectionObject;
|
||
|
|
||
|
/**
|
||
|
* Allows you to render debug information about a {@link ViewableData} object into a template.
|
||
|
*/
|
||
|
class ViewableData_Debugger extends ViewableData
|
||
|
{
|
||
|
|
||
|
/**
|
||
|
* @var ViewableData
|
||
|
*/
|
||
|
protected $object;
|
||
|
|
||
|
/**
|
||
|
* @param ViewableData $object
|
||
|
*/
|
||
|
public function __construct(ViewableData $object)
|
||
|
{
|
||
|
$this->object = $object;
|
||
|
parent::__construct();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return string The rendered debugger
|
||
|
*/
|
||
|
public function __toString()
|
||
|
{
|
||
|
return (string)$this->forTemplate();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return debugging information, as XHTML. If a field name is passed, it will show debugging information on that
|
||
|
* field, otherwise it will show information on all methods and fields.
|
||
|
*
|
||
|
* @param string $field the field name
|
||
|
* @return string
|
||
|
*/
|
||
|
public function forTemplate($field = null)
|
||
|
{
|
||
|
// debugging info for a specific field
|
||
|
if ($field) {
|
||
|
return "<b>Debugging Information for {$this->class}->{$field}</b><br/>" .
|
||
|
($this->object->hasMethod($field) ? "Has method '$field'<br/>" : null) .
|
||
|
($this->object->hasField($field) ? "Has field '$field'<br/>" : null);
|
||
|
}
|
||
|
|
||
|
// debugging information for the entire class
|
||
|
$reflector = new ReflectionObject($this->object);
|
||
|
$debug = "<b>Debugging Information: all methods available in '{$this->object->class}'</b><br/><ul>";
|
||
|
|
||
|
foreach ($this->object->allMethodNames() as $method) {
|
||
|
// check that the method is public
|
||
|
if ($method[0] === strtoupper($method[0]) && $method[0] != '_') {
|
||
|
if ($reflector->hasMethod($method) && $method = $reflector->getMethod($method)) {
|
||
|
if ($method->isPublic()) {
|
||
|
$debug .= "<li>\${$method->getName()}";
|
||
|
|
||
|
if (count($method->getParameters())) {
|
||
|
$debug .= ' <small>(' . implode(', ', $method->getParameters()) . ')</small>';
|
||
|
}
|
||
|
|
||
|
$debug .= '</li>';
|
||
|
}
|
||
|
} else {
|
||
|
$debug .= "<li>\$$method</li>";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$debug .= '</ul>';
|
||
|
|
||
|
if ($this->object->hasMethod('toMap')) {
|
||
|
$debug .= "<b>Debugging Information: all fields available in '{$this->object->class}'</b><br/><ul>";
|
||
|
|
||
|
foreach ($this->object->toMap() as $field => $value) {
|
||
|
$debug .= "<li>\$$field</li>";
|
||
|
}
|
||
|
|
||
|
$debug .= "</ul>";
|
||
|
}
|
||
|
|
||
|
// check for an extra attached data
|
||
|
if ($this->object->hasMethod('data') && $this->object->data() != $this->object) {
|
||
|
$debug .= ViewableData_Debugger::create($this->object->data())->forTemplate();
|
||
|
}
|
||
|
|
||
|
return $debug;
|
||
|
}
|
||
|
|
||
|
}
|