Source of file DataObjectPageController.php
Size: 18,805 Bytes - Last Modified: 2021-12-24T05:15:54+00:00
/var/www/docs.ssmods.com/process/src/src/View/DataObjectPageController.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 | <?php use HudhaifaS\DOM\Model\DiscoverableDataObject; use HudhaifaS\DOM\Model\SociableDataObject; use HudhaifaS\Forms\FrontendFileField; use HudhaifaS\Forms\FrontendImageField; use HudhaifaS\Forms\FrontendRichTextField; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\Convert; use SilverStripe\Forms\DateField; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\Form; use SilverStripe\Forms\FormAction; use SilverStripe\Forms\HiddenField; use SilverStripe\Forms\HTMLEditor\HTMLEditorField; use SilverStripe\Forms\RequiredFields; use SilverStripe\Forms\TextField; use SilverStripe\i18n\i18n; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBField; use SilverStripe\ORM\PaginatedList; use SilverStripe\Security\Security; use SilverStripe\View\Requirements; /** * * @author Hudhaifa Shatnawi <hudhaifa.shatnawi@gmail.com> * @version 1.5, Jan 22, 2017 - 6:20:48 PM */ class DataObjectPageController extends PageController { private static $allowed_actions = [ // Actions 'show', 'edit', 'tabs', 'summary', 'picture', 'upload', 'related', // Forms 'ObjectEditForm', 'doObjectEdit', 'ImageEditForm', 'doImageEdit', 'doImageCancel', 'ImportantEditForm', 'doImportantEdit', ]; private static $url_handlers = [ 'show/$ID' => 'show', 'edit/$ID' => 'edit', 'tabs/$ID' => 'tabs', 'summary/$ID' => 'summary', 'picture/$ID' => 'picture', 'upload/$ID' => 'upload', 'related/$ID' => 'related' ]; public function init() { parent::init(); FrontendFileField::init_scripts(); Requirements::css("https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.css"); Requirements::css("hudhaifas/silverstripe-dataobject-manager: res/css/dataobject.css"); Requirements::css("hudhaifas/silverstripe-dataobject-manager: res/css/lightbox.css"); if ($this->isRTL()) { Requirements::css("hudhaifas/silverstripe-dataobject-manager: res/css/dataobject-rtl.css"); } Requirements::javascript("https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.js"); Requirements::javascript("hudhaifas/silverstripe-dataobject-manager: res/js/lightbox.js"); Requirements::javascript("hudhaifas/silverstripe-dataobject-manager: res/js/dataobject.manager.js"); } public function index(HTTPRequest $request) { $start = microtime(true); // time in Microseconds if ($query = $request->getVar('q')) { $results = $this->searchObjects($this->getObjectsList(), $query); } else { $results = $this->getObjectsList() ->sort('RAND()') ->limit($this->PageLength); } if (!$results) { return []; } if ($results instanceof PaginatedList) { $paginated = $results; $count = $results->getTotalItems(); } else { $paginated = PaginatedList::create( $results, $request )->setPageLength($this->PageLength) ->setPaginationGetVar('start'); $count = $results->Count(); } $end = microtime(true); // time in Microseconds $data = [ 'Results' => $paginated, 'Count' => $count, 'Seconds' => ($end - $start) / 1000 ]; if ($request->isAjax()) { return $this->customise($data) ->renderWith('Includes\ObjectsList'); } return $data; } protected function showSingle($single) { if (!$single) { return $this->httpError(404, 'That object could not be found!'); } if (!$single->canPublicView()) { return Security::permissionFailure($this); } $this->preRenderSingle($single); if ($single->hasMethod('addView')) { $single->addView(); } return $this ->customise([ 'Single' => $single, 'Title' => $single->Title ]) ->renderWith(['DataObjectPage_Show', 'DataObjectPage', 'Page']); } protected function editSingle($single) { if (!$single) { return $this->httpError(404, 'That object could not be found!'); } if (!$single->canEdit()) { return Security::permissionFailure($this); } $this->preRenderSingle($single); return $this ->customise([ 'Single' => $single, 'Title' => $single->Title ]) ->renderWith(['DataObjectPage_Edit', 'DataObjectPage', 'Page']); } public function getObjectsList() { return DataObject::get('Page'); } protected function getSingle($singleID = null) { if ($singleID instanceof HTTPRequest) { $id = $singleID->postVar('ObjectID'); } else { $id = $singleID; } $list = $this->getObjectsList(); if (!$list) { return null; } if (!$id) { $id = $this->getRequest()->param('ID'); } return $list->filter([ 'ID' => $id ])->first(); } public function searchObjects($list, $keywords) { if (!$list) { return null; } return $list->filter([ 'Title:PartialMatch' => $keywords ]); } public function isSearchable() { return true; } protected function IsVerticalList() { return false; } /** * * $lists = [ * [ * 'Title' => 'Categories', * 'Items' => $this->getObjectsList() * ], * [ * 'Title' => 'Categories', * 'Items' => $this->getObjectsList()->Limit(6) * ] * ]; * return new ArrayList($lists); * * @return type */ protected function getFiltersList() { return null; } public function restrictFields() { return []; } protected function preRenderList() { } protected function preRenderSingle($single) { } /// Actions public function show() { $single = $this->getSingle(); return $this->showSingle($single); } public function edit() { $single = $this->getSingle(); return $this->editSingle($single); } public function tabs() { $single = $this->getSingle(); return $this ->customise([ 'ObjectTabs' => $single->getObjectTabs() ]) ->renderWith('Includes\Single_Tabs'); } public function summary() { $single = $this->getSingle(); return $this ->customise([ 'Single' => $single ]) ->renderWith('Includes\Single_Summary'); } public function picture() { $single = $this->getSingle(); return $this ->customise([ 'ObjectImage' => $single->getObjectImage(), 'ObjectDefaultImage' => $single->getObjectDefaultImage(), 'CanPublicView' => $single->canPublicView(), 'ObjectTitle' => $single->getObjectTitle() ]) ->renderWith('Includes\Single_Image'); } public function upload() { $single = $this->getSingle(); return $this ->customise([ 'ObjectImage' => $single->getObjectImage(), 'ObjectDefaultImage' => $single->getObjectDefaultImage(), 'CanPublicView' => $single->canPublicView(), 'ObjectTitle' => $single->getObjectTitle() ]) ->renderWith('Includes\Single_Image_Upload'); } public function related() { $single = $this->getSingle(); return $this ->customise([ 'Single' => $single ]) ->renderWith('Includes\Single_Related'); } /// Links public function TabsLink($id) { return $this->Link("tabs/$id"); } public function SummaryLink($id) { return $this->Link("summary/$id"); } public function PictureLink($id) { return $this->Link("picture/$id"); } public function UploadLink($id) { return $this->Link("upload/$id"); } public function RelatedLink($id) { return $this->Link("related/$id"); } /// Forms public function ObjectSearchForm() { if ($this->hasMethod('getGoogleSiteSearchForm')) { return $this->getGoogleSiteSearchForm()->setTemplate('Form_GoogleSearch'); } $data = $this->request->getVars(); $form = Form::create( $this, 'ObjectSearchForm', FieldList::create( TextField::create('q') ), FieldList::create( FormAction::create('doObjectSearch') ) ); $form ->disableSecurityToken() ->setFormMethod('GET') ->setFormAction($this->Link()) ->setTemplate('Includes\Form_ObjectSearch') ->loadDataFrom($data); return $form; } public function ObjectEditForm($singleID) { if ($singleID instanceof HTTPRequest) { $id = $singleID->postVar('ObjectID'); } else { $id = $singleID; } $single = $this->getSingle($id); if (!$single) { $this->httpError(404, 'That object could not be found!'); } if ($single && !$single->canPublicView()) { Security::permissionFailure($this); } // Create fields $fields = new FieldList(); $fields->push(HiddenField::create('ObjectID', 'ObjectID', $single->ID)); $this->getRecordFields($single, $fields); // Create action $actions = new FieldList(); $this->getRecordActions($single, $actions); // Create Validators $validator = new RequiredFields(); $form = Form::create($this, 'ObjectEditForm', $fields, $actions, $validator); return $form; } public function doObjectEdit($data, $form) { $objectID = $data['ObjectID']; $single = $this->getSingle($objectID); foreach ($data as $key => $value) { $single->$key = $value; } $single->write(); return $this->owner->redirectBack(); } public function ImageEditForm($singleID) { if ($singleID instanceof HTTPRequest) { $id = $singleID->postVar('ObjectID'); } else { $id = $singleID; } $single = $this->getSingle($id); if (!$single) { $this->httpError(404, 'That object could not be found!'); } if ($single && !$single->canEdit()) { Security::permissionFailure($this); } if ($single && !$single->getObjectEditableImageName()) { return null; } // Create fields $fields = new FieldList(); $fields->push(HiddenField::create('ObjectID', 'ObjectID', $single->ID)); // Upload Field $field = FrontendImageField::create($single->getObjectEditableImageName(), '', $single->getObjectImage()); $fields->push($field); // Create action $actions = new FieldList(); $actions->push( FormAction::create('doImageEdit', _t('DataObjectPage.SAVE', 'Save')) ->addExtraClass('btn btn-primary') ); // Create Validators $validator = new RequiredFields(); $form = Form::create($this, 'ImageEditForm', $fields, $actions, $validator); return $form; } public function doImageEdit($data, $form) { $objectID = $data['ObjectID']; $single = $this->getSingle($objectID); $form->saveInto($single); $single->write(); return $this->owner->redirectBack(); } public function doImageCancel($data, $form) { return $this->owner->redirectBack(); } public function ImportantEditForm($singleID) { if ($singleID instanceof HTTPRequest) { $id = $singleID->postVar('ObjectID'); } else { $id = $singleID; } $single = $this->getSingle($id); if (!$single) { $this->httpError(404, 'That object could not be found!'); } if ($single && !$single->canEdit()) { Security::permissionFailure($this); } if ($single && !$single->getImportantItems()) { return null; } $items = $single->getImportantItems(); $items[] = HiddenField::create('ObjectID', 'ObjectID', $single->ID); // Create fields $fields = new FieldList($items); // Create action $actions = new FieldList( FormAction::create('doImageEdit', _t('DataObjectPage.SAVE', 'Save')) ->addExtraClass('btn btn-primary') ); // Create Validators $validator = new RequiredFields(); return Form::create($this, 'ImportantEditForm', $fields, $actions, $validator); } public function doImportantEdit($data, $form) { $objectID = $data['ObjectID']; $single = $this->getSingle($objectID); $form->saveInto($single); $single->write(); return $this->owner->redirectBack(); } protected final function getRecordActions($record, &$actions) { if ($record->hasMethod('canEdit') && $record->canEdit()) { $actions->push( FormAction::create('doObjectEdit', _t('DataObjectPage.SAVE', 'Save')) ->addExtraClass('btn btn-primary btn-block') ); } if ($record->ID && $record->hasMethod('canDelete') && $record->canDelete()) { $actions->push( FormAction::create('doDelete', _t('DataObjectPage.DELETE', 'Delete')) ->addExtraClass('btn btn-danger btn-block') ); } } protected final function getRecordFields($record, &$fields) { if (!$record) { return; } $dbFields = $record->config()->get('db'); $restrictFields = $record->config()->restrict_fields; if ($restrictFields) { $restrictFields = array_merge(['Version'], $restrictFields); } else { $restrictFields = ['Version']; } // iterate database fields foreach ($dbFields as $fieldName => $fieldType) { if ($restrictFields && in_array($fieldName, $restrictFields)) { continue; } $fieldObject = $record->dbObject($fieldName)->scaffoldFormField(null); // Allow fields to opt-out of scaffolding if (!$fieldObject) { continue; } if ($fieldObject instanceof HTMLEditorField) { $fieldObject = FrontendRichTextField::create($fieldName); } else if ($fieldObject instanceof DateField) { } $fieldObject->setTitle($record->fieldLabel($fieldName)); $fieldObject->setValue($record->$fieldName); $fields->push($fieldObject); } } /// Utilities public function ExtraClasses() { return ''; } public function ExtraMetaTags() { return $this->renderWith('Includes\Page_ExtraTags'); } public function RichSnippets() { $single = $this->getSingle(); if ($single && $single instanceof DiscoverableDataObject) { $schema = $single->getObjectMarkup(); $schema['@context'] = "http://schema.org"; $text = Convert::array2json($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); return DBField::create_field('HTMLText', $text); } } public function OpenGraph() { $single = $this->getSingle(); if ($single) { return $this ->customise([ 'Single' => $single ]) ->renderWith('Includes\Single_OpenGraph'); } else { return $this->renderWith('Includes\Page_OpenGraph'); } } public function SocialDescription() { $single = $this->getSingle(); if ($single && $single instanceof SociableDataObject) { return $single->getObjectDescription(); } } public function Canonical() { $single = $this->getSingle(); if ($single) { return $single->getObjectLink(); } else { return $this->Link(); } } public function FullURL($url) { return Director::absoluteURL($url); } public function ThemedURL($url) { return Director::absoluteURL($this->ThemeDir() . $url); } public function Align() { return $this->isRTL() == 'rtl' ? 'right' : 'left'; } public function isRTL() { return i18n::get_script_direction(i18n::get_locale()) == 'rtl'; } public function Strip($html) { return strip_tags($html); } } |