ECshop--搜索模块细究
ecshop细究
<!-- #BeginLibraryItem "/library/page_header.lbi" --><!-- #EndLibraryItem -->
即可重用的搜索模块代码,拼接在body下面,我们可以进入这个文件看看,在50行左右
<div class="serach-box"> <form id="searchForm" name="searchForm" method="get" action="search.php" onSubmit="return checkSearchForm()" class="f_r"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="135"><input name="keywords" type="text" id="keyword" value="{$search_keywords|escape}" class="B_input" /></td> <td><input name="imageField" type="submit" value="搜索" class="go" style="cursor:pointer;" /></td> </tr> </table> </form> </div>
这样就很清楚了,url对应的是根目录下php,文本框里面设置
<span style="font-size:18px;">value="{$search_keywords|escape}"</span>
即保留搜索值,form表单里面的action指向php,但是在检索之前,也即表单提交的同时,通过checkSearchForm()验证输入合法,然后我们到根目录下search.php中看看,代码非常多,需要检索的东西有点复杂,但可以找到通过表单提交过来的keywords
/* 初始化搜索条件 */ $keywords = ''; $tag_where = ''; if (!empty($_REQUEST['keywords'])) { $arr = array(); if (stristr($_REQUEST['keywords'], ' AND ') !== false) { /* 检查关键字中是否有AND,如果存在就是并 */ $arr = explode('AND', $_REQUEST['keywords']); $operator = " AND "; } elseif (stristr($_REQUEST['keywords'], ' OR ') !== false) { /* 检查关键字中是否有OR,如果存在就是或 */ $arr = explode('OR', $_REQUEST['keywords']); $operator = " OR "; } elseif (stristr($_REQUEST['keywords'], ' + ') !== false) { /* 检查关键字中是否有加号,如果存在就是或 */ $arr = explode('+', $_REQUEST['keywords']); $operator = " OR "; } else { /* 检查关键字中是否有空格,如果存在就是并 */ $arr = explode(' ', $_REQUEST['keywords']); $operator = " AND "; } $keywords = 'AND ('; $goods_ids = array(); foreach ($arr AS $key => $val) { if ($key > 0 && $key < count($arr) && count($arr) > 1) { $keywords .= $operator; } $val = mysql_like_quote(trim($val)); $sc_dsad = $_REQUEST['sc_ds'] ? " OR goods_desc LIKE '%$val%'" : ''; $keywords .= "(goods_name LIKE '%$val%' OR goods_sn LIKE '%$val%' OR keywords LIKE '%$val%' $sc_dsad)"; $sql = 'SELECT DISTINCT goods_id FROM ' . $ecs->table('tag') . " WHERE tag_words LIKE '%$val%' "; $res = $db->query($sql); while ($row = $db->FetchRow($res)) { $goods_ids[] = $row['goods_id']; } $db->autoReplace($ecs->table('keywords'), array('date' => local_date('Y-m-d'), 'searchengine' => 'ecshop', 'keyword' => addslashes(str_replace('%', '', $val)), 'count' => 1), array('count' => 1)); } $keywords .= ')'; $goods_ids = array_unique($goods_ids); $tag_where = implode(',', $goods_ids); if (!empty($tag_where)) { $tag_where = 'OR g.goods_id ' . db_create_in($tag_where); } }
在上面的代码中通过
<span style="font-size:18px;">$_REQUEST['keywords']</span>
来获取关键值,之后进行一些其他处理,然后拼接sql语句,查询返回的结果通过
$smarty->assign('goods_list', $arr);注入值,最后在search.dwt文件中还原整个页面
<span style="font-size:18px;"><!-- {if $action eq "form"} --></span>
这里我也不是太清楚,网上搜了下,没有相关的回答,大体上就是这样注入数据,仔细看看会发现嵌套使用蛮多的,search.dwt文件里面表单也会调用search.php文件,然后不断循环,我就感觉这样很复杂,模块化并不好。