SmartFAQ 由 SmartFactory(https://www.smartfactory.ca)开发,SmartFactory 是 InBox Solutions(https://www.inboxsolutions.net)的一个部门

更新 Xoops 2.0.x 搜索页面以支持模板引擎
概览 Xoops有一个模板引擎,它允许您将页面生成(PHP代码)与页面布局和展示(HTML + CSS)分开。Xoops还支持主题引擎。这种程度的自定义存在于“超过”数据生成+布局之外,不在此文章的范围之内。模板是用于利用Smarty标签的HTML文档。Smarty是一种额外的语言/层,您必须学习以便布局Xoops生成的HTML。尽管如此,基本的思想是在HTML中添加标签,这些标签作为由相关PHP页面设置的入站变量的占位符。默认情况下,Xoops的搜索页面位于Xoops目录的根目录下,并命名为search.php。此页面(与大多数不同)实际上在PHP代码中使用一系列'echo'语句直接生成执行其分配任务所需的HTML。这使得更新Xoops搜索页面的外观和感觉变得更加困难,因为您现在还必须处理Xoop搜索引擎的功能。本“如何做”文档了从search.php中剥离布局到功能的流程。在本教程结束时,您的Xoops系统将有一个与搜索页面关联的新系统级模板。您可以通过操作这个Smarty模板而不是直接操作search.php文件来更新搜索页面的外观和感觉。此外,search.php页面现在将自己与相应的模板页面之间的一个接口(或约定)联系起来,其中包含各种标签及其含义。这意味着您可以根据需要改变search.php,以更改搜索引擎的工作方式,而不会影响搜索页面的外观和感觉本身(除非,当然,您的更改需要更改与模板的接口)。 备份所有内容 – 使用测试站点 – 呜嘟,呜嘟,呜嘟 就像任何其他事情一样,在尝试执行本文中的更改之前,请务必备份您的宝贵数据。首先在测试站点上执行这些更改(如果可能的话)。尽管这里没有什么太侵入性的,但重要的是要确保如果出现问题,您可以恢复。 searchform.php 在“include”文件夹中,有一个名为searchform.php的文件。此文件负责生成出现在每个搜索页面底部的“高级搜索”表单。在我们做任何其他事情之前,我们需要对这个表单进行一些小的修改,以便使其与我们的新搜索模板兼容。在文件的末尾,简单地添加以下行
$search_form->addElement(new XoopsFormButton("""submit"_SR_SEARCH"submit"));

return 
$search_form->render();    // 由Lankford于2007/7/26添加。
?>
这个功能是什么?不是将整个PHP页面包含到“\search.php”中(及其创建和可用性的$search_form变量),我们将包含视为一个函数,并'返回'由此文件代码生成的表单的HTML版本(由render方法产生)。modules/system/xoops_version.php 你的下一步是告诉Xoops你即将创建的Smarty模板。你可能已经对模块和它们的安装/配置有一些了解。有趣的是,Xoops就像对待模块一样处理其系统代码。这就是为什么你会在Xoops管理界面的左侧看到“系统管理员”按钮和所有其他已安装的模块按钮。这是因为系统模块正是如此……一个模块!这很好,因为你不仅能快速轻松地找到配置系统的方式,就像配置模块一样,而且编写Xoops核心代码的人员能够使用相同的代码片段来安装/更新系统设置,就像安装/更新模块一样。那么,有什么好处吗?好吧,所有这些的重点是创建新的Xoops系统模板真的很简单。你所要做的就是编写模板(我们稍后将会这样做)并定义该模板为Xoops系统模块。如果你还不知道,你定义模块的模板在每个模块的'xoops_version.php'文件中。这个文件包含了许多信息,告诉Xoops有关你的模块,而不仅仅是模板数据。但是,由于这个架构决策,定义新的模板真的很简单。只需在80行附近添加以下附加代码即可。
$modversion['templates'][15]['description'] = '仅为自定义块或没有模板的块提供的占位符模板';
$modversion['templates'][16]['file'] = 'system_search.html';
$modversion['templates'][16]['description'] = 'Xoops搜索页的Smarty模板。';

// 块
我们在这里定义了一个第16个模板。我们给它命名为'系统_search.html',并给了它一个描述,在我们尝试编辑系统模板时将会显示。创建Smarty模板 现在是时候真正做一些事情了。让我们创建一个名为'\modules\system\templates\system_search.html'的新文件。请将以下HTML/Smarty代码插入到你刚刚创建的那个新文件中。


<
h3>"<{$search_type}>" <{$label_search_results}>: <{$showing}>h3>
<{
$label_keywords}>&nbsp;
    <
strong>
    <{* 
This section generates a space separated list of keywords that were searched. *}>
  <{
section name=cur_kw_searched loop=$searched_keywords}>
          <{
$searched_keywords[cur_kw_searched]}><{if $smarty.section.cur_kw_searched.index <> $smarty.section.cur_kw_searched.total}>&nbsp;<{/if}>
    <{/
section}>
    strong>
<
br />
<{
$label_ignored_keywords}>&nbsp;
    <
strong>
    <{* 
This section generates a space separated list of keywords that were NOT searched. *}>
     <{
section name=cur_kw_not_searched loop=$ignored_keywords}>
          <{
$ignored_keywords[cur_kw_not_searched]}><{if $smarty.section.cur_kw_not_searched.index <> $smarty.section.cur_kw_not_searched.total}>&nbsp;<{/if}>
    <{/
section}>
    strong>
<
br />

<{* 
    
This section generates a search results that mimic Xoops' original search.php results. 
    Note: The results are sorted.  Modules with higher hit counts are located on the page
          above modules with lower hit counts.
*}>
<{*  This section has been commented out in favor of the '
table' version located below...
<{foreach from=$module_sort_order key=sort_key item=sort_value}>
   

<{$sort_key}>: (<{$sort_value}> hits returned)


   
   <{section name=cur_result loop=$search_results[$sort_key].results}>
         <{if $smarty.section.cur_result.index > 0}><{/if}>
       " src="<{$search_results[$sort_key].results[cur_result].processed_image_url}>" />
       <{$search_results[$sort_key].results[cur_result].processed_image_tag}> 
       
           "><{$search_results[$sort_key].results[cur_result].processed_title}>
       

         
           "><{$search_results[$sort_key].results[cur_result].processed_user_name}> <{$search_results[$sort_key].results[cur_result].processed_time}>
       

   <{/section}>
  
   
   "><{$search_results[$sort_key].search_more_title}>
<{/foreach}>


*}>

<{* 
    This section generates a search results and places them into tables using the standard
    Xoops style tags for table formatting. 
    Note: The results are sorted.  Modules with higher hit counts are located on the page
          above modules with lower hit counts.
*}>
<{foreach from=$module_sort_order key=sort_key item=sort_value}>
  
    
      
          <{$sort_key}>: (<{$sort_value}> hits returned)
      
    
    <{if ($search_results[$sort_key].search_more_title == '') and ($sort_value > 0)}>
            
                
                
                    
                        
                                "><{$search_results[$sort_key].search_prev_title}>
                        
                        
                                "><{$search_results[$sort_key].search_next_title}>
                        
                    
                
            
            
       <{/if}>
    <{section name=cur_result loop=$search_results[$sort_key].results}>
        
          
              <{math equation="x + y" x=$smarty.section.cur_result.index y=$start}>
          
          " width="100%">
               " src="<{$search_results[$sort_key].results[cur_result].processed_image_url}>" />
               <{$search_results[$sort_key].results[cur_result].processed_image_tag}> 
               
                   "><{$search_results[$sort_key].results[cur_result].processed_title}>
               

                 
                   "><{$search_results[$sort_key].results[cur_result].processed_user_name}> <{$search_results[$sort_key].results[cur_result].processed_time}>
               

          
        
       <{/section}>
        <{if $sort_value > 0 }>
           <{if $search_results[$sort_key].search_more_title == ''}>
         
                
                
                    
                        
                                "><{$search_results[$sort_key].search_prev_title}>
                        
                        
                                "><{$search_results[$sort_key].search_next_title}>
                        
                    
                
            
        
           <{else}>
             <{if $search_results[$sort_key].search_more_url != ''}>
             
                    
                         "><{$search_results[$sort_key].search_more_title}>
                    
                
             <{/if}>
        <{/if}>
   <{/if}>
   
   
<{/foreach}>



<{$search_form}>
search.php 最后一项主要步骤是更新Xoops系统根目录下的主要搜索PHP页面。因为这个现有页面会生成所有HTML,所以我们需要改写它,使其将所有内容放置到Smarty模板变量中,并将这些变量传递给刚刚创建的模板。因此,编辑你的'\search.php',确保其看起来像这样
// $Id: search.php 506 2006-05-26 23:10:37Z skalpa $
//  ------------------------------------------------------------------------ //
//                XOOPS - PHP Content Management System                      //
//                    Copyright (c) 2000 XOOPS.org                           //
//                                                    //
//  ------------------------------------------------------------------------ //
//  This program is free software; you can redistribute it and/or modify     //
//  it under the terms of the GNU General Public License as published by     //
//  the Free Software Foundation; either version 2 of the License, or        //
//  (at your option) any later version.                                      //
//                                                                           //
//  You may not change or alter any portion of this comment or credits       //
//  of supporting developers from this source code or any supporting         //
//  source code which is considered copyrighted (c) material of the          //
//  original comment or credit authors.                                      //
//                                                                           //
//  This program is distributed in the hope that it will be useful,          //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of           //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            //
//  GNU General Public License for more details.                             //
//                                                                           //
//  You should have received a copy of the GNU General Public License        //
//  along with this program; if not, write to the Free Software              //
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
//  ------------------------------------------------------------------------ //

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

include 
'mainfile.php';

$xoopsOption['template_main'] = 'system_search.html';

$config_handler =& xoops_gethandler('config');
$xoopsConfigSearch =& $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);

if (
$xoopsConfigSearch['enable_search'] != 1) {
    
header('Location: '.XOOPS_URL.'/index.php');
    exit();
}

include 
XOOPS_ROOT_PATH.'/header.php';

$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['start'])) {
  
$start intval($_GET['start']);
} elseif (!empty(
$_POST['start'])) {
  
$start intval($_POST['start']);
}

$xoopsTpl->assign("start"$start 1);

$queries = array();

if (
$action == "recoosults") {
    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') {
    
// This area seems to handle the 'just display the advanced search page' part.
   
$search_form = include 'include/searchform.php';
   
$xoopsTpl->assign('search_form'$search_form);
    include 
XOOPS_ROOT_PATH.'/footer.php';
    exit();
}

if ( 
$andor != "OR" && $andor != "exact" && $andor != "AND" ) {
    
$andor "AND";
}
$xoopsTpl->assign("search_type"$andor);

$myts =& MyTextSanitizer::getInstance();
if (
$action != 'showallbyuser') {
    if ( 
$andor != "exact" ) {
        
$ignored_queries = array(); // holds kewords that are shorter than allowed minmum 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));
    }
}
$xoopsTpl->assign("label_search_results"_SR_SEARCHRESULTS);

// Keywords section.
$xoopsTpl->assign("label_keywords"_SR_KEYWORDS ':');
$keywords = array();
$ignored_keywords = array();
foreach (
$queries as $q) {
    
$keywords[] = htmlspecialchars(stripslashes($q));
}
if (!empty(
$ignored_queries)) {
     
$xoopsTpl->assign("label_ignored_keywords"sprintf(_SR_IGNOREDWORDS$xoopsConfigSearch['keyword_min']));
    foreach (
$ignored_queries as $q) {
        
$ignored_keywords[] = htmlspecialchars(stripslashes($q));
    }
    
$xoopsTpl->assign("ignored_keywords"$ignored_keywords);
}
$xoopsTpl->assign("searched_keywords"$keywords);

$all_results = array();
$all_results_counts = array();
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($modules);
        }
    
        foreach (
$mids as $mid) {
            
$mid intval($mid);
            if ( 
in_array($mid$available_modules) ) {
                
$module =& $modules[$mid];
                
$results =& $module->search($queries$andor50);
                
$xoopsTpl->assign("showing"sprintf(_SR_SHOWING15));
                
$count count($results);
                
$all_results_counts[$module->getVar('name')] = $count;

                if (!
is_array($results) || $count == 0) {
                    
$all_results[$module->getVar('name')] = array();
                } else {
                    for (
$i 0$i $count$i++) {
                          
$results[$i]['processed_image_alt_text'] = $myts->makeTboxData4Show($module->getVar('name')) . ": ";
                        if (isset(
$results[$i]['image']) && $results[$i]['image'] != "") {
                              
$results[$i]['processed_image_url'] = "modules/" $module->getVar('dirname') . "/" $results[$i]['image'];
                        } else {
                              
$results[$i]['processed_image_url'] = "images/icons/posticon2.gif";
                        }
                        if (!
preg_match("/^http[s]*:///i"$results[$i]['link'])) {
                            
$results[$i]['link'] = "modules/".$module->getVar('dirname')."/".$results[$i]['link'];
                        }
                        
$results[$i]['processed_title'] = $myts->makeTboxData4Show($results[$i]['title']);
                        
$results[$i]['uid'] = @intval($results[$i]['uid']);
                        if ( !empty(
$results[$i]['uid']) ) {
                            
$uname XoopsUser::getUnameFromId($results[$i]['uid']);
                            
$results[$i]['processed_user_name'] = $uname;
                            
$results[$i]['processed_user_url'] = XOOPS_URL."/userinfo.php?uid=".$results[$i]['uid'];
                        }
                        
$results[$i]['processed_time'] = !empty($results[$i]['time']) ? " ("formatTimestamp(intval($results[$i]['time'])).")" "";
                    }
                    if ( 
$count >= ) {
                        
$search_url XOOPS_URL.'/search.php?query='.urlencode(stripslashes(implode(' '$queries)));
                        
$search_url .= "&mid=$mid&action=showall&andor=$andor";
                    } else {
                        
$search_url "";
                    }
                    
$all_results[$module->getVar('name')] = array("search_more_title" => _SR_SHOWALLR
                                                                
"search_more_url" => htmlspecialchars($search_url), 
                                                                                                                  
"search_next_title" => ""
                                                                    
"search_next_url" => ""
                                                                    
"search_prev_title" => "",
                                                                    
"search_prev_url" => "",
                                                                
"results" =>$results);
                }
            }
            unset(
$results);
            unset(
$module);
        }
        break;
    case 
"showall":
    case 
'showallbyuser':
        
$module_handler =& xoops_gethandler('module');
        
$module =& $module_handler->get($mid);
        
$results =& $module->search($queries$andor20$start$uid);
      
$xoopsTpl->assign("showing"sprintf(_SR_SHOWING$start 1$start 20));
        
$count count($results);
        
$all_results_counts[$module->getVar('name')] = $count;
        if (
is_array($results) && $count 0) {
            
$next_results =& $module->search($queries$andor1$start 20$uid);
            
$next_count count($next_results);
            
$has_next false;

            if (
is_array($next_results) && $next_count == 1) {
                
$has_next true;
            }

            for (
$i 0$i $count$i++) {
                  
$results[$i]['processed_image_alt_text'] = $myts->makeTboxData4Show($module->getVar('name')) . ": ";
                if (isset(
$results[$i]['image']) && $results[$i]['image'] != "") {
                      
$results[$i]['processed_image_url'] = "modules/" $module->getVar('dirname') . "/" $results[$i]['image'];
                } else {
                      
$results[$i]['processed_image_url'] = "images/icons/posticon2.gif";
                }
                if (!
preg_match("/^http[s]*:///i"$results[$i]['link'])) {
                    
$results[$i]['link'] = "modules/".$module->getVar('dirname')."/".$results[$i]['link'];
                }
                
$results[$i]['processed_title'] = $myts->makeTboxData4Show($results[$i]['title']);
                
$results[$i]['uid'] = @intval($results[$i]['uid']);
                if ( !empty(
$results[$i]['uid']) ) {
                    
$uname XoopsUser::getUnameFromId($results[$i]['uid']);
                    
$results[$i]['processed_user_name'] = $uname;
                    
$results[$i]['processed_user_url'] = XOOPS_URL."/userinfo.php?uid=".$results[$i]['uid'];
                }
                
$results[$i]['processed_time'] = !empty($results[$i]['time']) ? " ("formatTimestamp(intval($results[$i]['time'])).")" "";
            }
            
                        
$search_url_prev "";
                        
$search_url_next "";
                        
              
$search_url XOOPS_URL.'/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;
                    
$search_url_prev $search_url."&start=$prev";
                }
                if (
false != $has_next) {
                    
$next $start 20;
                    
$search_url_next $search_url."&start=$next";
                }
                
          
$all_results[$module->getVar('name')] = array("search_more_title" => "",
                                                                                                      
"search_more_url" => "",
                                                                                                      
"search_next_title" => _SR_NEXT
                                                        
"search_next_url" => htmlspecialchars($search_url_next), 
                                                        
"search_prev_title" => _SR_PREVIOUS,
                                                        
"search_prev_url" => htmlspecialchars($search_url_prev),
                                                        
"results" =>$results);
        } else {
            echo 
'

'._SR_NOMATCH.'

'
;
        }
        break;
}
arsort($all_results_counts);
$xoopsTpl->assign("module_sort_order"$all_results_counts);
$xoopsTpl->assign("search_results"$all_results);

$search_form = include 'include/searchform.php';
$xoopsTpl->assign('search_form'$search_form);

include 
XOOPS_ROOT_PATH."/footer.php";
?>
更新系统模块 您现在已将所有全新的代码放置到网站上,但在进行以下几步操作之前,您还看不到任何好的效果。首先,您需要更新系统模块,以便将新的Smarty模板载入数据库。按照以下步骤进行操作:*) 前往网站的管理部分('\admin.php')。*) 在屏幕左侧点击“系统管理”按钮。*) 点击“模块”。*) 点击系统管理模块的更新按钮(缩略图)并确认您的选择。您应该在屏幕的某个位置看到以下文本:引用
将模板system_search.html插入到数据库中。模板system_search.html已重新编译。
更新默认模板集(可选) 希望您已知道,您可以定义多个模板集,并选择您想要作为网站“默认”模板集的任何一个。如果能够将模板集与主题相关联(暗示,暗示)...那将是极好的...但我跑题了。重点是,如果您已经决定修改模板以增强您网站的视觉效果(如果您正在按照这些说明操作,这是一个相当安全的假设),您将想要确保我们刚刚提供的新模板已经存在于您的默认模板集中。请按照以下说明操作:*) 前往网站的管理部分('\admin.php')。*) 在屏幕左侧点击“系统管理”按钮。*) 点击“模板”。*) 在模板集管理器中,找到右侧有勾选标记的行。这一行是您的网站当前选定的模板集。*) 点击“系统”右侧的“列表”链接,该链接位于模板集管理器的模板列中(那是一大串话!)。*) 在 resulting page中找到突出显示的黄色行“system_search.html”,然后点击“生成”链接。这将确保这个特定的模板集已经准备好了供使用的新搜索模板。 结论 就这样。您的新搜索页应该已经正常运行(尽管您可能需要清理模板缓存文件夹,如果您仍然看到旧的)。您现在可以通过随时更新适当的模板来定制您网站搜索页的外观和感受。如果觉得这个说明有帮助,请向Xoops团队游说,将此类更改添加到Xoops的下一个版本的核心中。作者:rlankford,见以下 帖子


评论归作者所有。我们不对他们的内容负责。
user

 对搜索结果页的修改?


你好,

我阅读了本站关于“搜索”功能的几个常见问题/论坛主题,但没有找到任何相关的答案。我网站的的大部分内容都在WebLinks模块中。我需要修改搜索结果,使其包含标题以及简短摘要(就像谷歌、雅虎等)和显示当前用户的网页链接评分。

有人能告诉我这样做是否可行以及难度如何?此外,我们是否有其他更好的搜索引擎供我们的XOOPS网站使用的选择?

我也愿意付费让人帮我做这个修改。请联系我私聊。

谢谢。

Abu

 
user

 关于修改搜索结果页面的问题?


Hi' 

有没人见过适用于Xoops 2.4.x的相同教程?

谢谢。

 


Login

Who's Online

302 user(s) are online (19 user(s) are browsing XOOPS FAQ)


Members: 0


Guests: 302


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!

Did you know ?

You can update your profile information by clicking on the 'Edit Account' of the 'User Menu'.

Random question

How do I find a module?