2007-08-03 00:07:11 +02:00
|
|
|
<?php
|
2008-02-25 03:10:37 +01:00
|
|
|
/**
|
|
|
|
* Base class for widgets.
|
|
|
|
* Widgets let CMS authors drag and drop small pieces of functionality into defined areas of their websites.
|
|
|
|
* @package sapphire
|
|
|
|
* @subpackage widgets
|
|
|
|
*/
|
2007-08-03 00:07:11 +02:00
|
|
|
class Widget extends DataObject {
|
|
|
|
static $db = array(
|
|
|
|
"Sort" => "Int"
|
|
|
|
);
|
2008-11-04 03:21:09 +01:00
|
|
|
|
|
|
|
static $has_one = array(
|
|
|
|
"Parent" => "WidgetArea",
|
|
|
|
);
|
2007-08-03 00:07:11 +02:00
|
|
|
|
|
|
|
static $default_sort = "Sort";
|
|
|
|
|
|
|
|
static $title = "Widget Title";
|
|
|
|
static $cmsTitle = "Name of this widget";
|
|
|
|
static $description = "Description of what this widget does.";
|
|
|
|
|
|
|
|
function getCMSFields() {
|
|
|
|
return new FieldSet();
|
|
|
|
}
|
|
|
|
|
|
|
|
function WidgetHolder() {
|
|
|
|
return $this->renderWith("WidgetHolder");
|
|
|
|
}
|
|
|
|
|
|
|
|
function Content() {
|
|
|
|
return $this->renderWith($this->class);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Title() {
|
|
|
|
$instance = singleton($this->class);
|
|
|
|
return $instance->uninherited('title', true);
|
|
|
|
}
|
|
|
|
|
|
|
|
function CMSTitle() {
|
|
|
|
$instance = singleton($this->class);
|
|
|
|
return $instance->uninherited('cmsTitle', true);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Description() {
|
|
|
|
$instance = singleton($this->class);
|
|
|
|
return $instance->uninherited('description', true);
|
|
|
|
}
|
|
|
|
|
|
|
|
function DescriptionSegment() {
|
|
|
|
return $this->renderWith('WidgetDescription');
|
|
|
|
}
|
|
|
|
|
|
|
|
function EditableSegment() {
|
|
|
|
return $this->renderWith('WidgetEditor');
|
|
|
|
}
|
|
|
|
|
|
|
|
function CMSEditor() {
|
|
|
|
$output = '';
|
|
|
|
|
|
|
|
$fields = $this->getCMSFields();
|
|
|
|
foreach($fields as $field) {
|
|
|
|
$name = $field->Name();
|
|
|
|
$field->setValue($this->getField($name));
|
|
|
|
$renderedField = $field->FieldHolder();
|
|
|
|
$renderedField = ereg_replace("name=\"([A-Za-z0-9\-_]+)\"", "name=\"Widget[" . $this->ID . "][\\1]\"", $renderedField);
|
|
|
|
$renderedField = ereg_replace("id=\"([A-Za-z0-9\-_]+)\"", "id=\"Widget[" . $this->ID . "][\\1]\"", $renderedField);
|
|
|
|
$output .= $renderedField;
|
|
|
|
}
|
|
|
|
return $output;
|
|
|
|
}
|
|
|
|
|
|
|
|
function ClassName() {
|
|
|
|
return $this->class;
|
|
|
|
}
|
|
|
|
|
|
|
|
function Name() {
|
|
|
|
return "Widget[".$this->ID."]";
|
|
|
|
}
|
|
|
|
|
|
|
|
function populateFromPostData($data) {
|
|
|
|
foreach($data as $name => $value) {
|
|
|
|
if($name != "Type") {
|
|
|
|
$this->setField($name, $value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->write();
|
|
|
|
|
|
|
|
// The field must be written to ensure a unique ID.
|
|
|
|
$this->Name = $this->class.$this->ID;
|
|
|
|
$this->write();
|
|
|
|
}
|
2008-03-03 09:48:52 +01:00
|
|
|
|
|
|
|
function FormObjectLink($formName) {
|
|
|
|
if(is_numeric($this->ID)) {
|
|
|
|
return "WidgetFormProxy/index/$this->ID?executeForm=$formName";
|
|
|
|
} else {
|
|
|
|
user_error("Attempted to create a form on a widget that hasn't been saved to the database.", E_USER_WARNING);
|
|
|
|
}
|
|
|
|
}
|
2007-08-03 00:07:11 +02:00
|
|
|
}
|
|
|
|
|
2008-03-11 04:29:36 +01:00
|
|
|
class Widget_Controller extends Controller {
|
|
|
|
function editablesegment() {
|
|
|
|
$className = $this->urlParams['ID'];
|
|
|
|
if(class_exists($className) && is_subclass_of($className, 'Widget')) {
|
|
|
|
$obj = new $className();
|
|
|
|
return $obj->EditableSegment();
|
|
|
|
} else {
|
|
|
|
user_error("Bad widget class: $className", E_USER_WARNING);
|
|
|
|
return "Bad widget class name given";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-08-03 00:07:11 +02:00
|
|
|
?>
|