/**
  * Private method to generate the main body HTML for this page.
  *
  * @since 1.0
  *
  * @return string
  */
 private function displayBodyContent()
 {
     $classNames = ActiveRecord::getBOClassNames();
     $body = '';
     $fields = array('formAction' => $this->request->getURI());
     foreach ($classNames as $className) {
         try {
             $activeRecord = new $className();
             $view = View::getInstance($activeRecord);
             $body .= $view->adminView($fields);
         } catch (AlphaException $e) {
             self::$logger->error("[{$classname}]:" . $e->getMessage());
             // its possible that the exception occured due to the table schema being out of date
             if ($activeRecord->checkTableExists() && $activeRecord->checkTableNeedsUpdate()) {
                 $missingFields = $activeRecord->findMissingFields();
                 $count = count($missingFields);
                 for ($i = 0; $i < $count; ++$i) {
                     $activeRecord->addProperty($missingFields[$i]);
                 }
                 // now try again...
                 $activeRecord = new $className();
                 $view = View::getInstance($activeRecord);
                 $body .= $view->adminView($fields);
             }
         } catch (\Exception $e) {
             self::$logger->error($e->getMessage());
             $body .= View::displayErrorMessage('Error accessing the class [' . $classname . '], check the log!');
         }
     }
     return $body;
 }
Ejemplo n.º 2
0
 /**
  * Handle GET requests.
  *
  * @param Alpha\Util\Http\Request $request
  *
  * @return Alpha\Util\Http\Response
  *
  * @since 1.0
  */
 public function doGET($request)
 {
     self::$logger->debug('>>doGET($request=[' . var_export($request, true) . '])');
     $config = ConfigProvider::getInstance();
     $sessionProvider = $config->get('session.provider.name');
     $session = SessionProviderFactory::getInstance($sessionProvider);
     // if there is nobody logged in, we will send them off to the Login controller to do so before coming back here
     if ($session->get('currentUser') === false) {
         self::$logger->info('Nobody logged in, invoking Login controller...');
         $controller = new LoginController();
         $controller->setName('LoginController');
         $controller->setRequest($request);
         $controller->setUnitOfWork(array('Alpha\\Controller\\LoginController', 'Alpha\\Controller\\InstallController'));
         self::$logger->debug('<<__construct');
         return $controller->doGET($request);
     }
     $params = $request->getParams();
     $sessionProvider = $config->get('session.provider.name');
     $session = SessionProviderFactory::getInstance($sessionProvider);
     $body = View::displayPageHead($this);
     $body .= '<h1>Installing the ' . $config->get('app.title') . ' application</h1>';
     try {
         $body .= $this->createApplicationDirs();
     } catch (\Exception $e) {
         $body .= View::displayErrorMessage($e->getMessage());
         $body .= View::displayErrorMessage('Aborting.');
         return new Response(500, $body, array('Content-Type' => 'text/html'));
     }
     // start a new database transaction
     ActiveRecord::begin();
     /*
      * Create DEnum tables
      */
     $DEnum = new DEnum();
     $DEnumItem = new DEnumItem();
     try {
         $body .= '<p>Attempting to create the DEnum tables...';
         if (!$DEnum->checkTableExists()) {
             $DEnum->makeTable();
         }
         self::$logger->info('Created the [' . $DEnum->getTableName() . '] table successfully');
         if (!$DEnumItem->checkTableExists()) {
             $DEnumItem->makeTable();
         }
         self::$logger->info('Created the [' . $DEnumItem->getTableName() . '] table successfully');
         // create a default article DEnum category
         $DEnum = new DEnum('Alpha\\Model\\Article::section');
         $DEnumItem = new DEnumItem();
         $DEnumItem->set('value', 'Main');
         $DEnumItem->set('DEnumID', $DEnum->getID());
         $DEnumItem->save();
         $body .= View::displayUpdateMessage('DEnums set up successfully.');
     } catch (\Exception $e) {
         $body .= View::displayErrorMessage($e->getMessage());
         $body .= View::displayErrorMessage('Aborting.');
         self::$logger->error($e->getMessage());
         ActiveRecord::rollback();
         return new Response(500, $body, array('Content-Type' => 'text/html'));
     }
     /*
      * Loop over each business object in the system, and create a table for it
      */
     $classNames = ActiveRecord::getBOClassNames();
     $loadedClasses = array();
     foreach ($classNames as $classname) {
         array_push($loadedClasses, $classname);
     }
     foreach ($loadedClasses as $classname) {
         try {
             $body .= '<p>Attempting to create the table for the class [' . $classname . ']...';
             try {
                 $BO = new $classname();
                 if (!$BO->checkTableExists()) {
                     $BO->makeTable();
                 } else {
                     if ($BO->checkTableNeedsUpdate()) {
                         $missingFields = $BO->findMissingFields();
                         $count = count($missingFields);
                         for ($i = 0; $i < $count; ++$i) {
                             $BO->addProperty($missingFields[$i]);
                         }
                     }
                 }
             } catch (FailedIndexCreateException $eice) {
                 // this are safe to ignore for now as they will be auto-created later once all of the tables are in place
                 self::$logger->warn($eice->getMessage());
             } catch (FailedLookupCreateException $elce) {
                 // this are safe to ignore for now as they will be auto-created later once all of the tables are in place
                 self::$logger->warn($elce->getMessage());
             }
             self::$logger->info('Created the [' . $BO->getTableName() . '] table successfully');
             $body .= View::displayUpdateMessage('Created the [' . $BO->getTableName() . '] table successfully');
         } catch (\Exception $e) {
             $body .= View::displayErrorMessage($e->getMessage());
             $body .= View::displayErrorMessage('Aborting.');
             self::$logger->error($e->getMessage());
             ActiveRecord::rollback();
             return new Response(500, $body, array('Content-Type' => 'text/html'));
         }
     }
     $body .= View::displayUpdateMessage('All business object tables created successfully!');
     /*
      * Create the Admin and Standard groups
      */
     $adminGroup = new Rights();
     $adminGroup->set('name', 'Admin');
     $standardGroup = new Rights();
     $standardGroup->set('name', 'Standard');
     try {
         try {
             $body .= '<p>Attempting to create the Admin and Standard groups...';
             $adminGroup->save();
             $standardGroup->save();
             self::$logger->info('Created the Admin and Standard rights groups successfully');
             $body .= View::displayUpdateMessage('Created the Admin and Standard rights groups successfully');
         } catch (FailedIndexCreateException $eice) {
             // this are safe to ignore for now as they will be auto-created later once all of the tables are in place
             self::$logger->warn($eice->getMessage());
         } catch (FailedLookupCreateException $elce) {
             // this are safe to ignore for now as they will be auto-created later once all of the tables are in place
             self::$logger->warn($elce->getMessage());
         }
     } catch (\Exception $e) {
         $body .= View::displayErrorMessage($e->getMessage());
         $body .= View::displayErrorMessage('Aborting.');
         self::$logger->error($e->getMessage());
         ActiveRecord::rollback();
         return new Response(500, $body, array('Content-Type' => 'text/html'));
     }
     /*
      * Save the admin user to the database in the right group
      */
     try {
         try {
             $body .= '<p>Attempting to save the Admin account...';
             $admin = new Person();
             $admin->set('displayName', 'Admin');
             $admin->set('email', $session->get('currentUser')->get('email'));
             $admin->set('password', $session->get('currentUser')->get('password'));
             $admin->save();
             self::$logger->info('Created the admin user account [' . $session->get('currentUser')->get('email') . '] successfully');
             $adminGroup->loadByAttribute('name', 'Admin');
             $lookup = $adminGroup->getMembers()->getLookup();
             $lookup->setValue(array($admin->getID(), $adminGroup->getID()));
             $lookup->save();
             self::$logger->info('Added the admin account to the Admin group successfully');
             $body .= View::displayUpdateMessage('Added the admin account to the Admin group successfully');
         } catch (FailedIndexCreateException $eice) {
             // this are safe to ignore for now as they will be auto-created later once all of the tables are in place
             self::$logger->warn($eice->getMessage());
         } catch (FailedLookupCreateException $elce) {
             // this are safe to ignore for now as they will be auto-created later once all of the tables are in place
             self::$logger->warn($elce->getMessage());
         }
     } catch (\Exception $e) {
         $body .= View::displayErrorMessage($e->getMessage());
         $body .= View::displayErrorMessage('Aborting.');
         self::$logger->error($e->getMessage());
         ActiveRecord::rollback();
         return new Response(500, $body, array('Content-Type' => 'text/html'));
     }
     $body .= '<br><p align="center"><a href="' . FrontController::generateSecureURL('act=Alpha\\Controller\\ListActiveRecordsController') . '">Administration Home Page</a></p><br>';
     $body .= View::displayPageFoot($this);
     // commit
     ActiveRecord::commit();
     self::$logger->info('Finished installation!');
     self::$logger->action('Installed the application');
     self::$logger->debug('<<doGET');
     return new Response(200, $body, array('Content-Type' => 'text/html'));
 }
Ejemplo n.º 3
0
 /**
  * (non-PHPdoc).
  *
  * @see Alpha\Model\ActiveRecordProviderInterface::isTableOverloaded()
  */
 public function isTableOverloaded()
 {
     self::$logger->debug('>>isTableOverloaded()');
     $reflection = new ReflectionClass($this->BO);
     $classname = $reflection->getShortName();
     $tablename = ucfirst($this->BO->getTableName());
     // use reflection to check to see if we are dealing with a persistent type (e.g. DEnum) which are never overloaded
     $implementedInterfaces = $reflection->getInterfaces();
     foreach ($implementedInterfaces as $interface) {
         if ($interface->name == 'Alpha\\Model\\Type\\TypeInterface') {
             self::$logger->debug('<<isTableOverloaded [false]');
             return false;
         }
     }
     if ($classname != $tablename) {
         // loop over all BOs to see if there is one using the same table as this BO
         $BOclasses = ActiveRecord::getBOClassNames();
         foreach ($BOclasses as $BOclassName) {
             $reflection = new ReflectionClass($BOclassName);
             $classname = $reflection->getShortName();
             if ($tablename == $classname) {
                 self::$logger->debug('<<isTableOverloaded [true]');
                 return true;
             }
         }
         throw new BadTableNameException('The table name [' . $tablename . '] for the class [' . $classname . '] is invalid as it does not match a BO definition in the system!');
         self::$logger->debug('<<isTableOverloaded [false]');
         return false;
     } else {
         // check to see if there is already a "classname" column in the database for this BO
         $query = 'SHOW COLUMNS FROM ' . $this->BO->getTableName();
         $result = self::getConnection()->query($query);
         if ($result) {
             while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
                 if ('classname' == $row['Field']) {
                     self::$logger->debug('<<isTableOverloaded [true]');
                     return true;
                 }
             }
         } else {
             self::$logger->warn('Error during show columns [' . self::getConnection()->error . ']');
         }
         self::$logger->debug('<<isTableOverloaded [false]');
         return false;
     }
 }
Ejemplo n.º 4
0
 /**
  * Set the name of the business object class that this class is related to.
  *
  * @param string $RC
  * @param string $side Only required for MANY-TO-MANY relations
  *
  * @since 1.0
  *
  * @throws Alpha\Exception\IllegalArguementException
  */
 public function setRelatedClass($RC, $side = '')
 {
     if (in_array($RC, ActiveRecord::getBOClassNames())) {
         switch ($side) {
             case '':
                 $this->relatedClass = $RC;
                 break;
             case 'left':
                 $this->relatedClassLeft = $RC;
                 break;
             case 'right':
                 $this->relatedClassRight = $RC;
                 break;
             default:
                 throw new IllegalArguementException('The side paramter [' . $RC . '] is not valid!');
         }
     } else {
         throw new IllegalArguementException('The class [' . $RC . '] is not defined anywhere!');
     }
 }
Ejemplo n.º 5
0
 /**
  * Handle GET requests.
  *
  * @param Alpha\Util\Http\Request $request
  *
  * @return Alpha\Util\Http\Response
  *
  * @throws Alpha\Exception\IllegalArguementException
  * @throws Alpha\Exception\FileNotFoundException
  *
  * @since 1.0
  */
 public function doGET($request)
 {
     self::$logger->debug('>>doGET($request=[' . var_export($request, true) . '])');
     $params = $request->getParams();
     $config = ConfigProvider::getInstance();
     $body = '';
     // render the tag manager screen
     if (!isset($params['ActiveRecordType']) && !isset($params['ActiveRecordOID'])) {
         $body .= View::displayPageHead($this);
         $message = $this->getStatusMessage();
         if (!empty($message)) {
             $body .= $message;
         }
         $body .= '<h3>Listing active record which are tagged</h3>';
         $ActiveRecordTypes = ActiveRecord::getBOClassNames();
         foreach ($ActiveRecordTypes as $ActiveRecordType) {
             $record = new $ActiveRecordType();
             if ($record->isTagged()) {
                 $tag = new Tag();
                 $count = count($tag->loadAllByAttribute('taggedClass', $ActiveRecordType));
                 $body .= '<h4>' . $record->getFriendlyClassName() . ' record type is tagged (' . $count . ' tags found)</h4>';
                 $fieldname = $config->get('security.encrypt.http.fieldnames') ? base64_encode(SecurityUtils::encrypt('clearTaggedClass')) : 'clearTaggedClass';
                 $js = "if(window.jQuery) {\n                        BootstrapDialog.show({\n                            title: 'Confirmation',\n                            message: 'Are you sure you want to delete all tags attached to the " . $record->getFriendlyClassName() . " class, and have them re-created?',\n                            buttons: [\n                                {\n                                    icon: 'glyphicon glyphicon-remove',\n                                    label: 'Cancel',\n                                    cssClass: 'btn btn-default btn-xs',\n                                    action: function(dialogItself){\n                                        dialogItself.close();\n                                    }\n                                },\n                                {\n                                    icon: 'glyphicon glyphicon-ok',\n                                    label: 'Okay',\n                                    cssClass: 'btn btn-default btn-xs',\n                                    action: function(dialogItself) {\n                                        \$('[id=\"" . $fieldname . "\"]').attr('value', '" . addslashes($ActiveRecordType) . "');\n                                        \$('#clearForm').submit();\n                                        dialogItself.close();\n                                    }\n                                }\n                            ]\n                        });\n                    }";
                 $button = new Button($js, 'Re-create tags', 'clearBut' . stripslashes($ActiveRecordType));
                 $body .= $button->render();
             }
         }
         ActiveRecord::disconnect();
         $body .= '<form action="' . $request->getURI() . '" method="POST" id="clearForm">';
         $body .= '<input type="hidden" name="' . $fieldname . '" id="' . $fieldname . '"/>';
         $body .= View::renderSecurityFields();
         $body .= '</form>';
     } elseif (isset($params['ActiveRecordType']) && $params['ActiveRecordType'] != 'Alpha\\Model\\Tag' && isset($params['ActiveRecordOID'])) {
         // render screen for managing individual tags on a given active record
         $body .= View::displayPageHead($this);
         $message = $this->getStatusMessage();
         if (!empty($message)) {
             $body .= $message;
         }
         $ActiveRecordType = urldecode($params['ActiveRecordType']);
         $ActiveRecordOID = $params['ActiveRecordOID'];
         if (class_exists($ActiveRecordType)) {
             $record = new $ActiveRecordType();
         } else {
             throw new IllegalArguementException('No ActiveRecord available to display tags for!');
         }
         try {
             $record->load($ActiveRecordOID);
             $tags = $record->getPropObject('tags')->getRelatedObjects();
             ActiveRecord::disconnect();
             $body .= '<form action="' . $request->getURI() . '" method="POST" accept-charset="UTF-8">';
             $body .= '<h3>The following tags were found:</h3>';
             foreach ($tags as $tag) {
                 $labels = $tag->getDataLabels();
                 $temp = new StringBox($tag->getPropObject('content'), $labels['content'], 'content_' . $tag->getID(), '');
                 $body .= $temp->render(false);
                 $js = "if(window.jQuery) {\n                        BootstrapDialog.show({\n                            title: 'Confirmation',\n                            message: 'Are you sure you wish to delete this tag?',\n                            buttons: [\n                                {\n                                    icon: 'glyphicon glyphicon-remove',\n                                    label: 'Cancel',\n                                    cssClass: 'btn btn-default btn-xs',\n                                    action: function(dialogItself){\n                                        dialogItself.close();\n                                    }\n                                },\n                                {\n                                    icon: 'glyphicon glyphicon-ok',\n                                    label: 'Okay',\n                                    cssClass: 'btn btn-default btn-xs',\n                                    action: function(dialogItself) {\n                                        \$('[id=\"" . ($config->get('security.encrypt.http.fieldnames') ? base64_encode(SecurityUtils::encrypt('ActiveRecordOID')) : 'ActiveRecordOID') . "\"]').attr('value', '" . $tag->getID() . "');\n                                        \$('#deleteForm').submit();\n                                        dialogItself.close();\n                                    }\n                                }\n                            ]\n                        });\n                    }";
                 $button = new Button($js, 'Delete', 'delete' . $tag->getID() . 'But');
                 $body .= $button->render();
             }
             $body .= '<h3>Add a new tag:</h3>';
             $temp = new StringBox(new String(), 'New tag', 'NewTagValue', '');
             $body .= $temp->render(false);
             $temp = new Button('submit', 'Save', 'saveBut');
             $body .= $temp->render();
             $body .= '&nbsp;&nbsp;';
             if ($params['ActiveRecordType'] = 'Alpha\\Model\\Article') {
                 $temp = new Button("document.location = '" . FrontController::generateSecureURL('act=Alpha\\Controller\\ArticleController&ActiveRecordType=' . $params['ActiveRecordType'] . '&ActiveRecordOID=' . $params['ActiveRecordOID'] . '&view=edit') . "'", 'Back to record', 'cancelBut');
             } else {
                 $temp = new Button("document.location = '" . FrontController::generateSecureURL('act=Alpha\\Controller\\ActiveRecordController&ActiveRecordType=' . $params['ActiveRecordType'] . '&ActiveRecordOID=' . $params['ActiveRecordOID'] . '&view=edit') . "'", 'Back to record', 'cancelBut');
             }
             $body .= $temp->render();
             $body .= View::renderSecurityFields();
             $body .= '</form>';
             $body .= View::renderDeleteForm($request->getURI());
         } catch (RecordNotFoundException $e) {
             $msg = 'Unable to load the ActiveRecord of id [' . $params['ActiveRecordOID'] . '], error was [' . $e->getMessage() . ']';
             self::$logger->error($msg);
             throw new FileNotFoundException($msg);
         }
     } else {
         return parent::doGET($request);
     }
     $body .= View::displayPageFoot($this);
     self::$logger->debug('<<doGET');
     return new Response(200, $body, array('Content-Type' => 'text/html'));
 }