<?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>肉包子的摇滚生活 &#187; PHP</title>
	<atom:link href="http://www.fangyuqiang.com/archives/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fangyuqiang.com</link>
	<description>前端开发，交互设计，用户体验</description>
	<lastBuildDate>Wed, 01 Sep 2010 09:06:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>php的switch函数的陷阱</title>
		<link>http://www.fangyuqiang.com/archives/926</link>
		<comments>http://www.fangyuqiang.com/archives/926#comments</comments>
		<pubDate>Wed, 04 Aug 2010 10:00:25 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=926</guid>
		<description><![CDATA[if(empty($reportCatid)&#124;&#124;$reportCatid == 176){ $reportCatid = '177,178,179,180'; } switch($reportCatid){ case 177: $reportName.=' - 福房指数'; break; case 178: $reportName.=' - 二手房指数'; break; case 179: $reportName.=' - 每日交易数据'; break; case 180: $reportName.=' - 综合数据分析'; break; } 猜猜结果如何。]]></description>
			<content:encoded><![CDATA[<p><code class="php" title="code"><br />
if(empty($reportCatid)||$reportCatid == 176){<br />
$reportCatid = '177,178,179,180';<br />
}</p>
<p>switch($reportCatid){<br />
case 177:<br />
$reportName.=' - 福房指数';<br />
break;<br />
case 178:<br />
$reportName.=' - 二手房指数';<br />
break;<br />
case 179:<br />
$reportName.=' - 每日交易数据';<br />
break;<br />
case 180:<br />
$reportName.=' - 综合数据分析';<br />
break;<br />
}<br />
</code><br />
猜猜结果如何。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/926/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>基于Supesite的大型网站开发</title>
		<link>http://www.fangyuqiang.com/archives/766</link>
		<comments>http://www.fangyuqiang.com/archives/766#comments</comments>
		<pubDate>Sun, 04 Jul 2010 13:39:02 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cms]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=766</guid>
		<description><![CDATA[很早就想开始写，但是因为一直忙于网站初期的上线跟后期改进，没有时间多写，现在决定每次想到什么都记录一点，不然过期就耽搁了。 目前我们在运营的网站http://www.hxfang.com，就是基于supesite 7.5开发的一个房地产网站。 supesite的优缺点 优点 缓存机制很强大 架构简单，却足够实用 缺点 单页支持不佳 模型做得比较强大，但是还是有不少可以改进的地方 非常怨念的问题。太多的地方需要设置权限。在liunx下面跑的时候太麻烦了。要到处给缓存目录设置写入权限。 svn支持不佳。因为太多目录会有读写操作，svn提交要设置很多繁杂的忽略，导致开发的时候很麻烦。 supesite建立频道 在后台频道管理中添加频道，单个页面一般为企业介绍之类。一般选择文章频道，不生成基本运行文件。 建立完之后，到对应的模板文件夹下创建频道的模板，一般以频道名打头，例如house_index.html.php。 然后编辑刚刚建立的频道，设置频道首页的模板为house_index。可以为各个频道设定不同的模板。这点上面ss做得的确不错。 待续。。。]]></description>
			<content:encoded><![CDATA[<p>很早就想开始写，但是因为一直忙于网站初期的上线跟后期改进，没有时间多写，现在决定每次想到什么都记录一点，不然过期就耽搁了。</p>
<p>目前我们在运营的网站<a href="http://www.hxfang.com" target="_blank">http://www.hxfang.com</a>，就是基于supesite 7.5开发的一个房地产网站。</p>
<h3><span id="more-766"></span></h3>
<h3>supesite的优缺点</h3>
<p>优点</p>
<ol>
<li>缓存机制很强大</li>
<li>架构简单，却足够实用</li>
</ol>
<p>缺点</p>
<ol>
<li>单页支持不佳</li>
<li>模型做得比较强大，但是还是有不少可以改进的地方</li>
<li>非常怨念的问题。太多的地方需要设置权限。在liunx下面跑的时候太麻烦了。要到处给缓存目录设置写入权限。</li>
<li>svn支持不佳。因为太多目录会有读写操作，svn提交要设置很多繁杂的忽略，导致开发的时候很麻烦。</li>
</ol>
<h3>supesite建立频道</h3>
<p>在后台频道管理中添加频道，单个页面一般为企业介绍之类。一般选择文章频道，不生成基本运行文件。</p>
<p>建立完之后，到对应的模板文件夹下创建频道的模板，一般以频道名打头，例如house_index.html.php。</p>
<p>然后编辑刚刚建立的频道，设置频道首页的模板为house_index。可以为各个频道设定不同的模板。这点上面ss做得的确不错。</p>
<p>待续。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/766/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php的empty函数的小陷阱</title>
		<link>http://www.fangyuqiang.com/archives/904</link>
		<comments>http://www.fangyuqiang.com/archives/904#comments</comments>
		<pubDate>Fri, 11 Jun 2010 08:55:10 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=904</guid>
		<description><![CDATA[先看看empty函数的用法: empty($var); 如果 var 是非空或非零的值，则 empty() 返回 FALSE。换句话说，&#8221;"、0、&#8221;0&#8243;、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的，如果 var 为空，则返回 TRUE。 我们经常用emtpt这样的函数来检查变量.但是要留意的是这样的问题,0值会被认为是empty . 这里就会带来一个问题了,如果说从数据库中取出来的值,或者从表单中传递过来的值本身就是0，那么就可能导致判断出问题. 我碰到的状况是判断表单传递过来的值,因为无意中忽略掉了0这样的状况,表单传递0的时候过来就会出现处理错误,后来改用isset方法才避免这样的问题.]]></description>
			<content:encoded><![CDATA[<p>先看看empty函数的用法:</p>
<p>empty($var);</p>
<p>如果   var   是非空或非零的值，则   empty()   返回   FALSE。换句话说，&#8221;"、0、&#8221;0&#8243;、NULL、FALSE、array()、var   $var;   以及没有任何属性的对象都将被认为是空的，如果   var   为空，则返回   TRUE。     <span id="more-904"></span></p>
<p>我们经常用emtpt这样的函数来检查变量.但是要留意的是这样的问题,0值会被认为是empty . 这里就会带来一个问题了,如果说从数据库中取出来的值,或者从表单中传递过来的值本身就是0，那么就可能导致判断出问题.</p>
<p>我碰到的状况是判断表单传递过来的值,因为无意中忽略掉了0这样的状况,表单传递0的时候过来就会出现处理错误,后来改用isset方法才避免这样的问题.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/904/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Flash Chart 在IE下显示错误的bug</title>
		<link>http://www.fangyuqiang.com/archives/891</link>
		<comments>http://www.fangyuqiang.com/archives/891#comments</comments>
		<pubDate>Wed, 26 May 2010 02:04:10 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=891</guid>
		<description><![CDATA[图表在首次打开IE6进去后可以正常看到，但是这个时候再点击其他的图表，就出错了，IE8，firefox等浏览器不会有此问题，想来想去不清楚问题所在。后来用httpwatch抓包分析了下，发现IE6第二次不会重新加载图表。shit，又是 IE6缓存问题造成的。要解决IE6的缓存问题，当然就是每次请求的时候请求地址后面附带一个随机数。]]></description>
			<content:encoded><![CDATA[<p>之前就已经碰到过这个问题，open flash chart在IE6，7下会显示不出来，参见：<a href="http://www.fangyuqiang.com/archives/531">http://www.fangyuqiang.com/archives/531</a></p>
<blockquote><p>算是被这个bug吓出一身冷汗，还以为open flash chart在IE下不能用了。状况是：图表在首次打开IE6进去后可以正常看到，但是这个时候再点击其他的图表，就出错了，IE8，firefox等浏览器不会有此问题，想来想去不清楚问题所在。后来用httpwatch抓包分析了下，发现IE6第二次不会重新加载图表。shit，又是 IE6缓存问题造成的。要解决IE6的缓存问题，当然就是每次请求的时候请求地址后面附带一个随机数。这里我们就要对flash的加载地址后面附带随机数了。</p></blockquote>
<p>这次我是用swfobject加载的flash，所以直接在加载的flash地址后面加上时间随机数：<br />
swfobject.embedSWF(&#8220;{S_URL}/flash/hxchart.swf?t=&#8221;+new Date(), &#8220;totaldata&#8221;, &#8220;100%&#8221;, &#8220;100%&#8221;, &#8220;7.0.0&#8243;,&#8221;expressInstall.swf&#8221;,{&#8220;get-data&#8221;:&#8221;get_total_data&#8221;});</p>
<p>问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/891/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql与php时间格式化参数参考</title>
		<link>http://www.fangyuqiang.com/archives/881</link>
		<comments>http://www.fangyuqiang.com/archives/881#comments</comments>
		<pubDate>Sun, 16 May 2010 15:30:17 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=881</guid>
		<description><![CDATA[为方便查阅，从官方网站上转载的。因为mysql还有php的时间格式化参数不同，不小心会搞混，这里整理一番 PHP format character Description Example returned values Day &#8212; &#8212; d Day of the month, 2 digits with leading zeros 01 to 31 D A textual representation of a day, three letters Mon through Sun j Day of the month without leading zeros 1 to 31 l (lowercase &#8216;L&#8217;) A full textual representation of [...]]]></description>
			<content:encoded><![CDATA[<p>为方便查阅，从官方网站上转载的。因为mysql还有php的时间格式化参数不同，不小心会搞混，这里整理一番<span id="more-881"></span></p>
<h3>PHP</h3>
<table>
<thead>
<tr valign="middle">
<th><em><tt>format</tt></em> character</th>
<th>Description</th>
<th>Example returned values</th>
</tr>
</thead>
<tbody>
<tr valign="middle">
<td align="center"><em>Day</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>d</em></td>
<td align="left">Day of the month, 2 digits with leading  zeros</td>
<td align="left"><em>01</em> to <em>31</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>D</em></td>
<td align="left">A textual representation of a day, three  letters</td>
<td align="left"><em>Mon</em> through <em>Sun</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>j</em></td>
<td align="left">Day of the month without leading zeros</td>
<td align="left"><em>1</em> to <em>31</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>l</em> (lowercase &#8216;L&#8217;)</td>
<td align="left">A full textual representation of the day of  the week</td>
<td align="left"><em>Sunday</em> through <em>Saturday</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>N</em></td>
<td align="left">ISO-8601 numeric representation of the day  of the week (added in            PHP 5.1.0)</td>
<td align="left"><em>1</em> (for Monday) through <em>7</em> (for  Sunday)</td>
</tr>
<tr valign="middle">
<td align="left"><em>S</em></td>
<td align="left">English ordinal suffix for the day of the  month, 2 characters</td>
<td align="left"><em>st</em>, <em>nd</em>, <em>rd</em> or             <em>th</em>.  Works well with <em>j</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>w</em></td>
<td align="left">Numeric representation of the day of the  week</td>
<td align="left"><em>0</em> (for Sunday) through <em>6</em> (for  Saturday)</td>
</tr>
<tr valign="middle">
<td align="left"><em>z</em></td>
<td align="left">The day of the year (starting from 0)</td>
<td align="left"><em>0</em> through <em>365</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Week</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>W</em></td>
<td align="left">ISO-8601 week number of year, weeks starting  on Monday (added in PHP 4.1.0)</td>
<td align="left">Example: <em>42</em> (the 42nd week in the  year)</td>
</tr>
<tr valign="middle">
<td align="center"><em>Month</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>F</em></td>
<td align="left">A full textual representation of a month,  such as January or March</td>
<td align="left"><em>January</em> through <em>December</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>m</em></td>
<td align="left">Numeric representation of a month, with  leading zeros</td>
<td align="left"><em>01</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>M</em></td>
<td align="left">A short textual representation of a month,  three letters</td>
<td align="left"><em>Jan</em> through <em>Dec</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>n</em></td>
<td align="left">Numeric representation of a month, without  leading zeros</td>
<td align="left"><em>1</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>t</em></td>
<td align="left">Number of days in the given month</td>
<td align="left"><em>28</em> through <em>31</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Year</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>L</em></td>
<td align="left">Whether it&#8217;s a leap year</td>
<td align="left"><em>1</em> if it is a leap year, <em>0</em> otherwise.</td>
</tr>
<tr valign="middle">
<td align="left"><em>o</em></td>
<td align="left">ISO-8601 year number. This has the same  value as             <em>Y</em>, except that if the ISO week number             (<em>W</em>) belongs to the previous or next year, that year             is used instead. (added in PHP 5.1.0)</td>
<td align="left">Examples: <em>1999</em> or <em>2003</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>Y</em></td>
<td align="left">A full numeric representation of a year, 4  digits</td>
<td align="left">Examples: <em>1999</em> or <em>2003</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>y</em></td>
<td align="left">A two digit representation of a year</td>
<td align="left">Examples: <em>99</em> or <em>03</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Time</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>a</em></td>
<td align="left">Lowercase Ante meridiem and Post meridiem</td>
<td align="left"><em>am</em> or <em>pm</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>A</em></td>
<td align="left">Uppercase Ante meridiem and Post meridiem</td>
<td align="left"><em>AM</em> or <em>PM</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>B</em></td>
<td align="left">Swatch Internet time</td>
<td align="left"><em>000</em> through <em>999</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>g</em></td>
<td align="left">12-hour format of an hour without leading  zeros</td>
<td align="left"><em>1</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>G</em></td>
<td align="left">24-hour format of an hour without leading  zeros</td>
<td align="left"><em>0</em> through <em>23</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>h</em></td>
<td align="left">12-hour format of an hour with leading zeros</td>
<td align="left"><em>01</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>H</em></td>
<td align="left">24-hour format of an hour with leading zeros</td>
<td align="left"><em>00</em> through <em>23</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>i</em></td>
<td align="left">Minutes with leading zeros</td>
<td align="left"><em>00</em> to <em>59</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>s</em></td>
<td align="left">Seconds, with leading zeros</td>
<td align="left"><em>00</em> through <em>59</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>u</em></td>
<td align="left">Microseconds (added in PHP 5.2.2)</td>
<td align="left">Example: <em>654321</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Timezone</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>e</em></td>
<td align="left">Timezone identifier (added in PHP 5.1.0)</td>
<td align="left">Examples: <em>UTC</em>, <em>GMT</em>, <em>Atlantic/Azores</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>I</em> (capital i)</td>
<td align="left">Whether or not the date is in daylight  saving time</td>
<td align="left"><em>1</em> if Daylight Saving Time, <em>0</em> otherwise.</td>
</tr>
<tr valign="middle">
<td align="left"><em>O</em></td>
<td align="left">Difference to Greenwich time (GMT) in hours</td>
<td align="left">Example: <em>+0200</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>P</em></td>
<td align="left">Difference to Greenwich time (GMT) with  colon between hours and minutes (added in PHP 5.1.3)</td>
<td align="left">Example: <em>+02:00</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>T</em></td>
<td align="left">Timezone abbreviation</td>
<td align="left">Examples: <em>EST</em>, <em>MDT</em> &#8230;</td>
</tr>
<tr valign="middle">
<td align="left"><em>Z</em></td>
<td align="left">Timezone offset in seconds. The offset for  timezones west of UTC is always            negative, and for those east of UTC is always positive.</td>
<td align="left"><em>-43200</em> through <em>50400</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Full Date/Time</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>c</em></td>
<td align="left">ISO 8601 date (added in PHP 5)</td>
<td align="left">2004-02-12T15:19:21+00:00</td>
</tr>
<tr valign="middle">
<td align="left"><em>r</em></td>
<td align="left"><a href="http://www.faqs.org/rfcs/rfc2822">» RFC 2822</a> formatted date</td>
<td align="left">Example: <em>Thu, 21 Dec 2000 16:01:07 +0200</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>U</em></td>
<td align="left">Seconds since the Unix Epoch (January 1 1970  00:00:00 GMT)</td>
<td align="left">See also <a href="http://www.php.net/manual/en/function.time.php">time()</a></td>
</tr>
</tbody>
</table>
<p>Unrecognized characters in the format string will be printed        as-is.  The <em>Z</em> format will always return        <em>0</em> when using <a href="http://www.php.net/manual/en/function.gmdate.php">gmdate()</a>.</p>
<p><strong>Note</strong>:                  Since this function only accepts  <a href="http://www.php.net/manual/en/language.types.integer.php">integer</a> timestamps the         <em>u</em> format character is only useful when using the         <a href="http://www.php.net/manual/en/function.date-format.php">date_format()</a> function with user based  timestamps         created with <a href="http://www.php.net/manual/en/function.date-create.php">date_create()</a>.</p>
<h3>MySQL</h3>
<table>
<tbody>
<tr>
<th>Specifier</th>
<th>Description</th>
</tr>
<tr>
<td><code>%a</code></td>
<td>Abbreviated weekday name                   (<code>Sun</code>..<code>Sat</code>)</td>
</tr>
<tr>
<td><code>%b</code></td>
<td>Abbreviated month name (<code>Jan</code>..<code>Dec</code>)</td>
</tr>
<tr>
<td><code>%c</code></td>
<td>Month, numeric (<code>0</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%D</code></td>
<td>Day of the month with English suffix (<code>0th</code>,                   <code>1st</code>, <code>2nd</code>,                   <code>3rd</code>, …)</td>
</tr>
<tr>
<td><code>%d</code></td>
<td>Day of the month, numeric (<code>00</code>..<code>31</code>)</td>
</tr>
<tr>
<td><code>%e</code></td>
<td>Day of the month, numeric (<code>0</code>..<code>31</code>)</td>
</tr>
<tr>
<td><code>%f</code></td>
<td>Microseconds (<code>000000</code>..<code>999999</code>)</td>
</tr>
<tr>
<td><code>%H</code></td>
<td>Hour (<code>00</code>..<code>23</code>)</td>
</tr>
<tr>
<td><code>%h</code></td>
<td>Hour (<code>01</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%I</code></td>
<td>Hour (<code>01</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%i</code></td>
<td>Minutes, numeric (<code>00</code>..<code>59</code>)</td>
</tr>
<tr>
<td><code>%j</code></td>
<td>Day of year (<code>001</code>..<code>366</code>)</td>
</tr>
<tr>
<td><code>%k</code></td>
<td>Hour (<code>0</code>..<code>23</code>)</td>
</tr>
<tr>
<td><code>%l</code></td>
<td>Hour (<code>1</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%M</code></td>
<td>Month name (<code>January</code>..<code>December</code>)</td>
</tr>
<tr>
<td><code>%m</code></td>
<td>Month, numeric (<code>00</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%p</code></td>
<td><code>AM</code> or <code>PM</code></td>
</tr>
<tr>
<td><code>%r</code></td>
<td>Time, 12-hour (<code>hh:mm:ss</code> followed by                   <code>AM</code> or <code>PM</code>)</td>
</tr>
<tr>
<td><code>%S</code></td>
<td>Seconds (<code>00</code>..<code>59</code>)</td>
</tr>
<tr>
<td><code>%s</code></td>
<td>Seconds (<code>00</code>..<code>59</code>)</td>
</tr>
<tr>
<td><code>%T</code></td>
<td>Time, 24-hour (<code>hh:mm:ss</code>)</td>
</tr>
<tr>
<td><code>%U</code></td>
<td>Week (<code>00</code>..<code>53</code>),  where Sunday is the                   first day of the week</td>
</tr>
<tr>
<td><code>%u</code></td>
<td>Week (<code>00</code>..<code>53</code>),  where Monday is the                   first day of the week</td>
</tr>
<tr>
<td><code>%V</code></td>
<td>Week (<code>01</code>..<code>53</code>),  where Sunday is the                   first day of the week; used with <code>%X</code></td>
</tr>
<tr>
<td><code>%v</code></td>
<td>Week (<code>01</code>..<code>53</code>),  where Monday is the                   first day of the week; used with <code>%x</code></td>
</tr>
<tr>
<td><code>%W</code></td>
<td>Weekday name (<code>Sunday</code>..<code>Saturday</code>)</td>
</tr>
<tr>
<td><code>%w</code></td>
<td>Day of the week                   (<code>0</code>=Sunday..<code>6</code>=Saturday)</td>
</tr>
<tr>
<td><code>%X</code></td>
<td>Year for the week where Sunday is the first day of the week,  numeric,                   four digits; used with <code>%V</code></td>
</tr>
<tr>
<td><code>%x</code></td>
<td>Year for the week, where Monday is the first day of the week,  numeric,                   four digits; used with <code>%v</code></td>
</tr>
<tr>
<td><code>%Y</code></td>
<td>Year, numeric, four digits</td>
</tr>
<tr>
<td><code>%y</code></td>
<td>Year, numeric (two digits)</td>
</tr>
<tr>
<td><code>%%</code></td>
<td>A literal “<code>%</code>”  character</td>
</tr>
<tr>
<td><code>%<em><code>x</code></em></code></td>
<td><em><code>x</code></em>, for any                   “<em><code>x</code></em>”  not listed                   above</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/881/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>小心php单引号与双引号的陷阱</title>
		<link>http://www.fangyuqiang.com/archives/879</link>
		<comments>http://www.fangyuqiang.com/archives/879#comments</comments>
		<pubDate>Fri, 14 May 2010 03:28:57 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=879</guid>
		<description><![CDATA[今天碰到一个比较奇怪的问题，想用php的explode函数分割一个用换行符隔开的字符串，但是发现总是不奏效，代码如下： explode(‘\n’,trim($_POST['datatable'])); 困惑。最后google了下，原来是自己的编程习惯还有对php不够娴熟闹的。在php中，单引号与双引号都是可以用来指定一个字符串，因为平时都是随便用，从来没有注意到其中详细的差别，今天碰到的问题就是因为单引号与双引号的差别引起的，只要将代码改成 explode(&#8220;\n&#8221;,trim($_POST['datatable']));，单引号改成双引号就OK。 单引号 指定一个简单字符串的最简单的方法是用单引号（字符 ‘）括起来。 要表示一个单引号，需要用反斜线（\）转义，和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线，需要用两个反斜线表示。注意如果你试图转义任何其它字符，反斜线本身也会被显示出来！所以通常不需要转义反斜线本身。 ————–所以我们用str_replace(‘\n’,’ ’)替换的 字符串中的 \n 而不是换行符，似乎有些晕。也就是说单引号内的是字符串，php不做任何解释，这其实在别的地方用的时候都知道，但没想到连换行符都不解释。 双引号 如果用双引号（”）括起字符串，PHP 懂得更多特殊字符的转义序列： 表格 6-1. 转义字符 序列 含义 \n 换行（LF 或 ASCII 字符 0×0A（10）） \r 回车（CR 或 ASCII 字符 0×0D（13）） \t 水平制表符（HT 或 ASCII 字符 0×09（9）） \\ 反斜线 \$ 美元符号 \” 双引号 \[0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符 \x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符 此外，如果试图转义任何其它字符，反斜线本身也会被显示出来！ 所以，在使用str_replace,explode这些函数的时候，应该要是用双引号！]]></description>
			<content:encoded><![CDATA[<p>今天碰到一个比较奇怪的问题，想用php的explode函数分割一个用换行符隔开的字符串，但是发现总是不奏效，代码如下：</p>
<p>explode(‘\n’,trim($_POST['datatable']));</p>
<p>困惑。最后google了下，原来是自己的编程习惯还有对php不够娴熟闹的。<span id="more-879"></span>在php中，单引号与双引号都是可以用来指定一个字符串，因为平时都是随便用，从来没有注意到其中详细的差别，今天碰到的问题就是因为单引号与双引号的差别引起的，只要将代码改成</p>
<p>explode(&#8220;\n&#8221;,trim($_POST['datatable']));，单引号改成双引号就OK。</p>
<h3>单引号</h3>
<p>指定一个简单字符串的最简单的方法是用单引号（字符 ‘）括起来。</p>
<p>要表示一个单引号，需要用反斜线（\）转义，和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线，需要用两个反斜线表示。注意如果你试图转义任何其它字符，反斜线本身也会被显示出来！所以通常不需要转义反斜线本身。<br />
————–所以我们用str_replace(‘\n’,’<br />
’)替换的 字符串中的 \n 而不是换行符，似乎有些晕。也就是说单引号内的是字符串，php不做任何解释，这其实在别的地方用的时候都知道，但没想到连换行符都不解释。</p>
<h3>双引号</h3>
<p>如果用双引号（”）括起字符串，PHP 懂得更多特殊字符的转义序列：<br />
表格 6-1. 转义字符</p>
<table border="1">
<thead>
<tr>
<th>序列</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><var>\n</var></td>
<td>换行（LF 或 ASCII 字符 0×0A（10））</td>
</tr>
<tr>
<td><var>\r</var></td>
<td>回车（CR 或 ASCII 字符 0×0D（13））</td>
</tr>
<tr>
<td><var>\t</var></td>
<td>水平制表符（HT 或 ASCII 字符 0×09（9））</td>
</tr>
<tr>
<td><var>\\</var></td>
<td>反斜线</td>
</tr>
<tr>
<td><var>\$</var></td>
<td>美元符号</td>
</tr>
<tr>
<td><var>\”</var></td>
<td>双引号</td>
</tr>
<tr>
<td><var>\[0-7]{1,3}</var></td>
<td>此正则表达式序列匹配一个用八进制符号表示的字符</td>
</tr>
<tr>
<td><var>\x[0-9A-Fa-f]{1,2}</var></td>
<td>此正则表达式序列匹配一个用十六进制符号表示的字符</td>
</tr>
</tbody>
</table>
<p>此外，如果试图转义任何其它字符，反斜线本身也会被显示出来！</p>
<p>所以，在使用str_replace,explode这些函数的时候，应该要是用双引号！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/879/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LimeSurvey 启动投票后添加问题选项</title>
		<link>http://www.fangyuqiang.com/archives/853</link>
		<comments>http://www.fangyuqiang.com/archives/853#comments</comments>
		<pubDate>Fri, 23 Apr 2010 08:25:54 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=853</guid>
		<description><![CDATA[Limesurvey是最近项目中引入的一个很棒的投票系统。
虽然初始操作的时候会有些复杂，但是上手就发现功能真的太强大了。不过使用中马上就发现一个严重的问题：Limesurvey的调查在启动了之后就不允许再添加选项，只允许修改选项的文字等内容。这样就真的杯具了，领导常常要求在投票进行到一半，增加选项，这下郁闷了。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.limesurvey.org/" target="_blank">Limesurvey</a>是最近项目中引入的一个很棒的投票系统。</p>
<blockquote><p><a href="http://www.limesurvey.org/" target="_blank">LimeSurvey</a>（前身为PHPSurveyor）是一款开源的在线问卷调查程序，它用PHP语言编写并可以使用MySQL，PostgreSQL或者MSSQL等多种数据库，它集成了调查程序开发、调查问卷的发布以及数据收集等功能，使用它，用户不必了解这些功能的编程细节。</p>
<p>本系统包括了分支、自定义页面布局和设计（使用web template system），并且提供了基本的统计分析功能。调查可以匿名访问也可以限制为拥有“访问一次”令牌的用户参加，从而我们能得到匿名数据或者参与者与结果相分离的数据</p></blockquote>
<p>虽然初始操作的时候会有些复杂，但是上手就发现功能真的太强大了。不过使用中马上就发现一个严重的问题：<strong><a href="http://www.limesurvey.org/" target="_blank">Limesurvey</a>的调查在启动了之后就不允许再添加选项，只允许修改选项的文字等内容。</strong>这样就真的杯具了，领导常常要求在投票进行到一半，增加选项，这下郁闷了。<span id="more-853"></span></p>
<p>既然程序上有逻辑判断不能增加选项，那我们就直接到数据库，看看数据库的设计逻辑，最后还是还是让我看出了端倪，直接修改数据库结构，实现在启动调查后添加选项的功能，hiahiahia&#8230;</p>
<p>limesurvey的一个投票，基本上有2个组成，一个是投票选项表lime_answers，一个是投票结果表lime_survey_21437，后面的数字是投票结果的数字id。</p>
<p>首先在limesurvey的投票选项表lime_answers增加自己要投票的选项，qid为问题所在的组的id，code跟sortorder一般是一样的，表示选项的顺序，照例添加好。</p>
<p>然后到投票结果表lime_survey_21437中，修改表结构，在投票结果表lime_survey_21437中，每个选项的值，都被做成一个字段，形如：21437X3X1010。观察一下，各个字段名字一般都是一系列下来：21437X3X101，21437X3X102，21437X3X103。这里的字段，其实就是跟投票选项一一对应的，你在投票选项中增加的选项，就要在这个结果表中建立相应的字段名，以存储这个字段的投票结果。</p>
<p>虽然通过了这样直接修改数据库的方式解决了问题，但是感觉还是比较不爽，因为数据库操作很麻烦。而且不小心容易出错。期望limesurvey可以改进这一点。也不知道是为什么limesurvey要限制这样的操作。</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 61px; width: 1px; height: 1px; overflow: hidden;">http://www.clh.cc/html/work.htmlzz</div>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/853/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DedeCMS自定义模型的开发总结及一些技巧</title>
		<link>http://www.fangyuqiang.com/archives/684</link>
		<comments>http://www.fangyuqiang.com/archives/684#comments</comments>
		<pubDate>Fri, 04 Dec 2009 17:25:02 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[dedecms]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=684</guid>
		<description><![CDATA[最近刚刚完成一个朋友的二手客车网站，要求要实现一个二手客车的销售展示等。这个涉及到了DedeCMS自定义模型的开发，网上的资料比较少，在开发过程中总结了一些技巧，与各位分享。 完成后的网站的地址是：http://www.365517.com 整个网站最难的地方，就在于运用自定义模型来处理二手客车的字段了。在dede的使用手册关于自定义模型有个介绍，http://help.dedecms.com/v53/archives/extend/channel/ 参考这篇文章，可以完成常用的自定义模型了。 客户要求填写二手客车资料的时候要可以选择所在地，省市二级联动。很好，dedecms自带有一个联动类别管理，在自定义模型字段名字填入联动类的名字nativeplace，这样添加修改二手客车这个自定义模型就有了 一个联动的省市选择。 现在问题来了： 客户需要所在地点是可以搜索的，到自定义模型的自定义搜索里面去看，发现在后台没有提供所在地的字段的搜索，原因是因为nativeplace是系统联动调用的，可能在做这个自定义搜索的时候，开发者遗漏了这一点。 列表中要显示一些自定义字段，如何调用？（这对熟悉dedecms的人是个简单问题我知道） 高级搜索可以搜索出结果出来，但是搜索出来的结果列表datalist，却无法显示自定义的字段，只能显示标题，时间点击率之类的。无法显示如car_price这些自定义的字段。 首页跟侧边栏都有搜索框，要求要能调用联动的地点，但是发现直接在首页跟侧边栏采用dede.field.nativeplace这样来调用行不通。猜测应该是首页跟侧边栏的解析时候根本就没有考虑这些标记。只有特定模板才会特定的解析这些标记。 这些都是些大问题，不解决不行，下面一个个来告诉你我是怎么搞定的，如果你也碰到同样的问题，也许会有帮助。 没提供的话就自己手动加上去。指定自定义搜索可以搜索的字段存的数据库表是dede_advancedsearch，在这个表找到addonfields这个字段，里面的内容形如：car_title:select,car_price:int,car_sites:int, 前面表示字段名，后面表示字段类型，：分开。不同的类型会采用不同的sql构造策略来搜索，比如int类型，就采用&#62;startcar_sites and &#60;endcar_sites这样的sql来搜索。我们这里要搜索的是nativeplace，因为存的值都是int，手动在addonfields这个字段里加上nativeplace:int，。注意，最后面一定要以逗号，结尾。因为前台程序分割后数组会pop掉最后面的空数组，没逗号的话会把要的数组给pop了。这样子手动修改了表后，虽然前台没有字段可以勾选，但是事实上这个字段已经可以搜索了。 这个看官方的文档后来才知道的，原来很简单，就是普通的artlist要做一点处理，形如： {dede:arclist addfields=' 你的自定义字段 ' row='1'  titlelen='30'  channelid='模型ID'  typeid='1'} [field:自定义字段/] {/dede:arclist} 但是高级搜索里面就不是这么一回事了，死折腾它就是显示不出来。研究了一下高级搜索的sql语句才发现，它没有select出附加表的字段出来。打开plus/advanced_search.php再次做一下修改，找到大概在238行左右的sql语句，我大概改成这样: "select main.id as aid,main.*,main.description as des, type.namerule,type.typedir, addon.car_price,addon.car_status from $maintable main left join #@__arctype type on type.id=main.typeid left join $addontable addon on addon.aid=main.id $where $orderby"; 要注意的是，这里搜索出的字段就是可以在页面上调用显示的字段，因为原来的sql，没有select附加表的字段，所以高级搜索页面调用不了附加字段显示，这里我加了addon.car_price，addon.car_status 2个字段，另外原来type是select [...]]]></description>
			<content:encoded><![CDATA[<p>最近刚刚完成一个朋友的二手客车网站，要求要实现一个二手客车的销售展示等。这个涉及到了DedeCMS自定义模型的开发，网上的资料比较少，在开发过程中总结了一些技巧，与各位分享。<span id="more-684"></span></p>
<p>完成后的网站的地址是：<a href="http://www.365517.com/" target="_blank">http://www.365517.com</a></p>
<p>整个网站最难的地方，就在于运用自定义模型来处理二手客车的字段了。在dede的使用手册关于自定义模型有个介绍，<a href="http://help.dedecms.com/v53/archives/extend/channel/" target="_blank">http://help.dedecms.com/v53/archives/extend/channel/</a> 参考这篇文章，可以完成常用的自定义模型了。</p>
<p>客户要求填写二手客车资料的时候要可以选择所在地，省市二级联动。很好，dedecms自带有一个联动类别管理，在自定义模型字段名字填入联动类的名字nativeplace，这样添加修改二手客车这个自定义模型就有了 一个联动的省市选择。</p>
<p>现在问题来了：</p>
<ol>
<li>客户需要所在地点是可以搜索的，到自定义模型的自定义搜索里面去看，发现在<strong>后台没有提供所在地的字段的搜索</strong>，原因是因为nativeplace是系统联动调用的，可能在做这个自定义搜索的时候，开发者遗漏了这一点。</li>
<li>列表中要显示一些自定义字段，如何调用？（这对熟悉dedecms的人是个简单问题我知道）</li>
<li>高级搜索可以搜索出结果出来，但是搜<strong>索出来的结果列表datalist，却无法显示自定义的字段</strong>，只能显示标题，时间点击率之类的。无法显示如car_price这些自定义的字段。</li>
<li>首页跟侧边栏都有搜索框，要求要能调用联动的地点，但是发现直接在<strong>首页跟侧边栏采用dede.field.nativeplace这样来调用行不通</strong>。猜测应该是首页跟侧边栏的解析时候根本就没有考虑这些标记。只有特定模板才会特定的解析这些标记。</li>
</ol>
<p>这些都是些大问题，不解决不行，下面一个个来告诉你我是怎么搞定的，如果你也碰到同样的问题，也许会有帮助。</p>
<ol>
<li>没提供的话就自己手动加上去。<strong>指定自定义搜索可以搜索的字段存的数据库表是dede_advancedsearch，在这个表找到addonfields这个字段</strong>，里面的内容形如：car_title:select,car_price:int,car_sites:int, 前面表示字段名，后面表示字段类型，：分开。不同的类型会采用不同的sql构造策略来搜索，比如int类型，就采用&gt;startcar_sites and &lt;endcar_sites这样的sql来搜索。我们这里要搜索的是nativeplace，因为存的值都是int，手动在addonfields这个字段里加上nativeplace:int，。注意，最后面一定要以逗号，结尾。因为前台程序分割后数组会pop掉最后面的空数组，没逗号的话会把要的数组给pop了。这样子手动修改了表后，虽然前台没有字段可以勾选，但是事实上这个字段已经可以搜索了。</li>
<li> 这个看官方的文档后来才知道的，原来很简单，就是普通的artlist要做一点处理，形如：
<pre>{dede:arclist addfields=' 你的自定义字段 ' row='1'  titlelen='30'  channelid='模型ID'  typeid='1'}
[field:自定义字段/]
{/dede:arclist}</pre>
</li>
<li>但是高级搜索里面就不是这么一回事了，死折腾它就是显示不出来。研究了一下高级搜索的sql语句才发现，<strong>它没有select出附加表的字段出来</strong>。打开plus/advanced_search.php再次做一下修改，找到大概在238行左右的sql语句，我大概改成这样:
<pre>"select main.id as aid,main.*,main.description as des, type.namerule,type.typedir,
 addon.car_price,addon.car_status from $maintable main
 left join #@__arctype type on type.id=main.typeid
 left join $addontable addon on addon.aid=main.id
 $where  $orderby";</pre>
<p>要注意的是，这里搜索出的字段就是可以在页面上调用显示的字段，因为原来的sql，没有select附加表的字段，所以高级搜索页面调用不了附加字段显示，这里我加了addon.car_price，addon.car_status 2个字段，另外原来type是select type.*的，但是事实上只要2个字段就可以了，不需要.*，减少select出来的字段可以一定程度的提高sql的效率。</li>
<li>首页跟侧边栏页无法直接调用联动数组例如nativeplace，因为模板没有对这个标签进行解析，有2种方法，一种是改进模板解析，使其可以识别，但是这种我觉得改动工作比较麻烦，而且不熟悉的话改不好，不是好方法。第二种就是我用的办法，<strong>直接把调用nativeplace后生成的代码copy到模板中就行了。简单方便，而且并无错误。</strong></li>
</ol>
<p>除了这些之外，还有几个小地方细节的改动。</p>
<p>每次页面操作成功跳转的时候都会显示：DEDECMS提示信息，客户希望可以去掉，说这样看起来很不专业。。搜索下对应的文件，找到ShowMsg这个方法就行了。</p>
<p>我还对会员中心做了大量的裁剪，我只需要简单的，可以注册会员发布一下二手客车信息就可以了，其他的收藏啊，短信息之类的统统删除掉了。</p>
<p>此外，后台菜单很多客户用不到的内容，我也简单的将菜单屏蔽掉了，只要修改dede/inc/inc_menu.php 中的菜单项以及dede/templets/index_menu2.htm 就可以了。看起来后台菜单简单清爽多了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/684/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>cakaphp与open flash chart整合</title>
		<link>http://www.fangyuqiang.com/archives/531</link>
		<comments>http://www.fangyuqiang.com/archives/531#comments</comments>
		<pubDate>Sun, 27 Sep 2009 09:28:39 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=531</guid>
		<description><![CDATA[最近的接了个工单系统的外快，小项目，1个人2个月搞定。cakephp传说是不错的，但是从来没用过，所以打算就用cakephp，一试果然很爽，一个晚上我就可以上手了，php的框架，以及灵活性，果然是比java好太多了。啊，废话说太多了，这个系统需要一个图形报表，开源的漂亮的图形报表，显然是open flash chart了，完美。 更完美的是，cakephp提供了open flash chart的helper，自己只要调用就行了~~~http://bakery.cakephp.org/articles/view/flashcharthelper-version-3 不过事情总是没有想象的那么顺利，官方整合的这个open flash chart在使用过程中还是发现了一些问题。这里记录一下分享。 先上几张无码高清图： 具体如何整合open flash chart我就不多废话了，请直接参考官方的文档，很详细。我在使用过程中碰到的几个问题以及解决方法记录在这里。如果你也在使用过程中碰到一下的问题，你可以打开你的cakephp工程下面app/views/helpers/flash_char.php这个helper的源代码，参照我下面做的修改。 1.IE6经典的缓存问题 算是被这个bug吓出一身冷汗，还以为open flash chart在IE下不能用了。状况是：图表在首次打开IE6进去后可以正常看到，但是这个时候再点击其他的图表，就出错了，IE8，firefox等浏览器不会有此问题，想来想去不清楚问题所在。后来用httpwatch抓包分析了下，发现IE6第二次不会重新加载图表。shit，又是IE6缓存问题造成的。要解决IE6的缓存问题，当然就是每次请求的时候请求地址后面附带一个随机数。这里我们就要对flash的加载地址后面附带随机数了。 public function render($width = null, $height = null, $chartId = 'default', $domId = false) { if (! is_null ( $width )) { $this-&#62;settings ['width'] = $width; } if (! is_null ( $height )) { $this-&#62;settings ['height'] = $height; [...]]]></description>
			<content:encoded><![CDATA[<p>最近的接了个工单系统的外快，小项目，1个人2个月搞定。cakephp传说是不错的，但是从来没用过，所以打算就用cakephp，一试果然很爽，一个晚上我就可以上手了，php的框架，以及灵活性，果然是比java好太多了。啊，废话说太多了，这个系统需要一个图形报表，开源的漂亮的图形报表，显然是open flash chart了，完美。</p>
<p>更完美的是，cakephp提供了open flash chart的helper，自己只要调用就行了~~~<a href="http://bakery.cakephp.org/articles/view/flashcharthelper-version-3" target="_blank">http://bakery.cakephp.org/articles/view/flashcharthelper-version-3</a> 不过事情总是没有想象的那么顺利，官方整合的这个open flash chart在使用过程中还是发现了一些问题。这里记录一下分享。</p>
<h3><span id="more-531"></span></h3>
<p>先上几张无码高清图：</p>
<p><img class="alignnone size-full wp-image-570" title="1" src="http://www.fangyuqiang.com/wp-content/uploads/2009/09/1.png" alt="1" width="582" height="289" /></p>
<p><img class="alignnone size-full wp-image-571" title="2" src="http://www.fangyuqiang.com/wp-content/uploads/2009/09/2.png" alt="2" width="585" height="310" /></p>
<p><img class="alignnone size-full wp-image-572" title="3" src="http://www.fangyuqiang.com/wp-content/uploads/2009/09/3.png" alt="3" width="581" height="302" /></p>
<p>具体如何整合open flash chart我就不多废话了，请直接参考官方的文档，很详细。我在使用过程中碰到的几个问题以及解决方法记录在这里。如果你也在使用过程中碰到一下的问题，你可以打开你的cakephp工程下面app/views/helpers/flash_char.php这个helper的源代码，参照我下面做的修改。</p>
<h3>1.IE6经典的缓存问题</h3>
<p>算是被这个bug吓出一身冷汗，还以为open flash chart在IE下不能用了。状况是：图表在首次打开IE6进去后可以正常看到，但是这个时候再点击其他的图表，就出错了，IE8，firefox等浏览器不会有此问题，想来想去不清楚问题所在。<strong>后来用httpwatch抓包分析了下，发现IE6第二次不会重新加载图表。shit，又是IE6缓存问题造成的。要解决IE6的缓存问题，当然就是每次请求的时候请求地址后面附带一个随机数。</strong>这里我们就要对flash的加载地址后面附带随机数了。</p>
<pre class="php" title="code">public function render($width = null, $height = null, $chartId = 'default', $domId = false) {
 if (! is_null ( $width )) {
 $this-&gt;settings ['width'] = $width;
 }
 if (! is_null ( $height )) {
 $this-&gt;settings ['height'] = $height;
 }
 $this-&gt;Chart = new open_flash_chart ( );
 //hack for IE cache bug! 给请求地址后面加上一个时间戳
 $this-&gt;swf .= '?t=' . mktime ();
 return $this-&gt;Flash-&gt;renderSwf ( $this-&gt;swf, $this-&gt;settings ['width'], $this-&gt;settings ['height'], $domId, array ('flashvars' =&gt; array ('get-data' =&gt; 'get_data_' . $chartId ) ) );
 }</pre>
<h3>2.无法设置默认点样式</h3>
<p>这些bug其实不能都怪提供这个helper的作者不小心，因为我觉得open flash chart本身提供的api确实太混乱了，命名又不是非常有规则，导致这边会遗漏掉一些属性设置项。</p>
<p>这个bug的状况是：官方的open flash chart可以设置图表上面点的样式，但是helper上面设置了却无效。查看源代码发现设置点样式的set_default_dot_style方法被遗漏了。。需要自己给它补上：</p>
<pre class="php" title="code">foreach ( $options as $key =&gt; $setting ) {
 switch ($key) {
 case 'line_style' :
 $line_style = new line_style ( $setting [0], $setting [1] );
 $element-&gt;line_style ( $line_style );
 break;
 //line的默认点样式无法设置!，方法遗漏，补上。
 case 'default_dot_style' :
 $default_dot = new dot ( );
 foreach ( $setting as $k =&gt; $v ) {
 $default_dot-&gt;$k ( $v );
 }
 $element-&gt;set_default_dot_style ( $default_dot );
 break;
 default :
 $set_method = 'set_' . $key;
 if (is_array ( $setting )) {
 $element-&gt;$set_method ( $setting [0], $setting [1] );
 } else {
 $element-&gt;$set_method ( $setting );
 }
 break;
 }
 }</pre>
<p>补充一点：<strong>这个bug只有线状图才会这样，因为其他图的设置点样式的方法是通用的，但是设置线状图的方法是独特的。</strong></p>
<h3>3.visible_steps跟rotate属性无法生效</h3>
<p>visible_steps属性设置的是横坐标上面间隔多少个坐标是可视的，当横坐标上面的点非常非常密集的时候，就需要间隔显示了，比如1-100，就不显示100个数字了，而是每10个显示一个。rotate属性设置是倾斜度，有些坐标文字比较长，比如说日期，2009年10月20日，这样一个横坐标长度好多个字，这个时候可以通过rotete属性来设置倾斜显示的角度。但是，这个属性也不能生效。</p>
<p>看了下源代码，原因在于：大部分的属性设置，open flash chart都提供了很规范的set方法来实现，但是偏偏这2个属性却是直接调用的，那cakephp这个help都是按照set模式来实现的，所以这2个属性就被忽略了。而且还会报错，因为方法不存在。这个hack也是比较生硬的，只能硬编码：</p>
<pre class="php" title="code">foreach ( $labelsOptions as $key =&gt; $setting ) {
 $set_method = 'set_' . $key;
 //BUG! without this，will skip the visible_steps config。默认都是set方法，但是这2个方法特殊，是直接调用。
 if (in_array ( $key, array ('visible_steps', 'rotate' ) )) {
 $set_method = $key;
 }
 $x_axis_label-&gt;$set_method ( $setting );
 }</pre>
<p>总结下：整体上，这些bug的来源主要还是因为open flash chart官方的实现比较凌乱的关系，写这个cakephp open flash chart helper的人，还是挺强大的，整理了这么好的东西出来。确实不容易。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/531/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>windows下cakephp的bake工具使用</title>
		<link>http://www.fangyuqiang.com/archives/386</link>
		<comments>http://www.fangyuqiang.com/archives/386#comments</comments>
		<pubDate>Fri, 24 Jul 2009 14:05:43 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=386</guid>
		<description><![CDATA[cakephp的bake工具是一个超强的代码自动生成工具。

自动生成工具相信很多人都有所了解，很早之前出现的phpmaker之类的工具，就能做到这点，而cakephp自带的代码自动生成工具，结合框架，可以带来很多的优点，最大的优点，当然就是快速开发，你只要建立好数据库，通过自动工具就能迅速生成一个基本的骨架，其实在生成这个骨架之前，你就可以利用cakephp的脚手架功能看到实现的样子。]]></description>
			<content:encoded><![CDATA[<p>cakephp的bake工具是一个超强的代码自动生成工具。</p>
<p>自动生成工具相信很多人都有所了解，很早之前出现的phpmaker之类的工具，就能做到这点，而cakephp自带的代码自动生成工具，结合框架，可以带来很多的优点，最大的优点，当然就是快速开发，你只要建立好数据库，通过自动工具就能迅速生成一个基本的骨架，其实在生成这个骨架之前，你就可以利用cakephp的脚手架功能看到实现的样子。</p>
<p>通过使用 Bake（CakePHP 代码生成器），可以生成一个包含 Scaffolding 功能和相关视图的控制器。</p>
<p><strong>将路径 /webroot/cake/console 添加到环境的 PATH 变量中，可以简化操作。设置这个变量之后，就可以直接调用 Cake Console 而不需要指定路径信息</strong>。这种做法并不是必需的，假设我们不这样做。另外，应该从应用程序的 app 目录（在本示例中是 /project/app）运行 Cake Console，否则 Cake Console 会认为您打算对新的应用程序执行操作。</p>
<p>在继续执行操作之前，请制作现有 app 目录的拷贝。Bake 将覆盖 products 控制器，而且当操作包括关键字 “overwrite”（或者 “copy”、“delete”、“format” 或 “voodoo”）时，应当经常备份文件。如果遇到问题，请确保 php 位于环境的 PATH 变量中。</p>
<p>对 products 控制器使用 Bake：</p>
<p>windows下使用 Bake，很重要的一点，<strong>应该先使用 cd 命令切换到 /webroot/app 目录并启动 Cake Console：</strong></p>
<p>然后在控制台输入： php ../cake/console/cake.php bake</p>
<p>这样就会出现正常的命令窗口了，然后即可以通过窗口的提示一步步往下走了。</p>
<h3>修改bake工具生成的默认视图</h3>
<p>bake工具生成的界面有时候是你不希望的，可能希望生成自己定义的格式，其实这个很简单，cakephp提供了很简单的方式来修改生成的视图，这个在官方网站上面有介绍，这里只是简单的翻译一下官方网站的文档。</p>
<ol>
<li> 进入目录: cake/console/libs/templates/views</li>
<li> 目录下有4个文件，是视图的模板</li>
<li> 复制到自己的app下面: app/vendors/shells/templates/views</li>
<li> 修改这些视图，那么再次使用bake工具生成的时候就会调用这些视图</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/386/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
