2008年3月17日月曜日

WordPress パーマリンクでトラブり

パーマリンク構造のカスタマイズ

これまでパーマリンクはデフォルトの
http://www.example.com/test/?p=123
のようなURLで動かしていたけど、ふと思い立って「日付と投稿名ベース」のURLにしようとした。
以前、パーマリンクのテストがすんでいたので問題なく設定できると思ったら、これが泥沼ずぶずぶになってしまった。

[設定][パーマリンク構造のカスタマイズ]のページで「パーマリンク構造を更新」をクリックしても、
「日付と投稿名ベース」や「数字ベース」を選ぶと
「.htaccess を更新してください。」と出てパーマリンクの設定ができない


別のディレクトリにホームページを設定する場合では
http://example.com/wordpress
にwordpressをおいて
http://example.com
をブログURLにできる。

で、http://example.com/wordpressにwordpressのコアを入れて、
index.phpの中の
require('./wp-blog-header.php');

require('./wordpress/wp-blog-header.php');
に変えればオッケー。

http://example.com/wordpress/wp-admin
で管理画面にアクセスできる。
とあった
(あと .htaccessをindex.phpがあるディレクトリに手動でコピーしろいうのもある。)

じつは、いろいろ環境をテストしてて、パーマリンクにしようとしたサイトは、/home/sample2/public_html/wordpress/で、
/var/www/testにシンボリックリンクが張ってあったのだ。
...さっきの「別のディレクトリにホームページを設定する場合」をどこまで拡大解釈できるかといじってた。

その結果、[設定][一般設定]のページの設定で
WordPress のアドレス (URL):http://example.com/~sample2/wordpress
ブログのアドレス (URL):http://example.com/~sample2/wordpress
ならパーマリンクはOKだった。
これは当たり前の初期状態。

[設定][一般設定]のページの設定を、
WordPress のアドレス (URL):http://example.com/~sample2/wordpress
ブログのアドレス (URL):http://example.com/test
にすると、

「.htaccess を更新する必要があります。」
がでてきて書き換えができないといわれる。

[設定][一般設定]のページの設定を、
WordPress のアドレス (URL):http://example.com/test
ブログのアドレス (URL):http://example.com/test
にすると、

「パーマリンク構造を更新しました。」
となって、

.htaccess
# BEGIN WordPress

RewriteEngine On
RewriteBase /test/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test/index.php [L]


# END WordPress

なんだけど、
http://example.com/test/2008/03/15/個別ページ/
は 404のエラーになる。

......................................
....いろいろもだえたんだけど...........
......................................
あとあと忘れてもオッケーのシンプルな解決方法が見つからない。

結局、[設定][一般設定]のページの設定、
WordPress のアドレス (URL):http://example.com/test
ブログのアドレス (URL):http://example.com/test

# cat /etc/apache2/conf.d/wordpress.conf
Alias /test /home/sample2/www/wordpress
にして、

[設定][パーマリンク構造のカスタマイズ]のページで「日付と投稿名ベース」にして、
 http://example.com/test/2008/03/17/sample-post/
を表示することにした。

...まったくの覚え書きで、他の人には無用だろうなぁ。

2008年3月13日木曜日

Nucleus コメント欄がでない! Macの人の落とし穴

コメント欄ってあるべきだよなぁ

コメント欄が出ないのです。
チェックを入れたり外したり、メールアドレスを直したりしたんだけど、全然コメント欄が現れない。
アイテムページの一番下に
「Leave comment」と出るだけ。
何せ初めていじるもんで、「そーゆーもんだ」といわれれば、「そうですか」と納得しちゃうんだけど、やっぱりなんかおかしい。
defaultスキンの「個別アイテムページ」には、
<div class="content">
<div class="contenttitle">
<h2>Add Comment</h2>
</div>
<%commentform%>
</div>
</div>

と書いてあるし、なんなんだぁ。
もしかして、コメント欄もプラグインかと思ったけど、たしか最初の頃コメントを送信した記憶がある。
フォーラムにいって情報あさりをする。

あーるじゃありませんか!
「もしかして、nucleus / formsディレクトリに commentform-notloggedin.template が無いんじゃないですか?」
ファイルをのぞくと.......
その通り!!!!
ファイル名の後ろが化けている
commentform-notloggedin.t#1B7D4


commentform-loggedin.template
は、あるんだけど
nucleus/forms/commentform-notloggedin.template

nucleus/forms/commentform-notloggedin.t#1B7D4
になっているのだ。
コメント欄が出たり出なかったりおかしいなとおもっていたら、ログインのときはコメント欄が出ていたのだ。
...あんまりログインしながらアイテムページ見てなかったんだけど。ブラウザ2種類使ってたし。

こいつの原因はわかってるのだ。
commentform-notloggedin.template
commentform-loggedin.template
この長さの違いが効いてる。
なぜかというと、MacOS 9xのファイル名の制約なのだ。
許されるファイル名は31バイトだから、長いファイル名は勝手にはしょっちゃうのね。
クラシック環境のfetchを使ってアップロードしたからこうなったのだ、

コメント欄が出るようになったけど、
お名前:
ウェブサイト:
メール:
が欄の右側に出てる。
いや、前の欄にくっ付いているのだ。
<br />を入れてごまかした。

でもこれ直すと、ずっと気にしてないとまずいんだよね。特にアップグレードなんか。

2008年3月11日火曜日

Nucleus NP_ShowBlogs.phpで独自ページを作ろうと

NP_ShowBlogs.phpで特別ページ

話は前後するけど、前にインデックスページに、特別なページを入れたくて、 NP_ShowBlogs.phpを使おうと考えた。

これと決めたアイテムの番号をトップページで掲載するアイテムにすれば更新が簡単だから、
<%ShowBlogs([テンプレート], [アイテム数], [ブログ], [ページスイッチ], [ソート], [固定表示ID], [固定表示テンプレート], [カテゴリーモード], [広告コード表示モード], [カテゴリ選択時の固定記事の表示方法])%>
の引数でアイテム一つだけを表示するページをトップページにしようと考えたのだ。

NP_ShowBlogs.phpをアップロードしてプラグインに登録したら画面がおかしくなった。

Warning: NP_ShowBlogs::include_once(/home/stage58pi/www/nucleusad/plugins/showblogs/english.php) [function.NP-ShowBlogs-include-once]: failed to open stream: No such file or directory in /home/stage58pi/www/nucleusad/plugins/NP_ShowBlogs.php on line 101

Warning: NP_ShowBlogs::include_once() [function.include]: Failed opening '/home/stage58pi/www/nucleusad/plugins/showblogs/english.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/stage58pi/www/nucleusad/plugins/NP_ShowBlogs.php on line 101

showblogsのフォルダ
 english.php
 japanese-utf8.php
 japanese-euc.php
が必要らしい、慌ててフォルダをアプロードした。

NP_ShowBlogsはblog()の代わりにいれればいいらしいから、
enlighten/skintypes/mainindex.phpに
<div id="main">
<!-- <%blog(enlighten/index,6)%> -->
<%ShowBlogs(enlighten/index,4,,2,DESC)%>
</div></div></div>
として入れた。

期待通り、アイテム4つと、前後のナビゲーションが表示された。
うまくいった。
nakahara21さん、Takaさん、kimitakeさん、shizukiさん、ありがとう。m(_ _)m

....と思って最初の目的、アイテム一つの表示に挑戦。
<%parsedinclude(head.php)%>
<meta name="description" content="<%blogsetting(desc)%>" />
<title><%blogsetting(name)%> - <%blogsetting(desc)%></title></head>
<%parsedinclude(header.php)%>
<%parsedinclude(sidemenu.php)%>
<div id="main">
<%ShowBlogs(enlighten/index,1,,0)%>
</div></div></div>
<%parsedinclude(footer.php)%>
で最新アイテムが表示された。
でも
<%ShowBlogs(enlighten/index,1,,0,DESC,25)%> <- そのブログの2番目のアイテムのつもり
とか
<%ShowBlogs(enlighten/index,0,,0,DESC,25)%>
とか、いろいろやったけど、指定したアイテム一つだけを表示することができない。必ず余分なアイテムが一つ表示される。

固定表示IDでなければ、最新アイテムを1つだけ表示することができる。

「メインの目次ページ」に決まったアイテム1個だけを表示すればオッケーと思ったんだけどなぁ。
これができれば、アイテムの変更で、トップページの変更ができるから簡単だと思ったんだけど挫折。(- -);

2008年3月10日月曜日

Nucleus 特注トップページ(3)

複数ブログで特注トップページ

スペシャルスキンを使った固定ページと、ブログ本体を融合させて、「固定ページ + ブログ」のサイトを作るのだ。
前回までにスペシャルスキンを使った固定ページができているところから始めてます。

まず固定ページに使っているスキンを複製する。
できたclone_enlightenの名前をenlighten_blogに変更したいが、エラーになる。"_"がチェックされているようだ。
「複製」なら使えるのに入力はチェックするなんてどうかなぁ。名前はenlighten4blogにする。

スキン「enlighten」を固定ページで使い、スキン「enlighten_blog」をブログにして組み合わせる案だ。
「スキンの編集 'enlighten': メインの目次ページ」は
<%parsedinclude(head.php)%>
<meta name="description" content="<%blogsetting(desc)%>" />
<title><%blogsetting(name)%> - <%blogsetting(desc)%></title></head>
<%parsedinclude(header.php)%>
<%parsedinclude(sidemenu.php)%>
<%ifcat%><%parsedinclude(skintypes/mainindex.php)%><%else%>
<%include(../../index1.txt)%>
<%endif%>
<%parsedinclude(footer.php)%>

にする。

スキンファイル管理で、ふと考えたんだけど、スキンの実態はどうなっているんだろう。

nucleus/skins/にはディレクトリは増えていない。ということはスキンファイルは元祖とcloneが同じものを使うということだろうか。
こいつぁ、気をつけないと危ないぞ。

新しいブログを作る。
2ch2.phpをアップロード
<?php
$CONF['Self'] = '2ch2.php';
include('./config.php');
selectBlog('2ch2');
selector();
?>


URLは、http://192.168.0.8/sample/nucleus/2ch2.phpだそうだ。
スキンファイル管理
skins / enlighten / header.php
にリンクを張り直す。
動作確認。これがトップページ


これがブログ部分のトップページ


これがアイテムを表示するページ


今ひとつトップページがブログっぽい。もう少し変えたいもんだ。
管理が楽なのは、

・ファイル数が少ない。
・手数が少なくて変更できる。
・下まで探さないで変更できる。
・以後の変更が簡単。

ならば、
「スキンの編集 'enlighten': メインの目次ページ」を
<%parsedinclude(head.php)%>
<meta name="description" content="<%blogsetting(desc)%>" />
<title><%blogsetting(name)%> - <%blogsetting(desc)%></title></head>
<%parsedinclude(header.php)%>
<!-- page content -->
<div id="content">
<!-- page start border:teal solid 1px; -->
<div style="margin:4px 96px;padding:4px;">
<%include(../../index1.txt)%>
</div>
<!-- page end -->
</div>
<%parsedinclude(footer.php)%>

にして、index1.txtの内容変更で更新をしよう。
mainpage33.png
だいぶ格好ついてきた。この方向で行くことにする。

2008年3月9日日曜日

Nucleus 特注トップページ(2)

トップページを好きに書きたい(2)

スキンの中に文章を直接書き込むのは、それはそれでいい考えだと思ったんだけど、せっかくだから初めてincludeを使ってみる。
やりたいことはこれだ。
カテゴリが選ばれたら、カテゴリのページを表示する
ブログを指定したら、ブログのトップページの文章を表示する。
それ以外なら
(最初の)トップページの文章を表示する。


skins:vars:ifに条件分岐の例が沢山あった。
<%if(category)%%> カテゴリが選択されているかどうか
<%if(category,catname,カテゴリ名)%%> 選択中のカテゴリ名が第3引数の指定値と一致するかどうか
<%if(blogsetting,bnumber,ブログid)%%> 選択中のブログidが第3引数の指定値と一致するかどうか


「スキンの編集 'enlighten': メインの目次ページ」はこんな、
<%parsedinclude(head.php)%>
<meta name="description" content="<%blogsetting(desc)%>" />
<title><%blogsetting(name)%> - <%blogsetting(desc)%></title></head>
<%parsedinclude(header.php)%>
<%parsedinclude(sidemenu.php)%>
<%if(category)%><%parsedinclude(skintypes/mainindex.php)%><%else%>
<%if(blogsetting,bnumber,1)%><%include(../../index2.txt)%><%else%>
<%include(../../index1.txt)%>
<%endif%><%endif%>
<%parsedinclude(footer.php)%>


http://192.168.0.8/sample/nucleus/


http://192.168.0.8/sample/nucleus/index.php?blogid=1


http://192.168.0.8/sample/nucleus/index.php?catid=4&blogid=1


<%if(blogsetting,bnumber,1)%>てのが期待通りに動いていない
index.phpでも blogid=1とされているようだ。
<%if(blogsetting,burl,ブログのURL)%>を使ってみる。
<%if(category)%><%parsedinclude(skintypes/mainindex.php)%><%else%>
<%if(blogsetting,burl,"http://192.168.0.8/")%><%include(../../index1.txt)%><%else%>
<%include(../../index2.txt)%>
<%endif%><%endif%>

これもだめ。前と結果は同じだ。

あまりコードを書き込むと、バージョンアップやサーバー替えや構成変更の時にメンテナンスが増えるのでやりたくない。
なるべくシンプルに行きたいもんだ。
http://192.168.0.8/sample/nucleus/は
http://192.168.0.8/sample/nucleus/index.phpと同じ
http://192.168.0.8/sample/nucleus/index.php?blogid=1とも同じらしい。


ブログを変えれば blogidが変わる。新規ブログを作って逃げよう。

...また続く

2008年3月7日金曜日

Nucleus 特注トップページ(1)

トップページを好きに書きたい

ブログのトップページを専用の画面を表示させたいんだけど、どうするんだろう。
「メンバー詳細ページ」を使わないことにして、これをブログのトップページに流用できるんだろうか。
どうやって「メンバー詳細ページ」を呼べばいいんだろう。

「 メインの目次ページ 」の呼ばれ方を見てみる。
「 メインの目次ページ 」でトップページが表示されることがわかった。
ということは、[スキンの編集]の[スキンの編集 'enlighten': メインの目次ページ]で
<%parsedinclude(head.php)%>
<meta name="description" content="<%blogsetting(desc)%>" />
<title><%blogsetting(name)%> - <%blogsetting(desc)%></title></head>
<%parsedinclude(header.php)%>
<%parsedinclude(sidemenu.php)%>
<%parsedinclude(skintypes/mainindex.php)%>
<%parsedinclude(footer.php)%>
<%parsedinclude(skintypes/mainindex.php)%>
の部分を書き換えればトップページに表示したい文字が出そうだ。

mainindex.phpは[スキンファイル管理]->[enlighten]->[skintypes]にあった。
中身は
<div id="main">
<%blog(enlighten/index,6)%>
</div></div></div>
ここに、文字列を入れた。
<div id="main">
<div style="margin:4px 240px 4px 16px;padding:4px;">
<p><h4>ここがトップページ</h4>
ここがトップページです<br />
ここがトップページです<br />
ここがトップページです<br />
ここがトップページです<br />
ここがトップページです<br />
ここがトップページです<br /></p>
</div>
</div></div></div>

http://192.168.0.8/sample/nucleus/


うまくいった。
と思ったら、ブログのページも同じになった。
http://192.168.0.8/sample/nucleus/index.php?blogid=1


カテゴリのページも同じになった。
http://192.168.0.8/sample/nucleus/index.php?catid=4&blogid=1


あっけにとられてわけがわからなくなったけど、スキンをdefaultにしたら「カテゴリのページ」はちゃんとカテゴリの内容が表示されている。

やりかたが違うらしい。あっちこっちから「 メインの目次ページ 」が使われているようだ。
「 メインの目次ページ 」の呼ばれかたがわからなければ、「メンバー詳細ページ」もわからない。Nucleusが内部で決めているんだろう。

アプローチを変えないとだめそう。少なくても変更したいページ全部に「 メインの目次ページ 」が使われることはわかったわけだ。
「スキンの編集 'enlighten': メインの目次ページ」の下に、
使用可能な変数 (クリックで説明表示): additemform, adminurl, archivedaylist, archivelink, archivelist, blog, bloglist, blogsetting, category, categorylist, charset, else, elseif, elseifnot, endif, if, ifnot, include, loginform, member, nextlink, nucleusbutton, otherarchivedaylist, otherarchivelist, otherblog, parsedinclude, phpinclude, plugin, preview, prevlink, referer, searchform, self, set, sitevar, skinfile, skinname, todaylink, version

が表示されている。これがスキン変数と言われるものらしい。
これを使って組み立てろということかな。
.......続く

2008年3月6日木曜日

Nucleus サムネイル付きで画像アップロード

Nucleusのチューンナップ

だんだん動き始めたNucleusだけど、少し欲が出てきた。
WordPressではdafaultでサムネールを使うことが組み込まれているけど、自分で好きな機能を追加するのが Nucleus流なのだ。
というわけで、欲しいものリストは、
・サムネイル付きで画像アップロードのプラグイン
・アクセス解析のプラグイン
なのだ。

「NP_Analyze.php 多機能かつインストールが容易なアクセス解析プラグイン」を、入れようとしたら、
現在、セキュリティチェックのため配布を停止しています。配布再開の見通しは立っていません。
だった。残念。

本家にいってみてもアクセス解析はなさそう。データベースから読むのをトリガーにして、Apacheの情報とページ情報をしまうような簡単のがあるかと思ったんだけど。
もっとも集計画面とかは面倒だろうけど。いや MySqlのSQLで一発かも。
なければ Analogの出番かなぁ。
とりあえず画像関係のは、
NP_PopupImageGD.php
A modified version of PopupImageNetPBM based on GD grahpic library version 2 or more (it also works with GD version 1 but you will have to modify the plugin yourself).
があった。

日本のpluginsも覗くと、NP_Thumbnail.php、NP_CustomThumbnail.phpがあった。
NP_Thumbnail.phは、ページ表示の都度動的に生成するバージョンと、DB内に保存して呼び出すバージョンでサムネイル画像を扱うらしい。リクエストの都度、生成したりデータベースを動かすのもどうかなぁ。フォルダに入れといて管理するのが簡単なんだけど。

NP_CustomThumbnail.phpは、サムネイル画像をmedia/thumbnailに保存するとのこと。いいじゃないの。
ダウンロードして一応コードを覗いてみる。
プラグインの仕様ってのはまだ解らないけど、画像の転送は昔やってことがあるので様子はわかるかも。やっぱり、gifとjpegとpngを別に処理してる。
いやー、大変そうだということだけわかった。

早速入れて、画像アップロードをテストしてみる。
わかったことは、
サムネールの指定寸法が、実寸法より大きいときは、画像は実寸法で埋め込まれる。ポップアップしない。
サムネールの指定寸法が、実寸法より小さいときは、画像はサムネールの寸法に縮小されて、ポップアップのリンクがつけられる。
おー、お利口だ。
ごきげんじゃん。

サンガツさんありがとう。ありがたく使わせていただきます。m(_ _)m

これで早速ブログがかけます。
あーっ、その前にブログ用のスキン作らねば。

まずいなっ。同じスキンをコピーして展開しようとするとファイル内のスキン名が同じだから、
次のスキン名がぶつかります: enlighten
次のテンプレート名がぶつかります: enlighten/index and enlighten/item
とでる。うー、マイナーチェンジでお茶を濁そうとしたのけどだめそう。
新しいスキンを入れてそれを変更することにする。

画像右配置、文字流し込み

一つ気になっているのが、右側に画像をおいて文字を回り込ませるのができないこと。

<div class="rightbox"><%image(20080221-dummy80cu.gif|80|77|これは右にいれる)%></div>

defaultのスキンと、Grey Gradientは問題なく右に表示されるんだけど、そのほかのスキンは単に左に画像が表示され、文字の回り込みも起こらない。

試しにスタイルシートの
.rightbox {
float: right;
border-left: 2px solid #ccc;
}
と同じことを、
<div class="rightbox"></div>
に追加してみたら期待通りに動いた。

<%image(20080221-dummy80cu.gif|80|77|これは右にいれる)%>


当面はこれでいけばいいんだけど、原因はなんなんだろう。
でも気になる。構成が複雑でブラウザが解釈できないとか、最初にスタイルシート読んでも使うときになったら忘れちゃってるとかだったりして。

2008年3月5日水曜日

Nucleus 管理ページを隠す

Nucleusの管理ページを隠す

www.example.com/blog/にNucleusを置くと、管理ページの入り口は defauletでお約束の、
http://www.example.com/blog/nucleus/
になる。
これじゃ、Nucleusを
http://www.example.com/blog/
でブログを動かしてるのがわかったら、「入り口はこの下 -> nucleus/」ってバレバレではありませんか。

あんまり危機意識がないと見られるのも困るので、せめて
http://www.example.com/blog/abc0001/index.php
みたいに、見つかりにくいURLにしたいもんだ。

確か、config.phpにディレクトリを指定した場所があったので変更する。

// mySQL connection information
$MYSQL_HOST = 'localhost';
$MYSQL_USER = 'sampleadmin';
$MYSQL_PASSWORD = 'sampleadmin';
$MYSQL_DATABASE = 'Nucleus';
$MYSQL_PREFIX = '';

// main nucleus directory
$DIR_NUCLEUS = '/home/example/public/abc0001/'; <- ココ変える

// path to media dir
$DIR_MEDIA = '/home/example/public/media/';

// extra skin files for imported skins
$DIR_SKINS = '/home/example/public/skins/';

// these dirs are normally sub dirs of the nucleus dir, but
// you can redefine them if you wish
$DIR_PLUGINS = $DIR_NUCLEUS . 'plugins/';
$DIR_LANG = $DIR_NUCLEUS . 'language/';
$DIR_LIBS = $DIR_NUCLEUS . 'libs/';

// include libs
include($DIR_LIBS.'globalfunctions.php');
if (!extension_loaded('mbstring')) {
include($DIR_LIBS.'mb_emulator/mb-emulator.php');
}
?>

管理画面にアクセスすると、なんと、画面が崩れてしまった。

ソースを見てみると、
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test001 - Admin</title>
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="http://www.example.com/blog/nucleus/styles/admin.css" />
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css"
href="http://www.example.com/blog/nucleus/styles/addedit.css" />
<script type="text/javascript" src="http://www.example.com/blog/nucleus/javascript/edit.js"></script>
<script type="text/javascript" src="http://www.example.com/blog/nucleus/javascript/admin.js"></script>
<script type="text/javascript" src="http://www.example.com/blog/nucleus/javascript/compatibility.js"></script>

スタイルシートのパスが通っていない。これじゃ崩れるはず。
config.php以外にURLを設定する場所があるらしい。

ファイルのぞいたがすぐには見つからないので、アプローチをかえる。
nucleuのデータベースを見ると nucleus_configが怪しそう。(phpmyadmin)

早速、ここを http://www.example.com/blog/abc0001/に書き換える。
注意:PluginURL http://www.example.com/blog/nucleus/plugins/
も変えないと、プラグインのリストがでなくなる。

これで、
http://www.example.com/blog/abc0001/
にアクセスすると、いつもの管理画面が表示された。


さて、動いたことは動いたんだけど、一応ファイルでも調べておきたいもんだ。

ADMIN.phpにURLを決めている場所があった。
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />
<title><?php echo htmlspecialchars($CONF['SiteName'])?> - Admin</title>
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="<?php echo $baseUrl?>styles/admin.css" />
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css"
href="<?php echo $baseUrl?>styles/addedit.css" />
<script type="text/javascript" src="<?php echo $baseUrl?>javascript/edit.js"></script>
<script type="text/javascript" src="<?php echo $baseUrl?>javascript/admin.js"></script>
<script type="text/javascript" src="<?php echo $baseUrl?>javascript/compatibility.js"></script>

4955: $baseUrl = htmlspecialchars($CONF['AdminURL']); <- これで設定しているようだ
4963: <link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="<?php echo $baseUrl?>styles/admin.css" />
4964: <link rel="stylesheet" title="Nucleus Admin Default" type="text/css"
4965: href="<?php echo $baseUrl?>styles/addedit.css" />
ほかにも、showlist.phpにあったけど、こっちは見るからにハズレ。

207: $baseUrl = 'index.php?plugid=' . intval($current->pid) . '&action=';

さらに
ADMIN.phpをみると
<td><input name="AdminURL" tabindex="10040" size="40" value="<?php echo htmlspecialchars($CONF['AdminURL']) ?>" /></td>

これみたい。ここで入力してデータベースに入れているのだ。
なんだ、「グローバル設定」の「管理者領域のURL (最後にスラッシュ "/" を付けてください)」じゃあ、ありませんか。(- -);

というわけで、良い子の皆さんは、最初に「グローバル設定」をやって、次にconfig.phpを書き換えてください。

2008年3月4日火曜日

Nucleus skinbackup.xmlをのぞいてみた

とりあえずdefaultのスキンを見ると

defaultのスキンのディレクトリの中は

skinbackup.xml
sidebar.inc
readme.html
preview.png
header.inc
head.inc
navigation.inc
preview-large.png
nicetitle.js
nicetitle.css
default_right.css
images
favicon.icofooter.inc
default_left.css

となっている。

スキンのキモ skinbackup.xmlをのぞいてみる


<nucleusskin>
<meta>
<skin name="default" />
<template name="default/index" />
<template name="default/item" />
<info><![CDATA[Nucleus CMS Default Skin]]></info>
</meta>

<skin name="default" type="text/html" includeMode="skindir" includePrefix="default/">
<description>Nucleus CMS default skin</description>

■定義済みパーツ: [スキンの編集 'default': 月別アーカイブページ]で表示される部分
<part name="archive"><![CDATA[<%parsedinclude(head.inc)%>
................
................

■定義済みパーツ: [スキンの編集 'default': 月別アーカイブ一覧ページ]で表示される部分
<part name="archivelist"><![CDATA[<%parsedinclude(head.inc)%>
................
................

■定義済みパーツ: [スキンの編集 'default': エラーページ]で表示される部分
<part name="error"><![CDATA[<%parsedinclude(head.inc)%>
................
................

■定義済みパーツ: [スキンの編集 'default': 画像ポップアップウィンドウ]で表示される部分
<part name="imagepopup"><![CDATA[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ................
................

■定義済みパーツ: [スキンの編集 'default': メインの目次ページ]で表示される部分
<part name="index"><![CDATA[<%parsedinclude(head.inc)%>
................
................

■定義済みパーツ: [スキンの編集 'default': 個別アイテムページ]で表示される部分
<part name="item"><![CDATA[<%parsedinclude(head.inc)%>
................
................

■定義済みパーツ: [スキンの編集 'default': メンバー詳細ページ]で表示される部分
<part name="member"><![CDATA[<%parsedinclude(head.inc)%>
................
................

■定義済みパーツ: [スキンの編集 'default': 検索ページ]で表示される部分
<part name="search"><![CDATA[<%parsedinclude(head.inc)%>
................
................
■■ここまでが、例の「標準で8種類ある」スキンらしい。

■■こっから先はテンプレートのようだ
■テンプレートの編集 'default/index'
<template name="default/index">
<description>Nucleus CMS default index template</description>
<part name="ARCHIVELIST_LISTITEM"><![CDATA[<dd>
................
<part name="BLOGLIST_LISTITEM"><![CDATA[<dd>
................
<part name="CATLIST_HEADER"><![CDATA[<dd>
................
<part name="CATLIST_LISTITEM"><![CDATA[<dd>
................
<part name="COMMENTS_MANY"><![CDATA[Comments]]></part>

<part name="COMMENTS_NONE"><![CDATA[<div class="contentitem3">
................
<part name="COMMENTS_ONE"><![CDATA[Comment]]></part>

<part name="COMMENTS_TOOMUCH"><![CDATA[<div class="contentitem3">
................

<part name="EDITLINK"><![CDATA[<div class="contentitem4">
................
<part name="FORMAT_DATE"><![CDATA[%m/%d]]></part>

<part name="FORMAT_TIME"><![CDATA[%X]]></part>

<part name="IMAGE_CODE"><![CDATA[<%image%>]]></part>

■[テンプレートの編集] 'default/index'で表示される部分
<part name="ITEM"><![CDATA[<div class="contenttitle">
<h2><%date%>: <a href="<%itemlink%>" title="Read entry: <%title(attribute)%>"><%title(raw)%></a></h2>
</div>
<div class="contentitem">
<div class="contentitem1">
<small class="contentitemcategory">
Category: <a href="<%categorylink%>" title="Category: <%Category%>"><%Category%></a>
</small>
</div>
<div class="contentitem2">
<small class="contentitempostedby">
Posted by: <a href="<%authorlink%>" title="Author: <%author%>"><%author%></a>
</small>
</div>
<%comments%>
<%edit%>
</div>
<div class="contentbody">
<%body%>
<%morelink%>
</div>]]></part>
■ここまで

<part name="LOCALE"><![CDATA[en]]></part>

<part name="MEDIA_CODE"><![CDATA[<%media%>]]></part>

<part name="MORELINK"><![CDATA[<p>&raquo;
<a href="<%itemlink%>#more" title="Read more on &#39;<%title(attribute)%>&#39;">Read More</a>
</p>]]></part>

<part name="POPUP_CODE"><![CDATA[<%popuplink%>]]></part>

<part name="SEARCH_HIGHLIGHT"><![CDATA[<span class="highlight">¥0</span>]]></part>

<part name="SEARCH_NOTHINGFOUND"><![CDATA[No search results found for <b><%query%></b>]]></part>

</template>

■■テンプレートの編集 'default/item'
<template name="default/item">
<description>Nucleus CMS default item template</description>
<part name="COMMENTS_BODY"><![CDATA[<div class="itemcomment id<%memberid%>">
................

<part name="COMMENTS_MANY"><![CDATA[comments]]></part>

<part name="COMMENTS_NONE"><![CDATA[<div class="comments">No comments yet</div>]]></part>

<part name="COMMENTS_ONE"><![CDATA[comment]]></part>

<part name="EDITLINK"><![CDATA[<div class="contentitem4">
................

<part name="FORMAT_DATE"><![CDATA[%m/%d]]></part>

<part name="FORMAT_TIME"><![CDATA[%X]]></part>

<part name="IMAGE_CODE"><![CDATA[<%image%>]]></part>

■[テンプレートの編集] 'default/item'で表示される部分
<part name="ITEM"><![CDATA[<div class="contenttitle">
<h2><%date%>: <%title(raw)%></h2>
</div>
<div class="contentitem">
<div class="contentitem1">
<small class="contentitemcategory">
Category: <a href="<%categorylink%>" title="Category: <%category%>"><%category%></a>
</small>
</div>
<div class="contentitem2">
<small class="contentitempostedby">
Posted by: <a href="<%authorlink%>" title="Author: <%author%>"><%author%></a>
</small>
</div>
<%edit%>
</div>
<div class="contentbody">
<%body%><br /><br />
<a name="more"></a><%more%>
</div>]]></part>
■ここまで
<part name="LOCALE"><![CDATA[en]]></part>

<part name="MEDIA_CODE"><![CDATA[<%media%>]]></part>

<part name="POPUP_CODE"><![CDATA[<%popuplink%>]]></part>

<part name="SEARCH_HIGHLIGHT"><![CDATA[<span class="highlight">¥0</span>]]></part>

</template>

</nucleusskin>

ホント、スキン変数とテンプレート変数だ。こいつをパーサーが読んで組み直して...ってことかな。

2008年3月3日月曜日

NucleusとWordPressとBlogger.com

三つのブログのシステム

Googleが買収した Blogger.com(このブログが動いてるサイト)の、ブログシステムのインターフェイスは良くできていてなかなか使いやすい。

Blogger.comのユーザ・インターフェースのレイアウトはWordPressに似ているけど、テンプレート(=Nucleusのスキン)がHTMLなところは Nucleus似だ。しかし、HTMLで書かれたテンプレートにページ要素(=Nucleusのテンプレート)をはめ込むデザインは、Blogger.comの方が Nucleusよりシンプルに見える。

Blogger.comのページ要素はこんなのだ。
<b:widget id='Header1' locked='true' title='ブログタイトル (Header)' type='Header'/>
<b:widget id='Blog1' locked='true' title='ブログの投稿' type='Blog'/>
<b:widget id='AdSense1' locked='false' title='' type='AdSense'/>
<b:widget id='BlogArchive1' locked='false' title='ブログのアーカイブ' type='BlogArchive'/>
<b:widget id='Profile1' locked='false' title='自己紹介' type='Profile'/>

Blogger.comでは、スタイルシートは Nucleus/skins/defaultのdefault_left.css、nicetitle.css、default_right.cssみたいな外部スタイルシートではなくて、テンプレート自体の最初の方にダーッと書いてある。[HTMLの編集]で表示されるテンプレートファイル400行のうち、スタイルシートの部分が 350行、 <body></body>の部分は50行しかない。( [HTML の編集]ページの「テンプレートをダウンロード」で得た template-99999999999999999.xmlは、スタイルシートの部分は同じだけど <body></body>の部分は550行だった。)
blogger.comのtemplate-99999999999999999.xmlはこんな。
<?xml version="1.0" encoding="UTF-8" ?/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<html expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'/>
<head>
  <b:include data='blog' name='all-head-content'/>
  <title><data:blog.pageTitle/></title>
 <b:skin><![CDATA[/*
 ....css350行......
 ]]></b:skin>
</head>

<b:includable id='title'>
<b:if cond='data:imagePlacement == "REPLACE"'>
 ..........
<b:else/>
 ..........
</b:if>
</html/>
Nucleusのdefault/navigation.incはこんな。
<nucleusskin>
 <meta>
  <skin name="default" />
  <template name="default/index" />
  <template name="default/item" />
  <info><![CDATA[Nucleus CMS Default Skin]]></info>
 </meta>

<%if(skintype,archivelist)%>
 ..........
<%endif%> //....elseはないんだろうか

記述方法は違うがBlogger.comのテンプレートは skinbackup.xmlとイメージが似ている。考え方が近いんだろうけど、実現の仕方で違いが出たという感じみたい。でも、ページ要素(Nucleusのテンプレート)をドラッグして並べ替えられるとかインターフェイスに気合い入れてる。

Blogger.comのページは、WordPressやNucleusみたいにリクエストのたびに組み立てるのではなく、MovableTypeのようにスタティックのページを生成するように見える。スタティック生成のシステムはアクセスが多い時有利だ。だけど、そうだとするとテンプレートを変えたとき全ページの生成が行われることになるから、ユーザが沢山いてせっせとブログを更新するときは負荷が高まる。cssや js、includeなどの読み込む外部ファイルが沢山あると不要なオーバーヘッドが増えるから、ファイルをまとめてサーバーの負荷を減らしてるみたいだ。自前で作るとこういうとこまで対応できていいよね。
シンプルな構成で、使うファイルが少なければ、ファイルの読み込み時間からして少なくてすむよね。gzipでページを圧縮してるし、レスポンスの向上のためにできることはなんでもやるつもりみたいだ。ヘッドのシーク1回で準備が整うなら実行時間もHDDの消耗も電力消費もも少なくてすんで、エコでいいんじゃないかなぁ。

WordPress、Nucleus、Movable Typeの 動きを Google Trendで見てみた。

Movable Typeはどんどん利用者が減っているようでグラフでは0をめざしてるけど、日本ではWordPressより人気らしい。日本の標準、世界の非標準かな。携帯みたい。それにしても東アジアはすごいな。インドもWordPress、Nucleusを同じくらい使ってるぞ。

.....elseはないんだろうか
nucleus/libs/PARSER.phpのfunction doAction()中に、
107: if (!$this->handler->if_currentlevel && ($actionlc != 'else') && ($actionlc != 'elseif') && ($actionlc != 'endif') && ($actionlc != 'ifnot') && ($actionlc != 'elseifnot') && (substr($actionlc,0,2) != 'if'))
というのがあったから使えそうだ。

「バージョンアップで else が使えるようになった」とどっかで読んだんだけど、wordpressかと思った。 ... 混乱してる。caseだっけ。

2008年3月2日日曜日

Nucleus スペシャルスキンパーツで独立ページ

独立ページを作りたい

WordPressだと、投稿ページのほかに「ページ」というので共通のスキンを使った独立したページを作ることができる。これをNucleus でもやりたいもんだ。

[レイアウト設定]>[スキン編集]でスキンを選ぶと「編集」のページに「スペシャルスキン」という入力窓が現れる。

スキン & テンプレートには、スキンの種別は8つで、item(個別アイテム)、archive(アーカイブ)、archivelist(アーカイブリスト)、archivelist(アーカイブリスト)、search(検索)、member(メンバー)、imagepopup(ポップアップ画像)、index(メイン)とerror タイプだと書いてあった。それ以外の「スペシャル」だとするとこいつぁ怪しいぞ。

「スペシャルスキン」で検索すると、当たりだった。これで独立ページが作れるらしい。
最終的にTips & Suggestions
の下の方にHow to create a Special skin partが見つかった。
英語だけど、この際ないよりはマシ。

    How to create a Special skin part

  1. Enter the Nucleus admin area and go to Skins management page (Layout>Skins). Find your skin and click the Edit link in the right column.

  2. Under the list of skin parts there is a sections called Special skin parts. In the field type the name of your special skin part and then click the Create button. (I'm using the name 'About' for my example). You then get a Edit skin part form, just like for any other skin part, that you can add content, skin variables or anything else. If you want to make it look like the rest of your site, you can copy the contents of the Main Index skinpart here and replace the <%body(...)%> skin variable with the contents of the static page.

    For example, using the default skin, the contents of the About skin part would look something like this:

    <%parsedinclude(head.inc)%>

    <!-- page header -->
    <%parsedinclude(header.inc)%>
    ...............
    コードがダーっと書いてあって、
    ...............
    <!-- page menu -->
    <h2 class="hidden">Sidebar</h2>
    <div id="sidebarcontainer">
    <%parsedinclude(sidebar.inc)%>
    </div>

    <!-- page footer -->
    <%parsedinclude(footer.inc)%>

  3. Now to access this page, you would point your browser (or put a link in your skin somewhere) to

    www.yourdomain.tld/index.php?special=About
  4. You can edit this skin part just as you would any other skin part and most skin variables and plugins will probably work.

    Note: You may want to keep your static content in a file called About.html in the skins/default/ directory (if using the default skin) and instead of typing the content of the page in the skin part, just put <%include(About.html)%>. There's almost no restriction on what these pages can contain.
一応exciteの翻訳窓に放り込んでみた。
でも「どうSpecial皮膚部分を作成するか。」はあんまりなので、S/皮膚/skin。
    どうSpecialSkin部分を作成するか。

  1. Nucleusアドミン領域に入ってください、そして、Skins管理ページ(レイアウト>スキン)に行きます。 Skinを見つけてください、そして、正しいコラムをEditリンクをクリックします。

  2. Skinの部品のリストの下では、SpecialSkinの部品と呼ばれるセクションがあります。 分野に、あなたの特別なSkin部分の名前をタイプしてください、そして、次に、Createボタンをクリックします。 (私は例に名前'About'を使用しています。) 次に、あなたはまさしくいかなる他のSkin部分などのようなEditSkin部分フォームも得て、内容、Skin変数または他の何かを加えることができます。 それをあなたのサイトの残りに似させたいなら、あなたは、静的なページのコンテンツにここにMain Index skinpartのコンテンツをコピーして、<%本体( )%>Skin変数を置き換えることができます。
    例えば、デフォルトSkinを使用して、AboutSkin部分のコンテンツはこのように見えるでしょう:
全然わからない。ますます混乱しちゃう。
とにかくやってみる。
[レイアウト設定]>[スキン編集]で、いま使っている「greygradient」の「編集」をクリックする。


「スキンの編集 'greygradient'」の画面で「スペシャルスキンパーツ」に、新しいスキンパーツ名を入力し「作成」をクリックする。


「スキンの編集 'greygradient': About」にHow to create a Special skin partにあったコードをコピーする。


「スキンの更新」をクリックする。
「メッセージ: スキンデータが保存されました」と表示された。

[レイアウト設定]>[スキン編集]に戻ると「Special1」というスキンが増えた。


http://192.168.0.999/~nucleus/index.php?special=About
でスペシャルスキンのページが表示された。


今後の課題:
スペシャルスキンをサイドバーの目次に表示する。

疑問:スペシャルスキンのデータはどこにしまわれるのだろう。
探した:「データベース: nucleus1 - テーブル : nucleus_skin」の中に、スキン/greygradientで、スキンタイプ/aboutというレコードができていた。

間違いはこちら

[レイアウト設定]>[スキン編集]で「新しいスキン」を作って、その中に。「スペシャルスキンパーツ」を作る。
[レイアウト設定]>[スキン編集]に「Special1」というスキンが増えるが、表示できない。


http://192.168.0.999/~nucleus/index.php?special=About
「スキン エラー」だけ。
で期待の画面が表示されない。

[管理ホーム]>[Nucleus Blog 1]の「設定」で
「標準のスキン」を「Special1」にしたら、期待の画面が表示される。

スキンというから、新しいスキンセットから作って、その中に Aboutというスキンを作ったのね。(- -);

2008年3月1日土曜日

Nucleus スキンとテンプレート

Nucleusの秘密を暴きたいんだけど.....

スキン & テンプレートの「テンプレートとスキンの相互関係」 に、

スキン とは出力する内容(タグを含むソース)を定義するものです。1つのスキンでもいくつかの種別ごとに定義が必要で、メインページや個別アイテムページ、アーカイブページなど(標準で8タイプ)があります。 スキン内の定義内容は、どの部分にblogデータを展開するのか、どのテンプレートを使用して展開するのかなどの指定を含みます。

とある。
「8種類」というは、[レイアウト設定]の[スキン編集]に出てくる、「定義済みパーツ:」の
  1. メインの目次ページ
  2. 個別アイテムページ
  3. 月別アーカイブ一覧ページ
  4. 月別アーカイブページ
  5. 検索ページ
  6. エラーページ
  7. メンバー詳細ページ
  8. 画像ポップアップウィンドウ

のようだ。

スキン=ブログの各ページの構造(レイアウト)を表すもので、標準で8種類のページパターンがある。blogger.comでいうテンプレート。

テンプレート=MySqlにしまわれているデータを流し込んで表示するブロック部分みたいなもの。blogger.comでいうページ要素。
...ということでよいのだろうか。

Nucleusの動く仕組みが分かってくれば理解できるのかも知れない。
  • 最初に読まれるのは、「index.php」
    index.phpは ..... config.phpを読む。

  • config.phpは ..... globalfunctions.phpを読む。

  • globalfunctions.phpは、以下を読む
    include($DIR_LIBS . 'mysql.php');
    include($DIR_LIBS . 'MEMBER.php');
    include($DIR_LIBS . 'ACTIONLOG.php');
    include($DIR_LIBS . 'MANAGER.php');
    include($DIR_LIBS . 'PLUGIN.php');

    include($DIR_LIBS . 'xmlrpc.inc.php'); // XML-RPC client classes
    include_once($DIR_LIBS . 'ADMIN.php');

    include($DIR_LIBS . 'PARSER.php');
     PARSER.phはrequire_once dirname(__FILE__) . '/BaseActions.php';

    include($DIR_LIBS . 'SKIN.php');
     SKIN.phpはrequire_once dirname(__FILE__) . '/ACTIONS.php';

    include($DIR_LIBS . 'TEMPLATE.php');
    include($DIR_LIBS . 'BLOG.php');
    include($DIR_LIBS . 'BODYACTIONS.php');
    include($DIR_LIBS . 'COMMENTS.php');
    include($DIR_LIBS . 'COMMENT.php');
    //include($DIR_LIBS . 'ITEM.php');
    include($DIR_LIBS . 'NOTIFICATION.php');
    include($DIR_LIBS . 'BAN.php');
    include($DIR_LIBS . 'PAGEFACTORY.php');
    include($DIR_LIBS . 'SEARCH.php');
    include($DIR_LIBS . 'entity.php');

    include_once($DIR_LIBS . 'ACTION.php');

    include($filename); //apacheとphpのトークンみたい

    include($DIR_LANG . ereg_replace( '[\\|/]', '', $language) . '.php');
    include($DIR_LIBS . 'PLUGINADMIN.php');

    include_once($DIR_LIBS.'mb_emulator/mb-emulator.php');
    ..............
    いろいろ進んで...
    ..............
  • globalfunctions.phpの中のselector()が呼び出される。
    ..............

    $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';
    $xml_file = $dir . $filename . '/skinbackup.xml';

  • ともあれ skinbackup.xml、skindata.xmlにたどり着く。
    nucleus/libs/ADMIN.phpや、nucleus/libs/skinie.phpが、skinbackup.xml、skindata.xmlを読み込む。
  • スキン & テンプレートにあるように、skinbackup.xmlがスキンのかなめになる。(らしい)

nucleus/libs/TEMPLATE.phpに

function fill($template, $values) {

if (sizeof($values) != 0) {
// go through all the values
for(reset($values); $key = key($values); next($values)) {
$template = str_replace("<%$key%>",$values[$key],$template);
}
}

// remove non matched template-tags
return preg_replace('/<%[a-zA-Z]+%>/','',$template);
}

があった。ここが Nucleus変数/テンプレート変数が、解釈される第一歩か。
ACTION.php、ADMIN.php、BLOG.php、MEMBER.php、BODYACTIONS.phpでfill()を呼んでいる。
細かいことまで理解する必要はないけど、動作概念くらいは知っておきたいもんだ。
.