存档

2010年4月 的存档

再写关于无限分类

2010年4月6日 1 条评论

数据表里的结构还是非常简单
三个字段id , parentid ,name
算法也很简单递归,以前用递归的时候很傻,应该说极傻,因为在递归中通过查询数据表来获得子类的所有,最近开窍了,想到了一个地球人都能想得到的方法,下面是代码,一个class

<?php
class Tree {

 /**
  * 从数据库查询出的所有分类信息
  * @var array
  */
 var $arr;
/**
 * 如下格式
 *  var $arr = array(
 1 => array(‘id’=>’1′,’parentid’=>0,’name’=>’一级栏目一’),
 2 => array(‘id’=>’2′,’parentid’=>0,’name’=>’一级栏目二’),
 3 => array(‘id’=>’3′,’parentid’=>1,’name’=>’二级栏目一’),
 );*/

 /**
  * 输出结构
  * @var array
  */
 var $tree = array();
 /**
  * 树形递归的深度
  * @var int
  */
 var $deep = 1;

 /**
  * 生成树形的修饰符号
  * @var array
  */
 var $icon = array(‘│’,'├’,'└’);
 /**
  * 生成指定id的下级树形结构
  * @param int $rootid 要获取树形结构的id
  * @param string $add 递归中使用的前缀
  * @param bool $parent_end 标识上级分类是否是最后一个
  */
 function getTree($rootid = 0,$add = ”,$parent_end =true){
  $is_top = 1;
  $child_arr = $this->getChild($rootid);
  if(is_array($child_arr)){
   $cnt = count($child_arr);
   foreach($child_arr as $key => $child){
    $cid = $child['id'];
    $child_child = $this->getChild($cid);
    if($this->deep >1){
     if($is_top == 1 && $this->deep > 1){
      $space = $this->icon[1];
      if(!$parent_end)
      $add .=  $this->icon[0];
      else $add .= ‘&nbsp;&nbsp;’;
     }

     if($is_top == $cnt){
      $space = $this->icon[2];
      $parent_end = true;
     }else {
      $space = $this->icon[1];
      $parent_end = false;
     }
    }
    $this->tree[] = array(‘spacer’=>$add.$k.$space,
           ‘name’=>$child['name'],
           ‘id’=>$cid
    );
    $is_top++;

    $this->deep++;
    if($this->getChild($cid))
    $this->getTree($cid,$add,$parent_end);
    $this->deep–;

   }

  }
  return $this->tree;
 }

 /**
  * 获取下级分类数组
  * @param int $root
  */
 function getChild($root = 0){

  $a = $child = array();
  foreach($this->arr as $id=>$a){
   if($a['parentid'] == $root){
    $child[$a['id']] = $a;
   }
  }
  return $child?$child:false;
   
 }
 /**
  * 设置源数组
  * @param $arr
  */
 function setArr($arr = array()){
  $this->arr = $arr;
 }
}

通过一次查询把结构保存进一个数组,再数组进行递归运算,无疑极大的提高了程序运行效率
使用代码很简单,得到查询结构后setArr,直接调用getTree, 皆可以得到按照程序排序号并带有前缀修饰等信息的数组,到这里通过foreach这个数组就可以得到如下的树状列表了

水果   
  ├香蕉
  ├苹果
  │├红富士
  │└海南苹果
  └桃子

smarty中使用fckeditor

2010年4月6日 没有评论

网上最常用的做法是先在php中调用fckeditor类的createHtml方法生成一段html,直接assign给一个samrty变量即可

这里我通过smarty的插件机制,可以更方便的在smarty中集成fckeditor,在smarty的plugin目录中新建文件function.fck.php

内容如下

<?php
function smarty_function_fck($params, &$smarty)
{
 if(!isset($params['InstanceName']) || empty($params['InstanceName']))
 {
  $smarty->trigger_error(‘fckeditor: required parameter “InstanceName” missing’);
 }

 static $base_arguments = array();
 static $config_arguments = array();

 if(!count($base_arguments))
  $init = TRUE;
 else
  $init = FALSE;

 if(isset($params['BasePath']))
 {
  $base_arguments['BasePath'] = $params['BasePath'];
 }
 else if(empty($base_arguments['BasePath']))
 {

//这里设置默认的fck所在的目录,相对于要使用fck的程序的目录
  $base_arguments['BasePath'] = ‘../plugins/fckeditor/’;
 }

 $base_arguments['InstanceName'] = $params['InstanceName'];

 if(isset($params['Value'])) $base_arguments['Value'] = $params['Value'];
 if(isset($params['Width'])) $base_arguments['Width'] = $params['Width'];
 if(isset($params['Height'])) $base_arguments['Height'] = $params['Height'];
 if(isset($params['ToolbarSet'])) $base_arguments['ToolbarSet'] = $params['ToolbarSet'];
 if(isset($params['CheckBrowser'])) $base_arguments['CheckBrowser'] = $params['CheckBrowser'];
 if(isset($params['DisplayErrors'])) $base_arguments['DisplayErrors'] = $params['DisplayErrors'];

 // Use all other parameters for the config array (replace if needed)
 $other_arguments = array_diff_assoc($params, $base_arguments);
 $config_arguments = array_merge($config_arguments, $other_arguments);

 $out = ”;

 if($init)
 {
  $out .= ‘<script type=”text/javascript” src=”‘ . $base_arguments['BasePath'] . ‘fckeditor.js”></script>’;
 }

 $out .= “\n<script type=\”text/javascript\”>\n”;
 $out .= “var oFCKeditor = new FCKeditor(‘” . $base_arguments['InstanceName'] . “‘);\n”;

 foreach($base_arguments as $key => $value)
 {
  if(!is_bool($value))
  {
   // Fix newlines, javascript cannot handle multiple line strings very well.
   $value = ‘”‘ . preg_replace(“/[\r\n]+/”, ‘” + $0″‘, addslashes($value)) . ‘”‘;
  }
  $out .= “oFCKeditor.$key = $value; “;
 }

 foreach($config_arguments as $key => $value)
 {
  if(!is_bool($value))
  {
   $value = ‘”‘ . preg_replace(“/[\r\n]+/”, ‘” + $0″‘, addslashes($value)) . ‘”‘;
  }
  $out .= “oFCKeditor.Config[\"$key\"] = $value; “;
 }

 $out .= “\noFCKeditor.Create();\n”;
 $out .= “</script>\n”;

 return $out;
}
?>

使用代码

{fck InstanceName=”body”  BasePath=“../plugins/fckeditor/” Value=$news_info.body Width=”100%” Height=”400″}
可以自定义参数 ToolbarSet-使用的工具栏, BasePath-fck相对于当前脚本的目录,InstanceName-要赋予的$_POST变量名, Value-默认值等