Newer
Older
ubFramework / Portal / docroot / include / runtime / Controller.php
@Christopher W. Olsen Christopher W. Olsen on 10 Dec 2017 9 KB Cleaning Up Making It A Sub Module
<?php

abstract class Sphere_Controller {

  function __construct() {


  }

  function loginRequired() {

    return true;

  }

  abstract function getViewer(Sphere_Request $request);

  abstract function process(Sphere_Request $request);

  function validateRequest(Sphere_Request $request) {


  }

  function preProcess(Sphere_Request $request) {


  }

  function postProcess(Sphere_Request $request) {


  }

  // Control the exposure of methods to be invoked from client (kind-of RPC)
  protected $exposedMethods = array ();

  /**
   * Function that will expose methods for external access
   *
   * @param <String> $name
   *          - method name
   */
  protected function exposeMethod($name) {

    if (! in_array ( $name, $this->exposedMethods )) {
      $this->exposedMethods [] = $name;
    }

  }

  /**
   * Function checks if the method is exposed for client usage
   *
   * @param string $name
   *          - method name
   * @return boolean
   */
  function isMethodExposed($name) {

    if (in_array ( $name, $this->exposedMethods )) {
      return true;
    }
    return false;

  }

  /**
   * Function invokes exposed methods for this class
   *
   * @param string $name
   *          - method name
   * @param Sphere_Request $request
   * @throws Exception
   */
  function invokeExposedMethod() {

    $parameters = func_get_args ();
    $name = array_shift ( $parameters );
    if (! empty ( $name ) && $this->isMethodExposed ( $name )) {
      return call_user_func_array ( array (
          $this,
          $name
      ), $parameters );
    }
    throw new Exception ( vtranslate ( 'LBL_NOT_ACCESSIBLE' ) );

  }

}

/**
 * Abstract Action Controller Class
 */
abstract class Sphere_Action_Controller extends Sphere_Controller {

  function __construct() {

    parent::__construct ();

  }

  function getViewer(Sphere_Request $request) {

    throw new AppException ( 'Action - implement getViewer - JSONViewer' );

  }

  function validateRequest(Sphere_Request $request) {

    return $request->validateReadAccess ();

  }

  function preProcess(Sphere_Request $request) {

    return true;

  }

  protected function preProcessDisplay(Sphere_Request $request) {


  }

  protected function preProcessTplName(Sphere_Request $request) {

    return false;

  }

  // TODO: need to revisit on this as we are not sure if this is helpful
  /*
   * function preProcessParentTplName(Sphere_Request $request) {
   * return false;
   * }
   */
  function postProcess(Sphere_Request $request) {

    return true;

  }

}

/**
 * Abstract View Controller Class
 */
abstract class Sphere_View_Controller extends Sphere_Action_Controller {

  protected $viewer;

  function __construct() {

    parent::__construct ();

  }

  function getViewer(Sphere_Request $request) {

    if (! $this->viewer) {
      global $vtiger_current_version;
      $viewer = new Sphere_Viewer ();
      $viewer->assign ( 'APPTITLE', getTranslatedString ( 'APPTITLE' ) );
      $viewer->assign ( 'VTIGER_VERSION', $vtiger_current_version );
      $viewer->assign ( 'MODULE_NAME', $request->getModule () );
      $this->viewer = $viewer;
    }
    return $this->viewer;

  }

  function getPageTitle(Sphere_Request $request) {

    return spheretranslate ( $request->getModule (), $request->get ( 'module' ) );

  }

  function preProcess(Sphere_Request $request, $display = true) {

    $currentUser = Users_Record_Model::getCurrentUserModel ();
    $viewer = $this->getViewer ( $request );
    $viewer->assign ( 'PAGETITLE', $this->getPageTitle ( $request ) );
    $viewer->assign ( 'SCRIPTS', $this->getHeaderScripts ( $request ) );
    $viewer->assign ( 'STYLES', $this->getHeaderCss ( $request ) );
    $viewer->assign ( 'SKIN_PATH', Sphere_Theme::getCurrentUserThemePath () );
    $viewer->assign ( 'LANGUAGE_STRINGS', $this->getJSLanguageStrings ( $request ) );
    $viewer->assign ( 'LANGUAGE', $currentUser->get ( 'language' ) );
    if ($display) {
      $this->preProcessDisplay ( $request );
    }

  }

  protected function preProcessTplName(Sphere_Request $request) {

    return 'Header.tpl';

  }

  // Note : To get the right hook for immediate parent in PHP,
  // specially in case of deep hierarchy
  // TODO: Need to revisit this.
  /*
   * function preProcessParentTplName(Sphere_Request $request) {
   * return parent::preProcessTplName($request);
   * }
   */
  protected function preProcessDisplay(Sphere_Request $request) {

    $viewer = $this->getViewer ( $request );
    $displayed = $viewer->view ( $this->preProcessTplName ( $request ), $request->getModule () );

    /*
     * if(!$displayed) {
     * $tplName = $this->preProcessParentTplName($request);
     * if($tplName) {
     * $viewer->view($tplName, $request->getModule());
     * }
     * }
     */
  }

  function postProcess(Sphere_Request $request) {

    $viewer = $this->getViewer ( $request );
    $currentUser = Users_Record_Model::getCurrentUserModel ();
    //MrOlsen $viewer->assign ( 'ACTIVITY_REMINDER', $currentUser->getCurrentUserActivityReminderInSeconds () );
    $viewer->view ( 'Footer.tpl' );

  }

  /**
   * Retrieves headers scripts that need to loaded in the page
   *
   * @param Sphere_Request $request
   *          - request model
   * @return <array> - array of Sphere_JsScript_Model
   */
  function getHeaderScripts(Sphere_Request $request) {

    $headerScriptInstances = array ();
    $languageHandlerShortName = Sphere_Language_Handler::getShortLanguageName ();
    $fileName = "libraries/jquery/posabsolute-jQuery-Validation-Engine/js/languages/jquery.validationEngine-$languageHandlerShortName.js";
    if (! file_exists ( $fileName )) {
      $fileName = "~libraries/jquery/posabsolute-jQuery-Validation-Engine/js/languages/jquery.validationEngine-en.js";
    }
    else {
      $fileName = "~libraries/jquery/posabsolute-jQuery-Validation-Engine/js/languages/jquery.validationEngine-$languageHandlerShortName.js";
    }
    $jsFileNames = array (
        $fileName
    );
    $jsScriptInstances = $this->checkAndConvertJsScripts ( $jsFileNames );
    $headerScriptInstances = array_merge ( $jsScriptInstances, $headerScriptInstances );
    return $headerScriptInstances;

  }

  function checkAndConvertJsScripts($jsFileNames) {

    $fileExtension = 'js';

    $jsScriptInstances = array ();
    foreach ( $jsFileNames as $jsFileName ) {
      // TODO Handle absolute inclusions (~/...) like in checkAndConvertCssStyles
      $jsScript = new Sphere_JsScript_Model ();

      // external javascript source file handling
      if (strpos ( $jsFileName, 'http://' ) === 0 || strpos ( $jsFileName, 'https://' ) === 0) {
        $jsScriptInstances [$jsFileName] = $jsScript->set ( 'src', $jsFileName );
        continue;
      }

      $completeFilePath = Sphere_Loader::resolveNameToPath ( $jsFileName, $fileExtension );

      if (file_exists ( $completeFilePath )) {
        if (strpos ( $jsFileName, '~' ) === 0) {
          $filePath = ltrim ( ltrim ( $jsFileName, '~' ), '/' );
          // if ~~ (reference is outside vtiger6 folder)
          if (substr_count ( $jsFileName, "~" ) == 2) {
            $filePath = "../" . $filePath;
          }
        }
        else {
          $filePath = str_replace ( '.', '/', $jsFileName ) . '.' . $fileExtension;
        }

        $jsScriptInstances [$jsFileName] = $jsScript->set ( 'src', $filePath );
      }
      else {
        $fallBackFilePath = Sphere_Loader::resolveNameToPath ( Sphere_JavaScript::getBaseJavaScriptPath () . '/' . $jsFileName, 'js' );
        if (file_exists ( $fallBackFilePath )) {
          $filePath = str_replace ( '.', '/', $jsFileName ) . '.js';
          $jsScriptInstances [$jsFileName] = $jsScript->set ( 'src', Sphere_JavaScript::getFilePath ( $filePath ) );
        }
      }
    }
    return $jsScriptInstances;

  }

  /**
   * Function returns the css files
   *
   * @param <Array> $cssFileNames
   * @param <String> $fileExtension
   * @return <Array of Sphere_CssScript_Model>
   *
   *         First check if $cssFileName exists
   *         if not, check under layout folder $cssFileName eg:layouts/slayout/$cssFileName
   */
  function checkAndConvertCssStyles($cssFileNames, $fileExtension = 'css') {

    $cssStyleInstances = array ();
    foreach ( $cssFileNames as $cssFileName ) {
      $cssScriptModel = new Sphere_CssScript_Model ();

      if (strpos ( $cssFileName, 'http://' ) === 0 || strpos ( $cssFileName, 'https://' ) === 0) {
        $cssStyleInstances [] = $cssScriptModel->set ( 'href', $cssFileName );
        continue;
      }
      $completeFilePath = Sphere_Loader::resolveNameToPath ( $cssFileName, $fileExtension );
      $filePath = NULL;
      if (file_exists ( $completeFilePath )) {
        if (strpos ( $cssFileName, '~' ) === 0) {
          $filePath = ltrim ( ltrim ( $cssFileName, '~' ), '/' );
          // if ~~ (reference is outside vtiger6 folder)
          if (substr_count ( $cssFileName, "~" ) == 2) {
            $filePath = "../" . $filePath;
          }
        }
        else {
          $filePath = str_replace ( '.', '/', $cssFileName ) . '.' . $fileExtension;
          $filePath = Sphere_Theme::getStylePath ( $filePath );
        }
        $cssStyleInstances [] = $cssScriptModel->set ( 'href', $filePath );
      }
    }
    return $cssStyleInstances;

  }

  /**
   * Retrieves css styles that need to loaded in the page
   *
   * @param Sphere_Request $request
   *          - request model
   * @return <array> - array of Sphere_CssScript_Model
   */
  function getHeaderCss(Sphere_Request $request) {

    return array ();

  }

  /**
   * Function returns the Client side language string
   *
   * @param Sphere_Request $request
   */
  function getJSLanguageStrings(Sphere_Request $request) {

    $moduleName = $request->getModule ( false );
    return Sphere_Language_Handler::export ( $moduleName, 'jsLanguageStrings' );

  }

}

?>