Ejemplo n.º 1
0
 /**
  * Initialize the object by picking up and processing the ISO 639 xml file
  * 
  * @exception 	will throw exception if no file can be found
  */
 public function init()
 {
     // first, see if Getttext functions are installed
     if (function_exists('bindtextdomain')) {
         $this->gettext = true;
     }
     // set full path to local copy
     $this->languages_file_xerxes = realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . $this->languages_file_xerxes);
     $this->gettext_domain_xerxes = realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . $this->gettext_domain_xerxes);
     // if the iso-codes is not installed, use our copy
     $file = "";
     if (file_exists($this->languages_file_system)) {
         $file = $this->languages_file_system;
     } elseif (file_exists($this->languages_file_xerxes)) {
         $file = $this->languages_file_xerxes;
     } else {
         throw new Exception("could not find file with the ISO 639 language list");
     }
     // load the languages file
     $xml = new DOMDocument();
     $xml->load($file);
     $this->xpath = new DOMXPath($xml);
     unset($xml);
     // which language shall we display?
     $objRegistry = Xerxes_Framework_Registry::getInstance();
     $objRequest = Xerxes_Framework_Request::getInstance();
     $lang = $objRequest->getProperty("lang");
     if ($lang == null) {
         $lang = $objRegistry->defaultLanguage();
     }
     $this->locale = $objRegistry->getLocale($lang);
     // bindings
     if ($this->gettext == true) {
         $gettext_domain_path = "";
         if (file_exists($this->gettext_domain_xerxes)) {
             $gettext_domain_path = $this->gettext_domain_xerxes;
         } elseif (file_exists($this->gettext_domain_system)) {
             $gettext_domain_path = $this->gettext_domain_system;
         }
         bindtextdomain($this->domain, $gettext_domain_path);
         // this works on windows too?
         bind_textdomain_codeset($this->domain, 'UTF-8');
         // assume UTF-8, all the .po files in iso_639 use it
         textdomain($this->domain);
     }
 }
Ejemplo n.º 2
0
 public static function execute()
 {
     // calculate current file, this directory
     $this_directory = dirname(__FILE__);
     // calculate root directory of the app ../../ from here
     $path_to_parent = $this_directory;
     $path_to_parent = str_replace("\\", "/", $path_to_parent);
     $arrPath = explode("/", $path_to_parent);
     array_pop($arrPath);
     array_pop($arrPath);
     $path_to_parent = implode("/", $arrPath);
     // here so other framework files can reference it
     self::$parent_directory = $path_to_parent;
     // register framework any main xerxes class files
     self::registerClasses("{$path_to_parent}/lib/framework", "Xerxes_Framework");
     // initialize the configuration setting (Registry),
     // command-view mapping (ControllerMap), and
     // language translation (Languages) objects
     $objRegistry = Xerxes_Framework_Registry::getInstance();
     $objRegistry->init();
     $objControllerMap = Xerxes_Framework_ControllerMap::getInstance();
     $objControllerMap->init();
     // set the version number, for interface or other places
     $objRegistry->setConfig("XERXES_VERSION", $objControllerMap->getVersion(), true);
     // dynamically set the web path, if config says so,
     // doesn't work on all webserver/php set-ups, so an
     // explicit web path from config is preferred
     if ($objRegistry->getConfig("base_web_path", false) == '{dynamic}') {
         if (isset($_SERVER)) {
             $script_name = $_SERVER['SCRIPT_NAME'];
             $script_name = str_replace("/index.php", "", $script_name);
             $objRegistry->setConfig("base_web_path", $script_name);
         }
     }
     // give our session a name to keep sessions distinct between multiple
     // instances of xerxes on one server.  use base_path (preferably) or
     // application_name config directives.
     $path_base = $objRegistry->getConfig("base_web_path", false);
     $path_key = preg_replace('/\\W/', '_', $path_base);
     $session_name = "xerxessession_" . $path_key;
     if ($path_base == "") {
         $path_base = "/";
     }
     $session_path = $objRegistry->getConfig("session_path", false, $path_base);
     $session_domain = $objRegistry->getConfig("session_domain", false, null);
     session_name($session_name);
     session_set_cookie_params(0, $session_path, $session_domain);
     session_start();
     // processes the incoming request
     $objRequest = Xerxes_Framework_Request::getInstance();
     $objRequest->init();
     // utility classes
     // assists with basic paging/navigation elements for the view
     $objPage = new Xerxes_Framework_Page($objRequest, $objRegistry);
     // functions for special logging or handling of errors
     $objError = new Xerxes_Framework_Error();
     // language names
     $objLanguage = Xerxes_Framework_Languages::getInstance();
     $objLanguage->init();
     // we'll put the remaining code in a try-catch block in order to show friendly error page
     // for any uncaught exceptions
     try {
         ####################
         #  DISPLAY ERRORS  #
         ####################
         if ($objRegistry->getConfig("DISPLAY_ERRORS") == true) {
             error_reporting(E_ALL);
             ini_set('display_errors', '1');
         }
         ####################
         #   DEFAULTS       #
         ####################
         // labels
         $objLabels = Xerxes_Framework_Labels::getInstance();
         $lang = $objRequest->getProperty("lang");
         $objLabels->init($lang);
         // make sure application_name is passthrough, and has a value.
         $objRegistry->setConfig("application_name", $objRegistry->getConfig("APPLICATION_NAME", false, "Xerxes", $lang), true);
         ####################
         #     SET PATHS    #
         ####################
         ### reverse proxy
         // check to see if xerxes is running behind a reverse proxy and swap
         // host and remote ip here with their http_x_forwarded counterparts;
         // but only if configured for this, since client can spoof the header
         // if xerxes is not, in fact, behind a reverse proxy
         if ($objRegistry->getConfig("REVERSE_PROXY", false, false) == true) {
             $forward_host = $objRequest->getServer('HTTP_X_FORWARDED_HOST');
             $forward_address = $objRequest->getServer('HTTP_X_FORWARDED_FOR');
             if ($forward_host != "") {
                 $objRequest->setServer('SERVER_NAME', $forward_host);
             }
             // last ip address is the user's
             if ($forward_address != "") {
                 $arrIP = explode(",", $forward_address);
                 $objRequest->setServer('REMOTE_ADDR', trim(array_pop($arrIP)));
             }
         }
         // the working directory is the instance, so any relative paths will
         // be executed in relation to the root directory of the instance
         $working_dir = getcwd();
         $working_dir = str_replace("\\", "/", $working_dir);
         // full web path
         //
         // NOTE :if you change this code  make sure you make a corresponding
         // change in lib/framework/Error.php, since there is redundant code
         // there in case something goes horribly wrong and we need to set the
         // web path for proper display of a (friendly) error page
         $base_path = $objRegistry->getConfig('BASE_WEB_PATH', false, "");
         $this_server_name = $objRequest->getServer('SERVER_NAME');
         // check for a non-standard port
         $port = $objRequest->getServer('SERVER_PORT');
         if ($port == 80 || $port == 443) {
             $port = "";
         } else {
             $port = ":" . $port;
         }
         $protocol = "http://";
         if ($objRequest->getServer("HTTPS")) {
             $protocol = "https://";
         }
         $web = $protocol . $this_server_name . $port;
         // register these values
         $objRegistry->setConfig("SERVER_URL", $web);
         $objRegistry->setConfig("PATH_PARENT_DIRECTORY", $path_to_parent);
         $objRegistry->setConfig("APP_DIRECTORY", $working_dir);
         $objRegistry->setConfig("BASE_URL", $web . $base_path, true);
         ####################
         #   INSTRUCTIONS   #
         ####################
         // ControllerMap contains instructions for commands and views
         // based on the url parameters 'base' and 'action'
         $strBase = $objRequest->getProperty("base");
         $strAction = $objRequest->getProperty("action");
         $objControllerMap->setAction($strBase, $strAction, $objRequest);
         ####################
         #  ACCESS CONTROL  #
         ####################
         // if this part of the application is restricted to a local ip range, or requires a named login, then the
         // Restrict class will check the user's ip address or if they have logged in; failure stops the flow
         // and redirects user to a login page with the current request passed as 'return' paramater in the url
         $objRestrict = new Xerxes_Framework_Restrict($objRequest);
         // command line scripts will ignore access rules
         if ($objRequest->isCommandLine() != true) {
             if ($objControllerMap->isRestricted() == true) {
                 if ($objControllerMap->requiresLogin() == true) {
                     // resource requires a valid named username
                     $objRestrict->checkLogin();
                 } else {
                     // resource is resricted, but local ip range is okay
                     $objRestrict->checkIP();
                 }
             } else {
                 // go ahead and register local users, but don't prompt for login
                 $objRestrict->checkIP(false);
             }
         }
         // if this action is set to only be run via the command line, in order to prevent
         // web execution of potentially long-running tasks, then restrict it here
         if (!$objRequest->isCommandLine() && $objControllerMap->restrictToCLI()) {
             throw new Exception("cannot run command from web");
         }
         ####################
         #     INCLUDES     #
         ####################
         // files and directories that have been set to be included by the config file
         foreach ($objControllerMap->getIncludes() as $path_to_include) {
             self::registerClasses($path_to_parent . "/{$path_to_include}");
         }
         ####################
         #       DATA       #
         ####################
         // set-up the data by defining the root element
         $strDocumentElement = $objControllerMap->getDocumentElement();
         $objRequest->setDocumentElement($strDocumentElement);
         // pass config values that should be made available to the XSLT
         $objRequest->addDocument($objRegistry->publicXML());
         // the data will be built-up by calling one or more command classes
         // which will fetch their data based on other parameters supplied in
         // the request; returning that data as xml to a master xml dom document
         // inside the Xerxes_Framework_Request class, or in some cases specififying
         // a url to redirect the user out
         $commands = $objControllerMap->getCommands();
         foreach ($commands as $arrCommand) {
             $strDirectory = $arrCommand[0];
             // directory where the command class is located
             $strNamespace = $arrCommand[1];
             // prefix namespace of the command class
             $strClassFile = $arrCommand[2];
             // suffix name of the command class
             // directory where commands live
             $command_path = "{$path_to_parent}/commands/{$strDirectory}";
             // allow for a local override, even
             $local_command_path = "commands/{$strDirectory}";
             // echo "<h3>$strClassFile</h3>";
             // first, include any parent class, assuming that the parent class will
             // follow the naming convention of having the same name as the directory
             $strParentClass = Xerxes_Framework_Parser::strtoupper(substr($strDirectory, 0, 1)) . substr($strDirectory, 1);
             if (file_exists("{$local_command_path}/{$strParentClass}.php")) {
                 require_once "{$local_command_path}/{$strParentClass}.php";
             } elseif (file_exists("{$command_path}/{$strParentClass}.php")) {
                 require_once "{$command_path}/{$strParentClass}.php";
             }
             // if the specified command class exists in the distro or local commands folder, then
             // instantiate an object and execute it
             $strClass = $strNamespace . "_Command_" . $strClassFile;
             $local_command = file_exists("{$local_command_path}/{$strClassFile}.php");
             if (file_exists("{$command_path}/{$strClassFile}.php") || $local_command) {
                 // if the instance has a local version, take it!
                 if ($local_command) {
                     require_once "{$local_command_path}/{$strClassFile}.php";
                 } else {
                     require_once "{$command_path}/{$strClassFile}.php";
                 }
                 // instantiate the command class and execute it, but only
                 // if it extends xerxes_framework_command
                 $objCommand = new $strClass();
                 if ($objCommand instanceof Xerxes_Framework_Command) {
                     $objCommand->execute($objRequest, $objRegistry);
                 } else {
                     throw new Exception("command classes must be instance of Xerxes_Framework_Command");
                 }
             } else {
                 // if no command but a view was specified, then go ahead and show the view
                 // minus any data, since the view is doin' its own thang
                 if (!file_exists($objControllerMap->getView())) {
                     throw new Exception("invalid command {$strClass}");
                 }
             }
         }
         ####################
         #     COOKIES      #
         ####################
         // any cookies specified in the reuqest object? if so, set em now.
         $cookieSetParams = $objRequest->cookieSetParams();
         foreach ($cookieSetParams as $cookieParams) {
             set_cookie($cookieParams[0], $cookieParams[1], $cookieParams[2], $cookieParams[3], $cookieParams[4], $cookieParams[5]);
         }
         ####################
         #     REDIRECT     #
         ####################
         // if the result of the command is a redirect, we will stop the
         // flow and redirect the user out, unless overridden by the noRedirect
         // directive
         if ($objRequest->getRedirect() != null) {
             if ($objRequest->getProperty("noRedirect") == null) {
                 header("Location: " . $objRequest->getRedirect());
                 exit;
             } else {
                 // include in the resposne what the redirect would have been
                 $objRequest->setProperty("redirect", $objRequest->getRedirect());
             }
         }
         ####################
         #       VIEW       #
         ####################
         // SET THE HTTP HEADER
         //
         // we'll set the content-type, and potentially other header elements, based on the paramater 'format';
         // format must correspond to one of the pre-defined format content-types in setHeader() or can be a user-
         // defined format set in action.xml
         $format = $objRequest->getProperty("format");
         if ($objControllerMap->getFormat($format) != null) {
             header($objControllerMap->getFormat($format));
         } else {
             self::setHeader($format);
         }
         // get the xml from the request object, but exclude any server information
         // from being included if format=source
         $bolShowServer = true;
         if ($format == "xerxes") {
             $bolShowServer = false;
         }
         $objXml = new DOMDocument();
         $objXml = $objRequest->toXML($bolShowServer);
         // RAW XML DISPLAY
         //
         // you can append 'format=xerxes' to the querystring to have this controller spit back
         // the response in plain xml, which can be useful in some cases, like maybe AJAX?
         if ($format == "xerxes") {
             echo $objXml->saveXML();
         } else {
             // VIEW CODE
             //
             // ControllerMap contains instructions on what file to include for the view; typically
             // this will be an xslt file, but could be a php file if the xslt does not
             // provide enough flexibility; php page will inherit the xml dom document and
             // can go from there
             if ($objControllerMap->getView() == "") {
                 // No view specified, no view will be executed.
                 return;
             }
             // PHP CODE
             if ($objControllerMap->getViewType() != "xsl" && $objControllerMap->getViewType() != null) {
                 $file = $objControllerMap->getView();
                 $distro_file = $objRegistry->getConfig("PATH_PARENT_DIRECTORY", true) . "/lib/{$file}";
                 if (file_exists($file)) {
                     require_once $file;
                 } elseif (file_exists($distro_file)) {
                     require_once $distro_file;
                 } else {
                     throw new Exception("Could not find non-xsl view specified to include: {$file}");
                 }
             } else {
                 // XSLT CODE
                 $output = $objPage->transform($objXml, $objControllerMap->getView(), null);
                 // EMBEDED JAVASCRIPT DISPLAY
                 //
                 // you can append 'format=embed_html_js' to the querystring to output
                 // the content as a javascript source document with everything wrapped in
                 // document.write() statements
                 if ($format == "embed_html_js") {
                     // first escape any single quotes
                     $output = str_replace("'", "\\'", $output);
                     // now break the html into lines and output with document.write('')
                     $lines = explode("\n", $output);
                     $new_lines = array("// Javascript output. ");
                     foreach ($lines as $line) {
                         array_push($new_lines, "document.write('" . $line . "');");
                     }
                     $output = implode("\n", $new_lines);
                 }
                 echo $output;
             }
             //remove the flash message, intended for one display only.
             $objRequest->setSession("flash_message", null);
         }
     } catch (Exception $e) {
         $objError->handle($e, $objRequest, $objRegistry);
     }
 }
Ejemplo n.º 3
0
 /**
  * Dynamically create our 'base' stylesheet, combining distro and local
  * stylesheets, as available, using includes and imports into our
  * 'base'.  Base uses the distro file xsl/dynamic_skeleton.xsl to
  * begin with. 
  * 
  * @param string $strXsltRelPath 	Relative path to a stylesheet, generally beginning with "xsl/". 
  * 									Stylesheet may exist in library location, app location, or both. 
  * @param array $arrInclude			[optional] additional stylesheets that should be included in the request
  * @return DomDocument 		A DomDocument holding the generated XSLT stylesheet.
  * @static
  */
 public static function generateBaseXsl($strXsltRelPath, $arrInclude = array())
 {
     $arrImports = array();
     // files to be imported
     $objRegistry = Xerxes_Framework_Registry::getInstance();
     ### first, set up the paths to the distro and local directories
     // the 'local' xsl lives here
     $local_xsl_dir = $objRegistry->getConfig("APP_DIRECTORY", true) . "/";
     $local_path = $local_xsl_dir . $strXsltRelPath;
     // the 'distro' xsl lives here
     $distro_xsl_dir = $objRegistry->getConfig("PATH_PARENT_DIRECTORY", true) . '/lib/';
     $distro_path = $distro_xsl_dir . $strXsltRelPath;
     ### check to make sure at least one of the files exists
     $distro_exists = file_exists($distro_path);
     $local_exists = file_exists($local_path);
     // if we don't have either a local or a distro copy, that's a problem.
     if (!($local_exists || $distro_exists)) {
         // throw new Exception("No xsl stylesheet found: $local_path || $distro_path");
         throw new Exception("No xsl stylesheet found: {$strXsltRelPath}");
     }
     ### now create the skeleton XSLT file that will hold references to both
     ### the distro and the local files
     $generated_xsl = new DOMDocument();
     $generated_xsl->load($distro_xsl_dir . "xsl/dynamic_skeleton.xsl");
     // prepend imports to this, to put them at the top of the file.
     $importInsertionPoint = $generated_xsl->documentElement->firstChild;
     ### add a reference to the distro file
     if ($distro_exists == true) {
         array_push($arrImports, $distro_path);
     } else {
         // if no distro, need to directly import (distro) includes.xsl, since we're not
         // importing a file that will reference it
         array_push($arrImports, $distro_xsl_dir . "xsl/includes.xsl");
     }
     ### language file
     $request = Xerxes_Framework_Request::getInstance();
     $language = $request->getProperty("lang");
     if ($language == "") {
         $language = $objRegistry->defaultLanguage();
     }
     // english file is included by default (as a fallback)
     array_push($arrInclude, "xsl/labels/eng.xsl");
     // if language is set to something other than english
     // then include that file to override the english labels
     if ($language != "eng") {
         array_push($arrInclude, "xsl/labels/{$language}.xsl");
     }
     ### add a refence for files programatically added (including the language file above)
     if ($arrInclude != null) {
         foreach ($arrInclude as $strInclude) {
             // but only if a distro copy exists
             if (file_exists($distro_xsl_dir . $strInclude)) {
                 array_push($arrImports, $distro_xsl_dir . $strInclude);
             }
             // see if there is a local version, and include it too
             if (file_exists($local_xsl_dir . $strInclude)) {
                 array_push($arrImports, $local_xsl_dir . $strInclude);
             }
         }
     }
     ### add a refence to the local file
     if ($local_exists) {
         self::addIncludeReference($generated_xsl, $local_path);
     }
     ### if the distro file  xsl:includes or xsl:imports other files
     ### check if there is a corresponding local file, and import it too
     // We import instead of include in case the local stylesheet does erroneously
     // 'include', to avoid a conflict. We import LAST to make sure it takes
     // precedence over distro.
     if ($distro_exists) {
         $distroXml = simplexml_load_file($distro_path);
         $distroXml->registerXPathNamespace('xsl', 'http://www.w3.org/1999/XSL/Transform');
         // find anything include'd or import'ed in original base file
         $array_merged = array_merge($distroXml->xpath("//xsl:include"), $distroXml->xpath("//xsl:import"));
         foreach ($array_merged as $extra) {
             // path to local copy
             $local_candidate = $local_xsl_dir . dirname($strXsltRelPath) . '/' . $extra['href'];
             // path to distro copy as a check
             $distro_check = $distro_xsl_dir . dirname($strXsltRelPath) . '/' . $extra['href'];
             // make sure local copy exists, and they are both not pointing at the same file
             if (file_exists($local_candidate) && realpath($distro_check) != realpath($local_candidate)) {
                 array_push($arrImports, $local_candidate);
             }
         }
     }
     ### make sure we've got a reference to the local includes too
     array_push($arrImports, $local_xsl_dir . "xsl/includes.xsl");
     // now make sure no dupes
     $arrImports = array_unique($arrImports);
     ### now the actual mechanics of the import
     foreach ($arrImports as $import) {
         self::addImportReference($generated_xsl, $import, $importInsertionPoint);
     }
     // header("Content-type: text/xml"); echo $generated_xsl->saveXML(); exit;
     return $generated_xsl;
 }