1
BigJim
Can't make changes to the search function - help needed!
  • 2008/5/28 12:09

  • BigJim

  • Just popping in

  • Posts: 78

  • Since: 2007/7/16


Hi there

I'm trying to adjust the search feature for a module (classifieds).

I want it to search by one additional field (called 'level').

I've added the field to the search form

Then I did GET/POST in the module/search.php page (I know this works because if I do an echo "$level" statement in search.php it displays).

But in search.inc.php I can't make the search work with this new field.

$sql .= "AND (l.type LIKE '$level')

If i enter the value directly it works

$sql .= "AND (l.type LIKE 'PGT')

But if i change it back to '$level' it doesn't work. So I guess search.inc.php can't read the value of $level

I've tried adding it to the search function in search.inc.php, like this:

function classifieds_search($queryarray, $andor, $limit, $offset, $userid, $level)

But that doesn't do it

I'm stumped, can anyone tell me how to make it work

thanks a lot for any help!!

2
trabis
Re: Can't make changes to the search function - help needed!
  • 2008/5/28 12:47

  • trabis

  • Core Developer

  • Posts: 2269

  • Since: 2006/9/1 1


You would have to hack search function in kernel/module.php

Change it to
function search($term ''$andor 'AND'$limit 0$offset 0$userid 0$level='')
    {
        if (
$this->getVar('hassearch') != 1) {
            return 
false;
        }
        
$search =& $this->getInfo('search');
        if (
$this->getVar('hassearch') != || !isset($search['file']) || !isset($search['func']) || $search['func'] == '' || $search['file'] == '') {
            return 
false;
        }
        if (
file_exists(XOOPS_ROOT_PATH."/modules/".$this->getVar('dirname').'/'.$search['file'])) {
            include_once 
XOOPS_ROOT_PATH.'/modules/'.$this->getVar('dirname').'/'.$search['file'];
        } else {
            return 
false;
        }
        if (
function_exists($search['func'])) {
            
$func $search['func'];
            return 
$func($term$andor$limit$offset$userid$level);
        }
        return 
false;
    }

3
BigJim
Re: Can't make changes to the search function - help needed!
  • 2008/5/29 3:53

  • BigJim

  • Just popping in

  • Posts: 78

  • Since: 2007/7/16


thanks a lot trabis but that hasn't done it

I've made the change to kernel/modules and here is what my search.php and search.inc.php files now look like (classifieds module)

Search.php

$xoopsOption
['pagetype'] = "search";

include 
'../../mainfile.php';
$mydirname basenamedirname__FILE__ ) ) ;
$search_lang =  '_' strtoupper$mydirname ) ;
$xmid $xoopsModule->getVar('mid');
$config_handler =& xoops_gethandler('config');
$xoopsConfigSearch =& $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);
if (
$xoopsConfigSearch['enable_search'] != 1) {
    
header("Location: '.XOOPS_URL.'modules/$mydirname/index.php");
    exit();
}
$action "search";
if (!empty(
$_GET['action'])) {
  
$action $_GET['action'];
} elseif (!empty(
$_POST['action'])) {
  
$action $_POST['action'];
}
$query "";
if (!empty(
$_GET['query'])) {
  
$query $_GET['query'];
} elseif (!empty(
$_POST['query'])) {
  
$query $_POST['query'];
}
$andor "AND";
if (!empty(
$_GET['andor'])) {
  
$andor $_GET['andor'];
} elseif (!empty(
$_POST['andor'])) {
  
$andor $_POST['andor'];
}
$mid $uid $start 0;
if ( !empty(
$_GET['mid']) ) {
  
$mid intval($_GET['mid']);
} elseif ( !empty(
$_POST['mid']) ) {
  
$mid intval($_POST['mid']);
}
if (!empty(
$_GET['uid'])) {
  
$uid intval($_GET['uid']);
} elseif (!empty(
$_POST['uid'])) {
  
$uid intval($_POST['uid']);
}

if (!empty(
$_GET['level'])) {
  
$level $_GET['level'];
} elseif (!empty(
$_POST['level'])) {
  
$level $_POST['level'];
}
if (!empty(
$_GET['start'])) {
  
$start intval($_GET['start']);
} elseif (!empty(
$_POST['start'])) {
  
$start intval($_POST['start']);
}
$queries = array();



if (
$action == "results") {
    if (
$query == "") {
         
redirect_header("search.php",1,_SR_PLZENTER);
        exit();
    }
} elseif (
$action == "showall") {
    if (
$query == "" || empty($mid)) {
        
redirect_header("search.php",1,_SR_PLZENTER);
        exit();
    }
} elseif (
$action == "showallbyuser") {
    if (empty(
$mid) || empty($uid)) {
        
redirect_header("search.php",1,_SR_PLZENTER);
        exit();
    }
}

$groups is_object($xoopsUser) ? $xoopsUser -> getGroups() : XOOPS_GROUP_ANONYMOUS;
$gperm_handler = & xoops_gethandler'groupperm' );
$available_modules $gperm_handler->getItemIds('module_read'$groups);

if (
$action == 'search') {
    include 
XOOPS_ROOT_PATH.'/header.php';
    include 
'include/searchform.php';
    
$search_form->display();
    include 
XOOPS_ROOT_PATH.'/footer.php';
    exit();
}

if ( 
$andor != "OR" && $andor != "exact" && $andor != "AND" ) {
    
$andor "AND";
}

$myts =& MyTextSanitizer::getInstance();
if (
$action != 'showallbyuser') {
    if ( 
$andor != "exact" ) {
        
$ignored_queries = array(); // holds keywords that are shorter than allowed mininum length
        
$temp_queries preg_split('/[s,]+/'$query);
        foreach (
$temp_queries as $q) {
            
$q trim($q);
            if (
strlen($q) >= $xoopsConfigSearch['keyword_min']) {
                
$queries[] = $myts->addSlashes($q);
            } else {
                
$ignored_queries[] = $myts->addSlashes($q);
            }
        }
        if (
count($queries) == 0) {
            
redirect_header('search.php'2sprintf(_SR_KEYTOOSHORT$xoopsConfigSearch['keyword_min']));
            exit();
        }
    } else {
        
$query trim($query);
        if (
strlen($query) < $xoopsConfigSearch['keyword_min']) {
            
redirect_header('search.php'2sprintf(_SR_KEYTOOSHORT$xoopsConfigSearch['keyword_min']));
            exit();
        }
        
$queries = array($myts->addSlashes($query));
    }
}
switch (
$action) {
    case 
"results":
    
$module_handler =& xoops_gethandler('module');
    
$criteria = new CriteriaCompo(new Criteria('hassearch'1));
    
$criteria->add(new Criteria('isactive'1));
    
$criteria->add(new Criteria('mid'"(".implode(','$available_modules).")"'IN'));
    
$modules =& $module_handler->getObjects($criteriatrue);
    
$mids = isset($_REQUEST['mids']) ? $_REQUEST['mids'] : array();
    if (empty(
$mids) || !is_array($mids)) {
        unset(
$mids);
        
$mids array_keys($xmid);
    }
    include 
XOOPS_ROOT_PATH."/header.php";
    


// for XOOPS 2.2.x versions
if ( file_exists("language/".$xoopsConfig['language']."/main.php") ) {
include_once(
"language/".$xoopsConfig['language']."/main.php");
} else {
include_once(
"language/english/main.php");
}
// end

    
echo "

".constant($search_lang."_SEARCHRESULTS")."

n"
;
    echo 
_SR_KEYWORDS.':';
    if (
$andor != 'exact') {
        foreach (
$queries as $q) {
            echo 
'.htmlspecialchars(stripslashes($level)).''
;
        }
        if (!empty(
$ignored_queries)) {
            echo 
'';
            
printf(_SR_IGNOREDWORDS$xoopsConfigSearch['keyword_min']);
            foreach (
$ignored_queries as $q) {
                echo 
'.htmlspecialchars(stripslashes($q)).'';
            }
        }
    } else {
        echo 
' "'.htmlspecialchars(stripslashes($queries[0])).'"';
    }
    echo 
'';
    foreach (
$mids as $mid) {
        
$mid intval($mid);
        if ( 
in_array($mid$available_modules) ) {
            
$module =& $modules[$mid];
            
$results =& $module->search($queries$andor50$level);
            
$count count($results);
            if (!
is_array($results) || $count == 0) {
                echo 
"

"._SR_NOMATCH."

"
;
            } else {
                for (
$i 0$i $count$i++) {
    
        echo 
"100%" class="outer">";
        echo 
"30%">";echo "".$myts->makeTboxData4Show($results[$i]['type'])."";
        echo 
"";
                    
$results[$i]['uid'] = @intval($results[$i]['uid']);
                    if ( !empty(
$results[$i]['uid']) ) {
                        
$uname XoopsUser::getUnameFromId($results[$i]['uid']);
                        echo 
" ".constant($search_lang."_FROM").".XOOPS_URL."/userinfo.php?uid=".$results[$i]['uid']."'>".$uname."n";
                    }
                    echo !empty(
$results[$i]['time']) ? " ("formatTimestamp(intval($results[$i]['time'])).")" "";
                    echo 
"
"
;
                    if (isset(
$results[$i]['photo']) && $results[$i]['photo'] != "") {
                        echo 
".$results[$i]['link']."'>.$results[$i]['sphoto']."' alt='' width='100' /> ";
                    } else {
                       
                    }
                    if (!
preg_match("/^http[s]*:///i"$results[$i]['link'])) {
                        
$results[$i]['link'] = "".$results[$i]['link'];
                    }
                    echo 
"50%">";


echo 
".$results[$i]['link']."'>".$myts->makeTboxData4Show($results[$i]['title'])."";

if ( !
XOOPS_USE_MULTIBYTES ) {
            if (
strlen($results[$i]['desctext']) >= 14) {
                
$results[$i]['desctext'] = substr($results[$i]['desctext'],0,90)."...";
            }
        }

echo 
"".$myts->makeTboxData4Show($results[$i]['cat_desc'])."";
 


                    
           echo 
"";
                }
                if ( 
$count >= ) {
                    
$search_url XOOPS_URL."/modules/$mydirname/search.php?query=".urlencode(stripslashes(implode(' '$queries)));
                    
$search_url .= "&mid=$mid&action=showall&andor=$andor";
                    echo 
'.htmlspecialchars($search_url).'">'._SR_SHOWALLR.'';
                }
         echo
"
";
            }
        }
        unset(
$results);
        unset(
$module);
    }
    include 
"include/searchform.php";
    
$search_form->display();
    break;
    case 
"showall":
    case 
'showallbyuser':
    include 
XOOPS_ROOT_PATH."/header.php";

// for XOOPS 2.2.x versions
if ( file_exists("language/".$xoopsConfig['language']."/main.php") ) {
include_once(
"language/".$xoopsConfig['language']."/main.php");
} else {
include_once(
"language/english/main.php");
}
// end

    
$module_handler =& xoops_gethandler('module');
    
$module =& $module_handler->get($mid);
    
$results =& $module->search($queries$andor20$start$uid$level);
    
$count count($results);
    if (
is_array($results) && $count 0) {
        
$next_results =& $module->search($queries$andor1$start 20$uid$level);
        
$next_count count($next_results);
        
$has_next false;
        if (
is_array($next_results) && $next_count == 1) {
            
$has_next true;
        }
        echo 
"

".constant($search_lang."_SEARCHRESULTS")."

n"
;
        if (
$action == 'showall') {
            echo 
_SR_KEYWORDS.':';
            if (
$andor != 'exact') {
                foreach (
$queries as $q) {
                    echo 
'.htmlspecialchars(stripslashes($q)).'';
                }
            } else {
                echo 
' "'.htmlspecialchars(stripslashes($queries[0])).'"';
            }
            echo 
'';
        }
        
//    printf(_SR_FOUND,$count);
        //    echo "";
        
printf(_SR_SHOWING$start+1$start $count);
        for (
$i 0$i $count$i++) {
        echo 
"100%" class="outer">";
        echo 
"30%">";echo "".$myts->makeTboxData4Show($results[$i]['type']).""
        echo 
"";
                    
$results[$i]['uid'] = @intval($results[$i]['uid']);
                    if ( !empty(
$results[$i]['uid']) ) {
                        
$uname XoopsUser::getUnameFromId($results[$i]['uid']);
                        echo 
" ".constant($search_lang."_FROM").".XOOPS_URL."/userinfo.php?uid=".$results[$i]['uid']."'>".$uname."";
                    }
                    echo !empty(
$results[$i]['time']) ? " ("formatTimestamp(intval($results[$i]['time'])).")" "";
                    echo 
"
";
                    if (isset(
$results[$i]['photo']) && $results[$i]['photo'] != "") {
                        echo 
".$results[$i]['link']."'>.$results[$i]['sphoto']."' alt='' width='100' /> ";
                    } else {
                       
                    }
                    if (!
preg_match("/^http[s]*:///i"$results[$i]['link'])) {
                        
$results[$i]['link'] = "".$results[$i]['link'];
                    }
                    echo 
"50%">";


echo 
".$results[$i]['link']."'>".$myts->makeTboxData4Show($results[$i]['title'])."";

if ( !
XOOPS_USE_MULTIBYTES ) {
            if (
strlen($results[$i]['desctext']) >= 14) {
                
$results[$i]['desctext'] = substr($results[$i]['desctext'],0,90)."...";
            }
        }

echo 
"".$myts->makeTboxData4Show($results[$i]['cat_desc'])."";
 

                   
           echo 
"
";
                }
                
        echo 
'
        

          
        ';
        
$search_url XOOPS_URL."/modules/$mydirname/search.php?query=".urlencode(stripslashes(implode(' '$queries)));
        
$search_url .= "&mid=$mid&action=$action&andor=$andor";
        if (
$action=='showallbyuser') {
            
$search_url .= "&uid=$uid";
        }
        if ( 
$start ) {
            
$prev $start 20;
            echo 
'
            '
;
            
$search_url_prev $search_url."&start=$prev";
            echo 
'.htmlspecialchars($search_url_prev).'">'._SR_PREVIOUS.'
            '
;
        }
        echo 
'

        ';
        if (
false != $has_next) {
            
$next $start 20;
            
$search_url_next $search_url."&start=$next";
            echo 
'.htmlspecialchars($search_url_next).'">'._SR_NEXT.'
            '
;
        }
        echo 
'
          

        
  

        


        ';
    } else {
        echo 
'

'._SR_NOMATCH.'

'
;
    }
    include 
"include/searchform.php";
    
$search_form->display();
    echo 
'


    '
;
    break;
}
include 
XOOPS_ROOT_PATH."/footer.php";
?>


Search.inc.php

    $mydirname 
basenamedirnamedirname__FILE__ ) ) );



function 
classifieds_search($queryarray$andor$limit$offset$userid$level){
    global 
$xoopsDB$xoopsModuleConfig$mydirname;


    
$search_lang =  '_' strtoupper$mydirname ) ;
    
    
$sql "select
l.lid,l.title,l.type,l.desctext,l.price,l.typeprice,l.date,l.usid,l.town,l.country,l.premium,p.cat_desc FROM "
.$xoopsDB->prefix("".$mydirname."_listing")." l LEFT JOIN  ".$xoopsDB->prefix("".$mydirname."_categories")." p ON l.cid=p.cid  WHERE valid='Yes' AND date<=".time()."";
    if ( 
$userid != ) {
        
$sql .= " AND l.usid=".$userid." ";
    }

//if (lid=lid)
    // because count() returns 1 even if a supplied variable
    // is not an array, we must check if $querryarray is really an array
    
if ( is_array($queryarray) && $count count($queryarray) ) {
        
$sql .= " AND ((l.title LIKE '%$queryarray[0]%' OR l.type LIKE '%$queryarray[0]%' OR l.desctext LIKE '%$queryarray[0]%'OR l.price LIKE '%$queryarray[0]%' OR l.typeprice LIKE '%$queryarray[0]%' OR l.town LIKE '%$queryarray[0]%' OR l.country LIKE '%$queryarray[0]%' )";
        for(
$i=1;$i<$count;$i++){
            
$sql .= $andor ";
            
$sql .= "(l.title LIKE '%$queryarray[$i]%' OR l.type LIKE '%$queryarray[$i]%' OR l.desctext LIKE '%$queryarray[$i]%' OR l.price LIKE '%$queryarray[$i]%' OR l.typeprice LIKE '%$queryarray[$i]%' OR l.town LIKE '%$queryarray[$i]%' OR l.country LIKE '%$queryarray[$i]%' )";
        }
        
$sql .= " ) ";
    }

    
$sql .= "AND (l.type LIKE '$level') ORDER BY premium DESC, date DESC";
    
$result $xoopsDB->query($sql,$limit,$offset);
    
$ret = array();
    
$i 0;
     while(
$myrow $xoopsDB->fetchArray($result)){
        
$ret[$i]['image'] = "images/cat/default.gif";
        
$ret[$i]['link'] = "index.php?pa=viewads&lid=".$myrow['lid']."";
        
$ret[$i]['title'] = $myrow['title'];
        
$ret[$i]['type'] = $myrow['type'];
        
$ret[$i]['price'] = number_format($myrow['price'], 2"."",");
        
$ret[$i]['typeprice'] = $myrow['typeprice'];
        
$ret[$i]['town'] = $myrow['town'];
        
$ret[$i]['desctext'] = $myrow['desctext'];
        
$ret[$i]['nophoto'] = "images/nophoto.jpg";
        
$ret[$i]['cat_desc'] = $myrow['cat_desc'];
        
$ret[$i]['sphoto'] = "photo/thumbs/thumb_".$myrow['url']."";
        
$ret[$i]['time'] = $myrow['date'];
        
$ret[$i]['uid'] = $myrow['usid'];
        
$i++;
    }
    return 
$ret;
}
?>


I've tried everything and it is driving me crazy - please help!!!

thanks a lot

4
trabis
Re: Can't make changes to the search function - help needed!
  • 2008/5/29 12:52

  • trabis

  • Core Developer

  • Posts: 2269

  • Since: 2006/9/1 1


you a have to hack search.php to in:
$results =& $module->search($queries$andor50$level);


add a 0 there
$results =& $module->search($queries$andor500$level);

5
BigJim
Re: Can't make changes to the search function - help needed!
  • 2008/5/30 3:27

  • BigJim

  • Just popping in

  • Posts: 78

  • Since: 2007/7/16


Brilliant that totally did it!

Thank you so much trabis!!!!!

Btw, can you tell me why this fixed, it seems the '0' is the value for $uid (is that right?) - had I deleted it by mistake previously?

thanks again

J

6
trabis
Re: Can't make changes to the search function - help needed!
  • 2008/5/30 13:11

  • trabis

  • Core Developer

  • Posts: 2269

  • Since: 2006/9/1 1


Yes, 0 is default for user id, if you look in the module->search, you will see that there is no need for setting if the value is already 0(and because it is in the end of the line), that is why in search.php that value was not inputed.

I said to put a ,0, but if you put just ,, it would work the same!

7
BigJim
Re: Can't make changes to the search function - help needed!
  • 2008/5/31 10:24

  • BigJim

  • Just popping in

  • Posts: 78

  • Since: 2007/7/16


Great! Thanks again trabis

Can I ask one more question?

I'm trying to have the results display grouped by categories.

The categories of the module are various countries.

So a search results will show all the matches in country 1, followed by all matches in country 2 and so on.

Any chance you can tell me how to do this???

8
trabis
Re: Can't make changes to the search function - help needed!
  • 2008/5/31 13:33

  • trabis

  • Core Developer

  • Posts: 2269

  • Since: 2006/9/1 1


If you just want to order results by country you can change your search.inc.php to

$sql .= "AND (l.type LIKE '$level') ORDER BY country DESC, premium DESC, date DESC";
    
$result $xoopsDB->query($sql,$limit,$offset);


I´m not sure if is this you want.

9
BigJim
Re: Can't make changes to the search function - help needed!
  • 2008/6/3 1:06

  • BigJim

  • Just popping in

  • Posts: 78

  • Since: 2007/7/16


Hey trabis

I was looking to allow users to choose how they order the results (by A to Z, by hits, by date) but results would still display grouped by category. So if it was 'by hits' the category with the most hits would display all its matches first.

But actually the way you mention is so much simpler I think I'll go with that

thanks!!!!!

Login

Who's Online

319 user(s) are online (85 user(s) are browsing Support Forums)


Members: 0


Guests: 319


more...

Donat-O-Meter

Stats
Goal: $100.00
Due Date: Aug 31
Gross Amount: $0.00
Net Balance: $0.00
Left to go: $100.00
Make donations with PayPal!

Latest GitHub Commits