2008年5月28日水曜日

WordPress 2.5.1 アップグレード

adminでLoginすると、「アップグレードしろ」という文章がでている。
ずっと延ばしてきたがここでアップグレードする。
アップグレードの手順などはここを参照したのだ。

アップグレードの実際


まずは、
1. バックアップをとる
  # cp -pr www/WordpressDir backup/wordpress.25
 今のwordpressを丸ごとバックアップしておく。

2. プラグインを停止する
  使っているプラグインを覚えておく。

3. アップグレードファイルをダウンロードする
  ファイルは http://ja.wordpress.org//wordpress-2.5.1-ja.zip にある。
 これを作業エリアにダウンロードして展開する。
 今回はすべてサーバー上で作業してみたい。
  ftp ja.wordpress.org は接続できないので wgetでダウンロードした。

 a. wgetでダウンロードする。
# wget http://ja.wordpress.org/wordpress-2.5.1-ja.zip
--09:44:33-- http://ja.wordpress.org/wordpress-2.5.1-ja.zip
=> `wordpress-2.5.1-ja.zip'
Resolving ja.wordpress.org... 72.233.56.138, 72.233.56.139
Connecting to ja.wordpress.org|72.233.56.138|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,570,465 (1.5M) [application/octet-stream]

100%[====================================>] 1,570,465 32.87K/s ETA 00:00

09:45:03 (51.15 KB/s) - `wordpress-2.5.1-ja.zip' saved [1570465/1570465]

 b.展開する。
  # unzip wordpress-2.5.1-ja.zip
     ディレクトリ wordpressが作られ、その中に2.5.1が展開される。

4. 現在のwordpressを削除する
  # rm -r www/WordpressDir/*

5. アップグレードするwordpress2.5.1をセットする
  # cp -pr WorkDir/wordpress www/WordpressDir/.

6. 以前の設定ファイルを戻す
  # cp -pr backup/wordpress.25/wp-config* www/WordpressDir/.

7. プラグイン、テーマファイルを戻す
   # cp -pr WorkDir/back/wordpress.25/wp-content www/WordpressDir/.

8./wp-admin/upgrade.phpにアクセスする
    「データベース更新」の指示が出た。指示通り実行する。

9. adminでLogin
    プラグインを「使用」に変更する。

これでおしまい。
あんまりモディファイするとアップグレードが面倒なのね。
アップグレードは簡単だけど、メモっておくと手間いらず。

2008年4月25日金曜日

wordplessの引っ越し

wordpressのブログを別のサーバーに引っ越しさせる。

wordpressの本体と、wordpressが使うデータベースに分けて考える。
まずwordpressを動かして、次にデータベースを持ち込む。
それから、wordpressのカスタマイズ部分を手当てする。

  1. 引っ越し先サーバーに wordpress をインストールする。
    a. データベースを作成
    mysql> create database wordpless1; <-- WordPress用データベースを用意

    mysql> show databases; <-- wordpress用データベースを確認
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | wordpless1 | <-- これができた
    +--------------------+

    元のサーバーと同じユーザを作成する。

    mysql> grant ALL on wordpless1.* to myuser3@localhost identified by 'passwd12letter'; <-- ユーザを設定する

    mysql> show grants for myuser1@localhost <-- 設定確認
    +---------------------------------------------------------------------------+
    | Grants for myuser3@localhost |
    +---------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'myuser3'@'localhost' IDENTIFIED BY PASSWORD '*332F79912345626ABCDEF588C71E453F85' |
    | GRANT ALL PRIVILEGES ON `wordpless1`.* TO 'myuser2'@'localhost' |
    +---------------------------------------------------------------------------+

    b. wordpressをインストール
     wordpress-2.5-ja.zipを展開してインストールする。
    c. configファイルを準備する
     元サーバーのwp-config-sample.php を新サーバーに保存する。
    d. wordpressにログインして内容を確認する。
    新規作成させるユーザでloginし、今までのサーバーに登録されていたユーザを登録する。
    最後に、登録したユーザでログインし直し、スーパユーザを再設定する。

  2. 今までのサーバーからデータを抜き出す

    a. phpmyadminにログインし、データベースwordpless1を選ぶ。
     「エクスポート」の形式「SQL 」をチェック(選択)する。
     「ファイルで保存する」をチェック(選択)する。
     あとはdefaultのまま。
    「実行する」のクリックで、localhost.sql が書き出された。

  3. 引っ越し先サーバーにデータを入れる。
    a. phpmyadminにログインする。
    b. 書き出された localhost.sql をインポートする。

  4. wordpressにログインして、登録内容と記事を確認する。
  5. 元サーバーで使っていたテーマとプラグインを入れる。
    a. 元サーバーからテーマとプラグインをダウンロードする。
    b. 新サーバーにテーマとプラグインを入れる。

  6. wordpressにログインして、テーマとプラグインを設定する。

簡単だった。
....ホントは順番を間違えて1回失敗した。

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()を呼んでいる。
細かいことまで理解する必要はないけど、動作概念くらいは知っておきたいもんだ。
.

2008年2月29日金曜日

Nucleus アーカイブをリスト表示 + NP_ListArticlesByNameプリフィックス対応

Nucleusでもアーカイブのリスト表示

wordPressでできたんだから、Nucleusでもアーカイブをリストで表示したい。

プラグインを探しにいこう。
プラグイン一覧(機能カテゴリー別)iには無いらしい。本家にいってみる。
「プラグイン・カテゴリ別」の中にanandさんが作った
NP_ListArticlesByName.php
   A plugin which will allow you to list recent articles by name.
があった。フォーラムに置いてあると書いてある。
フォーラムにはphpのコードと説明が載っている。「(コード)をコピーして、『NP_ListArticlesByName.php』という名前でセーブしろ」と書いてあった。
早速その通りにしてファイル「NP_ListArticlesByName.php」を作る。

ftpで nucleus/plaginにNP_ListArticlesByName.phpアップロードして、[サイト管理][プラグイン管理]で「プラグインのインストール」をすると、エラーがでた。
Parse error: syntax error, unexpected '"', expecting ',' or ';' in /home/nucleususer/www/nucleus/plugins/NP_ListArticlesByName.php on line 40

40: echo "<a href=¥"".$itemlink."¥">".$row['title']."</a>";
UTFで保存したので、¥がだめそう。
40: echo '<a href="'.$itemlink.'">'.$row['title'].'</a>';
に変更し、他の場所も同じように直す。
「プラグインの管理」ページを再読み込みすると、「List articles by name」のプラグインが増えた。

スキンの書き換え

サイドバーにArchiveのタイトルを表示したい。
「NP_ListArticlesByName」はスキン変数だから、スキンにいれるんだろう。
[プラグイン]の[スキンファイル]で、今使っているスキン grey_gradient の sidebar.incにコードを挿入してみる。

作者のanandは挿入するコードを、
  <%plugin(ListArticlesByName(50))%>...(50アイテム表示なら)
と書いていたが、あとで Trentが
  <%ListArticlesByName(50)%>
がいいと書いていた。Trentのコードを使うことにする。

「ファイルの編集 sidebar.inc」でコードを見るけど、Navigationという場所が沢山あってどこにいれたらいいか迷ってしまう。
<!-- search: navigation -->
<%if(skintype,search)%>
<dd><a href="<%todaylink%>" title="Today's entry">Today</a></dd>
<dd><a href="<%archivelink%>" title="Archives">Archives</a></dd>
<%endif%>

<dd><%ListArticlesByName(50)%></dd>//ここに入れてみる。

<!-- admin link, only visible if logged in -->
<%if(loggedin)%>
<dd><a href="<%adminurl%>" title="Admin Area">Admin</a></dd>
<%endif%>
</dl>
</div>

「保存」を押す。
....「メッセージ: ファイル sidebar.inc を保存しました。」と表示された。

最初はこんな。


さて、ページを再読み込みすると、
おーっ! リストだぁ。やったね。

まだローカルのテストマシンで動かしているので、実際に見てもらえなくてごめんなさい。

「NP_ListArticlesByName」は55行のプラグインなのでコードが一目瞭然だから、Nucleusの動きが少しわかったような...。
「プラグインのインストール」を押すと、プラグインを追加するプログラムがコードを確かめて、NP_を外した「ListArticlesByName」をどっかの定義場所に追加しているみたいだ。プラグインは、MySqlのnucleusのデータベースのテーブルnucleus_pluginに登録されてるらしい。Nucleusのタグを解釈しながらページを組み立ててるんだ。きっと。
ページを表示するとき、<%ListArticlesByName(50)%> があったら、NP_ListArticlesByName.phpをIncludeするとかそういうことかな。
登録してあるNP_ListArticlesByName.phpを無理矢理削除すると、アーカイブリストが表示されなくなるから、nucleus/plagin/NP_ListArticlesByName.phpを、表示のたびに読んでいるらしい。

今後の課題:
wordPressでやったように、NP_ListArticlesByName.phpに <select>要素を書けば、ドロップダウンで表示できるかも。

不具合発見:
「grey_gradient」の「Navigation」の「Previous Item」と「Next Item」は表示が逆みたいだ。
「Previous Item」をクリックすると、次のアイテムが表示されちゃう。
後で直さなきゃ。

あれ?:
www2.blogger.comは昨日の11:40ごろ(日本時間2008.02.28 11:40)サーバーが反応なかったけど何かあったのかな。気のせいかその後動きが少し悪いような気がして。


追加:プリフィックスをつけたテーブルがあると不具合
別のマシンでNP_ListArticlesByName.phpをテストをしたら、
Error!

プラグインが読み込めませんでした。もくは、使用中の Nucleus 上で動作させるために必要な機能が、プラグインでサポートされていません。(管理操作履歴に詳細があります。)
というエラーが出てプラグインとして組込めない。

管理操作履歴には
2008-03-01 20:14:43 [sample1] Plugin NP_ListArticlesByName was not loaded (does not support SqlTablePrefix)
と書かれていた。
NP_ListArticlesByName.phpは プリフィックスに対応していないらしく、プリフィックスチェックが行われていないようだ。

NP_ListArticlesByName.phpに
function supportsFeature($feature) {
switch($feature) {
case 'SqlTablePrefix':
return 1;
default:
return 0;
}
}
を挿入する。
これでエラーが消え、NP_ListArticlesByName.phpがインストールされた。

実行時(表示時かな)すると、プリフィックスをつけたテーブルにより不具合がでる。
mySQL error with query SELECT i.inumber as itemid, i.ititle as title FROM nucleus_item as i WHERE i.iblog=1 and i.idraft=0 and i.itime<="2008-03-01 21:31:07" ORDER by itime DESC LIMIT 0,50: Table 'nucleus.nucleus_item' doesn't exist <- ホントは'nucleus.nc1_nucleus_item'

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/sample1/web/nucleus/nucleus/plugins/NP_ListArticlesByName.php on line 45
 35: . ' FROM nucleus_item as i'

 35: . ' FROM '.$MYSQL_PREFIX . 'nucleus_item as i'
に変更し、

 global $MYSQL_PREFIX;

を追加してupload。「登録リストのアップデート」をクリックして、登録し直す。



追加:プリフィックスをつけたテーブルがあると不具合を増やしたので、
以前このページに置いていた調べたついでは、いずれ別ページに掲載の予定。

2008年2月27日水曜日

WordPress アーカイブをリストで表示したい

サイドバーでアーカイブの年月を表示しているのは、
<?php //wp_get_archives('type=monthly'); ?>
type=monthlyで年月がでるなら
type=listとかなんとかできないないものか。

探したら、Main_PageのDesign and Layout
Template TagsのGeneral tagsに、wp_get_archives()の説明があった。


  1. 12ヶ月を表示するなら、
    <p><?php wp_get_archives('type=monthly&limit=12'); ?></p>

  2. 15日表示するなら、
    <p><?php wp_get_archives('type=daily&limit=15'); ?></p>

  3. 最後の投稿20個なら
    <p><?php wp_get_archives('type=postbypost&limit=20&format=custom'); ?></p>

  4. ドロップダウンボックスは
    <select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'>
    <option value=""><?php echo attribute_escape(__('Select Month')); ?></option>
    <?php wp_get_archives('type=monthly&format=option&show_post_count=1'); ?> </select>

と書いてある。
それぞれを、
<?php //wp_get_archives('type=monthly'); ?>
と入れ替えてみるとしっかり動く。

ということは、全部の記事をドロッブダウンさせるには、
<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'>
<option value=""><?php echo attribute_escape(__('Select Month')); ?></option>
<?php wp_get_archives('type=postbypost&format=custom'); ?>
</select>
でいけるかも。


さっそくsidebar.phpの
<?php //wp_get_archives('type=monthly'); ?>
の場所に入れてみる。



<?php //wp_get_archives('type=postbypost&limit=20&format=custom'); ?>

<select name="archive_option" onChange='document.location.href=this.options[this.selectedIndex].value;'>
<option>Archives</option>
<?php wp_get_archives("format=option&type=postbypost"); ?>
</select>

こういう選択場所が現れた。

wp_get_archives2.png

ここで選ぶとそのページが表示される。
ごきげん!

2008年2月26日火曜日

Nucleus プラグインを追加する(2)

簡単なプラグインでウォーミングアップしてみる。
「カレンダーをスキンに追加する」これが今回の目標。

プラグインをインストール

np_calendar_v085.zip をダウンロードする。

インストール方法
 1. Zipファイルを展開して、中身をサーバーのプラグインディレクトリにアップロードします
 2. 管理画面からプラグインをインストールします
 3. スキンの適当な場所に、”<%Calendar%>”を挿入します

だって。「 <%Calendar%>」を書き込めばよさそうだ。

ftpで nucleus/plaginにアップロードする。
[サイト管理][プラグイン管理]で「プラグインのインストール」をする。


「Calendar Plugin」のプラグインが増えた。


せっかくだから「編集」で中をのぞいてみる。

とりあえずdefaultのままにしておく。

スキンかテンプレートの書き換え

よく見かけるやつ。サイドバーにカレンダーを置きたい。
[プラグイン]の[スキンファイル]で、今使っている grey_gradient のフォルダをクリックする。

サイドバーはsidebar.incなように思える。

カレンダーを置くために、sidebar.inc の「編集」をクリックする。
「 <%Calendar%>」を入れたい場所に書く。...まだよく理解していないけど。 (--);
「Search」の下「Log in」の上あたりに入れたいもんだ。
sidebar.incを変更したくても、パーミッションが変更可能になっていないと[アクション]が空白になって、「編集」が選べない。
chown -R www-data grey_gradient



<!-- search: navigation -->
<%if(skintype,search)%>
<dd><a href="<%todaylink%>" title="Today's entry">Today</a></dd>
<dd><a href="<%archivelink%>" title="Archives">Archives</a></dd>
<%endif%>

<!-- admin link, only visible if logged in -->
<%if(loggedin)%>
<dd><a href="<%adminurl%>" title="Admin Area">Admin</a></dd>
<%endif%>
</dl>
</div>

「search」「logged in」という部分があった。ここに入れてみる。

<%Calendar%>だけじゃ寂しいので上下に合わせて書きたいが、条件分岐の条件のskintypeがわからないので <!-- bloglist-->の真似をする。
だめだったら戻せばいいのだ。

<!-- search: navigation -->
<%if(skintype,search)%>
<dd><a href="<%todaylink%>" title="Today's entry">Today</a></dd>
<dd><a href="<%archivelink%>" title="Archives">Archives</a></dd>
<%endif%>

<!-- admin link, only visible if logged in -->
<%if(loggedin)%>
<dd><a href="<%adminurl%>" title="Admin Area">Admin</a></dd>
<%endif%>
</dl>
</div>

カレンダーがでた。

でもタイトルの部分が消えちまった!
だめじゃん。

タイトルが消えたgrey_gradientを戻す

まずは元の状態に戻したい。
sidebar.incから該当部分を削除したが、カレンダーは消えたけどタイトルも消えたままだ。
greygradient_skin.zipをもう一度 unzipするがやっぱり元に戻らない。

[レイアウト編集]の[読込/書出]でもう一度「greygradient」を読み込む。

スキンとテンプレートを読み込もうとしています
情報:
ファイル内のスキン: greygradient
ファイル内のテンプレート: greygradient/index and greygradient/item
次のスキン名がぶつかります: greygradient
次のテンプレート名がぶつかります: greygradient/index and greygradient/item

と出たが「はい、これを読み込みます」をクリックする。

[管理ホーム]でブログの[設定]で、「greygradientを」選ぶ。
greygradientが直ってタイトルが表示された。

defaultのスキンの sidebar.incに同じ方法で設定してみる。

<!-- Calendar -->
<div class="sidebar">
<dl class="sidebardl">
<dt>Calendar</dt>
<%Calendar%>
</dl>
</div>


カレンダーが表示された。タイトルも問題なく表示されている。

気を取り直してもう一度 greygradient の sidebar.incに同じコードを設定してみる。

<!-- Calendar -->
<div class="sidebar">
<dl class="sidebardl">
<dt>Calendar</dt>
<%Calendar%>
</dl>
</div>

うまく表示された。なぜだかはわからない。


カレンダーの表示を整える

カレンダーの数字の位置が左寄せになっている。
np_calendar_v085.zip にあった、

Tips and Tricks
To customize the output, please add similar code to the CSS file
table.calendar {
font-size: small;
color: black;
}

tr.calendardateheaders {
font-size: small;
color: red;
}

td.days {
text-align: center;
}

td.today {
text-align: center;
color: green;
background-color: whitesmoke;
}


を入れれば直りそう。


default_right.cssに

/* Menu lists */
.sidebardl

と書いてある。サイドバーはこいつが管理しているらしい。ここの一番下に入れると文字の表示が変わった。

環境

Debian GNU/Linux Etch 2.6.18
mysql- 5.0.32
phpmyadmin 2.9.1
nucleus 3.3
wordpress 2.3.3

2008年2月25日月曜日

Wordpress プラグインを追加する

一方 Wordpress は....プラグインの追加

決まったページをトップページとして表示したい。
Static Front Pageがあった。
はじめはこんな。


wp-content/pluginsにプラグイン「Static Front Page」をアップロードする

ftpが Permission deniedでアップロードできないときは所有者かパーミッションを変える。

# chown sample1:sample1 plugins/

# ls -l
-rw-r--r-- 1 root root 30 May 5 2007 index.php
drwxr-xr-x 2 root root 1024 Feb 6 20:06 languages
drwxr-xr-x 3 sample1 sample1 1024 Feb 6 20:06 plugins
drwxr-xr-x 8 sample1 sample1 1024 Feb 21 22:17 themes
drwxrwxrwx 3 www www 1024 Feb 21 22:26 uploads


# ls -l plugins/
drwxr-xr-x 2 root root 1024 Feb 6 20:06 akismet
-rw-r--r-- 1 root root 2136 Feb 6 20:06 hello.php
drwxr-xr-x 2 sample1 sample1 1024 Feb 22 22:26 sem-static-front

ページをリロードするとアップロードしたプラグインが表示される。

動かすには「使用する」をクリックする。

こうなる。


新しいページを追加してみる。
ヒントはStatic Front Pageにあった、
Defult Usage

Create a static page (Write / Page) called "Home", and another called "Blog".

That's it, you're done…

You can safely rename the two pages after you've created them: What really counts are the pages' slugs, which needs to be "home" and "blog" respectively.

The plugin removes the home page from page lists, and changes its permalink to your blog's url to avoid duplicate content.

Your site will resume to its default behavior if no home page is available.

「Home」というページを作って、スラッグに「home」と入れてみる。

ブログを表示すると、「Home」というページが現れた。


WordPressのスキン、プラグインは、入れればうごくお手軽タイプみたいだ。

Static Front Pageには、
DAdvanced Usage
Customizing the template

You can assign a template to the home page as you would for any other static page.

If you do not, the plugin will resume with your theme's home.php template, if any.

When you are customizing other php files, note that the home page answers to is_home() rather than is_page().

The blog page searches for a blog.php file in your template folder.
というのもあったけど、そのうちに。

環境

Debian GNU/Linux Etch 2.6.18
mysql- 5.0.32
phpmyadmin 2.9.1
nucleus 3.3
wordpress 2.3.3