예제 #1
0
파일: bluebox.php 프로젝트: Jaybee-/bluebox
 /**
  * Performs population of model
  *
  * @param object The base object to save
  * @param string The message to display if successful
  * @return bool
  */
 protected function formSave(&$object, $saveMessage = NULL, $saveEvents = array())
 {
     // Determine name of the base model for the object being saved
     if (get_parent_class($object) == 'Bluebox_Record') {
         $baseClass = get_class($object);
     } else {
         $baseClass = get_parent_class($object);
     }
     // Import any post vars with the key of this model into the object
     $formData = $this->input->post(strtolower($baseClass), array());
     $object->fromArray($formData);
     // Save data and all relations
     try {
         $this->save_prepare($object);
         // Allow plugins to process any form-related data we just got back and attach to our data object
         if (!plugins::save($this, $saveEvents)) {
             throw new Bluebox_Exception('Plugins failed to save');
         }
         $this->pre_save($object);
         // Save this base record
         $object->save();
         $this->post_save($object);
         // Success - optionally set a save message
         if (is_null($saveMessage)) {
             $displayName = inflector::humanizeModelName(get_class($object));
             message::set($displayName . ' saved!', array('type' => 'success'));
         } else {
             if (!empty($saveMessage)) {
                 message::set($saveMessage, array('type' => 'success'));
             }
         }
         $this->save_succeeded($object);
         return TRUE;
     } catch (Doctrine_Connection_Exception $e) {
         message::set('Doctrine error: ' . $e->getMessage());
     } catch (Bluebox_Validation_Exception $e) {
         message::set('Please correct the errors listed below.');
         kohana::log('alert', $e->getMessage());
     } catch (Bluebox_Exception $e) {
         message::set('Please correct the errors listed below.');
         kohana::log('alert', $e->getMessage());
     } catch (Exception $e) {
         message::set($e->getMessage());
     }
     $this->save_failed($object);
     return FALSE;
 }
예제 #2
0
파일: installer.php 프로젝트: swk/bluebox
 /**
  * This is the main wizard engine.  It will process the steps in the protected $steps looking for
  * methods that match the step name.  When information is submitted back and a method called process{stepName}
  * exists then the post var will be handed to it at which point that method chooses to continue
  * to the next step (after processing the post) by returning true; otherwise if the process method of a
  * step does not exist then it automaticly advances to the next or previous step.
  *
  * @return void
  */
 public function index()
 {
     /**
      * TODO: this is temporarliy here until the installMode step is but back
      */
     $this->session->set('installer.installMode', 'install');
     /**
      * These vars are used to execute event hooks
      */
     $this->views = $this->template->views = array();
     // Get any responses
     $returns = $this->input->post();
     // If there are return values try to process them!
     if (!empty($returns)) {
         // This test makes sure that the form being submitted has a matching token,
         // since the token changes every time the form is rendered if the tokens dont
         // match then it must be a refresh....
         $testToken = $this->session->get('installer.formToken', FALSE);
         if (empty($returns['form_token']) || $returns['form_token'] != $testToken) {
             if (isset($returns['next'])) {
                 unset($returns['next']);
             }
             if (isset($returns['prev'])) {
                 unset($returns['prev']);
             }
         }
         // Save all the submits from this form
         $ignoreReturns = array('next', 'prev', 'license', 'formToken');
         foreach ($returns as $name => $return) {
             if (!in_array($name, $ignoreReturns)) {
                 $this->session->set('installer.' . $name, $return);
             }
         }
         $driver = $this->session->get('installer.tel_driver');
         if (!empty($driver)) {
             // Add an event for this telephony driver exclusively
             $this->pluginEvents['driver'] = Router::$controller . '.' . $this->currentStep . '.' . $driver;
         }
         // See if the form was submitted with the next button
         if (!empty($returns['next'])) {
             // If the user wants to continue check for the existance of a method called process{stepName}
             if (method_exists($this, 'process' . ucfirst($this->currentStep))) {
                 // It the process exists go to the next step on if this step returns true
                 $proceed = call_user_func(array($this, 'process' . ucfirst($this->currentStep)));
             } else {
                 $proceed = TRUE;
             }
             // Run all registered save hooks for this installer.step
             $proceed = $proceed & plugins::save($this, $this->pluginEvents);
             // If the user wants to go back on step who are we to stop them?
             $this->_nextWizard($proceed);
         } else {
             if (!empty($returns['prev'])) {
                 $this->_prevWizard();
             }
         }
     }
     // Lets generate a unique token that the form must respond with so on refresh
     // it doesnt progress unexpectedly
     $formToken = strtoupper(md5(uniqid(rand(), TRUE)));
     $this->session->set('installer.formToken', $formToken);
     $this->template->formToken = $formToken;
     // Default to allow them to go to the back a step if the are not on the first.
     $this->template->allowPrev = $this->currentStepKey > 0 ? TRUE : FALSE;
     // By default they can always continue (but a step may disable this ability!)
     $this->template->allowNext = TRUE;
     // Attempt to render this step
     try {
         $subview = call_user_func(array($this, $this->currentStep));
         // Set the step view in the main template
         $this->template->content = $subview;
         // Run all registered view hooks for this installer.step
         plugins::views($this, $this->pluginEvents);
         $this->template->views = $this->template->content->views;
     } catch (Exception $e) {
         $this->template->title = 'INSTALLATION ERROR';
         $this->template->allowPrev = FALSE;
         $this->template->allowNext = FALSE;
         $subview = '<h2 class="error">ERROR: Can not execute step ' . $this->currentStep . ', wizard terminated!</h2>';
         $subview .= '<small class="error">' . $e->getMessage() . '</small>';
         $this->session->destroy();
         // Set the step view in the main template
         $this->template->content = $subview;
     }
 }