data = new ExaleadData();
$this->currentGroup = new ExaleadGroup();
$this->currentCategories = array();
$this->currentSpelling = new ExaleadSpelling();
$this->currentHit = new ExaleadHit();
$this->currentHitField = new ExaleadHitField();
$this->currentHitGroup = new ExaleadHitGroup();
$this->currentHitCategory = new ExaleadHitCategory();
$this->currentAction = new ExaleadAction();
$this->currentTextSegment = new ExaleadTextSegment();
$this->currentQuery = new ExaleadQuery();
$this->currentQueryTerm = new ExaleadQueryTerm();
$this->currentQueryParameter = new ExaleadQueryParameter();
$this->currentKeyword = new ExaleadKeyword();
//url de base du produit Exalead
$this->base_cgi = $base_cgi;
if(!empty($override_query_all)){
$this->query_all = $override_query_all;
}
else{
$this->query_all = $GLOBALS['query_all'];
}
}
/**** Fonctions d'interface avec le cgi d'Exalead Corporate ******/
function set_base_cgi($base_cgi){
$this->base_cgi = $base_cgi;
}
//retourne vrai si une requete a été faite, faux sinon
function query($varname = 'query'){
if(!empty($_REQUEST[$varname])){
$this->first_query(stripslashes($_REQUEST[$varname]));
return true;
}
elseif(isset($_REQUEST['_C'])){
$this->handle_request();
return true;
}
return false;
}
//a appeller pour faire la premiere requete
function first_query($query, $offset = 0){
if(empty($this->base_cgi)) return false;
//$tmp = parse_url($this->base_cgi);
//$view_name = substr($tmp['path'], 5);
//$query_exa = $this->base_cgi."?_q=".urlencode($query)."&_f=xml2&A=-1&_vn=".$view_name;
$query_exa = $this->base_cgi."?_q=".urlencode($query)."&_f=xml2";
if($offset > 0){
$query_exa .= "&_s=".$offset;
}
$xml_response = file_get_contents($query_exa);
/*$xml_response = '';
$query_explode = parse_url($query_exa);
$fp = fsockopen("murphy.m4x.org", 10000, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)
\n";
} else {
$out = "GET {$query_explode['path']}?{$query_explode['query']} HTTP/1.1\r\n";
$out .= "Host: murphy.m4x.org:10000\r\n";
$out .= "Accept: text/xml\r\n";
$out .= "Accept-Charset: utf-8\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$body = false;
while (!feof($fp)) {
$s = fgets($fp, 1024);
if ( $body )
$xml_response .= $s;
if ( $s == "\r\n" )
$body = true;
}
fclose($fp);
}*/
//echo $xml_response;exit;
$this->parse($xml_response);
//var_dump($this);
}
//pour recuperer tous les résultats d'une base indexée
function get_db_dump(){
$this->first_query($this->query_all);
}
function handle_request(){
if(empty($this->base_cgi)) return false;
if(empty($_REQUEST['_C'])) return false;// _C est le contexte Exalead
$query_exa = $this->base_cgi.'/_C='.str_replace(' ', '%20', $_REQUEST['_C']).'&_f=xml2';
if(!empty($_REQUEST['_s'])){
$query_exa .= "&_s=".((int) $_REQUEST['_s']);
}
$xml_response = file_get_contents($query_exa);
$this->parse($xml_response);
}
/******** Fonctions annexes relatives au parser ********/
function createParser(){
$this->parserId = xml_parser_create();
xml_set_element_handler($this->parserId, array(&$this, "startElement"), array(&$this, "endElement"));
xml_set_character_data_handler($this->parserId, array(&$this, "parsePCData"));
}
function freeParser(){
xml_parser_free($this->parserId);
}
function parseString($string){
if (!xml_parse($this->parserId, $string, true)) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->parserId)),
xml_get_current_line_number($this->parserId)));
}
}
/******** Méthode qui lance le parser ***********/
function parse($string){
$this->createParser();
$this->parseString($string);
$this->freeParser();
}
/********* fonctions spécifiques à chaque balise ******/
//Ces méthodes peuvent être surchargées
function startQuery(&$attrs){
$this->currentQuery->query = utf8_decode($attrs['QUERY']);
$this->currentQuery->context = $attrs['CONTEXT'];
$this->currentQuery->time = $attrs['TIME'];
if(isset($attrs['INTERRUPTED'])) $this->currentQuery->interrupted = $attrs['INTERRUPTED'];
if(isset($attrs['BROWSED'])) $this->currentQuery->browsed = $attrs['BROWSED'];
}
function StartQueryTerm(&$attrs){
$this->currentQueryTerm->level = $attrs['LEVEL'];
$this->currentQueryTerm->regexp = utf8_decode($attrs['REGEXP']);
}
function startQueryParameter(&$attrs){
$this->currentQueryParameter->name = $attrs['NAME'];
if(isset($attrs['VALUE'])) $this->currentQueryParameter->value = utf8_decode($attrs['VALUE']);
}
function startKeyword(&$attrs){
if(isset($attrs['NAME'])) $this->currentKeyword->name = $attrs['NAME'];
$this->currentKeyword->display = utf8_decode( $attrs['DISPLAY'] );
$this->currentKeyword->count = $attrs['COUNT'];
$this->currentKeyword->automatic = $attrs['AUTOMATIC'];
if(isset($attrs['REFINEHREF'])) $this->currentKeyword->refine_href = convert_url($attrs['REFINEHREF']);
if(isset($attrs['EXCLUDEHREF'])) $this->currentKeyword->exclude_href = $attrs['EXCLUDEHREF'];
if(isset($attrs['RESETHREF'])) $this->currentKeyword->reset_href = $attrs['RESETHREF'];
}
function startHits(&$attrs){
$this->data->nmatches = $attrs['NMATCHES'];
$this->data->nhits = $attrs['NHITS'];
if(isset($attrs['INTERRUPTED'])) $this->data->interrupted = $attrs['INTERRUPTED'];
$this->data->last = $attrs['LAST'];
$this->data->end = $attrs['END'];
$this->data->start = $attrs['START'];
}
function startHit(&$attrs){
$this->currentHit->url = $attrs['URL'];
$this->currentHit->score = $attrs['SCORE'];
}
function startHitGroup(&$attrs){
$this->currentHitGroup->title = utf8_decode($attrs['TITLE']);
$this->currentHitGroup->gid = $attrs['GID'];
}
function startHitCategory(&$attrs){
$this->currentHitCategory->name = $attrs['NAME'];
$this->currentHitCategory->display = utf8_decode($attrs['DISPLAY']);
$this->currentHitCategory->cref = $attrs['CREF'];
$this->currentHitCategory->gid = $attrs['GID'];
if(isset($attrs['BROWSEHREF'])) $this->currentHitCategory->browsehref = $attrs['BROWSEHREF'];
}
function startAction(&$attrs){
$this->currentAction->display = $attrs['DISPLAY'];
$this->currentAction->kind = $attrs['KIND'];
if(isset($attrs['EXECHREF']))$this->currentAction->execHref = $attrs['EXECHREF'];
}
function startHitField(&$attrs){
$this->currentHitField->name = $attrs['NAME'];
if(isset($attrs['VALUE'])) $this->currentHitField->value = utf8_decode($attrs['VALUE']);
}
function startTextSeg(&$attrs){
$this->currentTextSegment->setHighlighted($attrs['HIGHLIGHTED']);
}
function startTextCut(&$attrs){}
function startSpellingSuggestionVariant(&$attrs){
$this->currentSpelling->setDisplay($attrs['DISPLAY']);
$this->currentSpelling->setQueryHref($attrs['QUERY']);
}
function startGroup(&$attrs){
$this->currentGroup->setGid(utf8_decode($attrs['GID']));
$this->currentGroup->setTitle(utf8_decode($attrs['TITLE']));
$this->currentGroup->setClipped($attrs['CLIPPED']);
$this->currentGroup->setCount($attrs['COUNT']);
$this->currentGroup->setBrowsed($attrs['BROWSED']);
if(isset($attrs['CLIPHREF'])) $this->currentGroup->setClipHref($attrs['CLIPHREF']);
if(isset($attrs['RESETHREF'])) $this->currentGroup->setResetHref($attrs['RESETHREF']);
}
function startCategory(&$attrs){
$currentCategory = new ExaleadCategory();
$currentCategory->name = utf8_decode($attrs['NAME']);
$currentCategory->display = utf8_decode($attrs['DISPLAY']);
$currentCategory->count = $attrs['COUNT'];
$currentCategory->automatic = $attrs['AUTOMATIC'];
$currentCategory->cref = $attrs['CREF'];
if(isset($attrs['REFINEHREF'])) $currentCategory->refine_href = convert_url($attrs['REFINEHREF']);
$currentCategory->exclude_href = '_c=-'.$currentCategory->cref;
if(isset($attrs['RESETHREF'])){
$currentCategory->reset_href = $attrs['RESETHREF'];
}
$currentCategory->gid = $attrs['GID'];
$currentCategory->gcount = $attrs['GCOUNT'];
$this->currentCategories[] = $currentCategory;
}
function startSearch(&$attrs){}
function startElement($parser, $name, $attrs) {
//echo "start $name
";
//recupération des paramètres de query
if($name == 'QUERY'){
$this->startQuery($attrs);
}
elseif($name == 'QUERYTERM'){
$this->startQueryTerm($attrs);
}
elseif($name == 'QUERYPARAMETER'){
$this->startQueryParameter($attrs);
}
//gestion des mots-clés
elseif($name == 'KEYWORD'){
$this->startKeyword($attrs);
}
//gestion des resultats
elseif($name == 'HITS'){
$this->startHits($attrs);
}
elseif($name == 'HIT'){
$this->startHit($attrs);
}
elseif($name == 'HITFIELD'){
$this->startHitField($attrs);
}
elseif($name == 'HITGROUP'){
$this->startHitGroup($attrs);
}
elseif($name == 'HITCATEGORY'){
$this->startHitCategory($attrs);
}
elseif($name == 'ACTION'){
$this->startAction($attrs);
}
elseif($name == 'TEXTSEG'){
$this->startTextSeg($attrs);
}
elseif($name == 'TEXTCUT'){
$this->startTextCut($attrs);
}
//gestion suggestions d'orthographe
elseif($name == 'SPELLINGSUGGESTIONVARIANT'){
$this->startSpellingSuggestionVariant($attrs);
}
//gestion des categories pour raffiner
elseif($name == 'GROUP'){
$this->startGroup($attrs);
}
elseif($name == 'CATEGORY'){
$this->startCategory($attrs);
}
elseif($name == 'SEARCH'){
$this->startSearch($attrs);
}
}
function endQuery(){
$this->data->query = $this->currentQuery;
$this->currentQuery->clear();
}
function endQueryTerm(){
$this->currentQuery->addTerm($this->currentQueryTerm);
$this->currentQueryTerm->clear();
}
function endQueryParameter(){
$this->currentQuery->addParameter($this->currentQueryParameter);
$this->currentQueryParameter->clear();
}
function endKeyword(){
$this->data->addKeyword($this->currentKeyword);
$this->currentKeyword->clear();
}
function endHits(){
}
function endHit(){
$this->data->addHit($this->currentHit);
$this->currentHit->clear();
}
function endHitGroup(){
$this->currentHit->addHitGroup($this->currentHitGroup);
$this->currentHitGroup->clear();
}
function endHitCategory(){
$this->currentHitGroup->addHitCategory($this->currentHitCategory);
$this->currentHitCategory->clear();
}
function endAction(){
$this->currentHit->addAction($this->currentAction);
$this->currentAction->clear();
}
function endHitField(){
$this->currentHit->addHitField($this->currentHitField);
$this->currentHitField->clear();
}
function endTextSeg(){
$this->currentHitField->addTextSegment($this->currentTextSegment);
$this->currentTextSegment->clear();
}
function endTextCut(){
$this->currentHitField->setHasTextCut(true);
}
function endSpellingSuggestionVariant(){
$this->data->addSpelling($this->currentSpelling);
$this->currentSpelling->clear();
}
function endGroup(){
$this->data->addGroup($this->currentGroup);
$this->currentGroup->clear();
}
function endCategory(){
//the parent element is a Group element ?
if(count($this->currentCategories) == 1){
$this->currentGroup->addCategory(array_pop($this->currentCategories));
}
else{
//var_dump($this->currentCategories);
$category = array_pop($this->currentCategories);
//reset($this->currentCategories);
end($this->currentCategories);
//var_dump($this->currentCategories);
$parentCategory = &$this->currentCategories[key($this->currentCategories)];
//var_dump($parentCategory);
$parentCategory->addCategory($category);
}
}
function endSearch(){
}
function endElement($parser, $name) {
//echo "end $name
";
if($name == 'QUERY'){
$this->endQuery();
}
elseif($name == 'QUERYTERM'){
$this->endQueryTerm();
}
elseif($name == 'QUERYPARAMETER'){
$this->endQueryParameter();
}
elseif($name == 'KEYWORD'){
$this->endKeyword();
}
elseif($name == 'HITS'){
$this->endHits();
}
elseif($name == 'HIT'){
$this->endHit();
}
elseif($name == 'HITFIELD'){
$this->endHitField();
}
elseif($name == 'HITGROUP'){
$this->endHitGroup();
}
elseif($name == 'HITCATEGORY'){
$this->endHitCategory();
}
elseif($name == 'ACTION'){
$this->endAction();
}
elseif($name == 'TEXTSEG'){
$this->endTextSeg();
}
elseif($name == 'TEXTCUT'){
$this->endTextCut();
}
//gestion suggestions d'orthographe
elseif($name == 'SPELLINGSUGGESTIONVARIANT'){
$this->endSpellingSuggestionVariant();
}
//gestion des categories pour raffiner
elseif($name == 'GROUP'){
$this->endGroup();
}
elseif($name == 'CATEGORY'){
$this->endCategory();
}
elseif($name == 'SEARCH'){
$this->endSearch();
}
}
function parsePCData($parser, $text){
$this->currentTextSegment->append(utf8_decode($text));
}
}
?>