我刚学smarty 请问下 smarty中 如何扩展函数像网上cms类标签
比如{dede:arclist row='5'}[field.字段名]{/dede:arclist}扩展成这样的
我用smarty的register_block注册块 实现了
{arclist typeid="119" row="5" titlelen="30" reg="title:url"}
                         <dd><a href="[url]">[title]</a></dd>
                        {/arclist}
这种样式 但是里面的[title],[url]我都是在函数中以此替换的 感觉这种方法很死 
用{section}循环的话需要单独写sql语句 要是能代个参数比如指定栏目id进行循环就好了 在线等....

解决方案 »

  1.   

    看不明白,感觉这种方法很死 ? 这种方法指什么? 有对比吗?用{section}循环的话需要单独写sql语句 ??
    代个参数比如指定栏目id进行循环又是指什么?
      

  2.   


    假设我有个首页 需要调用很多栏目的文章 怎么调用 不可能每个调用部分都写条sql语句吧 意思是能够想网上cms标签一样 可以指定栏目id号 就可以循环了 循环中间只需要填写要循环的字段名即可 
      

  3.   

    1.如果用section也可以.因为你写成函数,也是需要每个栏目通过sql="select .."查询库中的数据的.只是写成函数后,你可以定指执行那条sql.相对来说比较自定义化.
    2.写自定义的这个函数{arclist typeid="119" row="5" titlelen="30" reg="title:url"} 
                            <dd> <a href="[url]">[title] </a> </dd> 
                            {/arclist} 
    里面的参数不太明清楚.因为你的函数没有写出来.所以没法帮你分析解决呀.
      

  4.   

    我是这样的
    是php文件
    ..
    $smarty->register_block('arclist','smarty_block_arclist',false); //注册smarty_block_arclist块
    ..然后smarty_block_arclist块代码是
    //文章调用函数
    /**
     * 参数取值范围:
     * @param row  返回文章条数
     * @param typeid  指定栏目id
     * @param titlelen  文章标题长度以中文UTF-8截取 详见函数cn_substr_utf8($str, $length, $start=0)
     * @param orderby  文档排序方式 取值为:click(点击),pubdate(发布时间),id(文档id) //代扩充
     * @param keyword  获取指定关键字的文章
     * @param aid  指定文档id
     * @param limit  起始ID,记录数 当指定了row此参数无效
     * @param orderway 升序和降序排列文章 取值为:desc 或 asc
     * @param reg 需要替换的变量 需要和数据库字段一一对应
     * */
    function smarty_function_arclist($param, $content)
    {
    global $pdo,$smarty;
    $row = $param['row'];
    $typeid = $param['typeid'];
    $titlelen = $param['titlelen'];
    $orderby = $param['orderby'];
    $keyword = $param['keyword'];
    $aid = $param['aid'];
    $limit = $param['limit'];
    $orderway = $param['orderway'];
    $reg = $param['reg'];
    $th = $param['th'];
    $th = explode(':',$th);
    if (empty($titlelen)) //文章初始化长度
    {
        $titlelen = 20;
    }
    if (empty($orderby))
    {
        $orderby = "order by a.id";
    }
    if (empty($orderway)) //升序或降序初始化 默认为空
    {
        $orderway = "";
    }
    $regArray = explode(':',$reg); //用:做分割需要替换的变量 需要和数据库字段一一对应
    $regRow = Count($regArray); //统计需要替换字段数目
      
    if (!isset($row)) //首先区别是row 还是limit
    {
    $body = $pdo->getRow("select uid from admin_category where category_id = $typeid"); //等到栏目模型ID 
    $result = $pdo->getAll("select a.*,b.* from web_content1 as a left join web_contentindex as b on a.id=b.id where b.mid=1 and b.cid>0 $orderby $orderway limit $row");
    $resultRow = Count($result);//统计数量

      
    for ($i=0;$i<$resultRow;$i++)
    {
        $url[].='<dd>'.'<a href="'.$result[$i][url].'">'.$result[$i][title].'</dd>';
    }
    echo  'a';
     /*  for ($i=0;$i<$regRow;$i++) //循环需要替换的字段
       {
           $Rarray[].='['.$regArray[$i].']'; //需替换字段
         if ($resultRow>1) //数组
         {
            for ($j=0;$j<$resultRow;$j++)
            {
               $Parray[].=$result[$j][$regArray[$i]];
            }
         }
         else //单条 
         {
             
         }
          
        
           
       }
       
         $str.=str_ireplace($Rarray,$Parray,$content);*/       
          
    }
    else 
    {
    echo 'b';
    }
    }还没有写完这个函数 我的意思就是加入是新闻首页模版需要调用很多部分的栏目文章 有什么办法通过模版把栏目id传进去 自定义查询这个栏目文章 现在用块是可以实现但是很死 要把需替换字段传进去 因为循环里面还包括 <dd></dd> 和><li></li>这种div标签 能否想网上cms系统一样 只需要把循环的字段放到循环即可
    比如织梦的{dede:arclist row=5 typeid='1'}[field.title/]{/dede:arclist}这种样式?标签