public function doExecute() { $lang = $this->request->getProperty("lang"); // main list of subcategories and databases $objXml = new DOMDocument(); $objXml->loadXML("<category />"); // list of subcategories that should go in the sidebar $objSidebar = new DOMDocument(); $objSidebar->loadXML("<sidebar />"); $strOld = $this->request->getProperty("category"); $strSubject = $this->request->getProperty("subject"); $configSidebar = $this->registry->getConfig("SUBCATEGORIES_SIDEBAR", false, null, $lang); $arrSidebar = explode(",", $configSidebar); // look up home page default subject from config if no subject was specified, and we were // instructed to look it up with use_categories_quicksearch=true if ($strSubject == "" && $this->request->getProperty("use_categories_quicksearch") == "true") { $strSubject = $this->registry->getConfig("categories_quicksearch", false, "quick-search", $lang); } $objData = new Xerxes_DataMap(); $objCategoryData = $objData->getSubject($strSubject, $strOld, "metalib", null, $lang); $y = 1; if ($objCategoryData != null) { $objXml->documentElement->setAttribute("name", $objCategoryData->name); $objXml->documentElement->setAttribute("normalized", $objCategoryData->normalized); // standard url for the category $arrParams = array("base" => "databases", "action" => "subject", "subject" => $objCategoryData->normalized); $url = Xerxes_Framework_Parser::escapeXml($this->request->url_for($arrParams)); $objElement = $objXml->createElement("url", $url); $objXml->documentElement->appendChild($objElement); // the attributes of the subcategories $db_list_index = 1; foreach ($objCategoryData->subcategories as $objSubData) { $objSubCategory = $objXml->createElement("subcategory"); $objSubCategory->setAttribute("name", $objSubData->name); $objSubCategory->setAttribute("position", $y); $objSubCategory->setAttribute("id", $objSubData->id); $y++; // the database information foreach ($objSubData->databases as $objDatabaseData) { $objDatabase = Xerxes_Helper::databaseToNodeset($objDatabaseData, $this->request, $this->registry, $db_list_index); $objDatabase = $objXml->importNode($objDatabase, true); $objSubCategory->appendChild($objDatabase); } // if marked for the sidebar, put it there if (in_array($objSubData->name, $arrSidebar)) { $objImport = $objSidebar->importNode($objSubCategory, true); $objSidebar->documentElement->appendChild($objImport); } else { $objXml->documentElement->appendChild($objSubCategory); } } } $this->request->addDocument($objXml); $this->request->addDocument($objSidebar); return 1; }
public function doExecute() { $objXml = new DOMDOcument(); $objXml->loadXML("<databases />"); $strID = $this->request->getProperty("id"); $strQuery = $this->request->getProperty("query"); $alpha = $this->request->getProperty("alpha"); $objDataMap = new Xerxes_DataMap(); $arrResults = array(); if ($strID) { $arrResults = $objDataMap->getDatabases($strID); if (count($arrResults) == 0) { throw new Xerxes_Exception_NotFound("Can not find database with id {$strID}"); } } elseif ($alpha != "") { $this->addAlphaList(); $arrResults = $objDataMap->getDatabasesStartingWith($alpha); } elseif ($strQuery) { $arrResults = $objDataMap->getDatabases(null, $strQuery); } elseif ($this->request->getProperty("suppress_full_db_list") != "true") { $this->addAlphaList(); // only show single letters, please if ($this->registry->getConfig("DATABASE_LIST_SINGLE_LETTER_DISPAY", false, false) && $this->request->getProperty("action") == "alphabetical") { $params = array("base" => "databases", "action" => "alphabetical", "alpha" => "A"); $link = $this->request->url_for($params); $this->request->setRedirect($link); return 0; } // all database $arrResults = $objDataMap->getDatabases(); } foreach ($arrResults as $objDatabaseData) { $objDatabase = Xerxes_Helper::databaseToNodeset($objDatabaseData, $this->request, $this->registry); $objDatabase = $objXml->importNode($objDatabase, true); $objXml->documentElement->appendChild($objDatabase); } $this->request->addDocument($objXml); return 1; }
public function doExecute() { $objXml = new DOMDOcument(); $objXml->loadXML("<category />"); $strSubject = $this->request->getProperty("subject"); $strUser = $this->request->getProperty("username"); $objData = new Xerxes_DataMap(); $objCategoryData = null; // only fetch if we actually have params, avoid the fetch-everything phenomena if ($strSubject && $strUser) { $objCategoryData = $objData->getSubject($strSubject, null, Xerxes_DataMap::userCreatedMode, $strUser); } // if there hasn't if (!$objCategoryData) { if ($this->request->getRedirect()) { // nevermind, we're in the creation process, already redirected, // just end now. return 1; } else { throw new Xerxes_Exception_NotFound("text_collections_error_personal_collection_not_found"); } } // make sure they have access if (!$objCategoryData->published) { Xerxes_Helper::ensureSpecifiedUser($objCategoryData->owned_by_user, $this->request, $this->registry, "text_collections_error_private_collection"); } $y = 1; if ($objCategoryData != null) { $objXml->documentElement->setAttribute("name", $objCategoryData->name); $objXml->documentElement->setAttribute("normalized", $objCategoryData->normalized); $objXml->documentElement->setAttribute("owned_by_user", $objCategoryData->owned_by_user); $objXml->documentElement->setAttribute("published", $objCategoryData->published); // we treat the 'default' collection (usually 'My Saved Records') special // giving it less flexibility for simplicity, in the XSL/javascript. if ($this->isDefaultCollection($objCategoryData)) { $objXml->documentElement->setAttribute("is_default_collection", "yes"); } // standard url for the category $arrParams = array("base" => "collections", "action" => "subject", "username" => $strUser, "subject" => $objCategoryData->normalized); $url = Xerxes_Framework_Parser::escapeXml($this->request->url_for($arrParams)); $objElement = $objXml->createElement("url", $url); $objXml->documentElement->appendChild($objElement); //edit url for the user-created category $arrParams = array("base" => "collections", "action" => "edit_form", "username" => $strUser, "subject" => $objCategoryData->normalized); $url = Xerxes_Framework_Parser::escapeXml($this->request->url_for($arrParams)); $objElement = $objXml->createElement("edit_url", $url); $objXml->documentElement->appendChild($objElement); // the attributes of the subcategories $db_list_index = 1; foreach ($objCategoryData->subcategories as $objSubData) { $objSubCategory = $objXml->createElement("subcategory"); $objSubCategory->setAttribute("name", $objSubData->name); $objSubCategory->setAttribute("position", $y); $objSubCategory->setAttribute("id", $objSubData->id); $y++; // the database information foreach ($objSubData->databases as $objDatabaseData) { $objDatabase = Xerxes_Helper::databaseToNodeset($objDatabaseData, $this->request, $this->registry, $db_list_index); $objDatabase = $objXml->importNode($objDatabase, true); $objSubCategory->appendChild($objDatabase); } $objXml->documentElement->appendChild($objSubCategory); } } $this->request->addDocument($objXml); return 1; }
/** * Do something with uncaught errors */ public static function handle($e, Xerxes_Framework_Request $objRequest, Xerxes_Framework_Registry $objRegistry) { if ($objRegistry->getConfig("DISPLAY_ERRORS", false, false)) { throw $e; } // flag certain exception types for special handling in the xslt $strErrorType = get_class($e); // might be a sub-class, reset so view will catch. if ($e instanceof PDOException) { $strErrorType = "PDOException"; } // if this is the command line, just rethrow the error so we can see it; might // make this a little better formatted in the future if ($objRequest->isCommandLine()) { throw $e; } else { // translate heading and message $labels = Xerxes_Framework_Labels::getInstance(); if ($e instanceof Xerxes_Exception) { $heading = $e->heading(); } else { $heading = "text_error"; } $heading = $labels->getLabel($heading); $message = $labels->getLabel($e->getMessage()); // first output to apache error log error_log("Xerxes error: " . $message . ": " . $e->getTraceAsString()); //set proper http response code $resultStatus = 500; if ($e instanceof Xerxes_Exception_AccessDenied) { $resultStatus = 403; } else { if ($e instanceof Xerxes_Exception_NotFound) { $resultStatus = 404; } } header(' ', true, $resultStatus); // send back http status as internal server error or other specified status // for the web, we'll convert the error message to xml along with the type // of exception and hand display off to the error.xsl file $objError = new DOMDocument(); $objError->loadXML("<error />"); $objMessage = $objError->createElement("message", $message); $objMessage->setAttribute("type", $strErrorType); $objError->documentElement->appendChild($objMessage); $objHeading = $objError->createElement("heading", $heading); $objError->documentElement->appendChild($objHeading); // make sure we're showing the main error file $objRegistry->setConfig("XSL_PARENT_DIRECTORY", null); // set the base url for the error.xsl file's benefit; don't want to assume that // the earlier code to this effect was executed before an exception, so this is redundant $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 . $base_path; $objBaseURL = $objError->createElement("base_url", $web); $objError->documentElement->appendChild($objBaseURL); // if it's a db denied exception, include info on dbs. if ($e instanceof Xerxes_Exception_DatabasesDenied) { $excluded_xml = $objError->createElement("excluded_dbs"); $objError->documentElement->appendChild($excluded_xml); foreach ($e->deniedDatabases() as $db) { $element = Xerxes_Helper::databaseToNodeset($db, $objRequest, $objRegistry); $element = $objError->importNode($element, true); $excluded_xml->appendChild($element); } } // add in the request object's stuff $request_xml = $objRequest->toXML(); $imported = $objError->importNode($request_xml->documentElement, true); foreach ($imported->childNodes as $childNode) { $objError->documentElement->appendChild($childNode); } if ($objRequest->getProperty("format") == "xerxes") { header('Content-type: text/xml'); echo $objError->saveXML(); } else { // display it to the user. Transform will pick up local // xsl for error page too, great. echo Xerxes_Framework_Parser::transform($objError, "xsl/error.xsl"); } } // need to incorporate methods for doing additional actions based on the type // of error -- probably a config option }
public function doExecute() { // metalib search object $objSearch = $this->getSearchObject(); // params from the request $strQuery = $this->request->getProperty("query"); $strQuery2 = $this->request->getProperty("query2"); $strField = $this->request->getProperty("field"); $strField2 = $this->request->getProperty("field2"); $strFindOperator = $this->request->getProperty("find_operator1"); $arrDatabases = $this->request->getProperty("database", true); $strSubject = $this->request->getProperty("subject"); $strSpell = $this->request->getProperty("spell"); $strContext = $this->request->getProperty("context"); $strContextUrl = $this->request->getProperty("context_url"); // configuration options $configNormalize = $this->registry->getConfig("NORMALIZE_QUERY", false, false); $configBaseUrl = $this->registry->getConfig("BASE_URL", true); $configYahooID = $this->registry->getConfig("YAHOO_ID", false, "calstate"); $configSearchLimit = $this->registry->getConfig("SEARCH_LIMIT", true); $configContextUrl = $this->registry->getConfig("LIMIT_CONTEXT_URL", false); // if so configured, ensure that context_url is limited to certain domain(s) if ($configContextUrl != null) { $bolPassed = Xerxes_Framework_Parser::withinDomain($strContextUrl, $configContextUrl); if ($bolPassed == false) { throw new Exception("context_url only allowed for specified domains"); } } // database communications object $objData = new Xerxes_DataMap(); // if subject is given but not databases, automatically find // databases for subject, from first sub-category. if ($strSubject != null && count($arrDatabases) == 0) { $search_limit = $this->registry->getConfig("SEARCH_LIMIT", true); $arrDatabases = array(); $objSubject = $objData->getSubject(strtolower($strSubject), null, "metalib", null, $this->request->getProperty("lang")); // did we find a subject that has subcategories? if ($objSubject != null && $objSubject->subcategories != null && count($objSubject->subcategories) > 0) { $subs = $objSubject->subcategories; $objSubcategory = $subs[0]; $index = 0; // get databases up to search limit from first subcat, // add to $arrdatabases. foreach ($objSubcategory->databases as $objDatabaseData) { if ($objDatabaseData->searchable == 1) { array_push($arrDatabases, $objDatabaseData->metalib_id); $index++; } if ($index >= $search_limit) { break; } } } } // if we have a subject, but no context/contexturl, look // them up for the subject. Allows convenient defaults // for direct-linking into search results. if ($strContext == "" && $strSubject != "") { // look up the subject if we haven't already, to get the name. if (!isset($objSubject)) { $objSubject = $objData->getSubject($strSubject); } $strContext = $objSubject->name; } if ($strContextUrl == "" && $strSubject != "") { $strContextUrl = $this->request->url_for(array("base" => "databases", "action" => "subject", "subject" => $strSubject)); } // ensure a query and field if ($strQuery == "") { throw new Exception("text_metasearch_error_no_search_terms"); } if ($strField == "") { $strField = "WRD"; } if ($strField2 == "") { $strField2 = "WRD"; } if ($strFindOperator == "") { $strFindOperator = "AND"; } // get databases $arrDB = $objData->getDatabases($arrDatabases); // start out database information xml object. $objXml = new DOMDocument(); $objXml->loadXML("<search />"); // access control for databases $excludedDbs = array(); $excludedIDs = array(); foreach ($arrDB as $db) { if (!Xerxes_Helper::dbSearchableForUser($db, $this->request, $this->registry)) { $excludedDbs[] = $db; $excludedIDs[] = (string) $db->metalib_id; } } if (count($excludedDbs) > 0) { // remove excluded dbs from our db lists. what a pain in php, sorry. foreach ($arrDB as $key => $db) { if (in_array((string) $db->metalib_id, $excludedIDs)) { unset($arrDB[$key]); } } foreach ($arrDatabases as $key => $id) { if (in_array($id, $excludedIDs)) { unset($arrDatabases[$key]); } } // and make a note of the excluded dbs please. $excluded_xml = $objXml->createElement("excluded_dbs"); $objXml->documentElement->appendChild($excluded_xml); foreach ($excludedDbs as $db) { $element = Xerxes_Helper::databaseToNodeset($db, $this->request, $this->registry); $element = $objXml->importNode($element, true); $excluded_xml->appendChild($element); } } // ensure correct number of databases selected if (count($arrDatabases) < 1 && count($excludedDbs) > 0) { $e = new Xerxes_Exception_DatabasesDenied("text_metasearch_error_not_authorized"); $e->setDeniedDatabases($excludedDbs); throw $e; } elseif (count($arrDatabases) < 1) { throw new Exception("text_metasearch_error_no_databases"); } if (count($arrDatabases) > $configSearchLimit) { $labels = Xerxes_Framework_Labels::getInstance(); $error = $labels->getLabel("text_metasearch_error_too_many_databases"); $error = sprintf($error, $configSearchLimit); throw new Exception($error); } $strSpellCorrect = ""; // spelling correction $strSpellUrl = ""; // return url for spelling change $strGroup = ""; // group id number $strNormalizedQuery = ""; // normalized query // query parser provides normalization and spell check $objQueryParser = new Xerxes_QueryParser(); // normalize query option is still experimental (2009-04-16) $strFullQuery = $objQueryParser->normalizeMetalibQuery($strField, $strQuery, $strFindOperator, $strField2, $strQuery2, $configNormalize); // initiate search with Metalib $strGroup = $objSearch->search($strFullQuery, $arrDatabases); // something went wrong, yo! if ($strGroup == "") { throw new Exception("Could not initiate search with Metalib server"); } // check spelling unless this is a return submission from a previous spell correction $strSpellSuggestions = null; if ($strSpell == null) { // check spelling $strAltYahoo = $this->registry->getConfig("ALTERNATE_YAHOO_LOCATION", false); $strSpellCorrect = $objQueryParser->checkSpelling($strQuery, $configYahooID, $strAltYahoo); $strSpellCorrect2 = null; if ($strQuery2) { $strSpellCorrect2 = $objQueryParser->checkSpelling($strQuery2, $configYahooID); } if ($strSpellCorrect != "" || $strSpellCorrect2 != "") { // construct spell check return url with spelling suggestion // If both search fields were used (advanced search), spell corrections // may be in first, second, or both. $strNewQuery = $strQuery; $arrSuggestions = array(); if ($strSpellCorrect) { $strNewQuery = $strSpellCorrect; array_push($arrSuggestions, $strSpellCorrect); } $strNewQuery2 = $strQuery2; if ($strSpellCorrect2) { $strNewQuery2 = $strSpellCorrect2; array_push($arrSuggestions, $strSpellCorrect2); } $strSpellSuggestions = join(" ", $arrSuggestions); $strSpellUrl = "./?base=metasearch&action=search&spell=1&query=" . urlencode($strNewQuery) . "&field=" . $strField; if ($strNewQuery2) { $strSpellUrl .= "&query2=" . urlencode($strNewQuery2) . "&field2=" . $strField2; } $strSpellUrl .= "&context=" . urlencode($strContext); $strSpellUrl .= "&context_url=" . urlencode($strContextUrl); foreach ($arrDatabases as $strDatabase) { if ($strDatabase != null) { $strSpellUrl .= "&database=" . $strDatabase; } } } } // create search information xml $arrSearch = array(); $arrSearch["date"] = date("Y-m-d"); $arrSearch["spelling"] = $strSpellSuggestions; $arrSearch["spelling_url"] = $strSpellUrl; $arrSearch["context"] = $strContext; $arrSearch["context_url"] = $strContextUrl; foreach ($arrSearch as $key => $value) { $objElement = $objXml->createElement($key, Xerxes_Framework_Parser::escapeXml($value)); $objXml->documentElement->appendChild($objElement); } $objPair = $objXml->createElement("pair"); $objPair->setAttribute("position", 1); $objXml->documentElement->appendChild($objPair); $arrQuery = array(); $arrQuery["query"] = $strQuery; $arrQuery["field"] = $strField; $arrQuery["normalized"] = $strFullQuery; foreach ($arrQuery as $key => $value) { $objElement = $objXml->createElement($key, Xerxes_Framework_Parser::escapeXml($value)); $objPair->appendChild($objElement); } // add second pair if present. if ($strQuery2) { $objOperator = $objXml->createElement("operator", $strFindOperator); $objOperator->setAttribute("position", 1); $objXml->documentElement->appendChild($objOperator); $objPair = $objXml->createElement("pair"); $objPair->setAttribute("position", 2); $objXml->documentElement->appendChild($objPair); $arrQuery = array(); $arrQuery["query"] = $strQuery2; $arrQuery["field"] = $strField2; foreach ($arrQuery as $key => $value) { $objElement = $objXml->createElement($key, Xerxes_Framework_Parser::escapeXml($value)); $objPair->appendChild($objElement); } } // get links from ird records for those databases that have been included in the search and // store it here so we can get at this information easily on any subsequent page without having // to go back to the database $objDatabaseLinks = $objXml->createElement("database_links"); $objXml->documentElement->appendChild($objDatabaseLinks); foreach ($arrDB as $objDatabase) { // create a database node and append to database_links $objNodeDatabase = Xerxes_Helper::databaseToLinksNodeset($objDatabase, $this->request, $this->registry); $objNodeDatabase = $objXml->importNode($objNodeDatabase, true); $objDatabaseLinks->appendChild($objNodeDatabase); } // add any warnings from metalib $objWarnings = $objSearch->getWarnings(); if ($objWarnings != null) { $objImport = $objXml->importNode($objWarnings->documentElement, true); $objXml->documentElement->appendChild($objImport); } $strGroup = $this->getSearchDate() . "-" . $strGroup; // save this information in the cache $this->setCache($strGroup, "search", $objXml); // redirect to hits page $arrParams = array("base" => "metasearch", "action" => "hits", "group" => $strGroup); $this->saveCache(); $this->request->setRedirect($this->request->url_for($arrParams)); return 1; }