2015-11-21 07:17:29 +01:00
|
|
|
<?php
|
|
|
|
|
2016-12-15 04:41:49 +01:00
|
|
|
namespace SilverStripe\Blog\Forms\GridField;
|
|
|
|
|
|
|
|
use UnexpectedValueException;
|
|
|
|
use SilverStripe\Control\Controller;
|
|
|
|
use SilverStripe\Core\Convert;
|
|
|
|
use SilverStripe\Forms\GridField\GridField;
|
|
|
|
use SilverStripe\Forms\GridField\GridField_ActionProvider;
|
|
|
|
use SilverStripe\Forms\GridField\GridField_FormAction;
|
|
|
|
use SilverStripe\Forms\GridField\GridField_HTMLProvider;
|
|
|
|
use SilverStripe\Forms\TextField;
|
|
|
|
use SilverStripe\ORM\ArrayList;
|
|
|
|
use SilverStripe\Security\Security;
|
|
|
|
use SilverStripe\View\ArrayData;
|
|
|
|
use SilverStripe\View\Requirements;
|
|
|
|
|
2015-11-21 07:17:29 +01:00
|
|
|
class GridFieldAddByDBField implements GridField_ActionProvider, GridField_HTMLProvider
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* HTML Fragment to render the field.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $targetFragment;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Default field to create the DataObject by should be Title.
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $dataObjectField = 'Title';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a text field and add button which allows the user to directly create a new
|
|
|
|
* DataObject by just entering the title.
|
|
|
|
*
|
|
|
|
* @param string $targetFragment
|
|
|
|
* @param string $dataObjectField
|
|
|
|
*/
|
|
|
|
public function __construct($targetFragment = 'before', $dataObjectField = 'Title')
|
|
|
|
{
|
|
|
|
$this->targetFragment = $targetFragment;
|
|
|
|
$this->dataObjectField = (string) $dataObjectField;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Provide actions to this component.
|
|
|
|
*
|
|
|
|
* @param GridField $gridField
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getActions($gridField)
|
|
|
|
{
|
|
|
|
return array(
|
|
|
|
'add',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles the add action for the given DataObject.
|
|
|
|
*
|
|
|
|
* @param $gridField GridField
|
|
|
|
* @param $actionName string
|
|
|
|
* @param $arguments mixed
|
|
|
|
* @param $data array
|
|
|
|
*
|
|
|
|
* @return null|SS_HTTPResponse
|
|
|
|
*
|
|
|
|
* @throws UnexpectedValueException
|
|
|
|
*/
|
|
|
|
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
|
|
|
|
{
|
|
|
|
if ($actionName == 'add') {
|
|
|
|
$dbField = $this->getDataObjectField();
|
|
|
|
|
|
|
|
$objClass = $gridField->getModelClass();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var DataObject $obj
|
|
|
|
*/
|
|
|
|
$obj = new $objClass();
|
|
|
|
|
|
|
|
if ($obj->hasField($dbField)) {
|
|
|
|
$obj->setCastedField($dbField, $data['gridfieldaddbydbfield'][$obj->ClassName][$dbField]);
|
|
|
|
|
|
|
|
if ($obj->canCreate()) {
|
|
|
|
$id = $gridField->getList()->add($obj);
|
|
|
|
if (!$id) {
|
2017-01-13 03:33:53 +01:00
|
|
|
$gridField->setCustomValidationMessage(
|
2015-11-21 07:17:29 +01:00
|
|
|
_t(
|
2017-09-14 00:27:40 +02:00
|
|
|
__CLASS__ . '.AddFail',
|
2015-11-21 07:17:29 +01:00
|
|
|
'Unable to save {class} to the database.',
|
|
|
|
'Unable to add the DataObject.',
|
|
|
|
array(
|
|
|
|
'class' => get_class($obj),
|
|
|
|
)
|
2017-01-13 03:33:53 +01:00
|
|
|
)
|
2015-11-21 07:17:29 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return Security::permissionFailure(
|
|
|
|
Controller::curr(),
|
|
|
|
_t(
|
2017-09-14 00:27:40 +02:00
|
|
|
__CLASS__ . '.PermissionFail',
|
2015-11-21 07:17:29 +01:00
|
|
|
'You don\'t have permission to create a {class}.',
|
|
|
|
'Unable to add the DataObject.',
|
|
|
|
array(
|
|
|
|
'class' => get_class($obj)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
throw new UnexpectedValueException(
|
|
|
|
sprintf(
|
|
|
|
'Invalid field (%s) on %s.',
|
|
|
|
$dbField,
|
|
|
|
$obj->ClassName
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the database field for which we'll add the new data object.
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getDataObjectField()
|
|
|
|
{
|
|
|
|
return $this->dataObjectField;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the database field.
|
|
|
|
*
|
|
|
|
* @param $field string
|
|
|
|
*/
|
|
|
|
public function setDataObjectField($field)
|
|
|
|
{
|
|
|
|
$this->dataObjectField = (string) $field;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Renders the TextField and add button to the GridField.
|
|
|
|
*
|
|
|
|
* @param $gridField GridField
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getHTMLFragments($gridField)
|
|
|
|
{
|
2016-02-05 00:53:46 +01:00
|
|
|
Requirements::javascript(BLOGGER_DIR . '/js/gridfieldaddbydbfield.js');
|
|
|
|
|
2015-11-21 07:17:29 +01:00
|
|
|
/**
|
|
|
|
* @var DataList $dataList
|
|
|
|
*/
|
|
|
|
$dataList = $gridField->getList();
|
|
|
|
|
|
|
|
$dataClass = $dataList->dataClass();
|
|
|
|
|
|
|
|
$obj = singleton($dataClass);
|
|
|
|
|
|
|
|
if (!$obj->canCreate()) {
|
2017-01-13 03:33:53 +01:00
|
|
|
return '';
|
2015-11-21 07:17:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
$dbField = $this->getDataObjectField();
|
|
|
|
|
|
|
|
$textField = TextField::create(
|
|
|
|
sprintf(
|
|
|
|
"gridfieldaddbydbfield[%s][%s]",
|
|
|
|
$obj->ClassName,
|
|
|
|
Convert::raw2htmlatt($dbField)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
->setAttribute('placeholder', $obj->fieldLabel($dbField))
|
|
|
|
->addExtraClass('no-change-track');
|
|
|
|
|
|
|
|
$addAction = new GridField_FormAction(
|
|
|
|
$gridField,
|
|
|
|
'add',
|
2017-01-13 03:33:53 +01:00
|
|
|
_t(
|
2017-09-14 00:27:40 +02:00
|
|
|
__CLASS__ . '.Add',
|
2017-01-13 03:33:53 +01:00
|
|
|
'Add {name}',
|
|
|
|
'Add button text',
|
|
|
|
['name' => $obj->i18n_singular_name()]
|
2015-11-21 07:17:29 +01:00
|
|
|
),
|
|
|
|
'add',
|
|
|
|
'add'
|
|
|
|
);
|
|
|
|
$addAction->setAttribute('data-icon', 'add');
|
2017-01-13 03:33:53 +01:00
|
|
|
$addAction->addExtraClass('btn btn-primary');
|
2015-11-21 07:17:29 +01:00
|
|
|
|
|
|
|
$forTemplate = new ArrayData(array());
|
|
|
|
|
|
|
|
$forTemplate->Fields = new ArrayList();
|
|
|
|
$forTemplate->Fields->push($textField);
|
|
|
|
$forTemplate->Fields->push($addAction);
|
|
|
|
|
2017-01-26 09:28:42 +01:00
|
|
|
return array($this->targetFragment => $forTemplate->renderWith(self::class));
|
2015-11-21 07:17:29 +01:00
|
|
|
}
|
|
|
|
}
|