<?xml version='1.0' encoding='utf-8'?>
<rss version='2.0'>
<channel>
<title>TONTTU.NET</title>
<link>http://www.tonttu.net/</link>
<description>サイトの詳細</description>
<language>ja-JP</language>
<item>
<title>同じモデルをHABTMプラスwithする</title>
<link>http://www.tonttu.net/tec/cakePHP/cakephpHABTMwith.html</link>
<description><![CDATA[ <p>
HABTM(ハビタム、hasAndBelongsToMany）とは、モデル間の中間テーブルによる多対多のリレーションを構築します。<br />
料理モデル「Cooking」と素材モデル「Food」がある場合、「cooking_id」「food_id」のフィールドを持つ中間テーブル「cookings_foods」テーブルを作り、モデル「Cooking」には、 
</p>
<p>
&nbsp;var $hasAndBelongsToMany = array(&#39;Food&#39;); 
</p>
<p>
と記述するとCooking-&gt;findで自動的にFoodをぞろぞろ取ってきてくれる、、、はずです。すいません、この例は未検証です。<br />
この場合、取得できるのはCookingとFoodだけですが、「with」句を付けると「CookingsFood」もついでに取ってきてくれます。 
</p>
<p>
&nbsp;var $hasAndBelongsToMany = array(&#39;Food&#39; =&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(&#39;with&#39; =&gt; &#39;CookingsFood&#39;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); 
</p>
<p>
中間テーブルには「承認済」とか「仲良し度」とかの関係性を記録したい場合に使えます。<br />
今回はこれに加えて、同一テーブル間を多対多でつなぎたいと考えました。例はSNSのユーザー間でマイミクをするようなものです。<br />
ユーザー「Account」モデルと、「account_id」「member_id」を持つ中間「Member」モデルを用意します。<br />
Accountモデルに、
</p>
<p>
&nbsp;var $hasAndBelongsToMany = array(<br />
&nbsp;&nbsp;&nbsp;&#39;Friend&#39; =&gt; array(&#39;className&#39; =&gt; &#39;Account&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;joinTable&#39; =&gt; &#39;members&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;with&#39; =&gt; &#39;Member&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;foreignKey&#39; =&gt; &#39;account_id&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;associationForeignKey&#39; =&gt; &#39;member_id&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;conditions&#39; =&gt; &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;order&#39; =&gt; &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;limit&#39; =&gt; &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;uniq&#39; =&gt; false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;finderQuery&#39; =&gt; &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;deleteQuery&#39; =&gt; &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;insertQuery&#39; =&gt; &#39;&#39;<br />
&nbsp;&nbsp;&nbsp;)<br />
&nbsp;);
</p>
<p>
を記述します。お友達は「Friend」の下に、その中の「Member」にmemberモデルの内容が収められます。
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>28- 9·î-08 06:03</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/cakephpHABTMwith.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP1.2で携帯用</title>
<link>http://www.tonttu.net/tec/cakePHP/cakePHP_mobile.html</link>
<description><![CDATA[ <p>
cakePHPで携帯用にする方法はいくつかあるようですが、私の場合。 
</p>
<p>
・内部はUTF-8、出力はSHIFT-JIS,入力をUTF-8に変換<br />
app/app_controller.php<br />
if($this-&gt;RequestHandler-&gt;isMobile()){<br />
&nbsp;&nbsp;&nbsp;mb_language(&#39;ja&#39;);<br />
&nbsp;&nbsp;&nbsp;mb_internal_encoding(&#39;UTF-8&#39;);<br />
&nbsp;&nbsp;&nbsp;mb_http_output(&#39;SJIS&#39;);<br />
&nbsp;&nbsp;&nbsp;ob_start(&quot;mb_output_handler&quot;);<br />
&nbsp;&nbsp;&nbsp;mb_convert_variables(&quot;UTF-8&quot;, &quot;SJIS&quot;, $this-&gt;params[&#39;url&#39;]);<br />
&nbsp;&nbsp;&nbsp;mb_convert_variables(&quot;UTF-8&quot;, &quot;SJIS&quot;, $this-&gt;params[&#39;form&#39;]);<br />
&nbsp;&nbsp;&nbsp;mb_convert_variables(&quot;UTF-8&quot;, &quot;SJIS&quot;, $this-&gt;data);<br />
}&nbsp; 
</p>
<p>
・RequestHandler(拡張子)で「.mobile」を使用する。<br />
app/config/routes.phpに追加<br />
Router::parseExtensions(&#39;mobile&#39;);<br />
app/app_controller.php<br />
$this-&gt;RequestHandler-&gt;setContent(&quot;mobile&quot;,&#39;text/html&#39;); 
</p>
<p>
app/viewsの各コントローラーおよびlayoutsのフォルダに「mobile」フォルダを作成してビューを配置するのですが、なぜかドコモHPから入手できるiモードHTMLシミュレータでエラーになりました。layout用ビューを秀丸で一度文字コードをSFIFT-JISで保存してからUTF-8で保存しなおすと直りました。 
</p>
<p>
・リダイレクトをオーバーライド,セッションID付加<br />
app/app_controller.php<br />
//redirect メソッド書き換え<br />
&nbsp;function redirect($url,$status = null) {<br />
&nbsp;&nbsp;if($this-&gt;RequestHandler-&gt;isMobile()){<br />
&nbsp;&nbsp;&nbsp;if(strpos($url, &#39;.mobile&#39;) === false) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$url = $url.&quot;.mobile?&quot;.Configure::read(&#39;Session.cookie&#39;).&quot;=&quot;.session_id();<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$url = $url.&quot;?&quot;.Configure::read(&#39;Session.cookie&#39;).&quot;=&quot;.session_id();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;parent::redirect($url,$status);<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;parent::redirect($url,$status);<br />
&nbsp;&nbsp;}<br />
}<br />
他にも各リンクでセッションID引き渡しをします。<br />
core.phpの<br />
Security.levelがhighの場合、Session.phpでsession_regenerate_id()(セッションID振り直し)してくれます。 
</p>
<p>
各リンクでセッションID引き渡しがめんどうなら、リーサルウェポンsession.use_trans_sidを使う手も。<br />
core.phpの<br />
Configure::write(&#39;Session.save&#39;, &#39;mobilesession&#39;);<br />
とかカスタム宣言して、同フォルダにmobilesession.phpファイルを作成。session.phpの457行目以下を参考にしてカスタマイズします。<br />
注意！session.use_trans_sidはPHP5以上でないとini_setできません。 
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>28- 5·î-08 11:01</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/cakePHP_mobile.html</guid>
<author>クラウス</author>
</item>
<item>
<title>うぇブログ(xeblog2)をPHP5で動かす</title>
<link>http://www.tonttu.net/tec/tec_xoops/tec_xoops_xeblog.html</link>
<description><![CDATA[ <p>
うぇブログ(xeblog)はXOOPS用の高機能ブログモジュールです。Ethnaというフレームワークを使用しています。<br />
これをPHP5の環境で動かそうとしたらハマりましたのでメモ。<br />
Ethna自体をアップグレードすればすむかも知れませんし、今さっき作業したばかりなので見落としもあるかもしれません。 
</p>
<p>
1)PHP4互換モードにする<br />
.htaccessを使い、<br />
php_flag zend.ze1_compatibility_mode on<br />
の行を足してPHP4互換にしてしまいます。これで本文以外は表示されます。。
</p>
<p>
2）生成されるSELECT文のフィールドが空になっている。<br />
&nbsp;「SELECT&nbsp; FROM ...」となっていましたので、「SELECT&nbsp;* FROM ...」とします。<br />
common/xanhte/lib/Ethna/class/Ethna_AppObject.php<br />
を「SELECT」で検索し（複数見つかります）、たとえば1117行目あたりの上に<br />
if(!$column) $column = &quot;*&quot;;<br />
&nbsp;&nbsp;$sql = &quot;SELECT $column FROM $tables $condition $group_by $sort $limit&quot;;<br />
を足します。$columnsとなっているところもあります。DISTINCTとある場合はそのままにします。<br />
これでブログ記事一覧が表示されます。 
</p>
<p>
3）PHP5では、array_merge関数の動作が違う。<br />
どう違うのかは文献を探っていただくとして、その文献に対処も載っています。(array)でキャストします。<br />
同ファイルの1114行目あたりの&nbsp;<br />
$prop_def = array_merge($this-&gt;prop_def, $search_prop_def);<br />
を<br />
$prop_def = array_merge((array)$this-&gt;prop_def, (array)$search_prop_def);<br />
とします。<br />
これで個別記事が表示されます。<br />
XOOPSをgrepしたらarray_mergeはたくさん出てきたのですが、どうすればよいのでしょうね＾＾） 
</p>
 ]]></description>
<pubDate>22- 5·î-08 05:02</pubDate>
<guid>http://www.tonttu.net/tec/tec_xoops/tec_xoops_xeblog.html</guid>
<author>クラウス</author>
</item>
<item>
<title>XOOPS</title>
<link>http://www.tonttu.net/tec/tec_xoops.html</link>
<description><![CDATA[ <p>
&nbsp;
</p>
<p>
<ul>
</ul> 
</p>
 ]]></description>
<pubDate>22- 5·î-08 04:49</pubDate>
<guid>http://www.tonttu.net/tec/tec_xoops.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP+smartyでキャッシュを効かせる</title>
<link>http://www.tonttu.net/tec/cakePHP/cakePHPsmartyCache.html</link>
<description><![CDATA[ <p>
cakePHPでSmartyを使用しているとキャッシュに苦労します。<br />
cakePHP標準のキャッシュが使えるtipsを見つけたいものですが、、、<br />
今回はsmartyのキャッシュを使う方法ですが、落とし穴があるかも知れませんので自己責任でお願いします。 
</p>
<p>
cakeははじめにいろいろ自分の初期化をしてデータベースアクセスし、最後にVIEWを生成します。<br />
このうち初期化の後にキャッシュチェックをして有効であれば、その後をスルーすることにします。<br />
smartyは独自にキャッシュメカニズムを持っているのですが、最後にならないとsmartyが働かないので、コアに手を入れて初期化直後にVIEWクラスを生成します。 
</p>
<p>
まず、smarty内部でキャッシュファイルを生成するようにします。<br />
(私はrequestActionでブロック表示しているものだけキャッシュしたかったので、bareを見ています)<br />
/app/views/smarty.phpの「function __construct」関数（$this-&gt;ext= &#39;.tpl&#39;;とか設定しているところ）の最後に、 
</p>
<blockquote>
	<p>
	if($this-&gt;params[&#39;bare&#39;] == &#39;1&#39;) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Smarty-&gt;cache_lifetime = 3600; //有効秒数<br />
	&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Smarty-&gt;caching = true;&nbsp; //有効化<br />
	&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;cacheid = $this-&gt;params[&#39;url&#39;][&#39;url&#39;]; //url毎にキャッシュファイルを生成する。テンプレート単位でキャッシュする場合は不要<br />
	} 
	</p>
</blockquote>
<p>
function _render(...)の最後のfetchを以下に変更、&nbsp; 
</p>
<blockquote>
	<p>
	return $this-&gt;Smarty-&gt;fetch($___viewFn, $this-&gt;cacheid);&nbsp; 
	</p>
</blockquote>
<p>
/cake/dispatcher.phpの&nbsp;240行目あたり(return $this-&gt;_invoke(...)の直前)で、 
</p>
<blockquote>
	<p>
	include_once(VIEWS.&quot;smarty.php&quot;);<br />
	$viewClass =&amp; new SmartyView($controller);<br />
	$tplfile = $viewClass-&gt;_getViewFileName($this-&gt;params[&#39;action&#39;]);<br />
	if($viewClass-&gt;Smarty-&gt;is_cached($tplfile,$this-&gt;params[&#39;url&#39;][&#39;url&#39;]) === true) {<br />
	&nbsp; &nbsp; $viewClass-&gt;render();<br />
	&nbsp;&nbsp;&nbsp; return;<br />
	} 
	</p>
</blockquote>
<p>
smarty.phpをインクルードしてVIEWクラスを生成し、is_cached関数が真の場合、renderしてreturnしてしまいます。&nbsp; 
</p>
<hr />
<p>
ちなみにsmartyテンプレートからcakeのrequestActionを呼ぶにはヘルパーを自作しました。<br />
/app/views/helpers/block.php 
</p>
<blockquote>
	<p>
	&lt;?php<br />
	class BlockHelper extends AppHelper {<br />
	&nbsp;&nbsp;&nbsp; //requestAction<br />
	&nbsp;&nbsp;&nbsp; function fetch($address = null) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;pageTitle = $title;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!$address) return;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $output = $this-&gt;requestAction($address, array(&#39;return&#39;));<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $this-&gt;output($output);<br />
	&nbsp;&nbsp;&nbsp; }<br />
	}<br />
	?&gt; 
	</p>
</blockquote>
<p>
コントローラーにhelpers宣言しておいて、テンプレートからは<br />
{$block-&gt;fetch(&quot;/tags/index&quot;)}<br />
でNucleusライクに他のアクションの描画結果を呼び出せます。 
</p>
<hr />
<p>
もっと追加＾＾）smartyでfetchした結果を再度render評価します。<br />
ブログや管理画面で本文を入力した内容にsmarty関数を書いたりした場合に、一度fetchして再度fetchすることによって巻数を展開します。<br />
smartyにはリソースプラグインという機能があり、ファイルとしてテンプレートを読み込む以外にデータベースなどからテンプレートを読み込めるわけですが、なぜかPHP変数をテンプレートとして使えません。smartyプラグインとして作成します。ここではファイル名は「resource.memory.php」
</p>
<blockquote>
	<p>
	&lt;?php<br />
	function smarty_resource_memory_source($tpl_name,&amp;$tpl_source,&amp;$smarty_obj){<br />
	&nbsp; $tpl_source = $tpl_name;<br />
	&nbsp; return true;<br />
	}<br />
	function smarty_resource_memory_timestamp($tpl_name,&amp;$tpl_timestamp,&amp;$smarty_obj){<br />
	&nbsp; $tpl_timestamp = time();<br />
	&nbsp; return true;<br />
	}<br />
	function smarty_resource_memory_secure($tpl_name,&amp;$smarty_obj){<br />
	&nbsp; return true;<br />
	}<br />
	function smarty_resource_memory_trusted($tpl_name,&amp;$smarty_obj){<br />
	&nbsp; <br />
	}<br />
	?&gt;&nbsp;
	</p>
</blockquote>
<p>
/cake/dispatcher.phpの上記fetch箇所を&nbsp;
</p>
<blockquote>
	<p>
	$text = $this-&gt;Smarty-&gt;fetch($___viewFn, $this-&gt;cacheid);&nbsp;<br />
	if(strpos($text, $this-&gt;Smarty-&gt;left_delimiter) !== false) {<br />
	&nbsp;&nbsp;&nbsp; $text = $this-&gt;Smarty-&gt;fetch(&quot;memory:&quot;.$text);&nbsp;<br />
	}<br />
	return $text;
	</p>
</blockquote>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
</hr></hr> ]]></description>
<pubDate>29- 3·î-08 00:46</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/cakePHPsmartyCache.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP1.2でBasic認証</title>
<link>http://www.tonttu.net/tec/cakePHP/cakePHP12_2_BASIC.html</link>
<description><![CDATA[ <p>
cakePHP1.2でBASIC認証を使いたい。BASIC認証とは会員性のホームページなどにあるログインダイアログが表示されて正しいパスワードを入力しないと先へ進めないもの。普通はApacheのhtacessとhtpasswordを使わなければならないものが、以下のように簡単にできます。<br />
Securityコンポーネントを使います。コードを読みながらなので自己責任でお願いします。<br />
データベースとログインフォームを使った認証ならAuthコンポーネントを使いましょう。&nbsp;
</p>
<p>
var $components = array(&#39;Security&#39;);<br />
<br />
$users = array(&#39;（ユーザー名）&#39;=&gt;&#39;（パスワード）&#39;);<br />
$this-&gt;Security-&gt;requireLogin(&#39;add&#39;,&#39;edit&#39;,&#39;delete&#39;); //使いたいアクション<br />
$this-&gt;Security-&gt;requireLogin(array(&#39;type&#39;=&gt;&#39;basic&#39;,&#39;realm&#39;=&gt;&quot;パスワードを入力してください&quot;,&#39;users&#39;=&gt;$users));&nbsp;
</p>
<p>
Contoroller毎にも制御したいのですが、まだわかりません。<br />
ただ、こうすると入力フォームでもトークンキーを使った認証をしようとしてくれます。($form-&gt;create()と$form-&gt;end()を使うらしい)<br />
いろいろやったけどうざったいので、<br />
$this-&gt;params[&#39;requested&#39;] = 1;<br />
を付けて回避しました。本来はReqestActionで呼び出された時の判定用みたいなので、こういう使い方をしてはいけない気がします。<br />
このままでもREST呼び出ししたときにはBASIC認証を要求してくれました。<br />
<br />
BASIC認証ではパスワードが平文で通信されるので注意。<br />
&nbsp;* An associative array of usernames/passwords used for HTTP-authenticated logins.<br />
&nbsp;* If using digest authentication, passwords should be MD5-hashed.<br />
digest認証モードではmd5ハッシュしなさいだそうです。
</p>
 ]]></description>
<pubDate>16- 3·î-08 00:15</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/cakePHP12_2_BASIC.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP1.2でRESTfulなPUTでEDIT</title>
<link>http://www.tonttu.net/tec/cakePHP/cakePHP-RESTful-PUT.html</link>
<description><![CDATA[ <p>
ここではPUTメソッドでXML形式のデータを受信して更新します。
</p>
<p>
まずはコードを。<br />
普通アクセスの場合は、まずfindして入力フォームに送る。受信データがあればsave、失敗したら$this-&gt;dataをsetして戻す、<br />
RESTアクセスの場合は、XMLとみなしてUnserializeして$this-&gt;dataにしてsave。エラーがあればステータスコード400を返す。<br />
function edit($id = null) {<br />
&nbsp;&nbsp;if(!empty($this-&gt;params[&#39;id&#39;])) $id = $this-&gt;params[&#39;id&#39;];//RESTアクセスの場合idをparamsから取る<br />
&nbsp;&nbsp;if(!$id) die;//idがなければ終了<br />
&nbsp;&nbsp;$this-&gt;pageTitle = &quot;編集&quot;;//ページタイトル 
</p>
<p>
&nbsp;&nbsp;$REQUEST_METHOD = $_SERVER[&#39;REQUEST_METHOD&#39;];//RESTアクセスの判断<br />
&nbsp;&nbsp;if($REQUEST_METHOD == &#39;PUT&#39;) {//PUTの場合<br />
&nbsp;&nbsp; //認証しましょう<br />
&nbsp;&nbsp;&nbsp;$putdata = fopen(&quot;php://input&quot;,&quot;r&quot;);//一般入力php://inputから取るそうだ<br />
&nbsp;&nbsp;&nbsp;require_once(&quot;XML/Unserializer.php&quot;);//ライブラリ読み込み<br />
&nbsp;&nbsp;&nbsp;$param = array(&#39;complexType&#39; =&gt; &quot;array&quot;);<br />
&nbsp;&nbsp;&nbsp;$xml = new XML_Unserializer($param);//パラメーターを指定してインスタンス化<br />
&nbsp;&nbsp;&nbsp;$xml-&gt;unserialize($putdata);//データを渡す<br />
&nbsp;&nbsp;&nbsp;$result = $xml-&gt;getUnserializedData();//XMLから配列を得る<br />
&nbsp;&nbsp;&nbsp;if (PEAR::isError($result)) {//エラーがあれば<br />
&nbsp;&nbsp;&nbsp;&nbsp;header(&quot;HTTP/1.0 400 Bad Request&quot;);//コード400を返す<br />
&nbsp;&nbsp;&nbsp;&nbsp;die($result-&gt;getMessage());//エラーメッセージも送って終了<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;data = $result;//変換成功なら$this-&gt;dateにしてしまう。<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;if(!empty($this-&gt;data)) {//受信データがあれば<br />
&nbsp;&nbsp;&nbsp; //ここでデータを検証しましょう<br />
&nbsp;&nbsp;&nbsp;if(($this-&gt;Article-&gt;create($this-&gt;data) &amp;&amp; $this-&gt;Article-&gt;validates())) {//バリデーションチェック<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;Article-&gt;save($this-&gt;data);//通ればsave<br />
&nbsp;&nbsp;&nbsp;&nbsp;$cond = array(&quot;Article.id&quot; =&gt; $id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$article = $this-&gt;Article-&gt;find($cond);//save後のデータを取る<br />
&nbsp;&nbsp;&nbsp;} else {//失敗したら<br />
&nbsp;&nbsp;&nbsp;&nbsp;$article = $this-&gt;data;//$this-&gt;dataを戻す<br />
&nbsp;&nbsp;&nbsp;&nbsp;if($REQUEST_METHOD == &#39;PUT&#39;) {//RESTアクセスの場合<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header(&quot;HTTP/1.0 400 Bad Request&quot;);//400を返す<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die(join($this-&gt;validateErrors($this-&gt;Article)));//バリデーションエラーをモデルから渡す<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;$cond = array(&quot;Article.id&quot; =&gt; $id);//通常初回アクセスの場合<br />
&nbsp;&nbsp;&nbsp;$article = $this-&gt;Article-&gt;find($cond);//データを取る<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if($REQUEST_METHOD == &#39;PUT&#39;) exit;//RESTアクセスの場合、終了 
</p>
<p>
&nbsp;&nbsp;if(!$article) die;//データがなければ終了<br />
&nbsp;&nbsp;$this-&gt;set(&#39;article&#39;,$article);//VIEWに渡す<br />
}&nbsp; 
</p>
<p>
apcheのhttpd.confでLIMIT GET POST PUT DELETEもしておく必要があるのかな。<br />
たいていのWWWブラウザーではメソッドにGETとPOST以外は使えないので、専用ソフトを使いました。<br />
なぜか「eXeve」ではPUT&gt;EDIT誘導がうまくいかなくて「restclient」と「RESTTest」でやったらうまく出来たよ。 
</p>
 ]]></description>
<pubDate>14- 3·î-08 01:19</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/cakePHP-RESTful-PUT.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP1.2とPEAR:XMLでXML出力</title>
<link>http://www.tonttu.net/tec/cakePHP/PEAR-XML.html</link>
<description><![CDATA[ <p>
cakePHP1.2ではXML機能があるので、PHPのバージョンによらずXMLがあつかいやすくなったそうだ、、、けどPHP4の環境ということもあり、あえてPEAR:XMLを使うことにする。<br />
cakePHP1.2の$xml-&gt;serialize(変数)では属性に展開されてしまうのでイヤでした。配列にもどすやり方もわからなかったし（相互変換ができれば使うかも）。 
</p>
<p>
そのまえにcakePHP1.2では「webservice」が変わり、「(URL).xml」等でXML,RSS,JSONなどのフォーマットで出力できるようになった。<br />
/app/config/routes.phpに<br />
Router::parseExtensions(&#39;rss&#39;,&#39;xml&#39;,&#39;json&#39;);<br />
を追加して、コントローラーの頭で<br />
var $components = array(&#39;RequestHandler&#39;);<br />
を設定しておく。これで<br />
(コントローラー)/index/page:2/serch:hoge/category:flower.xml<br />
でXML出力を試みるみたい。VIEWは<br />
/app/views/(コントローラー)/xml/フォルダに各アクション名のを置いておく。LAYOUTも同様。<br />
（余談：RequestHandlerを読むと携帯判別しているような箇所もある＾＾） 
</p>
<p>
※あらかじめ「vendors」にPEARおよびXMLを仕込んでパスを通して使えるようにしておいてください。<br />
smartyが使いたいので、smartyプラグインでserializeできるようにする。<br />
function.xml_serializer.php<br />
&lt;?php<br />
function smarty_function_xml_serializer($params, &amp;$smarty) {<br />
&nbsp; if($params[&#39;value&#39;] == &#39;&#39;) return;<br />
&nbsp;require_once &#39;XML/Serializer.php&#39;;<br />
&nbsp;$options = array(<br />
&nbsp;&nbsp; &quot;indent&quot; =&gt; &quot; &quot;,<br />
&nbsp;&nbsp; &quot;linebreak&quot; =&gt; &quot;\n&quot;,<br />
&nbsp;&nbsp; &quot;typeHints&quot; =&gt; false,<br />
&nbsp;&nbsp; &quot;addDecl&quot; =&gt; true,<br />
&nbsp;&nbsp; &quot;encoding&quot; =&gt; &quot;UTF-8&quot;,<br />
&nbsp;&nbsp; &quot;rootName&quot; =&gt; &quot;root&quot;,<br />
&nbsp;&nbsp; &quot;rootAttributes&quot; =&gt; null,<br />
&nbsp;&nbsp; &quot;defaultTagName&quot; =&gt; &quot;data&quot;,<br />
&nbsp;);<br />
&nbsp;$serializer = new XML_Serializer($options); 
</p>
<p>
&nbsp;if ($serializer-&gt;serialize($params[&#39;value&#39;])) {<br />
&nbsp;&nbsp; $xml = $serializer-&gt;getSerializedData();<br />
&nbsp;&nbsp;print($xml);<br />
&nbsp;}<br />
}<br />
?&gt;&nbsp; 
</p>
<p>
VIEWからは<br />
&lt;{xml_serializer value=(変数)}&gt;<br />
layouts/default.tplには<br />
&lt;{$content_for_layout}&gt;<br />
だけ書いておく。 
</p>
<p>
出力は<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;<br />
&lt;data&gt;<br />
&nbsp; &lt;Article&gt;<br />
&nbsp; &lt;id&gt;2&lt;/id&gt; <br />
&nbsp; &lt;title&gt;2&lt;/title&gt; <br />
&nbsp; &lt;category_id /&gt; <br />
&nbsp; &lt;comment&gt;2&lt;/comment&gt; <br />
&nbsp; &lt;body&gt;2&lt;/body&gt; <br />
&nbsp; &lt;visible&gt;0&lt;/visible&gt; <br />
&nbsp; &lt;modified&gt;2008-03-12 14:19:48&lt;/modified&gt; <br />
&nbsp; &lt;created&gt;2008-03-12 14:19:48&lt;/created&gt; <br />
&nbsp; &lt;/Article&gt;<br />
&lt;/data&gt;<br />
となります。$xml-&gt;UnserializerにかませるとPHPの配列にしてくれるので後々扱いやすいです。 
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>14- 3·î-08 00:50</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/PEAR-XML.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP1.2でMySQL3を使いたい</title>
<link>http://www.tonttu.net/tec/cakePHP/useMySQL3.html</link>
<description><![CDATA[ <p>
どうしてもうまくいかないと思ったらcakePHP1.2ではMySQL4以上とのこと<br />
/app/config/database.php<br />
&nbsp;* driver =&gt; The name of a supported driver; valid options are as follows:<br />
&nbsp;*&nbsp;&nbsp;mysql &nbsp;&nbsp;- MySQL 4 &amp; 5, 
</p>
<p>
Updateの時にAliasを使ってくれて、そこでエラー。複数モデルを一度に更新できるためなんだろうけどね。<br />
しかたないのでこれを1.1のように1回1モデルしかUpdateできなくする。&nbsp; 
</p>
<p>
/cake/libs/model/datasources/dbo_source.phpの1245行目を<br />
&nbsp;&nbsp;&nbsp;case &#39;update&#39;:<br />
//&nbsp;&nbsp;&nbsp;&nbsp;return &quot;UPDATE {$table} {$this-&gt;alias}{$alias} {$joins} SET {$fields} {$conditions}&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$sql = &quot;UPDATE {$table} SET {$fields} {$conditions}&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$sql = str_replace(&quot;$alias&quot;.&quot;.&quot;,&quot;&quot;,$sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return $sql; 
</p>
<p>
検証が十分でないので、自己責任でお願いします。 
</p>
 ]]></description>
<pubDate>14- 3·î-08 00:25</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/useMySQL3.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP1.2でRESTfulなindex</title>
<link>http://www.tonttu.net/tec/cakePHP/RESTfulIndex.html</link>
<description><![CDATA[ <p>
これからアプリケーション作るなら、せっかくなのでRESTfulを目指したいところ、、、だが、<br />
・URLをRESTfulにする<br />
・indexには条件で絞り込みをつけたい<br />
・便利なpagenatorへの対応<br />
・smartyViewも使いたい<br />
案の定とんでもないはめに。<br />
<br />
RESTfulにはURIの考え方がかかせないらしい。Webアプリの場合、データベースのテーブルやレコードに対して一意なURLアドレスを名詞として対応させておいてMethodを動詞と考えて行うといえばわかりやすい。idが指定されればレコードが特定されるのでUpdateやDeleteができ、なければテーブルに対してInsertなどを行います。<br />
cakePHPの場合、URLが「/(コントローラー)/(アクション)/(id)」というルールになっていてRESTに近いがちょっと惜しい。RESTfulではURLからアクションを省くので。 
</p>
<p>
cakePHP1.2ではRuterを使ってMethodに応じてアクションに対応させてくれます。1.2.06311では<br />
cake\libs\router.phpの118行目に記述があります。<br />
/**<br />
&nbsp;* Default HTTP request method =&gt; controller action map.<br />
&nbsp;*<br />
&nbsp;* @var array<br />
&nbsp;* @access private<br />
&nbsp;*/<br />
&nbsp;var $__resourceMap = array(<br />
&nbsp;&nbsp;array(&#39;action&#39; =&gt; &#39;index&#39;,&nbsp;&#39;method&#39; =&gt; &#39;GET&#39;,&nbsp;&nbsp;&#39;id&#39; =&gt; false),<br />
&nbsp;&nbsp;array(&#39;action&#39; =&gt; &#39;view&#39;,&nbsp;&#39;method&#39; =&gt; &#39;GET&#39;,&nbsp;&nbsp;&#39;id&#39; =&gt; true),<br />
&nbsp;&nbsp;array(&#39;action&#39; =&gt; &#39;add&#39;,&nbsp;&#39;method&#39; =&gt; &#39;POST&#39;,&nbsp;&nbsp;&#39;id&#39; =&gt; false),<br />
&nbsp;&nbsp;array(&#39;action&#39; =&gt; &#39;edit&#39;,&nbsp;&#39;method&#39; =&gt; &#39;PUT&#39;, &nbsp;&nbsp;&#39;id&#39; =&gt; true),<br />
&nbsp;&nbsp;array(&#39;action&#39; =&gt; &#39;delete&#39;,&nbsp;&#39;method&#39; =&gt; &#39;DELETE&#39;,&nbsp;&#39;id&#39; =&gt; true),<br />
&nbsp;&nbsp;array(&#39;action&#39; =&gt; &#39;edit&#39;,&nbsp;&#39;method&#39; =&gt; &#39;POST&#39;, &nbsp;&#39;id&#39; =&gt; true)<br />
&nbsp;); 
</p>
<p>
これを有効にするには<br />
app\config\routes.phpで<br />
Router::mapResources(&#39;(コントローラー)&#39;);<br />
とします。すると、<br />
(コントローラー)/(id)にGETメソッドでアクセスすると、viewアクションに渡されます。<br />
（ちなみに今のＷＷＷブラウザーではGETとPOSTメソッドしか使えません）&nbsp; 
</p>
<p>
問題は、各メソッドに引数が指定できないこと。(この記事の結論からいえば、URLからindexは外せませんでした。)<br />
indexメソッドではカテゴリーでの絞り込みなどを行いたいもので、従来(本来？)<br />
function index($serch,$category) {<br />
としてURL「(コントローラー)/index/hoge/flower/」で値を渡してやります。<br />
値の渡し方はこの引数渡しのほかに、「(コントローラー)/index?serch=hoge&amp;category=flower」のGETクエリー渡しもあります。<br />
この場合はコントローラーで「$this-&gt;params[&#39;url&#39;][&#39;serch&#39;]」で値を取得します。 
</p>
<p>
さらに問題が。indexメソッドではたいていページ送りをしたいものですが、1.2ではpagenatorを使い、<br />
コントローラー中で<br />
$this-&gt;set(&#39;(view変数名)&#39;,$this-&gt;paginate());<br />
VIEWで<br />
$paginator-&gt;numbers(true)<br />
とするだけで、<br />
「1|2|3|4」などのページ送りリンクが生成されるのですが、上記の方法では引数が簡単には引き継がれません。 
</p>
<p>
pagenatorで生成されたリンクを見ると<br />
「（コントローラー）/index/page:2」などとなっています。この「page」は$this-&gt;params[&#39;named&#39;][&#39;page&#39;]として取得できます。<br />
これを利用してURLを<br />
(コントローラー)/index/serch:hoge<br />
(コントローラー)/index/page:2/serch:hoge/category:flower<br />
などとして、コントローラー内では、<br />
&nbsp;&nbsp;$option = array();<br />
&nbsp;&nbsp;foreach($this-&gt;params[&#39;named&#39;] as $key =&gt; $value) {<br />
&nbsp;&nbsp;&nbsp;$option[&#39;url&#39;][$key] = $value;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;$this-&gt;set(&#39;option&#39;, $option);<br />
VIEW(smarty使用)では&nbsp;<br />
{$paginator-&gt;numbers($option)}<br />
とします。リソースが一意になったような気がします。<br />
（cakePHPのsmartyViewの配列対応プラグイン「assign_assoc」では配列の配列がうまく扱えませんでした） 
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>13- 3·î-08 08:20</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/RESTfulIndex.html</guid>
<author>クラウス</author>
</item>
<item>
<title>リンクをWindowダイアログ内に表示する</title>
<link>http://www.tonttu.net/tec/85/link2Window.html</link>
<description><![CDATA[ <p>
ページ内のリンクをページ遷移せずにExt.Windowダイアログを作成してその中に表示します。<br />
Ext.Windowは移動や拡大縮小可能なwindowを生成します。その中にツールバーやテキストやGrid、タブなどを入れることもできます。<br />
Windowを使わない場合はExt.Panelでもかまいません。<br />
ここではいろんなことをしています。<br />
・Ext.Windowを作成する<br />
・Ext.Window.body.loadでリンクを読み込む<br />
・タイトルを表示する<br />
・ページ内のリンクを自動的にこのWindow内で開くようにする<br />
・進む、戻るのナビゲーションをタイトルバーにtoolとしてつける<br />
・同じリンクが指定された場合は、Ext.Windowダイアログを再利用する＞closeActionをhide()にしてShow()する<br />
・表示時に位置をランダムで変える<br />
・他ドメインのサイトはgetLink(url)としてiframeで表示する（説明は省きます） 
</p>
<p>
function getDoc(url,title)としてまとめます。<br />
通常のリンクからは&lt;a href=&#39;javascript:getDoc((url),(タイトル))；void(0)；&#39;&gt;とします。<br />
読み込んだページに対しても、<br />
genAjaxLink関数を使ってaタグすべてにこのWindow.body内で表示するようにします。&nbsp; 
</p>
<p>
まず、Ext.Windowダイアログを再利用するため、コードの冒頭で<br />
var modules = new Array();<br />
と宣言しておきます。<br />
modules[&#39;window&#39;]にExt.windowオブジェクトを格納します。<br />
modules[&#39;link&#39;]にナビゲーション用のリンク配列、<br />
modules[&#39;linkInc&#39;]に現在表示している[&#39;link&#39;]の順番番号(0スタート)を入れます。 
</p>
<p>
ちなみにExt.Windowの内容は、Ext.window.body.update(&#39;テキスト&#39;)で変更できます。<br />
または、modules[&#39;window&#39;].body.update(&#39;テキスト&#39;)（(urlは「/」と「.」などを「-」に変更しています＜IDに使えないため)）<br />
ID指定したい場合は、Ext.getCmp((ID)).body.update(&#39;テキスト&#39;) 
</p>
<p>
function getDoc(url,title){<br />
&nbsp; //他ドメインの場合はgetLink(url)関数へ渡す<br />
&nbsp;if(url.indexOf(&#39;http://&#39;) &gt; -1 || url.indexOf(&#39;https://&#39;) &gt; -1) {<br />
&nbsp;&nbsp;getLink(url);<br />
&nbsp;&nbsp;return false;<br />
&nbsp;}<br />
&nbsp; //ID設定するためにurlを変更する<br />
&nbsp;did = url.replace(/[^0-9a-z]/ig, &quot;\-&quot;); //make id<br />
&nbsp; //タイトル表示用に長すぎるタイトルを切る<br />
&nbsp;//make longer Title is Short<br />
&nbsp;if(title.length &gt; 60) {<br />
&nbsp;&nbsp;titlestr = title.substr(0,60) + &quot;...&quot;;<br />
&nbsp;} else {<br />
&nbsp;&nbsp;titlestr = title;<br />
&nbsp;}<br />
&nbsp; //modules[url]が存在しない場合、Ext.Windowを作成する<br />
&nbsp;if(!modules[url]){<br />
&nbsp;&nbsp;modules[url] = new Array();<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;] = new Ext.Window({<br />
&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&#39;doc_&#39;+did,<br />
&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :titlestr,<br />
&nbsp;&nbsp;&nbsp;layout&nbsp;&nbsp;&nbsp;&nbsp; :&#39;fit&#39;,<br />
&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :580,<br />
&nbsp;&nbsp;&nbsp;height&nbsp;&nbsp;&nbsp;&nbsp; :480,<br />
&nbsp;&nbsp;&nbsp;closeAction:&#39;hide&#39;, //Closeアイコンの動作(隠す)。省略の場合、close（削除）<br />
&nbsp;&nbsp;&nbsp;maximizable:true, //最大化有効<br />
&nbsp;&nbsp;&nbsp;collapsible:true, //アイコン化有効<br />
&nbsp;&nbsp;&nbsp;autoScroll :true,<br />
&nbsp;&nbsp;&nbsp;bodyStyle&nbsp; :&#39;background-color: white;&#39;,<br />
&nbsp;&nbsp;//enableイベントに対する動作<br />
&nbsp;&nbsp;&nbsp;//Document Scripting after hook load callback(enable Event)<br />
&nbsp;&nbsp;&nbsp;listeners&nbsp; :{&#39;enable&#39;:function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;genAjaxLink($(&#39;#doc_&#39;+did), this, null);<br />
&nbsp;&nbsp;&nbsp;}},<br />
&nbsp; //ツールバーに追加<br />
&nbsp;&nbsp;&nbsp;tools:[{ //make Titlebar Tool<br />
&nbsp;&nbsp;&nbsp; //左アイコンを追加。<br />
&nbsp;&nbsp;&nbsp;&nbsp;id:&#39;left&#39;, //Back navigation<br />
&nbsp;&nbsp;&nbsp;&nbsp;hidden:true, //初期非表示<br />
&nbsp;&nbsp;&nbsp; //リンクが1以上の場合、「戻る」動作をする<br />
&nbsp;&nbsp;&nbsp;&nbsp;handler: function(event, toolEl, panel){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(panel[&#39;linkInc&#39;] &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel[&#39;linkInc&#39;]--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link = panel[&#39;link&#39;][panel[&#39;linkInc&#39;]];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.body.load({url:link,params:{noTemplate:&#39;blank&#39;},callback:function(){panel.enable()},scripts:true});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(panel[&#39;linkInc&#39;] == 0) panel.tools.left.hide();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.tools.right.show(); //右アイコンを表示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;},{<br />
&nbsp;&nbsp;&nbsp; //右アイコンを追加。<br />
&nbsp;&nbsp;&nbsp;&nbsp;id:&#39;right&#39;, //Next navigation<br />
&nbsp;&nbsp;&nbsp;&nbsp;hidden:true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;handler: function(event, toolEl, panel){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(panel[&#39;linkInc&#39;] &lt; panel[&#39;link&#39;].length - 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel[&#39;linkInc&#39;]++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link = panel[&#39;link&#39;][panel[&#39;linkInc&#39;]];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.body.load({url:link,params:{noTemplate:&#39;blank&#39;},callback:function(){panel.enable()},scripts:true});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(panel[&#39;linkInc&#39;] == panel[&#39;link&#39;].length - 1) panel.tools.right.hide();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.tools.left.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}]<br />
&nbsp;&nbsp;});<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;].show(); //Ext.Windowを表示する<br />
<br />
&nbsp; //ナビゲーション用リンク配列<br />
&nbsp;&nbsp;//preparations link Navigation<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;][&#39;linkInc&#39;] = 0;<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;][&#39;link&#39;] = new Array();<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;][&#39;link&#39;].push(url);<br />
&nbsp;&nbsp;link = modules[url][&#39;window&#39;][&#39;link&#39;][modules[url][&#39;window&#39;][&#39;linkInc&#39;]];<br />
<br />
&nbsp; //body.loadを使い、読み込む<br />
&nbsp; //callbackでenable()イベントを発生させる＜ページ内容を操作するのにここのcallbackでは描画が完了していないらしいので<br />
&nbsp;&nbsp;//Document Ajax load<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;].body.load({url:link,params:{noTemplate:&#39;blank&#39;},callback:function(){modules[url][&#39;window&#39;].enable()},scripts:true});<br />
<br />
&nbsp; //初期表示時、位置をランダムで変える＜常に中心に表示されるので<br />
&nbsp;&nbsp;//Randam window position<br />
&nbsp;&nbsp;box = modules[url][&#39;window&#39;].getBox(true);<br />
&nbsp;&nbsp;pos_x = Math.floor(5*Math.random()) * 8 + box.x;<br />
&nbsp;&nbsp;pos_y = Math.floor(5*Math.random()) * 8 + box.y;<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;].setPosition(pos_x,pos_y);<br />
&nbsp;} else {<br />
&nbsp; //すでにmodules[url]が存在する（hide隠れている）場合、表示してloadしなおす<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;].show();<br />
&nbsp;&nbsp;modules[url][&#39;window&#39;].body.load({url:url,params:{noTemplate:&#39;blank&#39;},callback:function(){modules[url][&#39;window&#39;].enable()},scripts:true});<br />
&nbsp;}<br />
} 
</p>
<p>
読み込んだページに対してリンク（aタグ）すべてに対して動作を変更します。しなければ通常のページ遷移が発生します。<br />
obj:ID指定されたjQueryオブジェクト<br />
wobj:Ext.Windowオブジェクト<br />
wflg:getDocに渡してWindow生成する 
</p>
<p>
function genAjaxLink(obj, wobj, wflg) {<br />
&nbsp;//指定オブジェクト内のaタグすべてループする<br />
&nbsp;$(&#39;a&#39;, obj).each(function(){<br />
&nbsp; //urlがドメインのリンク(http://(自分のドメイン))であれば外す<br />
&nbsp;&nbsp;$(this).attr(&#39;href&#39;,$(this).attr(&#39;href&#39;).replace(serverpath,&#39;&#39;));<br />
&nbsp; //無名関数を割り当てる<br />
&nbsp;&nbsp;$(this).click(function(){<br />
&nbsp; //他ドメインへのリンクであればgetLinkに渡す<br />
&nbsp;&nbsp;&nbsp;if($(this).attr(&#39;href&#39;).indexOf(&#39;http://&#39;) &gt; -1 || $(this).attr(&#39;href&#39;).indexOf(&#39;https://&#39;) &gt; -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;getLink($(this).attr(&#39;href&#39;));<br />
&nbsp;&nbsp;&nbsp;} else if(wflg == &quot;-1&quot;) {<br />
&nbsp;&nbsp;&nbsp; //getDocに渡す<br />
&nbsp;&nbsp;&nbsp;&nbsp;getDoc($(this).attr(&#39;href&#39;),$(this).attr(&#39;href&#39;));<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp; //ナビゲーション用リンク配列にurlを追加し、loadする<br />
&nbsp;&nbsp;&nbsp;&nbsp;link = $(this).attr(&#39;href&#39;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;wobj[&#39;linkInc&#39;]++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;wobj[&#39;link&#39;].push(link);<br />
&nbsp;&nbsp;&nbsp;&nbsp;wobj.load({url:link,params:{noTemplate:&#39;blank&#39;},callback:function(){wobj.enable()},scripts:true});<br />
&nbsp;&nbsp;&nbsp; //左(戻る)アイコンを表示する<br />
&nbsp;&nbsp;&nbsp;&nbsp;wobj.tools.left.show();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;});<br />
&nbsp;});<br />
} 
</p>
 ]]></description>
<pubDate>16- 2·î-08 03:37</pubDate>
<guid>http://www.tonttu.net/tec/85/link2Window.html</guid>
<author>クラウス</author>
</item>
<item>
<title>WayfinderでExt.tree用のjsonを出力する</title>
<link>http://www.tonttu.net/tec/modx/wayfinder2Ext.html</link>
<description><![CDATA[ <p>
WayfinderはMODXのメニューを自動生成してくれます。<br />
Ext.treeは独自のjavascript配列を解釈してWindowsのExplorer風のツリーを表示します。 
</p>
<p>
jsonの形式は<br />
[{<br />
&nbsp; key1:value,<br />
&nbsp; key2:value,<br />
&nbsp; key3:{<br />
&nbsp;&nbsp;&nbsp; key1:value,<br />
&nbsp;&nbsp;&nbsp; key2:value<br />
&nbsp; },<br />
&nbsp; key3:{<br />
&nbsp;&nbsp;&nbsp; key1:value,<br />
&nbsp;&nbsp;&nbsp; key2:value,<br />
&nbsp;&nbsp;&nbsp; key3:{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key1:value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key2:value<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}]<br />
と配列の要素を「,(カンマ)」で区切って記述しますが、Wayfinderでは最後の要素を意識しないので、最後の要素のあとにもカンマがついてしまいます。<br />
$RowLastTplと$parentRowLastTplを使えるようにします。 
</p>
<p>
ドキュメントエイリアス：(ページ名).json<br />
テンプレート：(blank)<br />
コンテンツタイプ：text/jacvascript<br />
内容：【【Wayfinder? &amp;startId=`0` &amp;config=`Ext_menu`】】 
</p>
<p>
&amp;config=で設定ファイルを使用することができます。<br />
assets/snippets/wayfinder/configs/Ext_menu.config.php<br />
&lt;?php<br />
$removeNewLines = &quot;true&quot;;<br />
<br />
$outerTpl = &quot;@CODE:【【+wf.wrapper+】】&quot;;<br />
<br />
$rowTpl = &quot;@CODE:{<br />
&nbsp;href:&#39;javascript:getDoc(\&#39;【+wf.link+】\&#39;,\&#39;【+wf.linktext+】\&#39;);void(0);&#39;,<br />
&nbsp;text:&#39;【+wf.linktext+】(【+wf.subitemcount+】)&#39;,<br />
&nbsp;id:【+wf.docid+】,<br />
&nbsp;leaf:true,<br />
&nbsp;cls: &#39;file&#39;<br />
【+wf.wrapper+】},&quot;;<br />
<br />
$parentRowTpl = &quot;@CODE:{<br />
&nbsp;href:&#39;javascript:getDoc(\&#39;【+wf.link+】\&#39;,\&#39;【+wf.linktext+】\&#39;);void(0);&#39;,<br />
&nbsp;text:&#39;【+wf.linktext+】(【+wf.subitemcount+】)&#39;,<br />
&nbsp;id:【+wf.docid+】,<br />
&nbsp;cls:&#39;folder&#39;,<br />
children:【【+wf.wrapper+】】},&quot;;<br />
<br />
$rowLastTpl = &quot;@CODE:{<br />
&nbsp;href:&#39;javascript:getDoc(\&#39;【+wf.link+】\&#39;,\&#39;【+wf.linktext+】\&#39;);void(0);&#39;,<br />
&nbsp;text:&#39;【+wf.linktext+】(【+wf.subitemcount+】)&#39;,<br />
&nbsp;id:【+wf.docid+】,<br />
&nbsp;leaf:true,<br />
&nbsp;cls: &#39;file&#39;<br />
【+wf.wrapper+】}&quot;;<br />
<br />
$parentRowLastTpl = &quot;@CODE:{<br />
&nbsp;href:&#39;javascript:getDoc(\&#39;【+wf.link+】\&#39;,\&#39;【+wf.linktext+】\&#39;);void(0);&#39;,<br />
&nbsp;text:&#39;【+wf.linktext+】(【+wf.subitemcount+】)&#39;,<br />
&nbsp;id:【+wf.docid+】,<br />
&nbsp;cls:&#39;folder&#39;,<br />
children:【【+wf.wrapper+】】}&quot;;<br />
<br />
$innerTpl = &quot;@CODE:【+wf.wrapper+】&quot;;<br />
?&gt;<br />
(「【」と「】」は実際は「[」と「]」です)&nbsp;&nbsp;&nbsp; 
</p>
<p>
assets/snippets/wayfinder/wayfinder.inc.php<br />
98行目あたり<br />
if ($counter == ($numSubItems)) $docInfo[&#39;last&#39;] = 1;<br />
&nbsp;&nbsp;&nbsp;//Determine if document has children&nbsp; 
</p>
<p>
160行目あたり、<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif ($resource[&#39;isfolder&#39;] &amp;&amp; $this-&gt;_templates[&#39;parentRowTpl&#39;] &amp;&amp; ($resource[&#39;level&#39;] &lt; $this-&gt;_config[&#39;level&#39;] || $this-&gt;_config[&#39;level&#39;] == 0) &amp;&amp; $numChildren &amp;&amp; $resource[&#39;last&#39;]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $usedTemplate = &#39;parentRowLastTpl&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif ($resource[&#39;isfolder&#39;] &amp;&amp; $this-&gt;_templates[&#39;parentRowTpl&#39;] &amp;&amp; ($resource[&#39;level&#39;] &lt; $this-&gt;_config[&#39;level&#39;] || $this-&gt;_config[&#39;level&#39;] == 0) &amp;&amp; $numChildren) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $usedTemplate = &#39;parentRowTpl&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif ($resource[&#39;level&#39;] &gt; 1 &amp;&amp; $this-&gt;_templates[&#39;innerRowTpl&#39;]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $usedTemplate = &#39;innerRowTpl&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif($resource[&#39;last&#39;]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $usedTemplate = &#39;rowLastTpl&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $usedTemplate = &#39;rowTpl&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; 
</p>
<p>
出力の結果はこちら、<br />
<a href="Ext_menu.json">http://www.tonttu.net/Ext_menu.json</a> 
</p>
<p>
Ext.treeは次のように解釈します。<br />
&nbsp;href要素でリンククリック動作、<br />
&nbsp;text要素で表示文字列、<br />
&nbsp;id要素でID、<br />
&nbsp;leaf要素がtrueの場合、終端、<br />
&nbsp;cls要素でアイコン画像、&#39;file&#39;、&#39;folder&#39;を指定してあります。 
</p>
<p>
Extの記述。ここではWindowダイアログの中にTreePanelを表示しています。 
</p>
<p>
&nbsp;&nbsp;var treeWindow&nbsp;= new Ext.Window({<br />
&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :winid,<br />
&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :winid,<br />
&nbsp;&nbsp;&nbsp;layout&nbsp;&nbsp;&nbsp;&nbsp; :&#39;fit&#39;,<br />
&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :240,<br />
&nbsp;&nbsp;&nbsp;height&nbsp;&nbsp;&nbsp;&nbsp; :360,<br />
&nbsp;&nbsp;&nbsp;minWidth&nbsp;&nbsp; :64,<br />
&nbsp;&nbsp;&nbsp;closable&nbsp;&nbsp; :false,<br />
&nbsp;&nbsp;&nbsp;collapsible:true,<br />
&nbsp;&nbsp;&nbsp;bodyStyle:&#39;background-color: white;&#39;,<br />
&nbsp;&nbsp;&nbsp;items:treepanel = new Ext.tree.TreePanel({<br />
&nbsp;&nbsp;&nbsp;&nbsp;autoScroll :true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;loader: new Ext.tree.TreeLoader({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataUrl:&#39;/Ext_menu.json&#39;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}),<br />
&nbsp;&nbsp;&nbsp;&nbsp;root: treeroot = new Ext.tree.AsyncTreeNode({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text: &#39;Root&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&#39;root&#39;<br />
&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;})]<br />
&nbsp;&nbsp;});<br />
&nbsp;&nbsp;treeroot.expand();<br />
&nbsp;&nbsp;treeWindow.show(); 
</p>
 ]]></description>
<pubDate>16- 2·î-08 02:11</pubDate>
<guid>http://www.tonttu.net/tec/modx/wayfinder2Ext.html</guid>
<author>クラウス</author>
</item>
<item>
<title>パラメーターでテンプレートを使用しない</title>
<link>http://www.tonttu.net/tec/modx/notemplate.html</link>
<description><![CDATA[ <p>
MODxはドキュメント思考のCMSです。ヘッダーやフッターなどサイトに共通する部分は「テンプレート」にまとめ、ページ毎に異なる部分は「ドキュメント」と呼ばれ、表示時にテンプレートに埋め込んで表示されます。（私はXOOPSでいう「テーマ」という言い方のほうが好みです） 
</p>
<p>
Ajaxを使ったサイトでは、あるページの一部分の内容をページ遷移せずに置き換えることが行われます。<br />
この一部分をドキュメントとしたい場合はテンプレートが不要です。MODxではドキュメント毎にテンプレートを指定することができるので、これを「(blank)」と指定すればテンプレートで囲まれずに素のままのドキュメントが得られます。<br />
実際は(blank)指定の場合はテンプレート機能をスキップするわけではなくて、内部的にヘッダー等がないテンプレートを疑似的に使用しているだけです。 
</p>
<p>
ただ、ドキュメント思考のページの優れている点、URIリソースの考え方やSEO的にも、Ajax呼び出しの場合はblank、URLアドレス呼び出しの場合はテンプレートを適用としたいものです。例えばそのページだけにリンクを張りたい時もあります。&nbsp; 
</p>
<p>
POSTまたはGETでパラメーターを渡して、テンプレートを使用しないで表示するようにします。 
</p>
<p>
manager/includes/document.parser.class.inc.php<br />
1167行目あたりの<br />
if (!$this-&gt;documentObject[&#39;template&#39;])<br />
　　$this-&gt;documentContent= &quot;【*content*】&quot;; // use blank template<br />
がblank指定、疑似テンプレート回避をしている個所です。<br />
このブロックの終端に次のコードを追加します。<br />
if($_REQUEST[&#39;noTemplate&#39;] == &#39;blank&#39;) $this-&gt;documentContent= &quot;【*content*】&quot;;<br />
これでGETかPOSTに「noTemplate=blank」とすると、強制的にblank指定と同じ動作をさせることができます。<br />
(「【」と「】」は実際は「[」と「]」です)&nbsp; 
</p>
<p>
例：GETの場合は、<br />
(ドキュメント).html?noTemplate=blank 
</p>
<p>
Extのloadの場合は、<br />
(element).load({url:(url),params:{noTemplate:&#39;blank&#39;}}); 
</p>
<p>
jQueryのajaxの場合は、<br />
$.ajax({<br />
&nbsp; url: (url),<br />
&nbsp; dataType: &#39;html&#39;,<br />
&nbsp; data:{noTemplate:&#39;blank&#39;},<br />
&nbsp; success: function(html){<br />
&nbsp;&nbsp;&nbsp; (targetDIV).html(html);<br />
&nbsp; }<br />
});&nbsp; 
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>16- 2·î-08 01:45</pubDate>
<guid>http://www.tonttu.net/tec/modx/notemplate.html</guid>
<author>クラウス</author>
</item>
<item>
<title>perlメールフォームで文字コードUTF-8のテンプレートを使う</title>
<link>http://www.tonttu.net/tec/101/102.html</link>
<description><![CDATA[ <p>
perlのソースコードはEUCで書くこととされていますが、現在はなにかとUTF-8を使いたいものです。perl5.8以降はunicode対応もされているようですが、perl5.6.1で対応したメモです。 
</p>
<h2>概要</h2>
<p>
・メールフォームを作る<br />
・HTML::Templateテンプレートライブラリを使う<br />
・複数のページに共通したテーマを使う<br />
・メール本文に投稿内容を代入するのにテンプレートを使う<br />
・jcodeおよびJcode.pmは使わない<br />
・Unicode::Japaneseを使う<br />
・投稿内容のパースにcgi-lib.plを使う 
</p>
<p>
&nbsp;
</p>
<h2>ライブラリを読み込みます</h2>
<p>
（サーバーにライブラリがインストールされていれば不要です）<br />
CPAN等からライブラリを入手し、「lib」フォルダなどを作って配置します。 
</p>
<blockquote>
	<p>
	use lib &#39;（libへのフルパス）&#39;;<br />
	use HTML::Template;<br />
	use Unicode::Japanese;<br />
	require &quot;cgi-lib.pl&quot;; 
	</p>
	<p>
	&nbsp;
	</p>
</blockquote>
<h2>HTML::Templateテンプレートライブラリの使い方</h2>
<p>
ソースコードにhtmlの内容を埋め込まずに外部ファイルとして用意します。<br />
これでデザイナーとの協業やメンテナンスが容易になります。<br />
HTML::Temlateを使うと変数の埋め込みやIF条件などを使うことができます。<br />
<br />
１．読み込むテンプレートファイルを作成します。<br />
テーマテンプレート&rdquo;theme.html&rdquo; 
</p>
<blockquote>
	<p>
	&lt;html xmlns=&quot;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;<br />
	&lt;head&gt;<br />
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&#39;text/html; charset=&quot;UTF-8&quot;&#39; /&gt;<br />
	&lt;title&gt;template&lt;/title&gt;<br />
	&lt;/head&gt;<br />
	&lt;body&gt;<br />
	&lt;h1&gt;共通テーマ&lt;/h1&gt;<br />
	&lt;TMPL_VAR NAME=CONTENTS&gt;<br />
	&lt;/body&gt;<br />
	&lt;/html&gt; 
	</p>
</blockquote>
<p>
本文テンプレート&rdquo;tpl.html&rdquo; 
</p>
<blockquote>
	<p>
	&lt;h2&gt;本文&lt;/h2&gt;<br />
	&lt;TMPL_VAR NAME=ZIP&gt;<br />
	&lt;TMPL_VAR NAME=ADDRESS&gt;<br />
	&lt;TMPL_VAR NAME=TEL&gt; 
	</p>
</blockquote>
<p>
２．テンプレートを読み込み、いったん出力を変数に保持します。 
</p>
<blockquote>
	<p>
	$tplfile = &quot;tpl.html&quot;;<br />
	# テンプレート読み込み<br />
	$template = HTML::Template-&gt;new(filename =&gt; $tplfile,&#39;die_on_bad_params&#39; =&gt; 0);<br />
	# テンプレートに変数を代入する<br />
	$template-&gt;param(ZIP =&gt; &quot;373-****&quot;);<br />
	$template-&gt;param(ADDRESS =&gt; &quot;群馬県太田市******&quot;);<br />
	$template-&gt;param(TEL =&gt; &quot;0276-**-****&quot;);<br />
	# テンプレート出力<br />
	$data = $template-&gt;output; 
	</p>
</blockquote>
<p>
２．保持した変数をテーマテンプレートに入れて出力します。 
</p>
<blockquote>
	<p>
	$themetplfile = &quot;themel.html&quot;;<br />
	# テーマテンプレート読み込み<br />
	$template = HTML::Template-&gt;new(filename =&gt; $themetplfile,&#39;die_on_bad_params&#39; =&gt; 0);<br />
	# テーマテンプレートに変数を代入する<br />
	$template-&gt;param(CONTENTS =&gt; $data);<br />
	# テーマテンプレート出力<br />
	$data = $template-&gt;output; 
	</p>
	<p>
	# 出力する<br />
	print &quot;Content-Type: text/html\n\n&quot;, $themetemplate-&gt;output; 
	</p>
	<p>
	&nbsp;
	</p>
</blockquote>
<h2>cgi-lib.plの使い方</h2>
<blockquote>
	<p>
	my %in;<br />
	&amp;ReadParse(\%in);
	</p>
</blockquote>
<p>
これだけで受信したフォームデータが$in{&#39;(name属性値)&#39;}などで使うことができます。<br />
たとえば、<br />
&lt;input type=&quot;text&quot; name=&quot;hoge&quot;&gt;<br />
が<br />
$in{&#39;hoge&#39;}<br />
で使えます。 
</p>
<p>
テンプレートファイルをutf-8で作成すれば、受信データもutf-8になります。 
</p>
<p>
&nbsp;
</p>
<h2>メール送信</h2>
<p>
本来、日本語でメール送信するには文字コードiso-2022-jp形式で行います。<br />
gmailなどのウェブメーラーはutf-8とかでメールを送り、受信するメーラと中継するメールサーバーが対応していればかまわないようですが。<br />
本文以外のメールヘッダーの件名(Subject)、From,Toに日本語を使うときはさらにbase64エンコードをする必要があります。 
</p>
<p>
１．メール本文のテンプレートファイルを作成します。<br />
これもUTF-8で作成します。<br />
メール本文テンプレート&rdquo;mail.txt&rdquo;
</p>
<blockquote>
	<p>
	お問合せがありました<br />
	&lt;TMPL_VAR NAME=hoge&gt; 
	</p>
</blockquote>
<p>
２．件名をjisコードにして、さらにbase64エンコードします
</p>
<blockquote>
	<p>
	$mlsb = &quot;メールフォームからお問合せ&quot;;<br />
	$enc_mlsb = Unicode::Japanese-&gt;new($mlsb,&#39;auto&#39;);<br />
	$enc_mlsb = $enc_mlsb-&gt;conv(&#39;jis&#39;);<br />
	$enc_subject= &amp;Base64Encode($enc_mlsb); 
	</p>
</blockquote>
<blockquote>
	<p>
	sub Base64Encode {<br />
	&nbsp;my ($target) = @_;<br />
	&nbsp;my ($base) = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;<br />
	&nbsp;&nbsp;&nbsp;.&quot;abcdefghijklmnopqrstuvwxyz&quot;<br />
	&nbsp;&nbsp;&nbsp;.&quot;0123456789+/&quot;;<br />
	&nbsp;my $eStr = &quot;&quot;;<br />
	&nbsp;my $pStr = unpack(&quot;B*&quot;,$target);<br />
	&nbsp;for(my $i = 0;my $cStr = substr($pStr,$i,6); $i += 6){<br />
	&nbsp;&nbsp;$eStr .=substr($base,ord(pack(&quot;B*&quot;,&quot;00&quot;.$cStr)),1);<br />
	&nbsp;&nbsp;if(length($cStr) == 2){ $eStr .= &quot;==&quot;;}<br />
	&nbsp;&nbsp;elsif(length($cStr) == 4) { $eStr .= &quot;=&quot;;}<br />
	&nbsp;}<br />
	&nbsp;return(&quot;=?iso-2022-jp?B?$eStr?=&quot;);<br />
	} 
	</p>
</blockquote>
<p>
Unicode::Japaneseでは、<br />
$enc_mlsb-&gt;conv(&#39;jis&#39;, &#39;base64&#39;)<br />
として直接base64エンコードできますが、なぜか末尾に改行がついてメールヘッダーとして使えませんでした。<br />
この改行を取れば、「&quot;=?iso-2022-jp?B?」と「?=&quot;」で囲めばSubjectヘッダーに使えます。 
</p>
<p>
３．メール本文をテンプレートで生成する
</p>
<blockquote>
	<p>
	$mailfile = &quot;mail.txt&quot;;<br />
	$mailtemplate = HTML::Template-&gt;new(filename =&gt; $mailfile,&#39;die_on_bad_params&#39; =&gt; 0);<br />
	$mailtemplate-&gt;param(hoge =&gt; $in{&#39;hoge&#39;});<br />
	$body = $mailtemplate-&gt;output; 
	</p>
</blockquote>
<p>
４．メール送信する
</p>
<blockquote>
	<p>
	$mailer = &#39;/usr/sbin/sendmail&#39;;<br />
	$mlfr = &quot;（送信先メールアドレス）&quot;;<br />
	$err = 0;<br />
	open(MAIL, &quot;| $mailer -t -f&#39;$mlfr&#39;&quot;) or $err = 1;<br />
	if ($err == 0) {<br />
	&nbsp;print MAIL &quot;From: $mlfr\n&quot;;<br />
	&nbsp;print MAIL &quot;To: $mlfr\n&quot;;<br />
	&nbsp;print MAIL &quot;Subject: $enc_subject\n&quot;;<br />
	&nbsp;print MAIL &quot;MIME-Virsion: 1.0\n&quot;;<br />
	&nbsp;print MAIL &quot;Content-Type: text/plain; charset=iso-2022-jp\n&quot;;<br />
	&nbsp;print MAIL &quot;Content-Transfer-Encoding: 7bit\n\n&quot;;<br />
	&nbsp;print MAIL Unicode::Japanese-&gt;new($body,&#39;auto&#39;)-&gt;jis;<br />
	&nbsp; close(MAIL);<br />
	} else {<br />
	&nbsp; $errstr .= &#39;お客様メール送信エラー&#39;;<br />
	} 
	</p>
</blockquote>
<p>
Unicode::Japaneseはjisエンコード指定で、iso-2022-jp形式にしてくれます。<br />
また、いろいろテストしていた最中に<br />
$enc1 = Unicode::Japanese-&gt;new($mlsb,&#39;auto&#39;)-&gt;jis;<br />
$enc2 = Unicode::Japanese-&gt;new($mlsb,&#39;auto&#39;)-&gt;euc;<br />
$enc3 = Unicode::Japanese-&gt;new($mlsb,&#39;auto&#39;)-&gt;get;<br />
などとしているとおかしな結果が得られました。<br />
$enc = Unicode::Japanese-&gt;new($mlsb,&#39;auto&#39;);<br />
$enc1 = $enc-&gt;jis;<br />
$enc2 = $enc-&gt;euc;<br />
$enc3 = $enc-&gt;get;<br />
としていったん文字列オブジェクトとしてから使うほうがよいようです。 
</p>
 ]]></description>
<pubDate>07- 2·î-08 22:27</pubDate>
<guid>http://www.tonttu.net/tec/101/102.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Perl</title>
<link>http://www.tonttu.net/tec/101.html</link>
<description><![CDATA[ <p>
Perlは軽量言語で、文字列の取り扱いに優れています。<br />
HTML言語自体がテキストファイルなので、インターネットの動的サービス（CGI）には当初から広く用いられてきました。&nbsp;
</p>
<p>
<ul>
</ul> 
</p>
 ]]></description>
<pubDate>07- 2·î-08 22:24</pubDate>
<guid>http://www.tonttu.net/tec/101.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Ext.grid.EditorGridで表形式編集2</title>
<link>http://www.tonttu.net/tec/85/100.html</link>
<description><![CDATA[ <p>
Ｅｘｔ2で試してみました。前の連載よりシンプルにしてあります。 
</p>
<p>
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Style-Type&quot; content=&quot;text/css&quot; /&gt;<br />
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;resources/css/ext-all.css&quot;&gt; 
</p>
<p>
&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript&quot; /&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;adapter/jquery/jquery.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;adapter/jquery/jquery-plugins.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;adapter/jquery/ext-jquery-adapter.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;ext-all.js&quot;&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt; 
</p>
<p>
&lt;br /&gt;<br />
&lt;a href=&quot;#&quot; id=&quot;recordadd&quot;&gt;行追加&lt;/a&gt;&lt;br /&gt;<br />
&lt;a href=&quot;#&quot; id=&quot;recordput&quot;&gt;保存する&lt;/a&gt;&lt;br /&gt;<br />
&lt;br /&gt;<br />
&lt;div id=&quot;panelgrid&quot;&gt;&lt;/div&gt; 
</p>
<p>
&lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot;&gt;<br />
var store;<br />
var grid; 
</p>
<p>
$(function(){<br />
&nbsp;//データレコード設定<br />
&nbsp;var record = Ext.data.Record.create([<br />
&nbsp;&nbsp;{name:&quot;data[Doc][id]&quot;, type: &#39;int&#39;},<br />
&nbsp;&nbsp;{name:&quot;data[Article][title]&quot;, type: &#39;string&#39;},<br />
&nbsp;&nbsp;{name:&quot;data[Article][user_id]&quot;, type: &#39;int&#39;},<br />
&nbsp;&nbsp;{name:&quot;data[Article][modified]&quot;, type: &#39;string&#39;}<br />
&nbsp;]); 
</p>
<p>
&nbsp;//サンプルデータ<br />
&nbsp;var myData = [<br />
&nbsp;&nbsp;[1,&#39;title1&#39;,10,&#39;2007-1-11 00:01:00&#39;],<br />
&nbsp;&nbsp;[2,&#39;title2&#39;,20,&#39;2007-1-12 00:01:00&#39;],<br />
&nbsp;&nbsp;[3,&#39;title3&#39;,30,&#39;2007-1-13 00:01:00&#39;],<br />
&nbsp;&nbsp;[4,&#39;title4&#39;,40,&#39;2007-1-14 00:01:00&#39;],<br />
&nbsp;&nbsp;[5,&#39;title5&#39;,50,&#39;2007-1-15 00:01:00&#39;]<br />
&nbsp; ]; 
</p>
<p>
&nbsp;//データストア<br />
&nbsp;store = new Ext.data.Store({<br />
&nbsp;&nbsp;reader: new Ext.data.ArrayReader({}, record)<br />
&nbsp;}); 
</p>
<p>
/*<br />
&nbsp;//JSONでデータを得る場合<br />
&nbsp;var record = Ext.data.Record.create([<br />
&nbsp;&nbsp;{name:&quot;data[Doc][id]&quot;, mapping:&#39;Doc.id&#39;, type: &#39;int&#39;},<br />
&nbsp;&nbsp;{name:&quot;data[Article][title]&quot;, mapping:&#39;Article.title&#39;, type: &#39;string&#39;},<br />
&nbsp;&nbsp;{name:&quot;data[Article][user_id]&quot;, mapping:&#39;Article.user_id&#39;, type: &#39;int&#39;},<br />
&nbsp;&nbsp;{name:&quot;data[Article][modified]&quot;, mapping:&#39;Article.modified&#39;, type: &#39;string&#39;}<br />
&nbsp;]);<br />
&nbsp;store = new Ext.data.JsonStore({<br />
&nbsp;&nbsp;url: &#39;&#39;, //&lt;&lt;取得元アドレス設定<br />
&nbsp;&nbsp;root: &#39;&#39;,<br />
&nbsp;&nbsp;fields: Record<br />
&nbsp;});<br />
*/ 
</p>
<p>
&nbsp;//Grid内列設定<br />
&nbsp;var cm = new Ext.grid.ColumnModel([<br />
&nbsp;&nbsp;{header:&quot;id&quot;,width:75,dataIndex:&#39;data[Doc][id]&#39;},<br />
&nbsp;&nbsp;{header:&quot;件名&quot;,width:75,dataIndex:&#39;data[Article][title]&#39;,<br />
&nbsp;&nbsp;&nbsp;editor: new Ext.form.TextField({allowBlank: false})},<br />
&nbsp;&nbsp;{header:&quot;ユーザ&quot;,width:75,dataIndex:&#39;data[Article][user_id]&#39;},<br />
&nbsp;&nbsp;{header:&quot;更新日&quot;,width:75,dataIndex:&#39;data[Article][modified]&#39;}<br />
&nbsp;]); 
</p>
<p>
&nbsp;//EditorGrid設定<br />
&nbsp;var grid = new Ext.grid.EditorGridPanel({<br />
&nbsp;&nbsp;height:480,<br />
&nbsp;&nbsp;renderTo: &#39;panelgrid&#39;,<br />
&nbsp;&nbsp;cm: cm,<br />
&nbsp;&nbsp;clicksToEdit:1,<br />
&nbsp;&nbsp;store:store,<br />
&nbsp;&nbsp;stripeRows:true<br />
&nbsp;}); 
</p>
<p>
&nbsp;&nbsp;&nbsp; store.loadData(myData);<br />
//&nbsp;store.load(); //&nbsp;JSONでデータを得る場合
</p>
<p>
&nbsp;//新規行追加<br />
&nbsp;$(&#39;#recordadd&#39;).click(function(){<br />
&nbsp;&nbsp;var rc = new record({<br />
&nbsp;&nbsp;&nbsp;&#39;data[Article][title]&#39;: &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&#39;data[Article][user_id]&#39;: &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&#39;data[Article][modified]&#39;: &#39;&#39;<br />
&nbsp;&nbsp;});<br />
&nbsp;&nbsp;grid.stopEditing();<br />
&nbsp;&nbsp;store.insert(0, rc);<br />
&nbsp;&nbsp;grid.startEditing(0, 0);<br />
&nbsp;}); 
</p>
<p>
&nbsp;//保存<br />
&nbsp;$(&#39;#recordput&#39;).click(function(){<br />
&nbsp;&nbsp;//更新行を取得する<br />
&nbsp;&nbsp;var mrs = store.getModifiedRecords();<br />
&nbsp;&nbsp;//更新レコードをループする<br />
&nbsp;&nbsp;$.each(mrs, function(i) {<br />
&nbsp;&nbsp;&nbsp;//idがある場合、アップデート。ない場合、インサートする<br />
&nbsp;&nbsp;&nbsp;if(this.data[&#39;data[Doc][id]&#39;]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$.post(&quot;&quot;, this.data); //&lt;&lt;保存先アドレス設定<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$.post(&quot;&quot;, this.data); //&lt;&lt;保存先アドレス設定<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;});<br />
&nbsp;}); 
</p>
<p>
}); 
</p>
<p>
&lt;/script&gt; 
</p>
<p>
&lt;/body&gt;<br />
&lt;/html&gt; 
</p>
 ]]></description>
<pubDate>27- 1·î-08 16:49</pubDate>
<guid>http://www.tonttu.net/tec/85/100.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cal_test_01</title>
<link>http://www.tonttu.net/aboutus/DittoCal/cal_test_01.html</link>
<description><![CDATA[ cal_test_01
 ]]></description>
<pubDate>31-10·î-07 22:42</pubDate>
<guid>http://www.tonttu.net/aboutus/DittoCal/cal_test_01.html</guid>
<author>クラウス</author>
</item>
<item>
<title>マーケティング分析</title>
<link>http://www.tonttu.net/service/market.html</link>
<description><![CDATA[ さまざまなデータを多角的に分析して、見えにくかった戦略のご提案をします。  ]]></description>
<pubDate>28-10·î-07 21:18</pubDate>
<guid>http://www.tonttu.net/service/market.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Ajaxマッシュアップ検索MUP</title>
<link>http://www.tonttu.net/labo/94.html</link>
<description><![CDATA[ http://mup.tonttu.net/ ]]></description>
<pubDate>25-10·î-07 23:35</pubDate>
<guid>http://www.tonttu.net/labo/94.html</guid>
<author>クラウス</author>
</item>
<item>
<title>ホームページがアクセスされるまで</title>
<link>http://www.tonttu.net/tec/uml/web_access.html</link>
<description><![CDATA[ <p>
ホームページがユーザーに表示されるまでの流れです。<br />
他のページからリンクをたどる以外に、検索エンジンを利用したり広告からたどったりとさまざまな経路があります。<br />
SEOは一部分でしかなく、RSSやトラックバックなどブログマーケティングが強力なこともわかります。 
</p>
<p>
<a href="assets/images/tec/uml/webaccess.png" onclick="window.open('/assets/images/tec/uml/webaccess.png','','location=yes,scrollbars=yes,resizable=yes,status=yes');return false;"><img alt=" " border="0" height="402" src="assets/images/tec/uml/webaccess_520.gif" width="520" /></a> 
</p>
 ]]></description>
<pubDate>25-10·î-07 23:27</pubDate>
<guid>http://www.tonttu.net/tec/uml/web_access.html</guid>
<author>クラウス</author>
</item>
<item>
<title>ネットショップの流れ</title>
<link>http://www.tonttu.net/tec/uml/netshop_flow.html</link>
<description><![CDATA[ <p>
ネットショップの購入完了までの流れを時系列で表した図です。 
</p>
<p>
<a href="assets/images/tec/uml/netshop_flow.png" onclick="window.open('/assets/images/tec/uml/netshop_flow.png','netshop_flow','scrollbars=yes,resizable=yes,status=yes');return false;"><img alt=" " border="0" height="756" src="assets/images/tec/uml/netshop_flow_520.gif" width="520" /></a> 
</p>
 ]]></description>
<pubDate>25-10·î-07 23:19</pubDate>
<guid>http://www.tonttu.net/tec/uml/netshop_flow.html</guid>
<author>クラウス</author>
</item>
<item>
<title>ネットショップの一般的な構成</title>
<link>http://www.tonttu.net/tec/uml/netshop_class.html</link>
<description><![CDATA[ <p>
ネットショップの一般的な構成をUMLにしてみました。<br />
商品選択＞詳細画面＞カート＞配送・支払方法＞確認＞完了など、楽天やアマゾンでも変わりはありません。<br />
バックエンドでは、商品管理・お客様情報・注文管理などがあります。 
</p>
<p>
<a href="assets/images/tec/uml/netshop_class.png" onclick="window.open('netshop_class','','scrollbars=yes,resizable=yes,status=yes');return false;" target="_blank"><img alt=" " border="0" height="596" src="assets/images/tec/uml/netshop_class_520.gif" width="520" /></a>&nbsp; 
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>25-10·î-07 23:11</pubDate>
<guid>http://www.tonttu.net/tec/uml/netshop_class.html</guid>
<author>クラウス</author>
</item>
<item>
<title>UML</title>
<link>http://www.tonttu.net/tec/uml.html</link>
<description><![CDATA[ <p>
UMLは「汎用モデリング言語」です。<br />
世の中のさまざまなもののシステムや流れなどを図にします。目で見てわかりやすいのが特徴です。<br />
世界的な規約ですので、読み方を知っていればワークグループ作業において誤解を少なくすることができます。<br />
TONTTU.NETではコンサルティングからレポーティング、仕様書やご提案などに活用しています。&nbsp; 
</p>
<p>
<ul><li><a href="/tec/uml/netshop_class.html" title="ネットショップの一般的な構成" >ネットショップの一般的な構成</a></li>
<li><a href="/tec/uml/netshop_flow.html" title="ネットショップの流れ" >ネットショップの流れ</a></li>

</ul>&nbsp; 
</p>
 ]]></description>
<pubDate>25-10·î-07 23:03</pubDate>
<guid>http://www.tonttu.net/tec/uml.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Ext.grid.EditorGridで表形式編集_3</title>
<link>http://www.tonttu.net/tec/85/89.html</link>
<description><![CDATA[ <p>
編集したデータを保存します。<br />
表の中のデータは、Ext.data.Storeの中の「data」プロパティに存在します。<br />
.getModifiedRecords()メソッドで、更新されたレコードのみを得ることができます。<br />
この中の各レコードををjqueryの$.eachでループしながら$.postを使って非同期にアップデートします。<br />
<br />
ツールバーを作成して、追加、保存、再読込みのボタンと関数を定義します。<br />
ds.load();の前に次のコードを記述します。 
</p>
<p>
&nbsp;// ツールバー追加<br />
&nbsp;var gridHead = grid.getView().getHeaderPanel(true);<br />
&nbsp;var tb = new Ext.Toolbar(gridHead, <br />
&nbsp;[<br />
&nbsp;&nbsp;{text: &#39;商品追加&#39;,<br />
&nbsp;&nbsp;handler : function(){<br />
&nbsp;&nbsp;&nbsp;var itm = new Item({<br />
&nbsp;&nbsp;&nbsp;&nbsp;id: &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;title: &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;comment: &#39;&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;categorye_id: &#39;1&#39;,<br />
（中略、、、）<br />
&nbsp;&nbsp;&nbsp;&nbsp;minimum: 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;visible: 0<br />
&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;grid.stopEditing();<br />
&nbsp;&nbsp;&nbsp;ds.insert(0, itm);<br />
&nbsp;&nbsp;&nbsp;grid.startEditing(0, 0);<br />
&nbsp;&nbsp;}},<br />
&nbsp;&nbsp;{text: &#39;保存する&#39;,<br />
&nbsp;&nbsp;handler : function(){<br />
&nbsp;&nbsp;&nbsp;displayInfoClear();<br />
&nbsp;&nbsp;&nbsp;//更新データのみ取得する<br />
&nbsp;&nbsp;&nbsp;var mrs = ds.getModifiedRecords();<br />
&nbsp;&nbsp;&nbsp;$.each(mrs, function(i) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//AJAXでPOSTする<br />
&nbsp;&nbsp;&nbsp;&nbsp;$.post(&quot;/items/ajaxpost/&quot;,&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;data[Item][id]&#39;: this.data.id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;data[Item][title]&#39;: this.data.title,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;data[Item][comment]&#39;: this.data.comment,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;data[Item][categorye_id]&#39;: this.data.categorye_id,<br />
（中略、、、）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;data[Item][minimum]&#39;: this.data.minimum,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;data[Item][visible]&#39;: this.data.visible<br />
&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;displayInfo);<br />
&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;ds.reload();<br />
&nbsp;&nbsp;}},<br />
&nbsp;&nbsp;{text: &#39;再読込み&#39;,<br />
&nbsp;&nbsp;handler : function(){<br />
&nbsp;&nbsp;&nbsp;ds.reload();<br />
&nbsp;&nbsp;}}<br />
&nbsp;]<br />
&nbsp;);&nbsp; 
</p>
<p>
javascriptで以下の関数を追加します。&nbsp; 
</p>
<p>
//更新ステータスを表示する<br />
function displayInfo(data) {<br />
&nbsp;$(&quot;#postinfo&quot;).html($(&quot;#postinfo&quot;).html() + &quot;&lt;br /&gt;&quot; + data);<br />
}<br />
//更新ステータス表示を消去する<br />
function displayInfoClear() {<br />
&nbsp;$(&quot;#postinfo&quot;).html(&quot;&quot;);<br />
}&nbsp; 
</p>
<p>
cakePHP側のコントローラーに以下のメソッドを作成します。&nbsp; 
</p>
<p>
&nbsp;//表形式編集保存 -----------------------------------------------<br />
&nbsp; function ajaxpost() {<br />
&nbsp;&nbsp;if(!empty($this-&gt;data)) {<br />
&nbsp;&nbsp;&nbsp;if ($this-&gt;Item-&gt;save($this-&gt;data)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;Id=&quot;.$this-&gt;data[&quot;Item&quot;][&quot;id&quot;].&quot;保存しました&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;exit();<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;Id=&quot;.$this-&gt;data[&quot;Item&quot;][&quot;id&quot;].&quot;保存できませんでした&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;exit();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;exit();<br />
&nbsp; } 
</p>
<p>
&#39;data[Item][title]&#39;: this.data.title,<br />
がフォーム部品のname属性とvalue属性に相当します。<br />
cakePHPではこのnameフォーマットで送ると、<br />
$this-&gt;Item-&gt;save($this-&gt;data)<br />
だけで更新とバリデーション（データ検証）を行ってくれます。<br />
新規追加されたレコードにはidがないので、自動的にInsetをしてくれます。<br />
成功したら「保存しました」と返されるので、displayInfo(data)関数で表示します。<br />
この一連の更新作業は各レコードごとに非同期で行われます。 
</p>
<p>
再読込みするには、Ext.data.Store.reload()とするだけです。 
</p>
 ]]></description>
<pubDate>21-10·î-07 22:26</pubDate>
<guid>http://www.tonttu.net/tec/85/89.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Ext.grid.EditorGridで表形式編集_2</title>
<link>http://www.tonttu.net/tec/85/88.html</link>
<description><![CDATA[ <p>
Ext.grid.EditorGridを利用して表を表示します。<br />
前準備として、<a href="tec/cakePHP/87.html">webservicesでjsonデータを出力する</a>ができるようにcakePHPを構築しておいてください. 
</p>
<p>
ExtライブラリとjqueryAjaxライブラリを読み込みます。（app/webroot/js/extに置いています） 
</p>
<p>
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/ext/adapter/jquery/jquery.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/ext/adapter/jquery/jquery-plugins.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/ext/adapter/jquery/ext-jquery-adapter.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/ext/ext-all.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/ext/source/locale/ext-lang-ja.js&quot;&gt;&lt;/script&gt;<br />
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/js/ext/resources/css/ext-all.css&quot;&gt; 
</p>
<p>
Ext.grid.EditorGridの表示にはいくつかのクラスを必要とします。<br />
Ext.grid.ColumnModel　：　カラム（列）の設定。列名、幅、表示フォーマットなど。<br />
Ext.form　：　セレクト等の編集コンポーネント<br />
Ext.data.Record.create　：　各レコードのフィールドと対応するデータフィールド、各フィールドのデータ型など。<br />
Ext.data.Store　：　データを保持するオブジェクト。Ajaxで読み込むURLやxml,Jsonの解析設定など。<br />
Ext.Toolbar　：　今回は新規追加や保存するなどのボタンをツールバーに実装します。 
</p>
<p>
&lt;script type=&quot;text/javascript&quot;&gt;<br />
&lt;!--<br />
//ロード完了後実行（jquery使用）<br />
$(function() {<br />
&nbsp;Ext.QuickTips.init(); 
</p>
<p>
&nbsp;//Bool型の表示フォーマット<br />
&nbsp;function formatBoolean(value){<br />
&nbsp;&nbsp;return value ? &#39;1&#39; : &#39;0&#39;;<br />
&nbsp;}; 
</p>
<p>
&nbsp;var fm = Ext.form; //フォーム部品を使用する<br />
&nbsp;var Ed = Ext.grid.GridEditor; //EditorGridを使用する 
</p>
<p>
&nbsp;//カラムモデル<br />
&nbsp;var cm = new Ext.grid.ColumnModel(<br />
&nbsp;[<br />
&nbsp;&nbsp;{header: &#39;ID&#39;, width: 32, dataIndex: &#39;id&#39;},<br />
&nbsp;&nbsp;{header: &#39;商品名&#39;, width: 160, dataIndex: &#39;title&#39;,<br />
&nbsp;&nbsp;&nbsp;editor: new Ed(new fm.TextField({allowBlank: false}))<br />
&nbsp;&nbsp;},<br />
&nbsp;&nbsp;{header: &#39;備考&#39;, width: 120, dataIndex: &#39;comment&#39;,<br />
&nbsp;&nbsp;&nbsp;editor: new Ed(new fm.TextField())<br />
&nbsp;&nbsp;},<br />
&nbsp;&nbsp;{header: &#39;カテゴリー&#39;, width: 120, dataIndex: &#39;categorye_id&#39;,<br />
&nbsp;&nbsp;&nbsp;editor: new Ed(new Ext.form.ComboBox({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; triggerAction: &#39;all&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transform:&#39;categoryes&#39;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; forceSelection:true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;editable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;lazyRender:true<br />
&nbsp;&nbsp;&nbsp;}))<br />
&nbsp;&nbsp;},<br />
（中略、、、）<br />
&nbsp;&nbsp;{header: &#39;ロット&#39;, width: 42, dataIndex: &#39;minimum&#39;,<br />
&nbsp;&nbsp;&nbsp;editor: new Ed(new fm.NumberField({<br />
&nbsp;&nbsp;&nbsp;allowBlank: false,<br />
&nbsp;&nbsp;&nbsp;allowDecimals : false,<br />
&nbsp;&nbsp;&nbsp;allowNegative: false<br />
&nbsp;&nbsp;&nbsp;}))<br />
&nbsp;&nbsp;},<br />
&nbsp;&nbsp;{header: &#39;有効&#39;, width: 42, dataIndex: &#39;visible&#39;,<br />
&nbsp;&nbsp;&nbsp;renderer: formatBoolean,<br />
&nbsp;&nbsp;&nbsp;editor: new Ed(new fm.Checkbox())<br />
&nbsp;&nbsp;}<br />
&nbsp;]);<br />
&nbsp;cm.defaultSortable = true; 
</p>
<p>
&nbsp;//レコードモデル<br />
&nbsp;var Item = Ext.data.Record.create(<br />
&nbsp;[<br />
&nbsp;&nbsp;{name: &#39;id&#39;},<br />
&nbsp;&nbsp;{name: &#39;title&#39;, type: &#39;string&#39;},<br />
&nbsp;&nbsp;{name: &#39;comment&#39;, type: &#39;string&#39;},<br />
&nbsp;&nbsp;{name: &#39;categorye_id&#39;, type: &#39;int&#39;},<br />
（中略、、、）<br />
&nbsp;&nbsp;{name: &#39;minimum&#39;, type: &#39;int&#39;},<br />
&nbsp;&nbsp;{name: &#39;visible&#39;, type: &#39;bool&#39;}<br />
&nbsp;]) 
</p>
<p>
&nbsp;//データストア<br />
&nbsp;var ds = new Ext.data.Store({<br />
&nbsp;&nbsp;//データストアにAjaxでJSONを読み込む<br />
&nbsp;&nbsp;proxy:&nbsp; new Ext.data.HttpProxy(<br />
&nbsp;&nbsp;&nbsp;{url: &#39;http://（サーバーアドレス）/json/items/index/&#39;}<br />
&nbsp;&nbsp;),<br />
&nbsp;&nbsp;reader: new Ext.data.JsonReader(<br />
&nbsp;&nbsp;&nbsp;{id: &#39;id&#39;, root: &#39;Item&#39;}, Item)<br />
&nbsp;}); 
</p>
<p>
&nbsp;//グリッド<br />
&nbsp;var grid = new Ext.grid.EditorGrid(<br />
&nbsp;&nbsp;&#39;gridDrow&#39;,<br />
&nbsp;&nbsp;{ds: ds, cm: cm, enableColLock:false}<br />
&nbsp;);<br />
&nbsp;grid.render(); //グリッドの描画 
</p>
<p>
&nbsp;ds.load(); //データ生成の開始<br />
});<br />
//--&gt;<br />
&lt;/script&gt; 
</p>
<p>
&lt;div style=&quot;margin: 0px; padding: 0px; border:1px solid #bbb&quot;&gt;<br />
&lt;div id=&quot;gridDrow&quot; style=&quot;overflow:hidden;width:800px&quot;&gt;<br />
The grid will be placed here.<br />
&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;br /&gt;<br />
&lt;div id=&quot;postinfo&quot; style=&quot;background-color: #ffe;&quot;&gt;&lt;/div&gt; 
</p>
<p>
&lt;select name=&quot;categoryes&quot; id=&quot;categoryes&quot; style=&quot;display: none;&quot;&gt;<br />
&lt;{html_options options=$categoryelists}&gt;<br />
&lt;/select&gt; 
</p>
 ]]></description>
<pubDate>21-10·î-07 22:17</pubDate>
<guid>http://www.tonttu.net/tec/85/88.html</guid>
<author>クラウス</author>
</item>
<item>
<title>webservicesでjsonデータを出力する</title>
<link>http://www.tonttu.net/tec/cakePHP/87.html</link>
<description><![CDATA[ <p>
cakePHPでwebservicesを使うと、ホームページ用にヘッダーやメニューなどのテーマで飾られたページとは別に、rssやxmlなどの生データを出力することができます。 
</p>
<p>
JSON形式はJavascriptのオブジェクト、配列の生データの形式で、よく使われるXMLなどの形式より、javascriptでしか使われることがないと確定している場合には、変換などの必要がなく取扱いが容易になります。&nbsp; 
</p>
<p>
cakePHPではあらかじめ、rest,rss,soap,xml,xmlrpcの各形式に対応していますが、JSONに対応させるためには多少の手間が必要です。（また他のやり方も存在します）<br />
１./cake/libs/router.phpの152行目あたりに、<br />
$this-&gt;connect(&#39;/json/:controller/:action/*&#39;, array(&#39;webservices&#39; =&gt; &#39;Json&#39;));<br />
を追加します。<br />
２．<br />
app/controllers/components/json.phpにコントローラーを配置（空でよい）<br />
app/views/helpers/json.phpにヘルパーを配置（空でよい）<br />
app/views/layouts/json/にレイアウトを配置（&lt;{$content_for_layout}&gt;だけでよい）<br />
app/views/(コントローラー名)/json/にアクション名のテンプレートを配置 
</p>
<p>
たとえば商品一覧をテーブルで表示するページのアドレスは、<br />
/items/index/<br />
となりますが、webservicesでは、<br />
/rss/items/index/<br />
というアドレスになります。 
</p>
<p>
商品マスタテーブル「items」のデータを、<br />
$this-&gt;set(&#39;items&#39;, $this-&gt;Item-&gt;findAll());<br />
で渡されたテンプレート(smartyを使用)の例は以下です 
</p>
<p>
{&quot;Item&quot;: [<br />
&lt;{foreach from=$items item=data name=itmloop}&gt;<br />
{&quot;id&quot;:&lt;{$data.Item.id}&gt;, <br />
&quot;title&quot;:&quot;&lt;{$data.Item.title}&gt;&quot;, <br />
&quot;categorye_id&quot;:&lt;{$data.Item.categorye_id}&gt;, <br />
&quot;comment&quot;:&quot;&lt;{$data.Item.comment}&gt;&quot;, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （中略,,,）<br />
&quot;visible&quot;:&lt;{$data.Item.visible}&gt;, <br />
&quot;modified&quot;:&quot;&lt;{$data.Item.modified}&gt;&quot;}<br />
&lt;{if !$smarty.foreach.itmloop.last }&gt;<br />
,<br />
&lt;{/if}&gt;<br />
&lt;{/foreach}&gt;<br />
]} 
</p>
 ]]></description>
<pubDate>21-10·î-07 20:26</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/87.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Ext.grid.EditorGridで表形式編集_1</title>
<link>http://www.tonttu.net/tec/85/86.html</link>
<description><![CDATA[ <p>
Extの代表的なウィジィット（機能コンポーネント）はGridです。<br />
Gridを使うと、従来テーブルで表現されてきた表が、エクセルのような列の入れ替え、幅の調整、ソートなどを行えるようになります。<br />
EditorGridでは表示だけではなく、セルに対して編集ができます。数値のみに限定したり、金額表示や日付に対してはミニカレンダーからの入力も行えます。 <br />
（サンプルやネットでは表示のさせかたまでは調べることができましたが、今回は編集結果のデータベースへの反映までを解説します。<br />
ただし解説の手間をはぶくため、jqueryAjaxライブラリとcakePHPWebアプリケーションフレームワークを併用させていただきます。 ） 
</p>
<p>
おおまかな手順としては、<br />
１．cakePHPで配列にデータ取得、Webservicesとしてjson形式で出力できるようにしておく<br />
２．ページ表示。jsonデータを取得してExt.grid.EditorGridを構築。<br />
３．編集したデータをデータストアExt.data.Store.getModifiedRecords()から取得<br />
４．jqueryの$.eachで各行のデータをループしながらAjaxPOST送信する。<br />
となります。 
</p>
<p>
<img alt=" " height="266" src="assets/images/tec/EditGrid_01.gif" width="481" />&nbsp; 
</p>
<p>
ほとんどのネットショップの管理画面での商品情報の更新は、商品一覧画面-＞各商品詳細画面-＞各商品更新となりますが、<br />
このExt.grid.EditorGridとAjax技術を使うと、エクセルを扱うように一覧画面から直接複数商品の設定をすることができます。 
</p>
 ]]></description>
<pubDate>21-10·î-07 19:48</pubDate>
<guid>http://www.tonttu.net/tec/85/86.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Ext</title>
<link>http://www.tonttu.net/tec/85.html</link>
<description><![CDATA[ <p>
Extは「AjaxGUIライブラリ」です。<br />
GUIとはメニューやボタンなどの手にふれるユーザーインターフェースのことです。Extは高機能とその表示の美しさに定評があります。<br />
AjaxGUIライブラリを使うことで、ホームページ上でワープロソフトなどの高機能な操作性を実現することができます。&nbsp; 
</p>
<p>
<ul><li><a href="/tec/85/86.html" title="Ext.grid.EditorGridで表形式編集_1" >Ext.grid.EditorGridで表形式編集_1</a></li>
<li><a href="/tec/85/88.html" title="Ext.grid.EditorGridで表形式編集_2" >Ext.grid.EditorGridで表形式編集_2</a></li>
<li><a href="/tec/85/89.html" title="Ext.grid.EditorGridで表形式編集_3" >Ext.grid.EditorGridで表形式編集_3</a></li>
<li><a href="/tec/85/100.html" title="Ext.grid.EditorGridで表形式編集2" >Ext.grid.EditorGridで表形式編集2</a></li>

</ul>&nbsp;&nbsp; 
</p>
 ]]></description>
<pubDate>21-10·î-07 19:30</pubDate>
<guid>http://www.tonttu.net/tec/85.html</guid>
<author>クラウス</author>
</item>
<item>
<title>hasAndBelongsToMany以下の配列</title>
<link>http://www.tonttu.net/tec/cakePHP/84.html</link>
<description><![CDATA[ <p>
cakePHPはモデルにアソシエーションを設定すると、子や親のリレーション関係にあるデータも自動的に持ってきてくれるので便利です。<br />
<em><font face="Courier New">$recursive設定で、階層数やとってこないようにすることもできます。</font></em>
</p>
<p>
しかし、hasAndBelongsToManyの場合は、とっては来るのですが、それをキーで囲まないため、「id」「title」と同じ並びに0,1,2と並んでしまいます。
</p>
<p>
cake/libs/model/datasources/dbo_source.phpの845行目あたり、
</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;foreach ($merge as $i =&gt; $row) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (count($row) == 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[$association][] = $row[$association];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmp = array_merge($row[$association], $row);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($tmp[$association]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[$association][] = $tmp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}
</p>
<p>
を、
</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;foreach ($merge as $i =&gt; $row) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (count($row) == 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[$association][&#39;HABTM&#39;][] = $row[$association]; //&lt;&lt;&lt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmp = array_merge($row[$association], $row);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($tmp[$association]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[$association][&#39;HABTM&#39;][] = $tmp; //&lt;&lt;&lt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}
</p>
<p>
とすると、[HABTM]=array(,,,)と囲まれます。&nbsp;
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>08-10·î-07 21:46</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/84.html</guid>
<author>クラウス</author>
</item>
<item>
<title>hasAndBelongsToManyでINNER JOIN</title>
<link>http://www.tonttu.net/tec/cakePHP/INNERJOINbyHABTM.html</link>
<description><![CDATA[ <p>
このハックが適切かどうかわかりませんので、自己責任で、、。
</p>
<p>
「hasAndBelongsToMany」アソシエーションがうまく動作しないのでSQｌを調べてみると、ただの「JOIN」となっていました。<br />
これを「INNER JOIN」に変えたい場合は、&nbsp;
</p>
<p>
cake/libs/model/datasources/dbo_source.php<br />
の1107行目あたりに、<br />
&#39;type&#39; =&gt; &quot;INNER&quot;,<br />
を追加します。
</p>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>07-10·î-07 00:51</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP/INNERJOINbyHABTM.html</guid>
<author>クラウス</author>
</item>
<item>
<title>リンクにサムネイル画像を</title>
<link>http://www.tonttu.net/tec/tec_web/tec_web_thmbnail.html</link>
<description><![CDATA[ <p>
リンク先のサイトは実際に訪れてみるまではわかりませんが、これを（プレビュー）あらかじめ表示してしまおうとするのを「リンク先サムネイル」といいます。<br />
ユーザーにとっては、事前にリンク先の様子を知ることができます。 
</p>
<p>
リンク先サムネイルの実現方法には、<br />
・リンクの脇に画像を表示しておく<br />
・ポップアップ形式で表示する&nbsp;<br />
などの方法があります。前者は自分でリンク先ページをキャプチャーして貼っておくことでもできますが、メンテナンスが面倒ですね。 
</p>
<p>
ここでは「snap」をご紹介します。&nbsp;<br />
<a href="http://www.snap.com/about/shots_central.php?pageview_logged=1&amp;lang=ja-jp">http://www.snap.com/about/shots_central.php?pageview_logged=1&amp;lang=ja-jp</a> 
</p>
<p>
登録が必要ですが、いくつかの質問に答えた後表示されるJavascriptをリンク集のページに貼り付けておくだけです。<br />
このサイトでは<a href="aboutus/link.html" target="_blank">リンク集</a>のページで使用しています。<br />
すぐにお感じになると思いますが、けっこううっとおしいかもしれません＾＾） 
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>25- 9·î-07 17:09</pubDate>
<guid>http://www.tonttu.net/tec/tec_web/tec_web_thmbnail.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Web</title>
<link>http://www.tonttu.net/tec/tec_web.html</link>
<description><![CDATA[ <p>
インターネットでは様々な技術が日々登場しています。<br />
そのいくつかをご紹介します。 
</p>
<p>
<ul>
</ul> 
</p>
 ]]></description>
<pubDate>25- 9·î-07 17:01</pubDate>
<guid>http://www.tonttu.net/tec/tec_web.html</guid>
<author>クラウス</author>
</item>
<item>
<title>サムネイル画像が表示されない</title>
<link>http://www.tonttu.net/tec/modx/modx_NoThumbnail.html</link>
<description><![CDATA[ <p>
MODXの管理画面で、ページ編集を行う場合、TinyMCEエディーターから画像の選択やアップロード、フォルダの生成が行えます。<br />
リストには96X96のサイズのサムネイル(縮小)画像が表示されるのでたいへんわかりやすいです。<br />
この動作にはMCPUKというライブラリが使われています。 
</p>
<p>
たいていのサーバーでは問題ないのですが、WebarenaのSuite2プランではサムネイル画像の生成ができませんでした。<br />
サムネイル画像がない場合は、ファイルタイプを表す代替のアイコンが表示されますが、それもおかしいです。 
</p>
<p>
調べてみると、サムネイル画像を準備する関数「imagecreatetruecolor」をサポートしていないようです。<br />
この関数は、画像生成ライブラリGDが入っていても、GD２ライブラリがないと動作しないとか、、。&nbsp;
</p>
<p>
manager/media/browser/mcpuk/connectors/php/Commands/Thumbnail.php<br />
の221行目あたりを修正します。<br />
//&nbsp;&nbsp;$thumb=imagecreatetruecolor(96,96);<br />
if (function_exists(&quot;imagecreatetruecolor&quot;)) {<br />
&nbsp;$thumb=imagecreatetruecolor(96,96);<br />
} else {<br />
&nbsp;$thumb=imagecreate(96,96);<br />
}
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>24- 9·î-07 17:26</pubDate>
<guid>http://www.tonttu.net/tec/modx/modx_NoThumbnail.html</guid>
<author>クラウス</author>
</item>
<item>
<title>テーマ集</title>
<link>http://www.tonttu.net/tec/tec_wordpress/79.html</link>
<description><![CDATA[ <p>
wordpressのテーマがたくさん掲載されています。
</p>
<p>
<a href="http://themes.wordpress.net/" target="_blank">ThemeViewer</a>
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>17- 9·î-07 20:02</pubDate>
<guid>http://www.tonttu.net/tec/tec_wordpress/79.html</guid>
<author>クラウス</author>
</item>
<item>
<title>wordpress</title>
<link>http://www.tonttu.net/tec/tec_wordpress.html</link>
<description><![CDATA[ <p>
wordpress（ワードプレス）はサーバーインストール型のブログソフトです。<br />
日記形式のコンテンツ以外にも、「ページ」機能によって普通のホームページのようなページを作ることができます。 
</p>
<p>
 
</p>
 ]]></description>
<pubDate>17- 9·î-07 20:00</pubDate>
<guid>http://www.tonttu.net/tec/tec_wordpress.html</guid>
<author>クラウス</author>
</item>
<item>
<title>マネージャーユーザー毎に画像フォルダを分ける</title>
<link>http://www.tonttu.net/tec/modx/modx_userimage.html</link>
<description><![CDATA[ <p>
マネージャーユーザーとは、管理画面に入ることのできるユーザーです。<br />
（管理画面に入らず会員制のホームページにパスワードを使って入ることのできるユーザーはウェブユーザーといいます） 
</p>
<p>
&nbsp;
</p>
<p>
Modxで画像を選択したり、アップロード、削除するにはファイルブラウザダイアログを使用します。<br />
ファイルブラウザには独自の設定ファイルがあります。<br />
/manager/media/browser/mcpuk/connectors/php/config.php<br />
内の約107行目、<br />
$fckphp_config[&#39;UserFilesPath&#39;] = &quot;&quot;;<br />
を、<br />
$fckphp_config[&#39;UserFilesPath&#39;] = &quot;/users/&quot;.$user_id;<br />
とします。<br />
/assetsフォルダ内に「users」フォルダを作り、その中に「1」「2」「3」等の数字のフォルダを作ります。<br />
（これが$user_id（ユーザーid）に相当します）<br />
さらにその中に「images」フォルダを作成しておきます。 
</p>
<p>
&nbsp;
</p>
<p>
以下未確認ですが、画像編集機能も使う場合、<br />
/manager/media/ImageEditor/config.inc.php<br />
内の約51行目、<br />
$IMConfig[&#39;base_dir&#39;] = $rb_base_dir;<br />
を、<br />
$IMConfig[&#39;base_dir&#39;] = $rb_base_dir.&quot;/users/&quot;.$user_id;<br />
に、約61行目、<br />
$IMConfig[&#39;base_url&#39;] = $rb_base_url;<br />
を、<br />
$IMConfig[&#39;base_url&#39;] = $rb_base_url.&quot;/users/&quot;.$user_id;<br />
とします。 
</p>
 ]]></description>
<pubDate>12- 9·î-07 22:56</pubDate>
<guid>http://www.tonttu.net/tec/modx/modx_userimage.html</guid>
<author>クラウス</author>
</item>
<item>
<title>セカンドライフ参入支援</title>
<link>http://www.tonttu.net/service/secondlife.html</link>
<description><![CDATA[ 話題のバーチャルワールドで新たなビジネスチャンスを
狙うお手伝いをします  ]]></description>
<pubDate>10- 9·î-07 23:59</pubDate>
<guid>http://www.tonttu.net/service/secondlife.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Dittoのチャンクでテンプレート変数を使う</title>
<link>http://www.tonttu.net/tec/modx/modx_TV2ditto.html</link>
<description><![CDATA[ <p>
Dittoはあるフォルダ内のドキュメントを一覧してブログ風な表示を行えます。RSS出力にも使えます。<br />
一覧での各ドキュメントはチャンクをテンプレートとして使い、さまざまな表示のカスタマイズを行うことができます。<br />
テンプレート変数は、各ドキュメントに決められたフォーマットとしての入力項目を追加することができます。商品価格やメーカー名などに使うと便利です。<br />
ページタイトルやサマリーや本文はDittoのチャンクでテンプレート変数を使うなどで置き換えることができます。<br />
テンプレート変数はと、「tv」を変数名の前につける必要があります。
</p>
<p>
というテンプレート変数があった場合は、とチャンクに記します。&nbsp;
</p>
<p>
&nbsp;
</p>
 ]]></description>
<pubDate>10- 9·î-07 22:06</pubDate>
<guid>http://www.tonttu.net/tec/modx/modx_TV2ditto.html</guid>
<author>クラウス</author>
</item>
<item>
<title>tinuMCE使用時にエラーが出る場合</title>
<link>http://www.tonttu.net/tec/modx/titnyMCE_Error.html</link>
<description><![CDATA[ <p>
assets/plugins/tinymce/jscripts/tiny_mce/plugins/insertdatetime/langs/ja_utf-8.js<br />
で、<br />
&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;,<br />
となっているべきはずの箇所が<br />
&quot;1月&quot;, &quot;2月, &quot;3月&quot;,<br />
と「&quot;」が抜けていることがあるので修正してアップします。。<br />
複数個所あるので注意。 
</p>
<p>
inserttime_months_long : new Array(&quot;1月&quot;, &quot;2月, &quot;3月&quot;, &quot;4月&quot;, &quot;5月, &quot;6月&quot;, &quot;7月&quot;, &quot;8月&quot;, &quot;9月&quot;, &quot;10月&quot;, &quot;11月&quot;, &quot;12月&quot;),<br />
inserttime_months_short : new Array(&quot;1月&quot;, &quot;2月, &quot;3月&quot;, &quot;4月&quot;, &quot;5月, &quot;6月&quot;, &quot;7月&quot;, &quot;8月&quot;, &quot;9月&quot;, &quot;10月&quot;, &quot;11月&quot;, &quot;12月&quot;),<br />
inserttime_day_long : new Array(&quot;日曜日&quot;, &quot;月曜日, &quot;火曜日&quot;, &quot;水曜日&quot;, &quot;木曜日&quot;, &quot;金曜日&quot;, &quot;土曜日&quot;, &quot;日曜日&quot;),
</p>
<p>
を、
</p>
<p>
inserttime_months_long : new Array(&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;, &quot;4月&quot;, &quot;5月&quot;, &quot;6月&quot;, &quot;7月&quot;, &quot;8月&quot;, &quot;9月&quot;, &quot;10月&quot;, &quot;11月&quot;, &quot;12月&quot;),<br />
inserttime_months_short : new Array(&quot;1月&quot;, &quot;2月&quot;, &quot;3月&quot;, &quot;4月&quot;, &quot;5月&quot;, &quot;6月&quot;, &quot;7月&quot;, &quot;8月&quot;, &quot;9月&quot;, &quot;10月&quot;, &quot;11月&quot;, &quot;12月&quot;),<br />
inserttime_day_long : new Array(&quot;日曜日&quot;, &quot;月曜日&quot;, &quot;火曜日&quot;, &quot;水曜日&quot;, &quot;木曜日&quot;, &quot;金曜日&quot;, &quot;土曜日&quot;, &quot;日曜日&quot;),
</p>
<p>
とします。
</p>
 ]]></description>
<pubDate>09- 9·î-07 10:16</pubDate>
<guid>http://www.tonttu.net/tec/modx/titnyMCE_Error.html</guid>
<author>クラウス</author>
</item>
<item>
<title>smarty</title>
<link>http://www.tonttu.net/tec/smarty.html</link>
<description><![CDATA[ <p>
smartyは「テンプレートエンジン」です。<br />
Webアプリケーションはプログラムですが、その出力はただのホームページと同じです。<br />
テンプレートエンジンを使うことによって、プログラムは生のデータを扱い、表示はテンプレートに担当させることができます。<br />
たとえば、商品価格の表示は人間にとっては「￥30,000円」となるのが見やすいですが、プログラム内部での生のデータは「30000」のままのほうがあつかいやすくなります。smartyではテンプレートに 
</p>
<p>
￥{￥price|number_format}円 
</p>
<p>
と記述します。そのほかにも繰り返し処理やif分岐なども扱うことができ、XSS等のセキュリティ対策にも強くなります。<br />
テンプレートエンジンを使うことによって、プログラムとデザインの分離が実現され、分業やメンテナンスが容易になります。 
</p>
<p>
&nbsp;
</p>
<p>
 
</p>
 ]]></description>
<pubDate>09- 9·î-07 09:58</pubDate>
<guid>http://www.tonttu.net/tec/smarty.html</guid>
<author>クラウス</author>
</item>
<item>
<title>jquery</title>
<link>http://www.tonttu.net/tec/jquery.html</link>
<description><![CDATA[ <p>
jqueryは「Ajaxライブラリ」です。<br />
元来ホームページは大学間などでの文書公開および共有の仕組みとして生まれました。<br />
一方、掲示板などのデータ操作のインターフェースとしてもホームページは機能します（CGIといいます）。<br />
CGIはサーバー側でプログラムが動作するのに対し、ユーザーのブラウザ上でもスクリプトというプログラムを動作させることができます。簡単なものは時計の表示などです。 
</p>
<p>
このスクリプト技術を展開させたものがAjax（エージャックス）です。Ajaxが注目されたのはGoogleMapです。GoogleMapでは世界地図がなめらかにスクロールし、拡大縮小し、地点マーカーを付けてメモを付けることもできます。任意の地図画像は非同期でサーバーから取得します。<br />
これからはワープロや表計算のような高度なソフトもネットで使えるようになっていきます。<br />
Ajaxライブラリはそれを実現するために便利な機能を提供します。 
</p>
<p>
&nbsp;
</p>
<p>
 
</p>
 ]]></description>
<pubDate>09- 9·î-07 09:58</pubDate>
<guid>http://www.tonttu.net/tec/jquery.html</guid>
<author>クラウス</author>
</item>
<item>
<title>cakePHP</title>
<link>http://www.tonttu.net/tec/cakePHP.html</link>
<description><![CDATA[ <p>
cakePHPは「Webアプリケーションフレームワーク」です。<br />
フレームワークとは「半完成キット」のようなもので、必要なものが「ほぼ」「お膳立て」されています。<br />
家に例えると、たいていの家では玄関・台所・トイレ・寝室があるものでしょう。０から測量をし、土台を固め、柱を立てていっても家は作れますが、半完成状態の建売りがあれば後はお好みの壁紙にしたり照明を付けるだけです。<br />
WebアプリケーションではDBアクセス・管理画面・ログイン・セキュリティ対策などが組み込まれています。<br />
フレームワークを使うことで、開発効率や運用メンテナンスがぐっと容易になります。 
</p>
<p>
<ul><li><a href="/tec/cakePHP/INNERJOINbyHABTM.html" title="hasAndBelongsToManyでINNER JOIN" >hasAndBelongsToManyでINNER JOIN</a></li>
<li><a href="/tec/cakePHP/84.html" title="hasAndBelongsToMany以下の配列" >hasAndBelongsToMany以下の配列</a></li>
<li><a href="/tec/cakePHP/87.html" title="webservicesでjsonデータを出力する" >webservicesでjsonデータを出力する</a></li>
<li><a href="/tec/cakePHP/RESTfulIndex.html" title="cakePHP1.2でRESTfulなindex" >cakePHP1.2でRESTfulなindex</a></li>
<li><a href="/tec/cakePHP/useMySQL3.html" title="cakePHP1.2でMySQL3を使いたい" >cakePHP1.2でMySQL3を使いたい</a></li>
<li><a href="/tec/cakePHP/PEAR-XML.html" title="cakePHP1.2とPEAR:XMLでXML出力" >cakePHP1.2とPEAR:XMLでXML出力</a></li>
<li><a href="/tec/cakePHP/cakePHP12_2_BASIC.html" title="cakePHP1.2でBasic認証" >cakePHP1.2でBasic認証</a></li>
<li><a href="/tec/cakePHP/cakePHP-RESTful-PUT.html" title="cakePHP1.2でRESTfulなPUTでEDIT" >cakePHP1.2でRESTfulなPUTでEDIT</a></li>
<li><a href="/tec/cakePHP/cakePHPsmartyCache.html" title="cakePHP+smartyでキャッシュを効かせる" >cakePHP+smartyでキャッシュを効かせる</a></li>
<li><a href="/tec/cakePHP/cakePHP_mobile.html" title="cakePHP1.2で携帯用" >cakePHP1.2で携帯用</a></li>

</ul> 
</p>
 ]]></description>
<pubDate>09- 9·î-07 09:57</pubDate>
<guid>http://www.tonttu.net/tec/cakePHP.html</guid>
<author>クラウス</author>
</item>
<item>
<title>セカンドライフ</title>
<link>http://www.tonttu.net/tec/secondlife.html</link>
<description><![CDATA[  ]]></description>
<pubDate>09- 9·î-07 09:57</pubDate>
<guid>http://www.tonttu.net/tec/secondlife.html</guid>
<author>クラウス</author>
</item>
<item>
<title>テクノロジー</title>
<link>http://www.tonttu.net/tec.html</link>
<description><![CDATA[ <p>
TONTTU.NETでは、インターネット技術に対しての研究開発に力を入れております。 <br />
どんな技術が注目されているかアンテナを張ることに加え、その技術そのものを扱えるようにしていきます。 
</p>
<p>
<img alt=" " height="290" src="assets/images/tec/webskill.gif" width="500" /> 
</p>
<p>
<p>記事がありません。</p> 
</p>
 ]]></description>
<pubDate>09- 9·î-07 09:49</pubDate>
<guid>http://www.tonttu.net/tec.html</guid>
<author>クラウス</author>
</item>
<item>
<title>お問合せ</title>
<link>http://www.tonttu.net/67.html</link>
<description><![CDATA[ http://www.tonttu.net/contactus.html ]]></description>
<pubDate>28- 2·î-07 15:38</pubDate>
<guid>http://www.tonttu.net/67.html</guid>
<author>クラウス</author>
</item>
<item>
<title>RSSFeed</title>
<link>http://www.tonttu.net/rssfeed.html</link>
<description><![CDATA[ <div style="text-align: right;">
各社の提供するRSS最新ニュースを取得して表示しています.
</div>
<h2>＠IT自分戦略研究所</h2>
<div style="text-align: right;">
<a href="http://jibun.atmarkit.co.jp" target="_blank">http://jibun.atmarkit.co.jp</a>
</div>
<div style="float: left;">
<img src="http://www.atmarkit.co.jp/aboutus/copyright/jibun_links.gif" alt="＠IT自分戦略研究所" /><br />
</div>
<div style="float: left;">
ITエンジニアの中長期的なスキルとキャリアの向上を支援するサイト<br />
</div>
<div style="clear:both;"></div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/iN.ygwvgTIav/e07e58ab6370691d45e94c4e8a3a896a?ul=JSLwAx4YdLubDHVntOn9yXr7dPy.439DMu2uzMwlu9BuMgJCh2A_tPtclyRsC8.zFYzq7U0KDELUhQXQzsm2QQLSspdig5sQ6GeUd8uS1HyA8CnPl" target="_blank">パワーバランス</a><br />
<div style="font-size: 90%;">
<p>■夫婦間のパワーバランス■ 　なぜこんなタイトルにしたかというと、最近特にパワー...
<img bord...
<div style="text-align: right;">
2009/01/07&nbsp;エンジニアライフ&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/iN.ygwvgTIav/ddcb4e378f6fcfb73826765125cdd8a3?ul=Dhz7C3kyX9ZyDagwNKN2sn0HXkrvYBqEyoamr6KfTSXxljivkFZ.D49VfNhc1Of17PKJgG8YZqZv5_1LnJmS8B.OLhq0WDBvKF6rPMQj8Cr_dmupY" target="_blank">できるIT技術者はバイリンガルを目指そう</a><br />
<div style="font-size: 90%;">
　「うちではプログラマやSEの経験を積ませることなく、最初から要件定義だけでき...
<img border="...
<div style="text-align: right;">
2009/01/07&nbsp;エンジニアライフ&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/iN.ygwvgTIav/fbbdda22a27aae61b290ef00bdef83fb?ul=s80XNU0fyduKsG0.vueMXotkb.sxo4ou26vKTQJjSvW2uFgZ44_Ea295V3IpbZKZ74GTEfNCIFngDB8PFfNoOWU0Gybr" target="_blank">わたしはお客さんの社員と結婚しました</a><br />
<div style="font-size: 90%;">
　わたしの奥さんは、わたしがSE時代にシステム開発を請け負った会社のOLさんです...
<img border="...
<div style="text-align: right;">
2009/01/07&nbsp;エンジニアライフ&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/iN.ygwvgTIav/2c0a6022f0ed552958fc1950a5d2a5c0?ul=itOY.hkeiuATj4.9m7l_qxGnQRz6I3_WTZUktQ2iQDQRJNp37.rsetqNL_wN.5WW9acbxJnML9KQ7yN3xDmT4QD3iaj3" target="_blank">サバイブのカード</a><br />
<div style="font-size: 90%;">
　ぶるんっ。 　ハイテク化された車の運転席。キーをまわすと、エンジンがブートする...
<img borde...
<div style="text-align: right;">
2009/01/07&nbsp;エンジニアライフ&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/iN.ygwvgTIav/b6e4b08ad505d8a2acb067476e05904a?ul=Ycp5EIDd2FbWoZh_VOy7d2sluW_Hv4HMQ5Wsium7qOCwnIPifSG4Hznak1r4YRX7D3DxHGGsbrsj3kRfZ_IYm30p7lL2" target="_blank">加速する転職「負」のスパイラル</a><br />
<div style="font-size: 90%;">
　退職後4カ月を過ぎたある日、斉藤さん（仮名）のもとに前職の同僚から連絡がありま...
<img borde...
<div style="text-align: right;">
2009/01/07&nbsp;エンジニアライフ&nbsp;
</div>
</div>

<h2>＠IT情報マネジメント：IT戦略　カテゴリ</h2>
<div style="text-align: right;">
<a href="http://www.atmarkit.co.jp/im/cits/" target="_blank">http://www.atmarkit.co.jp/im/cits/</a>
</div>
<div style="float: left;">
<img src="http://www.atmarkit.co.jp/aboutus/copyright/atit_links.gif" alt="＠IT情報マネジメント：IT戦略　カテゴリ" /><br />
</div>
<div style="float: left;">
＠IT情報マネジメント − 企業におけるIT企画から投資、ガバナンスなどのIT戦略を担う人々に実践情報...<br />
</div>
<div style="clear:both;"></div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/desLJR67upVv/625259945ca5a777418769e4da90e9d1?ul=iky1tVapIPMlF.29WYJKbEpHrCqs0vBNVTlRrxr47MkHpESs5AhwY9xm4tGgC_J0J_EZZGr.4MABXgaOFi3aIkPIaxq3" target="_blank">ウォーリー、悪という名の経験を誇る</a><br />
<div style="font-size: 90%;">
　ウォーリーが、またアシュックをからかっているみたい。どうやらボスとの暗闘にアシュックを利用...
<div style="text-align: right;">
2008/12/26&nbsp;IT戦略&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/desLJR67upVv/be0978675db304400a18f98f95816f8d?ul=gTMKC_t2rDLSK0SYOkQPDQ8OagM6Tjl8PcuBd6KBRpAIZl0sAg.w8ichxojG48hvxGiFh_ugsbcjl1LWqesl5fD4y4nK" target="_blank">“変化”は外からやってくる（後編）</a><br />
<div style="font-size: 90%;">
<p>　世界同時不況のいま、IT投資の価値基準から、“お金中心”“自分中心”という社会の価値基準まで、...
<div style="text-align: right;">
2008/12/25&nbsp;IT戦略&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/desLJR67upVv/0faec76e8f45dd4e4521c190d534bdd0?ul=ajA_.P3_DeMtd57d3PZMQFqb1WZKysaV6wIq082Odxo4wYx.fKnLrDjT8iJDrLu_rI6DHU9SOsKHNGIhGKx4.HnKcOgC" target="_blank">ディルバート、プロジェクトの崩壊曲線を解説</a><br />
<div style="font-size: 90%;">
　ディルバートがボスなどを相手に、自社の開発案件がどのような末路をたどるかをプレゼンで発表。...
<div style="text-align: right;">
2008/12/19&nbsp;IT戦略&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/desLJR67upVv/cf07e27fc796766e263664c3a3ca1b60?ul=xhBJNVXvM4SsvVV3L97CapkXow7Y3vSrZD5VjgK3QIKWhoFH9aJVPv55ufrclU8iFe1wTNxyXCUwsm6sbUT4ciYBTc.Q" target="_blank">業務改革とシステム革新は“両輪”で進めろ！</a><br />
<div style="font-size: 90%;">
<p>　業務環境変化が激しい昨今、システム化計画もスピーディに立案することが求められている。今回...
<div style="text-align: right;">
2008/12/18&nbsp;IT戦略&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/desLJR67upVv/bccaa1ef0d80dcc981ea207b13f79a41?ul=a52ByQ..pUnEusGQLtu2PWo6W1kLLTbdPb1ZpyWR56zRfqMG5EgXnbG.SzlgucZlgPYfWJsVP8JQ1gZCHzsCetiVppYb" target="_blank">インドオフショアではどの契約形態がお得？</a><br />
<div style="font-size: 90%;">
　日本とインドでは商習慣が異なるため、契約形態の違いを認識しておくことは重要だ。今回は、イン...
<div style="text-align: right;">
2008/12/15&nbsp;IT戦略&nbsp;
</div>
</div>

<h2>＠IT情報マネジメント：ビジネスプロセス　カテゴリ</h2>
<div style="text-align: right;">
<a href="http://www.atmarkit.co.jp/im/cbp/" target="_blank">http://www.atmarkit.co.jp/im/cbp/</a>
</div>
<div style="float: left;">
<img src="http://www.atmarkit.co.jp/aboutus/copyright/atit_links.gif" alt="＠IT情報マネジメント：ビジネスプロセス　カテゴリ" /><br />
</div>
<div style="float: left;">
＠IT情報マネジメント − 競争優位を築くためのビジネスモデル構築など、経営革新や業務改革を担う人...<br />
</div>
<div style="clear:both;"></div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/DYk2hUZ2Fqpy/b4d8d0dac5388add78b9b9365a6bcbbc?ul=j7GHva1aVoloL7M.jU6BA6No80tnQlvM34ijK4EftzaJq6glP3oyK_xpn04sN6.INyipuiPjyjMbMhQjTfqqCTk.WnyZ" target="_blank">新年早々減給</a><br />
<div style="font-size: 90%;">
<p>　今年もシスアド先輩宅で新年会を開催することに。でも、あどみちゃんは新年早々ドジってしまい...
<div style="text-align: right;">
2009/01/07&nbsp;仕事の改善&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/DYk2hUZ2Fqpy/b7059e1949b1ee2c5c9f5dd2784d5f8c?ul=vKWterGTyaoMRXXHHBPAFdsCi3EC4TGvEQe4DAzGOiTczSaQdnfVGmfmgV.UIBo4a6JtdOXuWMtvvPn7inhhhcf3luSI" target="_blank">サンタさんにもらったレインボーパワー</a><br />
<div style="font-size: 90%;">
　あどみちゃんはクリスマスプレゼントに“人のオーラが見えるパワー”をもらいました。実際にその力...
<div style="text-align: right;">
2008/12/24&nbsp;仕事の改善&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/DYk2hUZ2Fqpy/737af4a70d00aa60241934515e77a030?ul=WVyNOPiB3RGTaF4eYQ6WnLzgOxfmS_XlkAHS3WTl4NCQldvvGD7g43WX.oOuKzbKiU2LSFzQF62.rN67pZtV2vkUmlzb" target="_blank">反省しない反省会</a><br />
<div style="font-size: 90%;">
　年の瀬のこの時期、どこの会社でも忘年会や反省会が開かれていると思いますが、あどみちゃんの場...
<div style="text-align: right;">
2008/12/17&nbsp;仕事の改善&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/DYk2hUZ2Fqpy/5191c2c8ad3259247e1786fd7979ad03?ul=urEBfxESzPcI.wjXm17ijh2cEqJmfDstnwLx3JTy2sWEZb.rwwyZSPTbVKy2NgJf_iHEQXEk04EqGGMoqt1yUHMrvTQP" target="_blank">前世のイメージが残る？</a><br />
<div style="font-size: 90%;">
<p>　システムが進化しても、前バージョンの面影は残っているものです。人間も同じで前世のイメージ...
<div style="text-align: right;">
2008/12/10&nbsp;仕事の改善&nbsp;
</div>
</div>
<hr />
<a href="http://rss.rssad.jp/rss/artclk/DYk2hUZ2Fqpy/6511660d6559acebb8506481783cda85?ul=7nrmc3kjSAs6.VBQkLZ_8y1x8KJjVXDzyBLZk7H7KUdSz4WPjDloZPZcX9z2N_U7UwYFk4p8.Sp3Hx4rJWO8u8eY6vPp" target="_blank">エイゴ、ワカリマセーン</a><br />
<div style="font-size: 90%;">
　なにわ電機では社内システム開発にインドオフショア開発を採用することに。当然先方との打ち合わ...
<div style="text-align: right;">
2008/12/03&nbsp;仕事の改善&nbsp;
</div>
</div>

<h2>CNET Japan 特集</h2>
<div style="text-align: right;">
<a href="http://japan.cnet.com/sp/" target="_blank">http://japan.cnet.com/sp/</a>
</div>
<div style="float: left;">
CNET Japan 特集<br />
</div>
<div style="float: left;">
テクノロジー＆ビジネス情報のメディアサイト。ニュースだけでなく、オピニオンリーダーによるコラ...<br />
</div>
<div style="clear:both;"></div>
<hr />
<a href="http://feeds.japan.cnet.com/click.phdo?i=48f1033c9583bc9d377348ac98112d03" target="_blank">CES 2009開幕目前--事前情報から展示を予想</a><br />
<div style="font-size: 90%;">
米国時間1月8日CES 2009がラスベガスで開幕する。例年よりもやや小規模になるものの、数多くの分野...
<div style="text-align: right;">
2009/01/07&nbsp;&nbsp;
</div>
</div>
<hr />
<a href="http://feeds.japan.cnet.com/click.phdo?i=ba1e6a05f939f2238df4341f0c019ebb" target="_blank">2008年下半期のヒットモデルはこれだ！（デジカメ、PC、携帯電話編）</a><br />
<div style="font-size: 90%;">
高機能・単機能化が進むデジタルカメラ、ネットブックという新ジャンルを生み出したノートPC、下半...
<div style="text-align: right;">
2008/12/30&nbsp;&nbsp;
</div>
</div>
<hr />
<a href="http://feeds.japan.cnet.com/click.phdo?i=e4654017b5349dfd64ffd8929a7e3df4" target="_blank">iPhone、メーカー撤退、フィルタリング--2008年モバイル業界10大ニュース</a><br />
<div style="font-size: 90%;">
2008年、モバイル業界は激動の一年だった。新しい端末やサービスが生まれ、またその一方で、市場撤...
<div style="text-align: right;">
2008/12/29&nbsp;&nbsp;
</div>
</div>
<hr />
<a href="http://feeds.japan.cnet.com/click.phdo?i=e9dafaeb8cdaac44fa00d9740b7d2e9d" target="_blank">2008年下半期のヒットモデルはこれだ！（オーディオ、ビジュアル編）</a><br />
<div style="font-size: 90%;">
液晶テレビ人気が高まる薄型テレビ、Blu-rayへと大きくシフトされたデジタルレコーダーなど、厳しい...
<div style="text-align: right;">
2008/12/29&nbsp;&nbsp;
</div>
</div>
<hr />
<a href="http://feeds.japan.cnet.com/click.phdo?i=146f982e0eae3f55fe27bd9655a71f33" target="_blank">ネットブックはブームから定着へ--軽量・小型PCを比較（HDD編）</a><br />
<div style="font-size: 90%;">
ASUSが2008年1月に発売した「EeePC」を皮切りに、日本国内でも続々と登場したネットブック。いまや...
<div style="text-align: right;">
2008/12/26&nbsp;&nbsp;
</div>
</div>

 ]]></description>
<pubDate>12- 2·î-07 16:25</pubDate>
<guid>http://www.tonttu.net/rssfeed.html</guid>
<author>クラウス</author>
</item>
<item>
<title>Dittoのオプション</title>
<link>http://www.tonttu.net/tec/modx/Ditto.html</link>
<description><![CDATA[ <p>
「Ditto」スニペットは特定のフォルダ以下のドキュメントを一覧表示するものです。<br />
「NewsListing」と同じくブログ形式の表示に適しています。<br />
オプションの指定をまとめてみました（完全ではありませんのであしからず）
</p>
<p>
&nbsp; // ---------------------------------------------------<br />
&nbsp; // Parameters<br />
&nbsp; // ---------------------------------------------------
</p>
<p>
$mode = isset($mode)? $mode : &quot;development&quot;;<br />
&nbsp;// determines whether variable sanity checks are run.<br />
&nbsp;// use &quot;development&quot; while creating the snippet call and &quot;production&quot; when your site goes live for a little speed boost.
</p>
<p>
$startID = isset($startID) ? $ditto-&gt;cleanStartIDs($startID, $mode) : $modx-&gt;documentIdentifier;<br />
&nbsp;&nbsp;&nbsp; //記事が格納されているフォルダーID(デフォルト:現在のフォルダー)。カンマ区切りで複数指定<br />
&nbsp;&nbsp;&nbsp; // the folder that contains post entries. separate by commas to use multiple folders
</p>
<p>
$paginate = isset($paginate)? $paginate : 0;<br />
&nbsp;&nbsp;&nbsp; //0:ページ送りを表示しない(デフォルト)、1:ページ送りを表示する<br />
&nbsp;&nbsp;&nbsp; //以下ページ送りのサンプルコード<br />
&nbsp;&nbsp;&nbsp; //&lt;div id=&rdquo;ditto_wrapper&ldquo;&gt;Page &lt;strong&gt;&lt;/strong&gt; of &lt;strong&gt;&lt;/strong&gt; Articles &lt;div id=&quot;ditto_pages&quot;&gt;  &lt;/div&gt;&lt;/div&gt;<br />
&nbsp;&nbsp; // paginatation enabled or disabled
</p>
<p>
$summarize = isset($summarize) ? $summarize : 3;<br />
&nbsp;&nbsp;&nbsp; //一覧表示する投稿の数。これ以上はアーカイブリストに表示(デフォルト:3)<br />
&nbsp;&nbsp;&nbsp; // number of posts of which to show a summary<br />
&nbsp;&nbsp;&nbsp; // remainder (to total) go as an arhived/other posts list
</p>
<p>
$trunc = isset($trunc) ? $trunc : 1;<br />
　　//0:本文の表示文字数制限をしない、1:する(デフォルト)<br />
&nbsp;&nbsp;&nbsp; // should there be summary/short version of the posts?
</p>
<p>
$truncSplit = isset($truncSplit) ? $truncSplit : 1;<br />
&nbsp;&nbsp;&nbsp; //0:任意の文字列までで区切らない、1:任意の文字列までで区切る(デフォルト)<br />
&nbsp;&nbsp;&nbsp; // should the post be summarized at the &quot;splitter&quot;?
</p>
<p>
$truncAt = isset($truncAt) ? $truncAt : $_lang[&#39;default_splitter&#39;];<br />
&nbsp;&nbsp;&nbsp; //区切る任意の文字(デフォルト:&lt;!-- splitter --&gt;)<br />
&nbsp;&nbsp;&nbsp; // where to split the text
</p>
<p>
$truncLen = isset($truncLen) ? $truncLen : 300;<br />
&nbsp;&nbsp;&nbsp; //表示する本文の最大文字数(デフォルト:300)<br />
&nbsp;&nbsp;&nbsp; // how many characters to show of blogs
</p>
<p>
$truncOffset = isset($truncOffset) ? $truncOffset : 30;<br />
&nbsp;&nbsp;&nbsp; // how many characters to show of blogs
</p>
<p>
$truncText = isset($truncText)? $truncText : $_lang[&#39;more_text&#39;];<br />
&nbsp;&nbsp;&nbsp; //もっと読むの表示テキスト(デフォルト:Read more...)<br />
&nbsp;&nbsp;&nbsp; // text to be displayed in item link
</p>
<p>
$truncChars = isset($truncChars) ? $truncChars : 0;<br />
&nbsp;&nbsp;&nbsp; //0:HTMLタグを考慮しないで区切る、1:HTMLタグを考慮し区切る(デフォルト)<br />
　　// truncate based on characters and not html tags
</p>
<p>
$tpl = isset($tpl) ? $modx-&gt;getChunk($tpl): $_lang[&#39;default_template&#39;];<br />
&nbsp;&nbsp;&nbsp; //テンプレートチャンク名<br />
&nbsp;&nbsp;&nbsp; // optional user defined chunk name to format the summary posts
</p>
<p>
$showPublishedOnly = isset($showPublishedOnly) ? $showPublishedOnly : 1;<br />
&nbsp;&nbsp;&nbsp; //0:非公開のみ表示、1:公開のみ表示(デフォルト)<br />
&nbsp;&nbsp;&nbsp; // allows you to show unpublished docs if needed
</p>
<p>
$showInMenuOnly = isset($showInMenuOnly) ? $showInMenuOnly : 0;<br />
&nbsp;&nbsp;&nbsp; //0:メニュー表示可のみ表示(デフォルト)、1:メニュー表示不可も表示<br />
&nbsp;&nbsp;&nbsp; // allows you to show docs marked not to show in the menus
</p>
<p>
$emptyText = isset($emptyText)? $emptyText : $_lang[&#39;no_entries&#39;];<br />
&nbsp;&nbsp;&nbsp; //表示該当がない場合のテキスト(デフォルト:&lt;p&gt;No entries found.&lt;/p&gt;)<br />
&nbsp;&nbsp;&nbsp; // text to be displayed when there are no results
</p>
<p>
$dateFormat = isset($dateFormat)? $dateFormat : $_lang[&#39;date_format&#39;];<br />
&nbsp;&nbsp;&nbsp; //日付フォーマット(デフォルト:%d-%b-%y %H:%M)<br />
&nbsp;&nbsp;&nbsp; // format for the summary post date format
</p>
<p>
$displayArchive = isset($displayArchive)? $displayArchive : 1;<br />
&nbsp; //0:アーカイブを表示しない、1:表示する(デフォルト)<br />
&nbsp; // whether or not to show the archive
</p>
<p>
$archiveText = isset($archiveText)? $archiveText : $_lang[&#39;archives&#39;];<br />
&nbsp;&nbsp;&nbsp; //アーカイブのテキスト(デフォルト:Archives)<br />
&nbsp;&nbsp;&nbsp; // text to use for the Archives listing
</p>
<p>
$commentsChunk = isset($commentsChunk)? &#39;&#39; : &#39;&#39;;<br />
&nbsp;&nbsp;&nbsp; //コメント表示のチャンク名<br />
&nbsp;&nbsp;&nbsp; // if you&#39;re using comments, the name of the chunk used to format them
</p>
<p>
$hiddenTVs = (isset($hiddenTVs))? $hiddenTVs : &quot;&quot; ;<br />
&nbsp;// allows the snippet to filter by tv&#39;s not in the template. separate by comma.
</p>
<p>
$ditto-&gt;hiddenTVs = $hiddenTVs;<br />
&nbsp;// send the variable to the class
</p>
<p>
$sortDir = isset($sortDir) ? strtoupper($sortDir) : &#39;DESC&#39;;<br />
&nbsp;&nbsp;&nbsp; //ASC:昇順、DESC:降順(デフォルト)<br />
&nbsp;&nbsp;&nbsp; // get sort dir
</p>
<p>
$sortBy = isset($sortBy) ? $ditto-&gt;checkSort($sortBy, $dateFormatType, $mode) : &quot;createdon&quot;;<br />
&nbsp;&nbsp;&nbsp; //`menuindex`でメニューの並び順、(デフォルト:作成日順)<br />
&nbsp;&nbsp;&nbsp; // get sortBy
</p>
<p>
$hiddenTVs = $ditto-&gt;hiddenTVs;<br />
&nbsp;// grab latest hiddenTV additions
</p>
<p>
$dateFormatType = $ditto-&gt;checkDateFormat($sortBy,$d