twitter sns クチコミ comments neta

2007/09/29 15:17:33 | comment(1124)

自分のホームをつくる

rhaco修行シリーズ!


セッションに入れた値を取る


ログインした時の情報は、LoginConditionでRequestLogin::setLoginSessionされていて、セッションに格納されてます。
RequestLogin::getLoginSession();とするとセットした情報がとれます。
ただ、セッションがスタートしてないと駄目なので、今回は__init__.phpに次のように書きました。
<?php
include_once("./__settings__.php");
Rhaco::import('model.User');
Rhaco::usesession();

Rhaco::constant("HTML_TEMPLATE_ARG_ESCAPE", true);

User情報を格納しているので、session_startの前にmodel.Userをimportしておく必要があります。
そして、ついでにHTML_TEMPLATE_ARG_ESCAPEもセットしておきます。こうすると、テンプレートで{$f.escape()}しなくても、常にescapeされた値になります。ただ、HTMLを表示したい場合などもあるので、そのときは{$f.noop()}に入れると、escapeを外せます。

これでは__init__.phpにusesessionしましたが、network.http.Requestをnewしてもsession_startするようです。


index.phpの実装


次に、自分のホームになるところを実装してみます。
とりあえずindex.phpとしてみました。
特別なことはしてません。DB操作もしたかったので、sessionに格納されてる値をまたDBから取ってくるとか無駄なことしてますが、許してください。。w
<?php
require_once '__init__.php';
Rhaco::import('network.http.RequestLogin');
Rhaco::import('network.http.Header');
Rhaco::import('database.DbUtil');
Rhaco::import('database.model.Criteria');
Rhaco::import('database.model.Q');
Rhaco::import('tag.HtmlParser');

if(!RequestLogin::isLogin()){
	Header::redirect(Rhaco::url('login.php'));
}

$template = new HtmlParser();
$user = RequestLogin::getLoginSession();
$db = new DbUtil(User::connection());
$object = $db->get(new User(), new Criteria(Q::eq(User::columnId(), $user->getId())));
if(is_null($object)){
    $template->write('404.html');
    Rhaco::end();
}
$template->setVariable('object', $object);
$template->write(Rhaco::constant("TEMPLATE") . '/index.html');

相変わらずis_nullで判定してますが、rhaco的にこれで良いのかどうか自信が無いです。。。


index.htmlを書く


次に表示部分ですが、前回?くらいにindex.htmlは用意してあるので、そこに変数を入れたりしてみました。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link
	href="{$rhaco.templateurl('cdp')}/theme/{$rhaco.constant('THEME')}/style.css"
	rel="stylesheet" type="text/css" />
<title>{$rhaco.constant('SITE_TITLE')}</title>
<style type="text/css">
<!--
label {
	position: absolute;
	text-align: right;
	width: 130px;
}

input,textarea {
	margin-left: 140px;
}
-->
</style>
</head>
<body>
<div id="PAGETOP">

<div id="HEADER">

<h1>{$rhaco.constant('SITE_TITLE')}</h1>
<ul id="PAN">
	<rt:block name="pan">
		<li>{$object.name}</li>
	</rt:block>
</ul>
</div>
<hr>

<div id="MENU">
<h2>menu</h2>
<ul>
	<rt:block name="menu">
		<li id="MENU01" class="menu-on"><a href="{$rhaco.url()}">index</a></li>
		<li id="MENU02"><a href="{$rhaco.url()}">Diary</a></li>
		<li id="MENU03"><a href="{$rhaco.url()}">Friends</a></li>
		<li id="MENU04"><a href="{$rhaco.url('setting.php')}">Settings</a></li>
		<li id="MENU05"><a href="{$rhaco.url()}">Logout</a></li>
	</rt:block>
</ul>
</div>

<hr>

<div id="KIZI"><rt:block name="content">
	<h2>{$object.name}</h2>
	<div class="text">
	<h3>My Profile</h3>
	<p><rt:if param="{$object.picture}">
		<img align="left"
			src="{$rhaco.url('resources/picture')}/{$object.picture}"
			alt="{$object.name}'s Picture." style="margin: 5px;" />
	</rt:if> {$f.noop($f.text2html($object.profile))}</p>

	<h3>My friend's new diary</h3>
	<ul>
		<li><a href="{$rhaco.url()}">sample</a> (test) - 10 minutes ago.</li>
		<li><a href="{$rhaco.url()}">sample</a> (test) - 2 days ago.</li>
		<li><a href="{$rhaco.url()}">sample</a> (test) - 3 days ago.</li>
	</ul>

	<ul class="modori">
		<li><a href="#PAGETOP">TOP</a></li>
	</ul>
	</div>
</rt:block></div>

<div id="FOOTER">
<h2>Address</h2>
<ul>
	<li id="FOOTER01"><a href="#PAGETOP">TOP</a></li>
	<li id="FOOTER02">
	<address><a href="http://d.riaf.org/">rhacosns</a></address>
	</li>
	<li id="FOOTER03">
	<address><a href="http://www.rhaco.org/">made with rhaco</a></address>
	</li>
</ul>
</div>


</div>
</body>
</html>

次の記事で、自分の情報を変更できるようにしたいと思うので、setting.phpへのリンクも忍び込ませておきました。
さらに、Cake版での実装があった、自分の写真のアップロードもしたいので、pictureの項目を増やして、画像をアップロードしている場合にそれを表示するようにもしてあります。
詳しくは次の記事で説明しますが、今回の変更でproject.xmlに少し変更があります。
        <table name="user" admin="true">
            <column name="id" type="serial" />
            <column name="name" type="string" size="50" require="true" />
            <column name="email" type="email" unique="true" require="true" />
            <column name="password" type="string" require="true" />
            <column name="profile" type="text" require="true" />
            <column name="created" type="timestamp" default="sysdate" />
            <column name="modified" type="timestamp" default="sysdate" />
            <column name="picture" type="string" />
        </table>

userテーブルにpictureの項目を追加しました。
DBを一旦削除してsetupをもう一度実行するか、alter tableしてuserにpictureを追加してください。
どちらにしても、setupでのテーブルクラスの更新は必要になります。