Source of file BuildController.php
Size: 12,430 Bytes - Last Modified: 2021-12-23T10:39:20+00:00
/var/www/docs.ssmods.com/process/src/src/Control/BuildController.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 | <?php namespace Sunnysideup\BuildDataObject\Control; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\Form; use SilverStripe\Forms\FormAction; use SilverStripe\ORM\DataObject; use Sunnysideup\BuildDataObject\Api\FormBuilder\InterfaceForFormController; use Sunnysideup\BuildDataObject\View\NewDataObject; abstract class BuildController extends Controller implements \Sunnysideup\BuildDataObject\Api\FormBuilder\InterfaceForFormController { //##################### // ABSTRACT AND PROVIDERS //##################### protected $myBaseClass = DataObject::class; protected $apiProvider = \Sunnysideup\BuildDataObject\API\DataObjectLists::class; /** * @var int */ protected $step = 1; /** * @var Form */ protected $form; /** * @var string */ protected $prevLink; /** * @var NewDataObject */ protected $finalData; private static $form_data_session_variable = 'Sunnysideup\BuildDataObject\Control\Models\DataObjectBuildController'; private static $url_segment = 'build'; private static $allowed_actions = [ 'primaryformstart' => true, 'PrimaryForm' => true, 'doprimaryform' => true, 'secondaryformstart' => true, 'SecondaryForm' => true, 'dosecondaryform' => true, 'results' => true, 'startover' => true, 'loadtemplate' => true, 'debug' => true, ]; //##################### // DEBUG STUFF //##################### private static $debug = true; private $_data; public function debug() { $this->processedFormData($this->retrieveData()); // print_r($this->CanMethodBuilder('canEdit')); print_r($this->finalData); die('-----------------------------'); } //##################### // STRING VARS //##################### public function Link($action = null) { if ($action) { $action .= '/'; } return Director::baseURL() . $this->Config()->get('url_segment') . '/' . strtolower($this->ShortBaseClass()) . '/' . $action; } public function LoadTemplateLink($className = '') { return $this->Link('loadtemplate') . '?classname=' . $className; } // InterfaceForFormController implements public function getBaseClass(): string { return $this->myBaseClass; } public function getShortBaseClass(): string { return $this->ShortBaseClass(); } public function Title() { return 'Build a ' . $this->ShortBaseClass() . ' - Step ' . $this->step . ' of 2'; } public function LongBaseClass() { return $this->myBaseClass; } public function ShortThisClass() { return ClassInfo::shortName($this); } //##################### // ACTIONS AND FORMS //##################### public function startover() { $this->saveData('_PrimaryForm', null); $this->saveData('_SecondaryForm', null); return $this->redirect($this->link('primaryformstart')); } public function loadtemplate($request) { $className = $request->getVar('classname'); if (class_exists($className)) { $obj = Injector::inst()->get($className); $primaryData = $this->turnStaticsIntoSessionData('primaryThingsToBuild', $className); $primaryData['Name'] = \Sunnysideup\BuildDataObject\Api\DBTypeConverter::fromClass($className)->toDropdown(); $extends = get_parent_class($className); $primaryData['Extends'] = $extends; $primaryData['singular_name'] = $obj->i18n_singular_name(); $primaryData['plural_name'] = $obj->i18n_plural_name(); $this->saveData('_PrimaryForm', $primaryData); $secondaryData = $this->turnStaticsIntoSessionData('secondaryThingsToBuild', $className); $this->saveData('_SecondaryForm', $secondaryData); return $this->redirect($this->link('primaryformstart')); } } public function index() { return $this->redirect($this->Link('primaryformstart')); } public function primaryformstart() { $this->PrimaryForm(); $this->prevLink = $this->Link('startover'); Config::modify()->set('SSViewer', 'source_file_comments', false); return $this->renderWith('BuildControllerForm'); } public function PrimaryForm() { $this->form = $this->createForm('PrimaryForm', 'Build Model'); return $this->form; } public function doprimaryform($data, $form) { $this->saveData('_PrimaryForm', $data); return $this->redirect($this->Link('secondaryformstart')); } public function secondaryformstart() { $this->step = 2; $this->SecondaryForm(); $this->prevLink = $this->Link('primaryformstart'); Config::modify()->set('SSViewer', 'source_file_comments', false); return $this->renderWith('BuildControllerForm'); } public function SecondaryForm() { $this->form = $this->createForm('SecondaryForm', 'Download Example Class'); return $this->form; } public function dosecondaryform($data, $form) { $this->saveData('_SecondaryForm', $data); return $this->redirect($this->Link('results')); } public function Form() { return $this->form; } public function PrevLink() { return $this->prevLink; } public function results() { Config::modify()->set('SSViewer', 'source_file_comments', false); $this->processedFormData($this->retrieveData()); $this->getFinalData()->CompileDataForRendering(); return HTTPRequest::send_file( $this->renderWith($this->resultsTemplateForBuilder()), $this->getFinalData()->getShortClassNameForObject() . '.php' ); } public function getFinalData() { return $this->finalData; } public function getAdditionalPrimaryFields(): array { return $this->additionalPrimaryFields(); } public function getPossibleRelationsWithBaseClass() { return $this->myAPI()->PossibleRelationsWithBaseClass($this->myBaseClass); } public function callAPIMethod($method, $defaultValueIfMethodIsNull) { if ($method) { if ($this->myAPI()->hasMethod($method)) { return $this->myAPI()->{$method}(); } return null; } return $defaultValueIfMethodIsNull; } abstract protected function primaryThingsToBuild(); abstract protected function secondaryThingsToBuild(); protected function ShortBaseClass() { return ClassInfo::shortName($this->myBaseClass); } protected function turnStaticsIntoSessionData($method, $className) { $data = []; $thingsToBuild = $this->{$method}(); foreach ($thingsToBuild as $static) { $varName = $static['Name']; $varValue = Config::inst()->get($className, $varName); if (is_array($varValue)) { $count = 0; foreach ($varValue as $varInnerKey => $varInnerValue) { ++$count; $data[$varName . '__KEY__' . $count] = $varInnerKey; $data[$varName . '__VALUE__' . $count] = trim(preg_replace('#\\([^)]+\\)#', '', $varInnerValue)); } } else { $data[$varName] = $varValue; } } return $data; } protected function createForm(string $formName, string $actionTitle): ?Form { if ('PrimaryForm' === $formName) { $builder = new \Sunnysideup\BuildDataObject\Api\FormBuilder\PrimaryFormBuilder($this, $this->primaryThingsToBuild()); } elseif ('SecondaryForm' === $formName) { $builder = new \Sunnysideup\BuildDataObject\Api\FormBuilder\SecondaryFormBuilder($this, $this->secondaryThingsToBuild()); } else { user_error('Set right form type: ' . $formName . ' is not valid'); return null; } $finalFields = $builder->build(); $actions = FieldList::create( [FormAction::create('do' . strtolower($formName), $actionTitle)] ); $form = Form::create($this, $formName, $finalFields, $actions); $form->setFormAction($this->Link($formName)); $form->loadDataFrom($this->retrieveData()); return $form; } /** * returns an array of fields. * * @return array */ protected function additionalPrimaryFields() { return []; } protected function saveData($name, $data) { unset($data['url'], $data['SecurityID']); if (is_array($data)) { foreach (array_keys($data) as $key) { if (0 === strpos($key, 'action_')) { unset($data[$key]); } } } $var = $this->Config()->get('form_data_session_variable'); $varName = $var . $name; $this->getRequest()->getSession()->clear($varName); $this->getRequest()->getSession()->set($varName, null); $this->getRequest()->getSession()->set($varName, $data); //$this->getRequest()->getSession()->save(); } protected function retrieveData() { if (! $this->_data) { $var = $this->Config()->get('form_data_session_variable'); $retrieveDataPrimary = $this->getRequest()->getSession()->get($var . '_PrimaryForm'); if (! is_array($retrieveDataPrimary)) { $retrieveDataPrimary = []; } $retrieveDataSecondary = $this->getRequest()->getSession()->get($var . '_SecondaryForm'); if (! is_array($retrieveDataSecondary)) { $retrieveDataSecondary = []; } $this->_data = $retrieveDataPrimary + $retrieveDataSecondary; } return $this->_data; } //###################################### // Process results //###################################### protected function processedFormData($data = null) { if (! $this->finalData) { if (! $data) { $data = $this->retrieveData(); } $decomposer = new \Sunnysideup\BuildDataObject\Api\FormData\FormDataDecomposer($data); $this->finalData = $decomposer->toArrayData(); $this->finalData->setBaseClassName($this->baseClass); //add more data .... } /// DEBUG DEBUG /// // self::print_r_debug($this->_processed_data); return $this->finalData; } protected function resultsTemplateForBuilder() { return $this->ShortThisClass() . 'Results'; } //###################################### // INFO FROM API //###################################### protected function myAPI() { $class = $this->apiProvider; return $class::inst($this->myBaseClass, $this->processedFormData()); } protected function addKeysToThingsToBuild($array) { $newArray = []; $fields = [ 'Name', 'SourceMethod1', 'SourceMethod2', 'IsMultiple', ]; foreach ($array as $arrayRowKey => $arrayRowValues) { $newArray[$arrayRowKey] = []; foreach ($arrayRowValues as $arrayColumnKey => $arrayColumnValue) { $newArray[$arrayRowKey][$fields[$arrayColumnKey]] = $arrayColumnValue; } } return $newArray; } private static function var_export_debug(&$var) { if (self::$debug) { /// DEBUG DEBUG /// echo '<!-- '; var_export($var); echo ' -->'; } } private static function print_r_debug(&$var) { if (self::$debug) { /// DEBUG DEBUG /// echo '<!-- '; print_r($var); echo ' -->'; } } } |