silverstripe-framework/forms/ScaffoldingComplexTableField.php
Ingo Schommer 9999f8edd8 BUGFIX Moving Requirements for TableField, TableListField, ComplexTableField, ScaffoldComplexTableField and HasManyComplexTableField from __construct() into FieldHolder() and renderWith(), which means inclusion closer to render time, and less side-effects by a previous Requirements::clear(), e.g. in a CTF popup
ENHANCEMENT Removed constructor overloading in ScaffoldingComplexTableField, was reconstrcuting its own Requirements (with lots of unnecessary jQuery plugins) which should really be done by the individual form fields and the parent popup class

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@74919 467b73ca-7a2a-4603-9d3b-597d59a354a9
2011-02-02 14:27:15 +13:00

94 lines
2.6 KiB
PHP

<?php
/**
* Used by ModelAdmin scaffolding, to manage many-many relationships.
*
* @package forms
* @subpackage fields-relational
*/
class ScaffoldingComplexTableField_Popup extends Form {
protected $sourceClass;
protected $dataObject;
public static $allowed_actions = array(
'filter', 'record', 'httpSubmission', 'handleAction', 'handleField'
);
function __construct($controller, $name, $fields, $validator, $readonly, $dataObject) {
$this->dataObject = $dataObject;
$actions = new FieldSet();
if(!$readonly) {
$actions->push(
$saveAction = new FormAction("saveComplexTableField", "Save")
);
$saveAction->addExtraClass('save');
}
$fields->push(new HiddenField("ComplexTableField_Path", Director::absoluteBaseURL()));
parent::__construct($controller, $name, $fields, $actions, $validator);
}
/**
* Handle a generic action passed in by the URL mapping.
*
* @param HTTPRequest $request
*/
public function handleAction($request) {
$action = str_replace("-","_",$request->param('Action'));
if(!$this->action) $this->action = 'index';
if($this->checkAccessAction($action)) {
if($this->hasMethod($action)) {
$result = $this->$action($request);
// Method returns an array, that is used to customise the object before rendering with a template
if(is_array($result)) {
return $this->getViewer($action)->process($this->customise($result));
// Method returns a string / object, in which case we just return that
} else {
return $result;
}
// There is no method, in which case we just render this object using a (possibly alternate) template
} else {
return $this->getViewer($action)->process($this);
}
} else {
return $this->httpError(403, "Action '$action' isn't allowed on class $this->class");
}
}
/**
* Action to render results for an autocomplete filter.
*
* @param HTTPRequest $request
* @return void
*/
function filter($request) {
//$model = singleton($this->modelClass);
$context = $this->dataObject->getDefaultSearchContext();
$value = $request->getVar('q');
$results = $context->getResults(array("Name"=>$value));
header("Content-Type: text/plain");
foreach($results as $result) {
echo $result->Name . "\n";
}
}
/**
* Action to populate edit box with a single data object via Ajax query
*/
function record($request) {
$type = $request->getVar('type');
$value = $request->getVar('value');
if ($type && $value) {
$record = DataObject::get_one($this->dataObject->class, "$type = '$value'");
header("Content-Type: text/plain");
echo json_encode(array("record"=>$record->toMap()));
}
}
}
?>