Ejemplo n.º 1
0
 /**
  * @covers GridField::setList
  * @covers GridField::getList
  */
 public function testSetAndGetList()
 {
     $list = Member::get();
     $arrayList = ArrayList::create(array(1, 2, 3));
     $obj = new GridField('testfield', 'testfield', $list);
     $this->assertEquals($list, $obj->getList());
     $obj->setList($arrayList);
     $this->assertEquals($arrayList, $obj->getList());
 }
 /**
  * Only delete record is supported.
  * Somehow this will not refresh the list, so we remove the item from the list as well
  */
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'deleterecord') {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item) {
             return;
         }
         if (!$item->canDelete()) {
             throw new ValidationException(_t('GridFieldAction_Delete.DeletePermissionsFailure', "No delete permissions"), 0);
         }
         $item->delete();
         $gridField->getList()->remove($item);
     }
 }
 /**
  * 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) {
                     $gridField->setError(_t('GridFieldAddByDBField.AddFail', 'Unable to save {class} to the database.', 'Unable to add the DataObject.', array('class' => get_class($obj))), 'error');
                 }
             } else {
                 return Security::permissionFailure(Controller::curr(), _t('GridFieldAddByDBField.PermissionFail', '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;
 }
 public function handleAction(\GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName != $this->urlSegment) {
         return;
     }
     $record = $gridField->Form && $gridField->Form->Record ? $gridField->Form->Record : null;
     if (!$record || !$record->SiteTreeID) {
         throw new \ValidationException(_t('Link.NO_CURRENT_PAGE', 'No current page to draw from'), 0);
     }
     $root = \SiteTree::get()->filter('ParentID', $record->SiteTreeID);
     if (!$root->exists()) {
         throw new \ValidationException(_t('Link.NO_PAGES', 'No pages available'), 0);
     }
     $item = singleton($gridField->getModelClass());
     if (!$item->canCreate()) {
         throw new \ValidationException(_t('Link.CANNOT_CREATE', 'You cannot create a Link'), 0);
     }
     foreach ($root as $page) {
         $link = $item->create();
         $link->Type = 'SiteTree';
         $link->SiteTreeID = $page->ID;
         $link->write();
         $gridField->getList()->add($link);
     }
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'publishsummitevent') {
         $summit_event = $gridField->getList()->byID($arguments['RecordID']);
         $former_state = $summit_event->isPublished();
         $msg = 'Summit Event Published!';
         $code = 200;
         try {
             if ($former_state) {
                 $summit_event->unPublish();
             } else {
                 $summit_event->publish();
             }
             $summit_event->write();
             if ($former_state) {
                 $msg = 'Summit Event Unpublished!';
             }
         } catch (Exception $ex) {
             //SS_Log::log($ex->getMessage(). SS_Log::ERR);
             //throw new ValidationException($ex->getMessage(),0);
             //return sprintf('<div>%s</div>', $ex->getMessage());
             //Controller::curr()->getResponse()->setStatusCode($code,  $ex->getMessage());
             //Controller::curr()->getResponse()->setBody(sprintf('<div>%s</div>', $ex->getMessage()));
             throw new ValidationException($ex->getMessage(), 0);
         }
         Controller::curr()->getResponse()->setStatusCode($code, $msg);
     }
 }
 public function handleSave(GridField $grid, DataObjectInterface $record)
 {
     $list = $grid->getList();
     $value = $grid->Value();
     if (!isset($value[__CLASS__]) || !is_array($value[__CLASS__])) {
         // throw error ?
         return;
     }
     $updatedList = ArrayList::create();
     foreach ($value[__CLASS__] as $id => $v) {
         if (!is_numeric($id)) {
             continue;
         }
         $updatedList->push($id);
     }
     $list->exclude(['ID' => $updatedList->toArray()])->removeAll();
     foreach ($updatedList->toArray() as $i => $id) {
         // if list already contains item, leave it there
         if ($list->byID($id)) {
             continue;
         }
         $gridfieldItem = DataObject::get_by_id($list->dataClass, $id);
         if (!$gridfieldItem || !$gridfieldItem->canEdit()) {
             continue;
         }
         $list->add($gridfieldItem);
     }
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if (!$this->checkDataType($gridField->getList())) {
         return;
     }
     if ($actionName === 'filter') {
         $gridField->State->UserFormsGridField = array('filter' => isset($data['FieldNameFilter']) ? $data['FieldNameFilter'] : null, 'value' => isset($data['FieldValue']) ? $data['FieldValue'] : null, 'start' => isset($data['StartFilter']) ? $data['StartFilter'] : null, 'end' => isset($data['EndFilter']) ? $data['EndFilter'] : null);
     }
 }
 /**
  * Scaffold a bulk loader, if none is provided
  *
  * @param GridField $gridField
  * @return mixed
  */
 public function scaffoldLoader(GridField $gridField)
 {
     $gridlist = $gridField->getList();
     $class = $gridlist instanceof HasManyList ? "ListBulkLoader" : "BetterBulkLoader";
     //set the correct constructor argument
     $arg = $class === "ListBulkLoader" || is_subclass_of($class, "ListBulkLoader") ? $gridlist : $gridField->getModelClass();
     $loader = new $class($arg);
     $loader->setSource(new CsvBulkLoaderSource());
     return $loader;
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     $item = $gridField->getList()->byID($arguments['RecordID']);
     if (!$item) {
         return;
     }
     if ($actionName == 'message') {
         $admin = new PostmarkAdmin();
         return $admin->MessageForm(null, $item->ID)->forTemplate();
     } elseif ($actionName == 'postmessage') {
     }
 }
 /**
  * Generate export fields for CSV.
  *
  * @param GridField $gridField
  * @return array
  */
 public function generateExportFileData($gridField)
 {
     $separator = $this->csvSeparator;
     $singl = singleton($gridField->getModelClass());
     if ($singl->hasMethod('exportedFields')) {
         $fallbackColumns = $singl->exportedFields();
     } else {
         $fallbackColumns = $singl->summaryFields();
     }
     $csvColumns = $this->exportColumns ? $this->exportColumns : $fallbackColumns;
     $fileData = '';
     $columnData = array();
     $fieldItems = new ArrayList();
     if ($this->csvHasHeader) {
         $headers = array();
         // determine the CSV headers. If a field is callable (e.g. anonymous function) then use the
         // source name as the header instead
         foreach ($csvColumns as $columnSource => $columnHeader) {
             $headers[] = !is_string($columnHeader) && is_callable($columnHeader) ? utf8_decode($columnSource) : utf8_decode($columnHeader);
         }
         $fileData .= "\"" . implode("\"{$separator}\"", array_values($headers)) . "\"";
         $fileData .= "\n";
     }
     $items = $gridField->getList();
     foreach ($items as $item) {
         if (!$item->hasMethod('canView') || $item->canView()) {
             $columnData = array();
             foreach ($csvColumns as $columnSource => $columnHeader) {
                 if (!is_string($columnHeader) && is_callable($columnHeader)) {
                     if ($item->hasMethod($columnSource)) {
                         $relObj = $item->{$columnSource}();
                     } else {
                         $relObj = $item->relObject($columnSource);
                     }
                     $value = $columnHeader($relObj);
                 } else {
                     $value = $gridField->getDataFieldValue($item, $columnSource);
                     if (!$value) {
                         $value = $gridField->getDataFieldValue($item, $columnHeader);
                     }
                 }
                 $value = str_replace(array("\r", "\n"), "\n", $value);
                 $columnData[] = '"' . str_replace('"', '""', utf8_decode($value)) . '"';
             }
             $fileData .= implode($separator, $columnData);
             $fileData .= "\n";
         }
         if ($item->hasMethod('destroy')) {
             $item->destroy();
         }
     }
     return $fileData;
 }
 /**
  * Handle the actions and apply any changes to the GridField
  *
  * @param GridField $gridField
  * @param string $actionName
  * @param mixed $arguments
  * @param array $data - form data
  * @return void
  */
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'deleterecord' || $actionName == 'unlinkrelation') {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item) {
             return;
         }
         if ($actionName == 'deleterecord' && !$item->canDelete()) {
             throw new ValidationException(_t('GridFieldAction_Delete.DeletePermissionsFailure', "No delete permissions"), 0);
         }
         $delete = false;
         if ($item->Pages()->Count() <= 1) {
             $delete = true;
         }
         $gridField->getList()->remove($item);
         //remove the relation
         if ($delete) {
             $item->delete();
         }
         //delete the DMSDocument
     }
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'becomefoundationmember') {
         $member = $gridField->getList()->byID($arguments['RecordID']);
         $allowed = !$member->isFoundationMember();
         $msg = 'This user is already a Foundation Member!';
         if ($allowed) {
             $member->upgradeToFoundationMember();
             $msg = 'User is now a Foundation Member';
         }
         Controller::curr()->getResponse()->setStatusCode(200, $msg);
     }
 }
 public function handleAction(\GridField $gridField, $actionName, $arguments, $data)
 {
     $item = $gridField->getList()->byID($arguments['RecordID']);
     if (!$item) {
         return;
     }
     parent::handleAction($gridField, $actionName, $arguments, $data);
     $item->extend('onUnlinkFromGroup', $gridField);
     $group = $gridField->getForm()->getRecord();
     if ($group) {
         $group->updateGroupCache();
     }
 }
 /**
  * Returns a json array of a search results that can be used by for example Jquery.ui.autosuggestion
  *
  * @param GridField $gridField
  * @param SS_HTTPRequest $request 
  * @return sting in JSON fromat
  */
 public function doSearch($gridField, $request)
 {
     $dataClass = $gridField->getList()->dataClass();
     $allList = $this->searchList ? $this->searchList : DataList::create($dataClass);
     $searchFields = $this->getSearchFields() ? $this->getSearchFields() : $this->scaffoldSearchFields($dataClass);
     if (!$searchFields) {
         throw new LogicException(sprintf('GridFieldAddExistingAutocompleter: No searchable fields could be found for class "%s"', $dataClass));
     }
     // TODO Replace with DataList->filterAny() once it correctly supports OR connectives
     $stmts = array();
     foreach ($searchFields as $searchField) {
         $stmts[] .= sprintf('"%s" LIKE \'%s%%\'', $searchField, Convert::raw2sql($request->getVar('gridfield_relationsearch')));
     }
     $results = $allList->where(implode(' OR ', $stmts))->subtract($gridField->getList());
     $results = $results->sort($searchFields[0], 'ASC');
     $results = $results->limit($this->getResultsLimit());
     if (!empty($this->filters)) {
         $results = $results->addFilter($this->filters);
     }
     if (!empty($this->excludes)) {
         switch (count($this->excludes)) {
             case 1:
                 $key = key($this->excludes);
                 $results->exclude($key, $this->excludes[$key]);
                 break;
             case 2:
                 $results->exclude($this->excludes);
                 break;
             default:
                 throw new InvalidArgumentException('Incorrect number of arguments passed to filter()');
         }
     }
     $json = array();
     foreach ($results as $result) {
         $json[$result->ID] = SSViewer::fromString($this->resultsFormat)->process($result);
     }
     return Convert::array2json($json);
 }
Ejemplo n.º 15
0
	function handleAction(GridField $gridField, $actionName, $arguments, $data) {
		if(!$this->checkDataType($gridField->getList())) return;

		$state = $gridField->State->GridFieldFilterHeader;
		if($actionName === 'filter') {
			if(isset($data['filter'])){
				foreach($data['filter'] as $key => $filter ){
					$state->Columns->$key = $filter;
				}
			}
		} elseif($actionName === 'reset') {
			$state->Columns = null;
		}
	}
 /**
  * Called when a grid field is saved, converts the StatefulGridFieldList to a RelationList
  * @param {GridField} $field
  * @param {DataObjectInterface} $record
  */
 public function handleSave(GridField $grid, DataObjectInterface $record)
 {
     $list = $grid->getList();
     if ($list instanceof StatefulGridFieldList) {
         $relationName = $list->getRelationName();
         if ($record->has_many($relationName)) {
             $list->changeToList($record->getComponents($list->getRelationName()));
         } else {
             if ($record->many_many($relationName)) {
                 $list->changeToList($record->getManyManyComponents($list->getRelationName()));
             } else {
                 throw new InvalidArgumentException('Record does not have a has_many or many_many relationship called "' . $relationName . '"', null, null);
             }
         }
     }
 }
Ejemplo n.º 17
0
 public function handleForm(GridField $grid, $request)
 {
     $id = $request->param('ID');
     $list = $grid->getList();
     if (!ctype_digit($id)) {
         throw new SS_HTTPResponse_Exception(null, 400);
     }
     if (!($record = $list->byID($id))) {
         throw new SS_HTTPResponse_Exception(null, 404);
     }
     $form = $this->getForm($grid, $record);
     foreach ($form->Fields() as $field) {
         $field->setName($this->getFieldName($field->getName(), $grid, $record));
     }
     return $form;
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'copyrecord') {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item) {
             return;
         }
         if (!$item->canCreate()) {
             throw new ValidationException(_t('GridFieldAction_Copy.CreatePermissionsFailure', "No create permissions"), 0);
         }
         $clone = $item->duplicate();
         if (!$clone || $clone->ID < 1) {
             user_error("Error Duplicating!", E_USER_ERROR);
         }
     }
 }
 /**
  * Generate export fields for CSV.
  *
  * Replaces the definition in GridFieldExportButton, this is the same as original except
  * it sources the {@link List} from $gridField->getList() instead of $gridField->getManipulatedList()
  *
  * @param GridField $gridField
  * @return array
  */
 public function generateExportFileData($gridField)
 {
     $separator = $this->csvSeparator;
     $csvColumns = $this->exportColumns ? $this->exportColumns : singleton($gridField->getModelClass())->summaryFields();
     $fileData = '';
     $columnData = array();
     if ($this->csvHasHeader) {
         $headers = array();
         // determine the CSV headers. If a field is callable (e.g. anonymous function) then use the
         // source name as the header instead
         foreach ($csvColumns as $columnSource => $columnHeader) {
             $headers[] = !is_string($columnHeader) && is_callable($columnHeader) ? $columnSource : $columnHeader;
         }
         $fileData .= "\"" . implode("\"{$separator}\"", array_values($headers)) . "\"";
         $fileData .= "\n";
     }
     // The is the only variation from the parent, using getList() instead of getManipulatedList()
     $items = $gridField->getList();
     // @todo should GridFieldComponents change behaviour based on whether others are available in the config?
     foreach ($gridField->getConfig()->getComponents() as $component) {
         if ($component instanceof GridFieldFilterHeader || $component instanceof GridFieldSortableHeader) {
             $items = $component->getManipulatedData($gridField, $items);
         }
     }
     foreach ($items->limit(null) as $item) {
         $columnData = array();
         foreach ($csvColumns as $columnSource => $columnHeader) {
             if (!is_string($columnHeader) && is_callable($columnHeader)) {
                 if ($item->hasMethod($columnSource)) {
                     $relObj = $item->{$columnSource}();
                 } else {
                     $relObj = $item->relObject($columnSource);
                 }
                 $value = $columnHeader($relObj);
             } else {
                 $value = $gridField->getDataFieldValue($item, $columnSource);
             }
             $value = str_replace(array("\r", "\n"), "\n", $value);
             $columnData[] = '"' . str_replace('"', '\\"', $value) . '"';
         }
         $fileData .= implode($separator, $columnData);
         $fileData .= "\n";
         $item->destroy();
     }
     return $fileData;
 }
 /**
  * {@inheritDoc}
  */
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'publish' || ($actionName = 'unpublish')) {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item) {
             return;
         }
         if (!$item->canEdit()) {
             throw new ValidationException(_t('CatalogManager.PUBLISHPERMISSIONFAILURE', 'No permission to publish or unpublish item'));
         }
         if ($actionName == 'publish') {
             $item->doPublish();
         }
         if ($actionName == 'unpublish') {
             $item->doUnpublish();
         }
     }
 }
 /**
  * {@inheritDoc}
  */
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'publish' || ($actionName = 'unpublish')) {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item) {
             return;
         }
         if (!$item->canEdit()) {
             throw new ValidationException(_t('News.PublishPermissionFailure', 'No permission to publish or unpublish news item'));
         }
         if ($actionName == 'publish') {
             $item->doPublish();
         }
         if ($actionName == 'unpublish') {
             $item->doUnpublish();
         }
     }
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == GridFieldCloneReleaseAction::ACTION_NAME) {
         $release = $gridField->getList()->byID($arguments['RecordID']);
         $msg = 'Release Cloned Cloned !';
         $code = 200;
         try {
             $manager = Injector::inst()->get('SoftwareManager');
             $manager->cloneRelease($release);
         } catch (Exception $ex) {
             //SS_Log::log($ex->getMessage(). SS_Log::ERR);
             //throw new ValidationException($ex->getMessage(),0);
             //return sprintf('<div>%s</div>', $ex->getMessage());
             //Controller::curr()->getResponse()->setStatusCode($code,  $ex->getMessage());
             //Controller::curr()->getResponse()->setBody(sprintf('<div>%s</div>', $ex->getMessage()));
             throw new ValidationException($ex->getMessage(), 0);
         }
         Controller::curr()->getResponse()->setStatusCode($code, $msg);
     }
 }
 /**
  * Handle the actions and apply any changes to the GridField
  *
  * @param \GridField $gridField
  * @param string $actionName
  * @param mixed $arguments
  * @param array $data - form data
  * @return void
  * @throws \ValidationException when there was an error
  */
 public function handleAction(\GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'voidpayment') {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item instanceof \Payment) {
             return;
         }
         /** @var ServiceFactory $factory */
         $factory = ServiceFactory::create();
         $voidService = $factory->getService($item, ServiceFactory::INTENT_VOID);
         try {
             $serviceResponse = $voidService->initiate();
         } catch (Exception $ex) {
             throw new \ValidationException($ex->getMessage(), 0);
         }
         if ($serviceResponse->isError()) {
             throw new \ValidationException(_t('GridFieldVoidAction.VoidError', 'Unable to void payment. An error occurred.'), 0);
         }
     }
 }
 /**
  * Handle the actions and apply any changes to the GridField
  *
  * @param \GridField $gridField
  * @param string $actionName
  * @param mixed $arguments
  * @param array $data - form data
  * @return void
  * @throws \ValidationException when there was an error
  */
 public function handleAction(\GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'refundpayment') {
         $item = $gridField->getList()->byID($arguments['RecordID']);
         if (!$item instanceof \Payment) {
             return;
         }
         $serviceData = array_intersect_key($data, array('amount' => null));
         /** @var ServiceFactory $factory */
         $factory = ServiceFactory::create();
         $refundService = $factory->getService($item, ServiceFactory::INTENT_REFUND);
         try {
             $serviceResponse = $refundService->initiate($serviceData);
         } catch (Exception $ex) {
             throw new \ValidationException($ex->getMessage(), 0);
         }
         if ($serviceResponse->isError()) {
             throw new \ValidationException(_t('GridFieldRefundAction.RefundError', 'Unable to refund payment. An error occurred.'), 0);
         }
     }
 }
 /**
  * Handles the add action for the given DataObject
  *
  * @param $gridFIeld GridFIeld
  * @param $actionName string
  * @param $arguments mixed
  * @param $data array
  **/
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == "add") {
         $dbField = $this->getDataObjectField();
         $objClass = $gridField->getModelClass();
         $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) {
                     $gridField->setError(_t("GridFieldAddByDBField.AddFail", "Unable to save {class} to the database.", "Unable to add the DataObject.", array("class" => get_class($obj))), "error");
                 }
             } else {
                 return Security::permissionFailure(Controller::curr(), _t("GridFieldAddByDBField.PermissionFail", "You don't have permission to create a {class}.", "Unable to add the DataObject.", array("class" => get_class($obj))));
             }
         } else {
             throw new UnexpectedValueException("Invalid field (" . $dbField . ") on  " . $obj->ClassName . ".");
         }
     }
 }
 /**
  * Returns a json array of a search results that can be used by for example Jquery.ui.autosuggestion
  *
  * @param GridField $gridField
  * @param SS_HTTPRequest $request 
  */
 public function doSearch($gridField, $request)
 {
     $dataClass = $gridField->getList()->dataClass();
     $allList = DataList::create($dataClass);
     $filters = array();
     $stmts = array();
     $searchFields = $this->getSearchFields() ? $this->getSearchFields() : $this->scaffoldSearchFields($dataClass);
     if (!$searchFields) {
         throw new LogicException(sprintf('GridFieldAddExistingAutocompleter: No searchable fields could be found for class "%s"', $dataClass));
     }
     // TODO Replace with DataList->filterAny() once it correctly supports OR connectives
     foreach ($searchFields as $searchField) {
         $stmts[] .= 'LOWER(' . $searchField . ') LIKE \'%' . strtolower(Convert::raw2sql($request->getVar('gridfield_relationsearch'))) . '%\'';
     }
     $results = $allList->where(implode(' OR ', $stmts));
     $results = $results->sort($searchFields[0], 'ASC');
     $results = $results->limit($this->getResultsLimit());
     $json = array();
     foreach ($results as $result) {
         $json[$result->ID] = SSViewer::fromString($this->resultsFormat)->process($result);
     }
     return Convert::array2json($json);
 }
 public function handleAction(GridField $gridField, $actionName, $arguments, $data)
 {
     if ($actionName == 'activatemember') {
         $member = $gridField->getList()->byID($arguments['RecordID']);
         $former_state = $member->Active;
         $msg = 'Member Activated!';
         $code = 200;
         try {
             if ($former_state) {
                 $member->Active = 0;
             } else {
                 $member->Active = 1;
             }
             $member->write();
             if ($former_state) {
                 $msg = 'Member Deactivated!';
             }
         } catch (Exception $ex) {
             $code = 401;
             $msg = $ex->getMessage();
         }
         Controller::curr()->getResponse()->setStatusCode($code, $msg);
     }
 }
Ejemplo n.º 28
0
 public function doSave($data, $form)
 {
     $new_record = $this->record->ID == 0;
     $controller = $this->getToplevelController();
     $list = $this->gridField->getList();
     if ($list instanceof ManyManyList) {
         // Data is escaped in ManyManyList->add()
         $extraData = isset($data['ManyMany']) ? $data['ManyMany'] : null;
     } else {
         $extraData = null;
     }
     if (!$this->record->canEdit()) {
         return $controller->httpError(403);
     }
     if (isset($data['ClassName']) && $data['ClassName'] != $this->record->ClassName) {
         $newClassName = $data['ClassName'];
         // The records originally saved attribute was overwritten by $form->saveInto($record) before.
         // This is necessary for newClassInstance() to work as expected, and trigger change detection
         // on the ClassName attribute
         $this->record->setClassName($this->record->ClassName);
         // Replace $record with a new instance
         $this->record = $this->record->newClassInstance($newClassName);
     }
     try {
         $form->saveInto($this->record);
         $this->record->write();
         $list->add($this->record, $extraData);
     } catch (ValidationException $e) {
         $form->sessionMessage($e->getResult()->message(), 'bad', false);
         $responseNegotiator = new PjaxResponseNegotiator(array('CurrentForm' => function () use(&$form) {
             return $form->forTemplate();
         }, 'default' => function () use(&$controller) {
             return $controller->redirectBack();
         }));
         if ($controller->getRequest()->isAjax()) {
             $controller->getRequest()->addHeader('X-Pjax', 'CurrentForm');
         }
         return $responseNegotiator->respond($controller->getRequest());
     }
     // TODO Save this item into the given relationship
     $link = '<a href="' . $this->Link('edit') . '">"' . htmlspecialchars($this->record->Title, ENT_QUOTES) . '"</a>';
     $message = _t('GridFieldDetailForm.Saved', 'Saved {name} {link}', array('name' => $this->record->i18n_singular_name(), 'link' => $link));
     $form->sessionMessage($message, 'good', false);
     if ($new_record) {
         return $controller->redirect($this->Link());
     } elseif ($this->gridField->getList()->byId($this->record->ID)) {
         // Return new view, as we can't do a "virtual redirect" via the CMS Ajax
         // to the same URL (it assumes that its content is already current, and doesn't reload)
         return $this->edit($controller->getRequest());
     } else {
         // Changes to the record properties might've excluded the record from
         // a filtered list, so return back to the main view if it can't be found
         $noActionURL = $controller->removeAction($data['url']);
         $controller->getRequest()->addHeader('X-Pjax', 'Content');
         return $controller->redirect($noActionURL, 302);
     }
 }
 /**
  * Handles sorting across pages
  * @param GridField $gridField Grid Field Reference
  * @param Array $data Data submitted in the request
  */
 protected function sortToPage(GridField $gridField, $data)
 {
     if (!($paginator = $gridField->getConfig()->getComponentsByType('GridFieldPaginator')->First())) {
         user_error('Paginator not detected', E_USER_ERROR);
     }
     if (empty($data['ItemID'])) {
         user_error('No item to sort', E_USER_ERROR);
     }
     if (empty($data['Target'])) {
         user_error('No target page', E_USER_ERROR);
     }
     $className = $gridField->getModelClass();
     $owner = $gridField->Form->getRecord();
     $items = clone $gridField->getList();
     $many_many = $items instanceof ManyManyList;
     $sortColumn = $this->sortColumn;
     $targetItem = $items->byID(intval($data['ItemID']));
     if (!$targetItem) {
         user_error('Target item not found', E_USER_ERROR);
     }
     $currentPage = 1;
     $pageState = $gridField->State->GridFieldPaginator;
     if ($pageState->currentPage && $pageState->currentPage > 1) {
         $currentPage = $pageState->currentPage;
     }
     if ($many_many) {
         list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many($gridField->getName());
     }
     if ($data['Target'] == 'previouspage') {
         $items = $items->limit($paginator->getItemsPerPage() + 1, $paginator->getItemsPerPage() * ($currentPage - 1) - 1);
     } else {
         if ($data['Target'] == 'nextpage') {
             $items = $items->limit($paginator->getItemsPerPage() + 1, $paginator->getItemsPerPage() * ($currentPage - 1));
         } else {
             user_error('Not implemented: ' . $data['Target'], E_USER_ERROR);
         }
     }
     $sortPositions = $items->column($sortColumn);
     //Event to notify the Controller or owner DataObject before list sort
     if ($owner && $owner instanceof DataObject && method_exists($owner, 'onBeforeGridFieldPageSort')) {
         $owner->onBeforeGridFieldPageSort(clone $items);
     } else {
         if (Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onBeforeGridFieldPageSort')) {
             Controller::curr()->onBeforeGridFieldPageSort(clone $items);
         }
     }
     //Start transaction if supported
     if (DB::getConn()->supportsTransactions()) {
         DB::getConn()->transactionStart();
     }
     if ($data['Target'] == 'previouspage') {
         if ($many_many) {
             DB::query('UPDATE "' . $table . '" SET "' . $sortColumn . '" = ' . $sortPositions[0] . ' WHERE "' . $componentField . '" = ' . $targetItem->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
         } else {
             $targetItem->{$sortColumn} = $sortPositions[0];
             $targetItem->write();
         }
         $i = 1;
         foreach ($items as $obj) {
             if ($obj->ID == $targetItem->ID) {
                 continue;
             }
             if ($many_many) {
                 DB::query('UPDATE "' . $table . '" SET "' . $sortColumn . '" = ' . $sortPositions[$i] . ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
             } else {
                 $obj->{$sortColumn} = $sortPositions[$i];
                 $obj->write();
             }
             $i++;
         }
     } else {
         if ($many_many) {
             DB::query('UPDATE "' . $table . '" SET "' . $sortColumn . '" = ' . $sortPositions[count($sortPositions) - 1] . ' WHERE "' . $componentField . '" = ' . $targetItem->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
         } else {
             $targetItem->{$sortColumn} = $sortPositions[count($sortPositions) - 1];
             $targetItem->write();
         }
         $i = 0;
         foreach ($items as $obj) {
             if ($obj->ID == $targetItem->ID) {
                 continue;
             }
             if ($many_many) {
                 DB::query('UPDATE "' . $table . '" SET "' . $sortColumn . '" = ' . $sortPositions[$i] . ' WHERE "' . $componentField . '" = ' . $obj->ID . ' AND "' . $parentField . '" = ' . $owner->ID);
             } else {
                 $obj->{$sortColumn} = $sortPositions[$i];
                 $obj->write();
             }
             $i++;
         }
     }
     //End transaction if supported
     if (DB::getConn()->supportsTransactions()) {
         DB::getConn()->transactionEnd();
     }
     //Event to notify the Controller or owner DataObject after list sort
     if ($owner && $owner instanceof DataObject && method_exists($owner, 'onAfterGridFieldPageSort')) {
         $owner->onAfterGridFieldPageSort(clone $items);
     } else {
         if (Controller::has_curr() && Controller::curr() instanceof ModelAdmin && method_exists(Controller::curr(), 'onAfterGridFieldPageSort')) {
             Controller::curr()->onAfterGridFieldPageSort(clone $items);
         }
     }
 }
Ejemplo n.º 30
0
 /**
  *
  * @return type 
  */
 public function getList()
 {
     return $this->grid->getList();
 }