<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Magki&#039;s Blog &#187; PHP</title>
	<atom:link href="http://www.magki.com/blog/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.magki.com/blog</link>
	<description>努力赚钱ing &#124; 承接各种企业站, 门户站, 商城等开发(PHP)</description>
	<lastBuildDate>Thu, 26 Aug 2010 05:04:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>一个简单好用的缩略图类</title>
		<link>http://www.magki.com/blog/2009/09/a-simple-thumbnail-class.html</link>
		<comments>http://www.magki.com/blog/2009/09/a-simple-thumbnail-class.html#comments</comments>
		<pubDate>Sat, 12 Sep 2009 02:37:47 +0000</pubDate>
		<dc:creator>Magki</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[代码片段]]></category>

		<guid isPermaLink="false">http://www.magki.com/blog/?p=33</guid>
		<description><![CDATA[这个缩略图生成类是根据从 PHPCMS 挖出来的相关函数简单修改而来的。自觉使用起来挺方便的，呵呵。
用法也简单，范例如下：
$thumb = new thumb(str_replace("\\","/",dirname(__FILE__))."/"); \\定义根物理路径
$thumb-&#62;get('images/107.jpg'); \\输入图片路径生成缩略图并返回缩略图路径
以上写法也可以改成
$thumb = new thumb();
$thumb-&#62;get('E:/htdocs/magki/include/images/107.jpg');
不过前一种返回的是缩略图的相对路径，而后一种是返回缩略图的绝对物理路径。
缩略图的命名只定义了三个标签如下：
%maxwidth% get 方法中所定义的缩略图的最大宽度，默认 100
%maxheight% get 方法中所定义的缩略图的最大高度，默认 100
%basename% 所要生成缩略图的原图文件名
类中默认使用的缩略图命名是 thumb_%maxwidth%_%maxheight%_%basename% 像上面范例中所生成的缩略图命名就是根据默认来生成的，所得到的缩略图文件名为 thumb_100_100_107.jpg。有需要的可以自己扩展更多的缩略图命名标签。
另外，这个类的 get 方法还有一个参数是 autocut，如果赋值为 1 （默认值）则如果原图高宽比例和所指定的缩略图高宽比例不一致则会进行裁剪而非变形拉伸。

class thumb{
    var $basepath;
    var $namerule;
    var $defaultpic;
    var $rules;
    /**
     * 兼容 PHP4 的类构造函数
     *
     * @param string $basepath
     * @param string $namerule
     * @param string $defaultpic
     */
    function thumb($basepath = '', $namerule = '', $defaultpic = 'images/defaultpic.gif')
    {
        return $this-&#62;__construct($basepath, $namerule, $defaultpic);
    }
    /**
     * [...]]]></description>
			<content:encoded><![CDATA[<p>这个缩略图生成类是根据从 PHPCMS 挖出来的相关函数简单修改而来的。自觉使用起来挺方便的，呵呵。</p>
<p>用法也简单，范例如下：</p>
<p><span style="color: #ff0000;">$thumb = new thumb(str_replace("\\","/",dirname(__FILE__))."/");</span> \\定义根物理路径<br />
<span style="color: #ff0000;">$thumb-&gt;get('images/107.jpg');</span> \\输入图片路径生成缩略图并返回缩略图路径</p>
<p>以上写法也可以改成</p>
<p><span style="color: #ff0000;">$thumb = new thumb();<br />
$thumb-&gt;get('E:/htdocs/magki/include/images/107.jpg');</span></p>
<p>不过前一种返回的是缩略图的相对路径，而后一种是返回缩略图的绝对物理路径。</p>
<p>缩略图的命名只定义了三个标签如下：</p>
<p><span style="color: #ff0000;">%maxwidth%</span> get 方法中所定义的缩略图的最大宽度，默认 100<br />
<span style="color: #ff0000;">%maxheight%</span> get 方法中所定义的缩略图的最大高度，默认 100<br />
<span style="color: #ff0000;">%basename%</span> 所要生成缩略图的原图文件名</p>
<p>类中默认使用的缩略图命名是 <span style="color: #ff0000;">thumb_%maxwidth%_%maxheight%_%basename%</span> 像上面范例中所生成的缩略图命名就是根据默认来生成的，所得到的缩略图文件名为 <span style="color: #ff0000;">thumb_100_100_107.jpg</span>。有需要的可以自己扩展更多的缩略图命名标签。</p>
<p>另外，这个类的 get 方法还有一个参数是 autocut，如果赋值为 1 （默认值）则如果原图高宽比例和所指定的缩略图高宽比例不一致则会进行裁剪而非变形拉伸。</p>
<p><span id="more-33"></span></p>
<blockquote><p>class thumb{<br />
    var $basepath;<br />
    var $namerule;<br />
    var $defaultpic;<br />
    var $rules;</p>
<p>    /**<br />
     * 兼容 PHP4 的类构造函数<br />
     *<br />
     * @param string $basepath<br />
     * @param string $namerule<br />
     * @param string $defaultpic<br />
     */<br />
    function thumb($basepath = '', $namerule = '', $defaultpic = 'images/defaultpic.gif')<br />
    {<br />
        return $this-&gt;__construct($basepath, $namerule, $defaultpic);<br />
    }</p>
<p>    /**<br />
     * 类构造函数<br />
     *<br />
     * @param string $basepath<br />
     * @param string $namerule<br />
     * @param string $defaultpic<br />
     */<br />
    function __construct($basepath = '', $namerule = '', $defaultpic = 'images/defaultpic.gif')<br />
    {<br />
        $this-&gt;basepath = $basepath;<br />
        $this-&gt;namerule = ($namerule) ? $namerule : 'thumb_%maxwidth%_%maxheight%_%basename%' ;<br />
        $this-&gt;defaultpic = ($defaultpic) ? $defaultpic : 'images/defaultpic.gif' ;<br />
        preg_match_all("/%([a-zA-Z0-9_]+)%/",$this-&gt;namerule,$matches);<br />
        $this-&gt;rules = $matches[1];<br />
    }</p>
<p>    /**<br />
     * 缩略图输出函数<br />
     *<br />
     * @param string $imgpath        图片路径<br />
     * @param integer $maxwidth        缩略图最大宽度<br />
     * @param integer $maxheight    缩略图最大高度<br />
     * @param boolean $autocut        是否自动裁剪<br />
     * @param boolean $interlace    是否启用交叉模式<br />
     * @return string<br />
     */<br />
    function get($imgpath, $maxwidth = 100, $maxheight = 100, $autocut = 1, $interlace = 0)<br />
    {<br />
        if(empty($imgpath)) return $this-&gt;defaultpic;<br />
        if(!file_exists($this-&gt;basepath.$imgpath)) return $this-&gt;defaultpic;<br />
        if(!extension_loaded('gd') || strpos($imgpath, '://')) return $imgpath;<br />
        list($width_t, $height_t, $type, $attr) = getimagesize($this-&gt;basepath.$imgpath);<br />
        if($maxwidth&gt;=$width_t || $maxheight&gt;=$height_t) return $imgpath;</p>
<p>        $basename = basename($imgpath);<br />
        $thumbname = $this-&gt;namerule;<br />
        foreach($this-&gt;rules as $rule){<br />
            $thumbname = str_replace('%'.$rule.'%',$$rule,$thumbname);<br />
        }<br />
        $thumbpath = dirname($imgpath).'/'.$thumbname;<br />
        if(file_exists($this-&gt;basepath.$thumbpath)) return $thumbpath;<br />
        <br />
        $image = $this-&gt;basepath.$imgpath;<br />
        $info = $this-&gt;info($image);<br />
        if($info === false) return false;<br />
        $srcwidth = $info['width'];<br />
        $srcheight = $info['height'];<br />
        $pathinfo = pathinfo($image);<br />
        $type = $pathinfo['extension'];<br />
        if(!$type) $type = strtolower($info['type']);<br />
        unset($info);<br />
        $scale = min($maxwidth/$srcwidth, $maxheight/$srcheight);<br />
        $createwidth = $width = (int)($srcwidth*$scale);<br />
        $createheight = $height = (int)($srcheight*$scale);<br />
        if($maxwidth &gt;= $srcwidth) $createwidth = $width = $srcwidth;<br />
        if($maxheight &gt;= $srcheight) $createheight = $height = $srcheight;<br />
        $psrc_x = $psrc_y = 0;<br />
        if($autocut)<br />
        {<br />
            if($maxwidth/$maxheight&lt;$srcwidth/$srcheight &amp;&amp; $maxheight&gt;=$height)<br />
            {<br />
                $width = $maxheight/$height*$width;<br />
                $height = $maxheight;<br />
            }<br />
            elseif($maxwidth/$maxheight&gt;$srcwidth/$srcheight &amp;&amp; $maxwidth&gt;=$width)<br />
            {<br />
                $height = $maxwidth/$width*$height;<br />
                $width = $maxwidth;<br />
            }<br />
            $createwidth = $maxwidth;<br />
            $createheight = $maxheight;<br />
        }<br />
        $createfun = 'imagecreatefrom'.($type=='jpg' ? 'jpeg' : $type);<br />
        $srcimg = $createfun($image);<br />
        if($type != 'gif' &amp;&amp; function_exists('imagecreatetruecolor'))<br />
            $thumbimg = imagecreatetruecolor($createwidth, $createheight);<br />
        else<br />
            $thumbimg = imagecreate($width, $height);</p>
<p>        if(function_exists('imagecopyresampled'))<br />
            imagecopyresampled($thumbimg, $srcimg, 0, 0, $psrc_x, $psrc_y, $width, $height, $srcwidth, $srcheight);<br />
        else<br />
            imagecopyresized($thumbimg, $srcimg, 0, 0, $psrc_x, $psrc_y, $width, $height, $srcwidth, $srcheight);<br />
        if($type=='gif' || $type=='png')<br />
        {<br />
            $background_color = imagecolorallocate($thumbimg, 0, 255, 0);<br />
            imagecolortransparent($thumbimg, $background_color);<br />
        }<br />
        if($type=='jpg' || $type=='jpeg') imageinterlace($thumbimg, $interlace);<br />
        $imagefun = 'image'.($type=='jpg' ? 'jpeg' : $type);<br />
        if(empty($thumbpath)) $thumbpath = substr($image, 0, strrpos($image, '.')).$suffix.'.'.$type;<br />
        $imagefun($thumbimg, $thumbpath);<br />
        imagedestroy($thumbimg);<br />
        imagedestroy($srcimg);<br />
        return $thumbpath;<br />
    }</p>
<p>    /**<br />
     * 根据传递进来图片物理路径返回基本的图片属性<br />
     *<br />
     * @param string $img<br />
     * @return array<br />
     */<br />
    function info($img)<br />
    {<br />
        $imageinfo = getimagesize($img);<br />
        if($imageinfo === false) return false;<br />
        $imagetype = strtolower(substr(image_type_to_extension($imageinfo[2]),1));<br />
        $imagesize = filesize($img);<br />
        return $info = array(<br />
            'width'=&gt;$imageinfo[0],<br />
            'height'=&gt;$imageinfo[1],<br />
            'type'=&gt;$imagetype,<br />
            'size'=&gt;$imagesize,<br />
            'mime'=&gt;$imageinfo['mime']<br />
        );<br />
    }<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.magki.com/blog/2009/09/a-simple-thumbnail-class.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>给 PHPCMS 添加删除栏目的代码做优化</title>
		<link>http://www.magki.com/blog/2009/08/code-optimization-for-phpcms.html</link>
		<comments>http://www.magki.com/blog/2009/08/code-optimization-for-phpcms.html#comments</comments>
		<pubDate>Tue, 11 Aug 2009 00:58:15 +0000</pubDate>
		<dc:creator>Magki</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[源码修改]]></category>

		<guid isPermaLink="false">http://www.magki.com/blog/?p=31</guid>
		<description><![CDATA[最近几个单都是用 PHPCMS 做二次开发，包括现在正在进行的这个大单，有多大？给客户添数据后，光是栏目数就已经设置到3000+并且上升势头不减……
以前没遇到过一个网站有那么多栏目的情况，估计 PHPCMS 的开发人员也没遇到过，因为我发现栏目越多，添加和修改栏目的速度越慢，栏目数过1000的时候，基本修改一次栏目就得花上1分钟时间，现在 3000+ 栏目已经要4，5分钟了……查阅了下 PHPCMS 的代码发现了问题所在。
PHPCMS 的栏目相关处理方法都是在 include\admin\category.class.php 里，这个类文件中有一个被频繁使用的方法 repair，问题就出在这里。无论是添加、删除还是其他的一些栏目操作，大多都会执行一次这个方法（有个地方连续执行两次，不解，应该是开发人员的失误）。而这个方法的主要工作就是将整个站的所有栏目遍历一次遍，对每个栏目都更新一下 arrparentid, parentdir, arrchildid 三个字段的内容。妈妈呀，那3000多个栏目岂不是要执行3000多次 update？怪不得……

我想开发人员之所以这么设计，应该是考虑到一个栏目的路径以及父栏目的变更对其父栏目和子栏目的影响，就计划要整体更新一遍防止出错。不过这种全盘更新的方式有失斟酌呀！一般只需要对影响到到的某几个栏目分支的所有栏目更新一遍就可以了。于是我将这个方法修改如下：

function repair($id=0,$pid=-1,$opid=-1)
{
&#160;&#160;&#160;&#160;@set_time_limit(600);
&#160;&#160;&#160;&#160;if($id==0){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(is_array($this->category))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach($this->category as $catid => $cat)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if($catid == 0) continue;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$arrparentid = $this->get_arrparentid($catid);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$parentdir = $this->get_parentdir($catid);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$arrchildid = $this->get_arrchildid($catid);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$child = is_numeric($arrchildid) ? 0 : 1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->db->query("UPDATE `$this->table` SET arrparentid='$arrparentid',parentdir='$parentdir',arrchildid='$arrchildid',child='$child' WHERE catid=$catid");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if($cat['module']=='phpcms') $this->url($catid);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$this->cache();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return TRUE;
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;if($pidget_arrparentid($opid).",".$opid);
&#160;&#160;&#160;&#160;$arrchildid = explode(",",$this->get_arrchildid($id));
&#160;&#160;&#160;&#160;$allid = array_merge($arrpid,$arropid);
&#160;&#160;&#160;&#160;$allid = array_merge($allid,$arrchildid);
&#160;&#160;&#160;&#160;$allid = array_flip($allid);
&#160;&#160;&#160;&#160;foreach($allid as $catid=>$v)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if($catid [...]]]></description>
			<content:encoded><![CDATA[<p>最近几个单都是用 PHPCMS 做二次开发，包括现在正在进行的这个大单，有多大？给客户添数据后，光是栏目数就已经设置到3000+并且上升势头不减……</p>
<p>以前没遇到过一个网站有那么多栏目的情况，估计 PHPCMS 的开发人员也没遇到过，因为我发现栏目越多，添加和修改栏目的速度越慢，栏目数过1000的时候，基本修改一次栏目就得花上1分钟时间，现在 3000+ 栏目已经要4，5分钟了……查阅了下 PHPCMS 的代码发现了问题所在。</p>
<p>PHPCMS 的栏目相关处理方法都是在 include\admin\category.class.php 里，这个类文件中有一个被频繁使用的方法 repair，问题就出在这里。无论是添加、删除还是其他的一些栏目操作，大多都会执行一次这个方法（有个地方连续执行两次，不解，应该是开发人员的失误）。而这个方法的主要工作就是将整个站的所有栏目遍历一次遍，对每个栏目都更新一下 <span style="color: #ff0000;">arrparentid</span>, <span style="color: #ff0000;">parentdir</span>, <span style="color: #ff0000;">arrchildid</span> 三个字段的内容。妈妈呀，那3000多个栏目岂不是要执行3000多次 update？怪不得……</p>
<p><span id="more-31"></span></p>
<p>我想开发人员之所以这么设计，应该是考虑到一个栏目的路径以及父栏目的变更对其父栏目和子栏目的影响，就计划要整体更新一遍防止出错。不过这种全盘更新的方式有失斟酌呀！一般只需要对影响到到的某几个栏目分支的所有栏目更新一遍就可以了。于是我将这个方法修改如下：</p>
<blockquote><p>
function repair($id=0,$pid=-1,$opid=-1)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@set_time_limit(600);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if($id==0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($this->category))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach($this->category as $catid => $cat)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($catid == 0) continue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrparentid = $this->get_arrparentid($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parentdir = $this->get_parentdir($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrchildid = $this->get_arrchildid($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$child = is_numeric($arrchildid) ? 0 : 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->db->query("UPDATE `$this->table` SET arrparentid='$arrparentid',parentdir='$parentdir',arrchildid='$arrchildid',child='$child' WHERE catid=$catid");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($cat['module']=='phpcms') $this->url($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->cache();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if($pid<1) $pid=$id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if($opid<1) $opid=$id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$arrpid = explode(",",$this->get_arrparentid($pid).",".$pid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$arropid = explode(",",$this->get_arrparentid($opid).",".$opid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$arrchildid = explode(",",$this->get_arrchildid($id));<br />
&nbsp;&nbsp;&nbsp;&nbsp;$allid = array_merge($arrpid,$arropid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$allid = array_merge($allid,$arrchildid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$allid = array_flip($allid);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;foreach($allid as $catid=>$v)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($catid == 0) continue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrparentid = $this->get_arrparentid($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parentdir = $this->get_parentdir($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arrchildid = $this->get_arrchildid($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$child = is_numeric($arrchildid) ? 0 : 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->db->query("UPDATE `$this->table` SET arrparentid='$arrparentid',parentdir='$parentdir',arrchildid='$arrchildid',child='$child' WHERE catid=$catid");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($this->category[$catid]['module']=='phpcms') $this->url($catid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;$this->cache();<br />
&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />
}
</p></blockquote>
<p>这个方法修改完毕后，在去这个类文件的 add 和 edit 方法中修改 <span style="color: #ff0000;">$this-&gt;repair();</span> 这一行，主要是有三个参数依次为<span style="color: #ff0000;">栏目ID</span>，<span style="color: #ff0000;">最后的父级ID</span>，<span style="color: #ff0000;">之前的父级ID</span>。三个参数都不设置则和原来的效果完全一致，只填栏目ID则只更新该栏目以及其子栏目的前面所说的那三个字段内容，填写最后的父级ID，则会将所指定栏目最后所在栏目分支里的所有栏目更新一遍，填写之前的父级ID，则会将所指定栏目更改父级栏目之前所在的栏目分支里所有栏目更新一遍。注意，如果要更新相关栏目分支里的栏目，栏目ID这个参数必须同时设置。针对我这边的情况，我将 add 方法里的 repair 方法调用修改成 <span style="color: #ff0000;">$this-&gt;repair($catid,$parentid);</span>，edit 方法里则改成 <span style="color: #ff0000;">$this-&gt;repair($catid,$parentid,$oldparentid);</span>。</p>
<p>另外 add 方法里执行 repair 方法之前还得插入如下代码，以保证新添加的栏目可以更新到缓存里去。</p>
<blockquote><p>
$this->category[$catid]['parentid'] = $category['parentid'];<br />
$this->category[$catid]['arrparentid'] = $category['arrparentid'];<br />
$this->category[$catid]['parentdir'] = $category['parentdir'];<br />
$this->category[$catid]['arrchildid'] = $catid;
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.magki.com/blog/2009/08/code-optimization-for-phpcms.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>FleaPHP 表关联学习笔记</title>
		<link>http://www.magki.com/blog/2009/04/fleaphp-study-notes.html</link>
		<comments>http://www.magki.com/blog/2009/04/fleaphp-study-notes.html#comments</comments>
		<pubDate>Wed, 22 Apr 2009 00:35:01 +0000</pubDate>
		<dc:creator>Magki</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://www.magki.com/blog/?p=22</guid>
		<description><![CDATA[HAS_ONE：当前表的每一条记录都拥有最多一条（0–1）关联记录
HAS_MANY：当前表的每一条记录都拥有多条（0-n）关联记录
MANY_TO_MANY：当前表的每一条记录都和其他表的多条（0-n）记录关联
BELONGS_TO：当前表的每一条记录都属于另一个表的某条记录
关联中必须设置的属性为：
'name',          // 关联的名字（如：hasOne、hasMany）
'tableClass',          // 关联的表数据入口对象名
'mappingName',          // 字段映射名
可选属性：
'foreignKey',          //外键字段名
'sort',          //对关联表进行查询时使用的排序参数
'conditions',          //对关联表进行查询时使用的条件参数
'fields',          //对关联表进行查询时要获取的关联表字段
'limit',          //对关联表进行查询时限制查出的记录数
'enabled',          //是否处理关联，设置为falses时，不处理该表入口的任何关联。enabled 的优先级高于 linkRead、linkCreate、linkUpdate 和 linkRemove。
'countOnly',          //指示在查询关联表时是否仅仅统计记录数，而不实际查询数据
'counterCache',          //将关联记录总数缓存到指定的字段,数据表中要建立相应的字段
'linkRead',          //指示是否在主表读取记录时也读取该关联对应的关联表的记录,默认ture
'linkCreate',          //指示是否在主表创建记录时也创建该关联对应的关联表的记录,默认ture
'linkUpdate',          //指示是否在主表更新记录时也更新该关联对应的关联表的记录,默认ture
'linkRemove',          //指示是否在主表删除记录时也删除该关联对应的关联表的记录,默认ture
'linkRemoveFillValue',          //当删除主表记录而不删除关联表记录时，用什么值填充关联表记录的外键字段,默认0
'saveAssocMethod',          //指示当保存关联数据时，采用何种方法，默认为 save，可以设置为 create、update 或 replace
关联：一个关联是一个关系，这个关系属于某一个数据表。例如 users 表可能就拥有一个或者多个关联。
主表：对于一个关联，拥有该关联的数据表就是主表。例如 posts 表定义了一个 MANY_TO_MANY 关联。那么在这里（指这个关联），posts 就是主表。
关联表：在一个关联中，关联表就是除主表外的另一个表。
外键：在数据库原理中，外键的含义很复杂。但在 FleaPHP 框架中的数据库关联功能中，外键泛指一个记录中用于关联另一个记录的字段。例如 profile 表中的 user_id 字段就是用于关联 users 表的字段。这个 user_id 字段就是一个外键。
中间表：在 MANY_TO_MANY 关联中，除了主表和关联表，还需要另一个表来保存这两个表的记录之间的互相关联关系。这个表称为中间表。
]]></description>
			<content:encoded><![CDATA[<p><strong>HAS_ONE：</strong>当前表的每一条记录都拥有最多一条（0–1）关联记录<br />
<strong>HAS_MANY：</strong>当前表的每一条记录都拥有多条（0-n）关联记录<br />
<strong>MANY_TO_MANY：</strong>当前表的每一条记录都和其他表的多条（0-n）记录关联<br />
<strong>BELONGS_TO：</strong>当前表的每一条记录都属于另一个表的某条记录</p>
<p>关联中必须设置的属性为：<br />
<strong>'name'</strong>,          // 关联的名字（如：hasOne、hasMany）<br />
<strong>'tableClass'</strong>,          // 关联的表数据入口对象名<br />
<strong>'mappingName'</strong>,          // 字段映射名</p>
<p>可选属性：<br />
<strong>'foreignKey'</strong>,          //外键字段名<br />
<strong>'sort'</strong>,          //对关联表进行查询时使用的排序参数<br />
<strong>'conditions'</strong>,          //对关联表进行查询时使用的条件参数<br />
<strong>'fields'</strong>,          //对关联表进行查询时要获取的关联表字段<br />
<strong>'limit'</strong>,          //对关联表进行查询时限制查出的记录数<br />
<strong>'enabled'</strong>,          //是否处理关联，设置为falses时，不处理该表入口的任何关联。enabled 的优先级高于 linkRead、linkCreate、linkUpdate 和 linkRemove。<br />
<strong>'countOnly'</strong>,          //指示在查询关联表时是否仅仅统计记录数，而不实际查询数据<br />
<strong>'counterCache'</strong>,          //将关联记录总数缓存到指定的字段,数据表中要建立相应的字段<br />
<strong>'linkRead'</strong>,          //指示是否在主表读取记录时也读取该关联对应的关联表的记录,默认ture<br />
<strong>'linkCreate'</strong>,          //指示是否在主表创建记录时也创建该关联对应的关联表的记录,默认ture<br />
<strong>'linkUpdate'</strong>,          //指示是否在主表更新记录时也更新该关联对应的关联表的记录,默认ture<br />
<strong>'linkRemove'</strong>,          //指示是否在主表删除记录时也删除该关联对应的关联表的记录,默认ture<br />
<strong>'linkRemoveFillValue'</strong>,          //当删除主表记录而不删除关联表记录时，用什么值填充关联表记录的外键字段,默认0<br />
<strong>'saveAssocMethod'</strong>,          //指示当保存关联数据时，采用何种方法，默认为 save，可以设置为 create、update 或 replace</p>
<p><strong>关联：</strong>一个关联是一个关系，这个关系属于某一个数据表。例如 users 表可能就拥有一个或者多个关联。<br />
<strong>主表：</strong>对于一个关联，拥有该关联的数据表就是主表。例如 posts 表定义了一个 MANY_TO_MANY 关联。那么在这里（指这个关联），posts 就是主表。<br />
<strong>关联表：</strong>在一个关联中，关联表就是除主表外的另一个表。<br />
<strong>外键：</strong>在数据库原理中，外键的含义很复杂。但在 FleaPHP 框架中的数据库关联功能中，外键泛指一个记录中用于关联另一个记录的字段。例如 profile 表中的 user_id 字段就是用于关联 users 表的字段。这个 user_id 字段就是一个外键。<br />
<strong>中间表：</strong>在 MANY_TO_MANY 关联中，除了主表和关联表，还需要另一个表来保存这两个表的记录之间的互相关联关系。这个表称为中间表。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.magki.com/blog/2009/04/fleaphp-study-notes.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpDoc 注释的一点说明</title>
		<link>http://www.magki.com/blog/2009/02/the-description-phpdoc.html</link>
		<comments>http://www.magki.com/blog/2009/02/the-description-phpdoc.html#comments</comments>
		<pubDate>Tue, 03 Feb 2009 03:05:53 +0000</pubDate>
		<dc:creator>Magki</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://www.magki.com/blog/?p=12</guid>
		<description><![CDATA[PHP 编程最好能做好各种注释，不管是用 IDE 还是编辑器进行代码编写，良好的注释总能给予极大的帮助。对于 phpDoc 注释的用法这里做点简单的说明。
/**
* @name  名字
* @abstract  申明变量/类/方法
* @access  指明这个变量、类、函数/方法的存取权限
* @author  函数作者的名字和邮箱地址
* @category  组织packages
* @copyright  指明版权信息
* @const  指明常量
* @deprecate  指明不推荐或者是废弃的信息
* @example  示例
* @exclude  指明当前的注释将不进行分析，不出现在文挡中
* @final  指明这是一个最终的类、方法、属性，禁止派生、修改。
* @global  指明在此函数中引用的全局变量
* @include  指明包含的文件的信息
* @link  定义在线连接
* @module  定义归属的模块信息
* @modulegroup  定义归属的模块组
* @package  定义归属的包的信息
* @param  定义函数或者方法的参数信息
* @return  定义函数或者方法的返回信息
* @see  定义需要参考的函数、变量，并加入相应的超级连接。
* @since  指明该api函数或者方法是从哪个版本开始引入的
* @static  指明变量、类、函数是静态的。
* @throws  指明此函数可能抛出的错误异常,极其发生的情况
* @todo  指明应该改进或没有实现的地方
* @var  [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 编程最好能做好各种注释，不管是用 IDE 还是编辑器进行代码编写，良好的注释总能给予极大的帮助。对于 phpDoc 注释的用法这里做点简单的说明。</p>
<p>/**<br />
* <strong>@name</strong>  名字<br />
* <strong>@abstract</strong>  申明变量/类/方法<br />
* <strong>@access</strong>  指明这个变量、类、函数/方法的存取权限<br />
* <strong>@author</strong>  函数作者的名字和邮箱地址<br />
* <strong>@category</strong>  组织packages<br />
* <strong>@copyright</strong>  指明版权信息<br />
* <strong>@const</strong>  指明常量<br />
* <strong>@deprecate</strong>  指明不推荐或者是废弃的信息<br />
* <strong>@example</strong>  示例<br />
* <strong>@exclude</strong>  指明当前的注释将不进行分析，不出现在文挡中<br />
* <strong>@final</strong>  指明这是一个最终的类、方法、属性，禁止派生、修改。<br />
* <strong>@global</strong>  指明在此函数中引用的全局变量<br />
* <strong>@include</strong>  指明包含的文件的信息<br />
* <strong>@link</strong>  定义在线连接<br />
* <strong>@module</strong>  定义归属的模块信息<br />
* <strong>@modulegroup</strong>  定义归属的模块组<br />
* <strong>@package</strong>  定义归属的包的信息<br />
* <strong>@param</strong>  定义函数或者方法的参数信息<br />
* <strong>@return</strong>  定义函数或者方法的返回信息<br />
* <strong>@see</strong>  定义需要参考的函数、变量，并加入相应的超级连接。<br />
* <strong>@since</strong>  指明该api函数或者方法是从哪个版本开始引入的<br />
* <strong>@static</strong>  指明变量、类、函数是静态的。<br />
* <strong>@throws</strong>  指明此函数可能抛出的错误异常,极其发生的情况<br />
* <strong>@todo</strong>  指明应该改进或没有实现的地方<br />
* <strong>@var</strong>  定义说明变量/属性。<br />
* <strong>@version</strong>  定义版本信息<br />
*/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.magki.com/blog/2009/02/the-description-phpdoc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 变量命名规则小述</title>
		<link>http://www.magki.com/blog/2009/01/php-variable-naming-rules.html</link>
		<comments>http://www.magki.com/blog/2009/01/php-variable-naming-rules.html#comments</comments>
		<pubDate>Sat, 31 Jan 2009 07:20:37 +0000</pubDate>
		<dc:creator>Magki</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.magki.com/blog/?p=10</guid>
		<description><![CDATA[一个良好的命名规则能让代码变得更加清晰流畅，不仅令别人阅读方面，就是自己维护起来也能减少许多麻烦，这里搜集整理了一点关于变量命名的资料一起分享。
string 字符串型，在变量前面加 str
eg：
　　//下面一个变量为字符串
　　$strMessage = 'Hello World!' ;
array 数组型，在变量前面加 a，一维数组使用名词单数，多维数组使用词复数
eg:
　　//下面一个变量为一维数组
　　$aData = array ( 1 , 2 , 3 , 4 , 5 ,6) ;
　　//下面一个变量为多维数组
　　$aMembers = array ( 'id' =&#62; 123456 , 'username' =&#62; 'ABC' , 'email' =&#62; 'abc#abc.com' ) ;
integer 整数型变量，在前面加上 n
eg:
　　//下面一个变量为整数
　　$nCount = $pBS-&#62;Member-&#62;getCount() ;
boolean 布尔型变量，在前面加上 b
eg:
　　//下面一个变量为布尔型
　　$bEncode = true ;
float 浮点型变量，在前面加上 f
eg:
　　//下面一个变量为浮点型
　　$fSave = 0.8 ;

指针类型，比如类。在前面加上 p
eg:
　　//下面是一个类的实例化
　　$pBP [...]]]></description>
			<content:encoded><![CDATA[<p>一个良好的命名规则能让代码变得更加清晰流畅，不仅令别人阅读方面，就是自己维护起来也能减少许多麻烦，这里搜集整理了一点关于变量命名的资料一起分享。</p>
<p>string 字符串型，在变量前面加 <span style="color: #ff0000;">str</span><br />
<strong>eg：<br />
</strong>　　//下面一个变量为字符串<br />
　　$strMessage = 'Hello World!' ;</p>
<p>array 数组型，在变量前面加 <span style="color: #ff0000;">a</span>，一维数组使用名词单数，多维数组使用词复数<br />
<strong>eg:</strong><br />
　　//下面一个变量为一维数组<br />
　　$aData = array ( 1 , 2 , 3 , 4 , 5 ,6) ;<br />
　　//下面一个变量为多维数组<br />
　　$aMembers = array ( 'id' =&gt; 123456 , 'username' =&gt; 'ABC' , 'email' =&gt; 'abc#abc.com' ) ;</p>
<p>integer 整数型变量，在前面加上 <span style="color: #ff0000;">n<br />
</span><strong>eg:<br />
</strong>　　//下面一个变量为整数<br />
　　$nCount = $pBS-&gt;Member-&gt;getCount() ;</p>
<p>boolean 布尔型变量，在前面加上 <span style="color: #ff0000;">b<br />
</span><strong>eg:<br />
</strong>　　//下面一个变量为布尔型<br />
　　$bEncode = true ;</p>
<p>float 浮点型变量，在前面加上 <span style="color: #ff0000;">f<br />
</span><strong>eg:</strong><br />
　　//下面一个变量为浮点型<br />
　　$fSave = 0.8 ;</p>
<p><span id="more-10"></span></p>
<p>指针类型，比如类。在前面加上 <span style="color: #ff0000;">p<br />
</span><strong>eg:<br />
</strong>　　//下面是一个类的实例化<br />
　　$pBP = new BluePage ;</p>
<p>resource 资源型，在前面加上 <span style="color: #ff0000;">rs<br />
</span><strong>eg:<br />
</strong>　　$rsConn = mysql_connect ( 'localhost' , 'user' , 'pw' ) ;<br />
　　$rsHandle = fopen( $strFilename );</p>
<p>未明变量，使用 <span style="color: #ff0000;">mx<br />
</span><strong>eg:<br />
</strong>　　$mxData = getData() ;</p>
<p>自定义函数，使用 <span style="color: #ff0000;">fn_</span> 开头<br />
<strong>eg:<br />
</strong>　　function fn_HaltError ( $strErrorMessage ) {<br />
　　　　// do sth...<br />
　　}</p>
<p><strong>一个综合的例子(使用分页类):</strong></p>
<p style="PADDING-LEFT: 30px">include ( "lib/BluePage.class.php" ) ;<br />
$pBP = new BluePage ;</p>
<p style="PADDING-LEFT: 30px">$rsConn = mysql_connect( 'localhost' , 'root' , '123456' ) or die( mysql_error() ) ;<br />
mysql_select_db( 'test' , $rsConn );<br />
$strQuery = "SELECT COUNT(`id`) FROM test" ;<br />
$nCount = $pBP-&gt;myGetCount( $strQuery , $rsConn ) ; //取得总数</p>
<p style="PADDING-LEFT: 30px">if ( $nCount &lt; 1 ) {<br />
　　fn_HaltError( $aMessages['nodata'] ) ;<br />
}</p>
<p style="PADDING-LEFT: 30px">$nShowNum = 10 ;</p>
<p style="PADDING-LEFT: 30px">//分页数组与 html<br />
$aPDatas = $pBP-&gt;get( $nCount , $nShowNum ) ;<br />
$strHtml = $pBP-&gt;getHTML( $aPDatas ) ;</p>
<p style="PADDING-LEFT: 30px">// 分页数据里包含有 offset，取数据<br />
$strQuery = "SELECT * FROM test LIMIT " . $aPDatas['offset'] . ", " . $nShowNum ;<br />
$rsResult = mysql_query( $strQuery );</p>
]]></content:encoded>
			<wfw:commentRss>http://www.magki.com/blog/2009/01/php-variable-naming-rules.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
