function onSearch($text, $phrase = '', $ordering = '', $areas = null) { require_once JPATH_SITE . DS . 'components' . DS . 'com_content' . DS . 'helpers' . DS . 'route.php'; require_once JPATH_SITE . DS . 'administrator' . DS . 'components' . DS . 'com_search' . DS . 'helpers' . DS . 'search.php'; $return = array(); $searchText = $text; if (is_array($areas)) { if (!array_intersect($areas, array_keys($this->onSearchAreas()))) { return $return; } } $text = trim($text); if ($text == '') { return $return; } // objeto usuario joomla $user =& JFactory::getUser(); // conexión a la base de datos $db =& JFactory::getDBO(); $nullDate = $db->getNullDate(); $date =& JFactory::getDate(); $now = $date->toMySQL(); // load plugin params info $plugin =& JPluginHelper::getPlugin('search', 'solrsearch'); $pluginParams = new JParameter($plugin->params); $sContent = $pluginParams->get('search_content', 1); $sUncategorised = $pluginParams->get('search_uncategorised', 1); $sArchived = $pluginParams->get('search_archived', 1); $limit = $pluginParams->def('search_limit', 50); $ws_endpoint = $pluginParams->def('ws_endpoint', null); // No se especifico ningún endpoint en la configuración if ($ws_endpoint == null) { return array(); } $xmlstr = <<<XML <?xml version="1.0" encoding="UTF-8"?> <ns0:requerimiento xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ns0='http://xml.netbeans.org/schema/ZonalesSolrQueryRequerimiento' xsi:schemaLocation='http://xml.netbeans.org/schema/ZonalesSolrQueryRequerimiento ZonalesSolrQueryRequerimiento.xsd'> <ns0:contenido> <ns0:query></ns0:query> </ns0:contenido> </ns0:requerimiento> XML; $ns = "http://www.zonales.com.ar/schema/ZonalesSolrQueryRespuesta"; $ns1 = "http://xml.netbeans.org/schema/ZonalesSolrQueryRequerimiento"; $option = array('trace' => 1, 'exceptions' => TRUE); /** * http://bugs.php.net/bug.php?id=34657 * http://bugs.xdebug.org/view.php?id=249 * * "Supuestamente" solucionado, pero igualmente sigue apareciendo un * error fatal que no puede ser atrapado por el catch... para resolver * el problema, temporalmente, se desactiva xdebug, si esta habilitado. */ if (array_search('xdebug', get_loaded_extensions()) !== FALSE) { xdebug_disable(); } try { $client = new SoapClient($ws_endpoint, $option); } catch (Exception $e) { return $return; } // ---------- requerimiento ---------------- $xml = simplexml_load_string($xmlstr, null, null, $ns1); $xml->contenido->query = $text; // Ordenamiento $sortFields = $xml->contenido->addChild('ns0:sortFields', null, $ns1); // Ordenamiento por defecto, en base al 'score' de solr $sort = $sortFields->addChild('ns0:sort', null, $ns1); $sort->addAttribute("field", "score"); $sort->addAttribute("order", "desc"); // Ordenamiento seleccionado por el usuario $sort = $sortFields->addChild('ns0:sort', null, $ns1); /** * TODO: Parametrizar en el backend que campo en el esquema de solr * que deberá utilizarse para cada tipo de ordenamiento, y así envíar * en el resquest unicamente el concepto (ej, 'oldest') y el orden. */ switch ($ordering) { case 'oldest': $sort->addAttribute("field", "creationDate"); $sort->addAttribute("order", "asc"); break; case 'popular': $sort->addAttribute("field", "hits"); $sort->addAttribute("order", "desc"); break; case 'alpha': $sort->addAttribute("field", "title_s"); $sort->addAttribute("order", "asc"); break; case 'category': $sort->addAttribute("field", "category_s"); $sort->addAttribute("order", "asc"); break; case 'newest': default: $sort->addAttribute("field", "creationDate"); $sort->addAttribute("order", "desc"); break; } $parametros = $xml->contenido->addChild('ns0:parametros', null, $ns1); // Informacion del Usuario $parametro = $parametros->addChild('ns0:parametro', null, $ns1); $parametro->addChild('ns0:clave', null, $ns1); $parametro->addChild('ns0:valor', null, $ns1); $parametro->clave = 'usuario'; $parametro->valor = $user->id; // User aid $parametro = $parametros->addChild('ns0:parametro', null, $ns1); $parametro->addChild('ns0:clave', null, $ns1); $parametro->addChild('ns0:valor', null, $ns1); $parametro->clave = 'usuario_aid'; $parametro->valor = $user->aid; // Límite de la búsqueda $parametro = $parametros->addChild('ns0:parametro', null, $ns1); $parametro->addChild('ns0:clave', null, $ns1); $parametro->addChild('ns0:valor', null, $ns1); $parametro->clave = 'limit'; $parametro->valor = $limit; // Búsqueda en Solr $response = $client->solrquery(array("mensaje" => $xml->asXML())); if ($response == null || !isset($response->return)) { return $return; } $xmlResp = simplexml_load_string($response->return, null, null, $ns); foreach ($xmlResp->contenido->resultados->resultado as $r) { $item = new stdClass(); $item->href = ContentHelperRoute::getArticleRoute($r->id); $item->title = $r->titulo; if (isset($r->section) && isset($r->category)) { $item->section = $doc->section . '/' . $doc->category; } else { $item->section = JText::_('Uncategorised Content'); } $item->created = $now; $item->text = $r->texto; $item->browsernav = ''; $return[] = $item; } return $return; }