Drupalのサイト構築 

Drupalをインストールしてから最初につまずいたのは独特の用語。 そしてメニューの作成の仕方。
インターネットで検索してもモジュールの追加やテーマのことは書いてあっても、基本的な使い方が書いてあるところが見つからなかった。本を探しても英語の本しか見つからないし、英語は苦手なので無理。もちろん本家のフォーラムとかは英語なので無理。 これは困った。自分で色々試してみるしかなかった。

デフォルトで表示されているナビゲーションは管理メニューなんかも付いていてウザイ。だけど非表示にしたら今度は管理メニューに行くにはURLを直接叩くことになって面倒。 プライマリーリンクって何?どう使えばいいの? 独自のメニューを作るには?
 色々思考錯誤していたらだんだん分かってきたので、ここで一旦まとめてみようと思う。

ブログ、ブック、ページ、ストーリーの違い


最初に戸惑ったのは「どれで記事を書きゃいいの?」ということ。 記事を書こうとすると、どのフォームへ行っても似たようなフォームで「何がどう違うの?」と思ってしまった。 それぞれ意味があって、フォームは似ていても表示の仕方やページの移動の仕方が違う。

ブログ:
これは今となっては一番分かりやすい。日記のような記事を書く時に使う。 新着順に表示されるので、サイトによっては更新記録とかにも使える。


ブック:
これが一番よく使うと思う。 他との大きな違いは「上位」や「優先順位」というフォームがある。これで記事の順序や階層をつけるのである。ページの順序を自由に変えられ階層も付けられるので、ひとまとまりの記事にいい。 例えば、サービス概要やサイトの使い方など後から記事が追加されるようなものに向いている。また、タクソノミーモジュールを上手く使えばちょっとしたデータベースとしても使える。


ページ:
これはDrupalの説明にもあるように静的なページに使う。 会社概要とかプライバシーポリシーとか。


ストーリー:
これがややこしいというか、違いが分からなかったもの。
機能はほとんどブログと同じで新着順に表示されて、それぞれのストーリーに順番は付けられない。ページも同じと言えば同じなんだけど…。


ブログは個人が発言しているので執筆者名が主張されていて、ストーリーはされていないということらしい。確かに、ブログで記事を書くと「○○さんのブログ」というリンクが作成されて、ナビゲーションにも「マイブログ」というメニューがあるので個人が書きやすい。「最近のブログ投稿」というブロックもある。
対してストーリーはメニューに関連付けない限りアクセスしづらく、投稿者も主張してない。自分の記事という感じではない。
参考:http://perltips.twinkle.cc/drupal/index.php#001213


でも、ブログ以外も「投稿者」が表示されているのでなんだか見た目はブログみたいだ。ややこしいので、後でこの投稿者の表示を消そうと思う。


独自管理メニューの作成


デフォルトでは「ナビゲーション」に管理メニューとコンテンツメニューが一緒になっていて、ややこしいので管理メニューとコンテンツメニューを分けようと思う。

1.ロールに管理者を追加
ログイン > 管理セクション > ユーザ管理 > ロール
ここで管理者のロールを追加します。日本語でもOK。 追加したら「権限の編集」で全ての権限を与えておく。


2.管理者権限を与える
管理セクション > ユーザ管理 > ユーザ
へ行き、管理メニューを使わせたいユーザに管理者権限を与える。 与えたいユーザの右にある「設定」をクリックし、「ロール」の「管理者」にチェックを入れる。


3.管理メニューを作る
管理セクション > サイトの構築 > メニュー
ここでメニューの追加を行なう。 タイトルは「管理メニュー」とかにする。 そしたら 
サイトの構築 > メニュー 
に戻って 管理メニューというメニューができているので 「項目の追加」をクリック。 管理メニューに追加したいリンクを追加する。
例えば、


タイトル:管理TOP
パス:admin
上位の項目:管理メニュー


タイトル:ユーザー管理
パス:admin/user
上位の項目:管理メニュー


という風に。


4.管理メニューブロックを設定
管理セクション > サイトの構築 > ブロック
ブロック設定画面へ行くと、新しいブロック「管理メニュー」ができているので設定する。 「設定」ボタンを押し、「ロール固有の表示設定」で最初に作成した「管理者」にチェックを入れる。


5.管理メニューブロックを表示させる
再び 管理セクション > サイトの構築 > ブロック
に行き、管理メニューを表示させたい領域を選択して「ブロックの保存」を押せば完成。 ここで「ナビゲーション」メニューを非表示にしてもいいが、ログアウトができなくなる(URL直叩きすればできる)ので、まだしない。


マイメニューの作成


管理メニューと同じようにメニューを作成するのだが、こっちは権限を設定しなくても最初からログインユーザには「authenticated user」というのがあるので、少し楽かな。

1.マイメニューを作る
管理セクション > サイトの構築 > メニュー
ここでメニューの追加を行なう。 タイトルは「マイメニュー」とかにする。 そしたら サイトの構築 > メニュー に戻って マイメニューというメニューができているので 「項目の追加」をクリック。 マイメニューに追加したいリンクを追加する。


例えば、


タイトル:アカウント情報
パス:user
上位の項目:マイメニュー


タイトル:ログアウト
パス:logout
上位の項目:マイメニュー


という風に。


2.マイメニューブロックを設定
管理セクション > サイトの構築 > ブロック
ブロック設定画面へ行くと、新しいブロック「マイメニュー」ができているので設定する。 「設定」ボタンを押し、「ロール固有の表示設定」で「authenticated user」にチェックを入れる。


3.マイメニューブロックを表示させる
再び
管理セクション > サイトの構築 > ブロック
に行き、マイメニューを表示させたい領域を選択して「ブロックの保存」を押す。 ここで「ナビゲーション」メニューを非表示にすれば完成。


と思いきや、不具合が残っていた。 「authenticated user」にだけチェックを入れれば、ログアウトすればマイメニューは表示されないはず。なのになぜか表示される。「ログアウト」は消えるけど「アカウント情報」は表示されてしまう。ブロックの「ページ固有の表示設定」にPHPでログインしているかのチェックを入れても、テーマに直接PHPを書いても効果がない。ハマッた…。


結局、これを非表示にするにはDrupalのソースを直接いじるしかなかった…。
参照:http://drupal.org/node/77414#comment-148719


drupal/includes/menyu.inc
1148行目あたりから


function _menu_item_is_accessible($mid) {
$menu = menu_get_menu();

// Follow the path up to find the first "access" attribute.
$path = isset($menu['items'][$mid]['path']) ? $menu['items'][$mid]['path'] : NULL;

// ここから追加
if (substr($path, 0, 5) == 'node/') {
$nid = substr($path, 5);
if (is_numeric($nid)) {
$node = node_load($nid);
return node_access('view', $node);
}
}
// ここまで追加

while ($path && (!isset($menu['path index'][$path]) || !isset($menu['items'][$menu['path index'][$path]]['access']))) {
$path = substr($path, 0, strrpos($path, '/'));
}
if (empty($path)) {
// Items without any access attribute up the chain are denied, unless they
// were created by the admin. They most likely point to non-Drupal directories
// or to an external URL and should be allowed.
return $menu['items'][$mid]['type'] & MENU_CREATED_BY_ADMIN;
}
return $menu['items'][$menu['path index'][$path]]['access'];
}

これでログインしないとマイメニューが表示されないようになる。 Drupalのソースを直接いじったので、Drupalのバージョンアップ時には気をつけよう。

 


マイメニューに「こんにちは○○さん」と表示させる


これは結構簡単。テーマを修正するだけ。

1.マイメニュー用テーマを作成する
今使用しているテーマの「block.tpl.php」を複製し、ファイル名を「block-menu-(マイメニューのメニューID).tpl.php」とする。 マイメニューのメニューIDは、マイメニューのブロックを編集しようとすればURLの最後にIDが表示される。↓
http://mydomain.com/admin/build/block/configure/menu/(ここにIDが表示される)


2.マイメニュー用テーマを編集する
マイメニューのテーマファイルを開き、以下のように修正する。


<div class="dbx-box" id="<?php print 'block-'.$block->module.'-'.$block->delta ?>">

<?php if ($block->subject): ?>
<h3 class="dbx-handle"><?php print $block->subject ?></h3>
<?php endif;?>

<div class="dbx-content">
こんにちは<?php global $user; print $user->name ?>さん
<?php print $block->content ?></div>
</div>

 


3.マイメニュー用テーマをアップロードする
今使用しているテーマフォルダ内にアップロードすれば完成。

Drupalを使おう! 

無料で使えるオープンソースのCMSとして xoops や Movable Type は有名だが、私はあまり好きじゃない。xoops は重いし、Movable Type はライセンスが微妙。何かいいCMSはないかな〜と探していたところ、いいのを発見。

Drupal(ドルーパルと読むらしい)
http://drupal.jp/

あんまり余計な機能が入ってなくて、構造はすごくスッキリしている。
すごく柔軟な対応が可能で、どんなサイトにも使えそうだ。

しかし、残念なことにドキュメントがほとんどなく、インストール後の使い方説明などがほとんど存在しない。下記サイトにインストールガイドやモジュールなどの説明はあるが、使ってみないと何をどうしたらどうなるのか、何ができるのかさっぱり分からない状態。

Drupal-jBox.net | Drupal日本語情報集約サイト
http://drupal-jbox.net/
まだまだドキュメントは少ないですが、今後増えていきそうな感じで期待できそう。

Drupal.0829.info | Drupal についての Note
http://drupal.0829.info/
カスタマイズ方法とか書いてあります。
階層の奥深くに役立つ方法が書いてあるので、よく探してください。

Drupalガイド | Neoceed
http://neoceed.co.jp/ja/drupalguide
企業サイトですがインストールやモジュールのガイドがあります。

CMS Solution
http://www.cms-solution.jp/
企業サイトですがテーマの作り方とか載ってます。

Drupal 日本公式サイト
http://drupal.jp/
インストールガイドとブログ作成ガイドは初心者には役に立ちます。

Drupal@jp-data
http://drupal.jp-data.com/
う〜ん…

SourceForge.jp
http://sourceforge.jp/projects/drupaldoc-jp/
Drupalリソース(翻訳文書/プログラム)を共有するプロジェクト

Diaspar Journal
http://diaspar.jp/
モジュールのインストールの仕方とか載ってます。

Perl Tips
http://perltips.twinkle.cc/drupal/
Drupal の小技がいっぱい載っています。
参考になります。
続きを読む

PHPでの数値文字列の扱い 

PHPでの数値文字列の扱いはとっても微妙。便利だなと思うときもあれば、危険だなと思うときもある。

以下のようなスクリプトを使ってテストしてみると…

<?php

$test = $_POST["test"];

// データ型を文字列に指定
settype($test, "string");

// 数字として扱ってくれる?
if(is_numeric( $test )) $numeric = "数字でっせ!";
else $numeric = "数字じゃね〜よ!";

// 数字として扱ってくれる?
if(ctype_digit( $test )) $digit = "数字でっせ!";
else $digit = "数字じゃね〜よ!";

// 文字列に足してみる
$test_plus = $test + 3;

//テスト
echo <<<EOF
<html>
<head>
<title>テスト</title>
</head>
<body>
test = $test<br>
numeric = $numeric<br>
digit = $digit<br>
test_plus = $test_plus<br>

<form action="$_SERVER[PHP_SELF]" method="post">
<input type="text" name="test" size="20">
<input type="submit" value="送信">
</form>
</body>
</html>
EOF;

?>


//******** 結果 *********
入力:0 結果:test = 0, numeric = 数字でっせ!, digit = 数字でっせ!, test_plus = 3
入力:3 結果:test = 3, numeric = 数字でっせ!, digit = 数字でっせ!, test_plus = 6
入力:1.2 結果:test = 1.2, numeric = 数字でっせ!, digit = 数字じゃね〜よ!, test_plus = 4.2
入力:a 結果:test = a, numeric = 数字じゃね〜よ!, digit = 数字じゃね〜よ!, test_plus = 3

結果を見て分かるとおり、わざわざ「文字列」と指定しても数字の文字列なら「数字」と解釈されるし、計算もできてしまう。

携帯サイトでsession(セッション)を使う方法 

通常、session_start()するとクッキーにセッションIDが発行され、次回アクセスした時にクッキーの中にセッションIDがあれば、セッションを読み込んでデータを保持できる。しかしPCと違い、携帯ではcookie(クッキー)が使えない機種がある。通常の方法では携帯でセッションが使えないのだ。


これを解決する方法としてURLにセッションIDを埋め込むという方法がある。クッキーではなくGETやPOSTでセッションIDを持ちまわすのである。ただ、全てのリンクやフォームタグにセッションIDを埋め込むのは骨が折れるだろう。そういう時はphp.iniのsession.use_trans_sidをOnにすればいい。そうすると自動的に全ての相対リンクにセッションIDが埋め込まれる。


しかし、PCと携帯と同じスクリプトで動かしている場合、PCでもセッションIDが埋め込まれてしまうとセッションIDが丸見えになってしまう。(携帯でも見えてしまうけど、PCほど問題にはならないと思う)そのような場合は以下のようなスクリプトで対応する。



続きを読む

AdWords(アドワーズ広告)〜キーワードの作り方 

アドワーズ広告で最も重要なのがキーワードだ。キーワード次第でクリック率が左右される。当然、掲載順位にも大いに影響を及ぼす。



完全一致、フレーズ一致、部分一致を上手く活用しよう


部分一致はヒットするキーワードが多いのでお得な気がするが、ヒット数が多いということはそれだけ無駄な表示も増え、クリック率が低下してしまうのである。そうすると順位は落ち、単価を釣り上げざるを得なくなる。かといって全部完全一致にしては自分が思ってもみないキーワードで検索された時に表示されないということになる。また、人気の高い(検索回数の多い)キーワードは必然的に単価は釣り上がってしまう。
このような時は完全一致とフレーズ一致、部分一致をバランス良く設定しなければならない。絶対外せないキーワードや人気の高いキーワードは完全一致で登録し、複数の組み合わせキーワードで人気の高いキーワードはフレーズ一致、組み合わせキーワードで人気も低いキーワードは部分一致で登録する。

例)靴を販売する時は「靴」というキーワードは外せないが、検索回数が多いので完全一致。
[靴](完全一致、「靴」と検索された時だけ表示)
[靴 販売](完全一致、「靴 販売」と検索された時だけ表示)
"販売 靴"(フレーズ一致、「販売 靴」や「販売 靴 大きい」などで表示)
大きい 靴 販売(部分一致、「大きい 靴 販売」でも「販売 大きい 靴」「販売 革靴 大きい」などでも表示)
※完全一致を補うために、フレーズ一致と部分一致はなるべく多く登録しよう。



除外キーワードを登録しよう


上の靴の例でいくと、通常の靴屋ではバレエの靴は販売しないから「-(マイナス)」で除外することで無駄な表示が減り、クリック率も上がる。無駄な表示をどんどん除外していけば順位が上がるはずである。

例)無駄なキーワードはどんどん除外していく
-バレエ
-ガラス
-靴下



呼び方の違い、略称、変換間違いに注意


人や地方によっては呼び方が違ったり、パソコンならではの変換間違いなども意外と多い。また、流行り言葉など略称が新たにできている場合もあるので、常にアンテナを張り巡らせておくこと。

例)
くつ(ひらがな)
シューズ(カタカナ)
ズック、つっかけ、など(呼び方の違い)
川靴(変換間違い)



グループ分けする


AdWords(アドワーズ広告)〜広告文の作り方その2でも述べたが、キーワードによってグループ分けすることでグループでのクリック率が上がり、よりコンバージョン率の高いグループはクリック単価を高く、あまり成約につながらないキーワード郡はクリック単価を下げるといった使い分けもできる。



ターゲットから連想するキーワードを使う


例えば就職活動している大学生がターゲットなら「面接」や「新聞」というキーワードも有効かもしれない。子供がいる家庭がターゲットなら「プーさん」「プレゼント」というキーワードも有効かもしれないのである。



時にはあきらめも肝心


物によっては競争相手が単価の高い商材を扱っていると、その相手は広告費にも相当な費用を費やしてくるだろう。そういうキーワードで勝負しても勝ち目がないことは見えている。そのような場合はアドワーズ広告をあきらめて、費用のあまりかからないSEOで勝負しよう。