腰痛+バイト面接で課題-3日。
さてがんばるか~。
☆制作課題
1.システム概要
・どんなシステムを作るか
・ターゲットユーザー
・収益モデル
等々
2.DBテーブル構成
3.アプリケーション・モジュール作成
4.各モジュールページ遷移図
全く考えてなかった。
2時間目も考えるが見事なまでに何もでない。
1.システム概要
・どんなシステムを作るか
→アフィリエイト+釣果掲示板
・ターゲットユーザー
→釣り人(海)LT系
・収益モデル
→楽天のアフィリ収益
等々
2.DBテーブル構成
まあBBSとほぼ一緒。
3.アプリケーション・モジュール作成
4.各モジュールページ遷移図
で、こんなのできた。
自宅でやります・・・・・・。
テーブル名とカラム名は同じにしないって一言が・・・・・・あれ? 似たようなことを前に聞いた気がする。
2011年4月15日金曜日
2011年4月11日月曜日
4/11覚書
1時間目自習
mypage未作成の人が居るためでらっち奔走。
mypageとかのfront以外のアプリ追加手順はこの日記を参照してほしい。
2時間目
mypageのlayout設定。
CSSはシンボリックリンクでfrontと同じにする。
ln -s ../css cssを使う。
ヘッダーとフッターをpartial化。
あとはパンくずとslotでつける。
ほかレイアウト調整。
3時間目
認証と権限の解説復習。
てかprint_r($this->getUser());こええええ。
丸わかりすぎ。
CCSでヘッダの下に追記
4時間目
mypageにログアウト、indexに遷移する処理。
ここはまんまbackendと同じなので省略~。
sessionからmember_idを元にデータを引き出す。
今日の材料はメールでデータがあるからそれ参考で。
5時間目
commentテーブルにmemberテーブルと紐付けるテーブル追加
ALTER TABLE comment ADD member_id int;
6時間目
comment_editを表示させる。
ケアレスミスに数時間_| ̄|○
action側
input
confirm
明日から実習
水曜午後から企画発表
・どのようなアプリにするか
・DB構成
・可能ならページ遷移
・アプリケーション、モジュールの構成
mypage未作成の人が居るためでらっち奔走。
mypageとかのfront以外のアプリ追加手順はこの日記を参照してほしい。
2時間目
mypageのlayout設定。
CSSはシンボリックリンクでfrontと同じにする。
ln -s ../css cssを使う。
ヘッダーとフッターをpartial化。
layout
<?php include_partial("global/header");?>
_header
<div id="header">
<a href="/">SHONANBBS</a>
ようこそ<?php echo $sf_user->getAttribute('nickname',NULL,sfConfig::get('sf_session_name'));?>
</div>
あとはパンくずとslotでつける。
ほかレイアウト調整。
3時間目
認証と権限の解説復習。
てかprint_r($this->getUser());こええええ。
丸わかりすぎ。
CCSでヘッダの下に追記
#headerLeft {
width: 200px;
float:left
}
#headerRight {
width: 200px;
float:right;
text-align:right;
}
4時間目
mypageにログアウト、indexに遷移する処理。
ここはまんまbackendと同じなので省略~。
sessionからmember_idを元にデータを引き出す。
今日の材料はメールでデータがあるからそれ参考で。
5時間目
commentテーブルにmemberテーブルと紐付けるテーブル追加
ALTER TABLE comment ADD member_id int;
6時間目
comment_editを表示させる。
ケアレスミスに数時間_| ̄|○
action側
<?php
/**
* comment_edit actions.
*
* @package bbs2
* @subpackage comment_edit
* @author Your name here
* @version SVN: $Id: actions.class.php 2692 2006-11-15 21:03:55Z fabien $
*/
class comment_editActions extends sfActions
{
/**
* Executes index action
*
*/
public function executeInput()
{
$comment_id = $this->getRequestParameter('id');
$this->comment = CommentPeer::retrieveByPK($comment_id);
if ($this->comment != '' &&
$this->comment->getMemberId() !=
$this->getUser()->getAttribute('member_id', null,
sfConfig::get('sf_session_name'))){
$this->redirect('http://www.shonanbbs.com');
}
return sfView::SUCCESS;
}
public function executeConfirm()
{
$this->id = $this->getRequestParameter('id');
$this->content = $this->getRequestParameter('content');
return sfView::SUCCESS;
}
public function executeResult()
{
$content = $this->getRequestParameter('content');
$comment_id = $this->getRequestParameter('id');
$comment = CommentPeer::retrieveByPK($comment_id);
$comment->setContent($content);
$comment->save();
return sfView::SUCCESS;
}
}
input
<?php slot('pankuzu');?>
<?php echo link_to("HOME","/mypage")?> > コメント編集<?php end_slot();?>
<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'home'));?>
<?php end_slot();?>
登録情報更新
<br>
<div class="tblData">
<?php echo form_tag("/comment_edit/confirm","method=post multipart=true") ?>
<table>
<td>コメント:<?php echo input_tag("content", $comment->getContent() , array("size => 20"))?><br>
<?php echo input_hidden_tag('id', $comment->getId());?>
<input type="submit" name="send" value="確認">
</table>
</form>
</div>
confirm
<div class="tblData">
<?php echo form_tag("/comment_edit/result","method=post multipart=true") ?>
<table>
<tr>
<th>名前</th>
<td><?php echo $content?>
<?php echo input_hidden_tag('content', $content);?>
</td>
</tr>
</table>
</div>
<?php echo input_hidden_tag('id',$id);?>
<?php echo submit_tag('完了');?>
明日から実習
水曜午後から企画発表
・どのようなアプリにするか
・DB構成
・可能ならページ遷移
・アプリケーション、モジュールの構成
2011年4月8日金曜日
4/8覚書
1時間目
CSS適用ができねえええええ。
とおもったら。
ln -s ../css css
自分のログで大文字で書いてた(テペペロ☆
2時間目
comment_listで
コメントと名前とカテゴリの編集をできるようにする。ヒントはreply_add。
exで画像のようだがそこまではムリポ。
3時間目
☆symfonyのアクセス制御
管理画面、マイページなどのように認証されたユーザで
特定の権限を持つユーザだけが閲覧や操作を行えるようにする。
/bbs2/lib/model/MemberPeer.php
4時間目
☆認証
symfonyは、アクセスしているユーザに関する情報はユーザークラス($this->getUser())が持っている。
ユーザクラスに権限の情報を付与・削除することと、各アプリケーションごと、
モジュールごとのsecurity.ymlでアクセス制御を実現する。
認証済みかどうか $this->getUser()->isAuthenticated();
どの権限を持つかどうか $this->getUser()->hasCredential("member");
この二つを主に利用する。
制限のルールを書くのはsecurity.ymlで行う。
/backend/config/security.ymlに以下のように記述
権限管理を行うこともできる。
あと複数設けることもできるが、orにしたい場合は
credentials: [[member,admin]]のようになる。
backendにlogoutモジュール作成して
ログアウト処理。backendからアウトしてTOPへ。
action側(しか要らない)
ログイン処理+α TOPからのリンク。をやりました。まとめソース↓
5時間目
admin_ynカラム追加してif文で判定。
$this->getUser()->setAttribute('member_id', $member->getId(),sfConfig::get('sf_session_name'));
第3引数はセッション内に名前空間(name_space)を必ず設定。
区切りでセットすることで区切りごと削除が可能となる。
sesstion_nameはプロジェクト直下のconfigのsetting.ymlに記述。
☆練習問題
mypageアプリケーション作成
権限Credentialはmemberを指定
adminとmemberでログインしたあとの遷移を変更。
てか最終的な情報しか残せなかたよ。ごめんよー。
frontのloginモジュール、action側
frontのloginモジュール、index側
mypageログイン時TOP表示。
mypageのsecurity.yml
action側
mypageのindex。
mypageのaction。
でけた。
ていうか現状ではlogoutがbackendしかないからmypageでログアウトするのって
ログインしなおすんだよね・・・・・・権限で判定??
補足設定
backendのsettings.ymlを下記に変更。
# timeout: 1800 # Session timeout, in seconds
だよー。
来週は自分のプロフィールや投稿のみ編集可能にする。
とバリデートするそーな。
自分的お勧め
PHPエラーの意味を教えてくれるところ
CSS適用ができねえええええ。
とおもったら。
ln -s ../css css
自分のログで大文字で書いてた(テペペロ☆
2時間目
comment_listで
コメントと名前とカテゴリの編集をできるようにする。ヒントはreply_add。
exで画像のようだがそこまではムリポ。
3時間目
☆symfonyのアクセス制御
管理画面、マイページなどのように認証されたユーザで
特定の権限を持つユーザだけが閲覧や操作を行えるようにする。
/bbs2/lib/model/MemberPeer.php
static public function retrieveByPassword($mailaddress,$password) {
$c = new Criteria();
$c->add(self::MAILADDRESS, $mailaddress);
$c->add(self::PASSWORD, $password);
return self::doSelectOne($c);
}
4時間目
☆認証
symfonyは、アクセスしているユーザに関する情報はユーザークラス($this->getUser())が持っている。
ユーザクラスに権限の情報を付与・削除することと、各アプリケーションごと、
モジュールごとのsecurity.ymlでアクセス制御を実現する。
認証済みかどうか $this->getUser()->isAuthenticated();
どの権限を持つかどうか $this->getUser()->hasCredential("member");
この二つを主に利用する。
制限のルールを書くのはsecurity.ymlで行う。
/backend/config/security.ymlに以下のように記述
all: is_secure: on #認証済みの必要がある credentials: [ member ] #必要な権限を設定するモジュールにもsecurity.ymlを置いて上記のように記述することでモジュールごとの
権限管理を行うこともできる。
あと複数設けることもできるが、orにしたい場合は
credentials: [[member,admin]]のようになる。
backendにlogoutモジュール作成して
ログアウト処理。backendからアウトしてTOPへ。
action側(しか要らない)
public function executeIndex()
{
//未認証にする
$this->getUser()->setAuthenticated(false);
//権限をクリア
$this->getUser()->clearCredentials();
//TOPへ移動
$this->redirect('http://www.shonanbbs.com'');
return sfView::SUCCESS;
}
ログイン処理→ログインできたらログアウト→defaultへ遷移。ログイン処理+α TOPからのリンク。をやりました。まとめソース↓
5時間目
admin_ynカラム追加してif文で判定。
$this->getUser()->setAttribute('member_id', $member->getId(),sfConfig::get('sf_session_name'));
第3引数はセッション内に名前空間(name_space)を必ず設定。
区切りでセットすることで区切りごと削除が可能となる。
sesstion_nameはプロジェクト直下のconfigのsetting.ymlに記述。
☆練習問題
mypageアプリケーション作成
権限Credentialはmemberを指定
adminとmemberでログインしたあとの遷移を変更。
てか最終的な情報しか残せなかたよ。ごめんよー。
frontのloginモジュール、action側
public function executeIndex()
{
$this->mailaddress = $this->getRequestParameter('mailaddress');
$this->password = $this->getRequestParameter('password');
if ($this->mailaddress != '' && $this->password != '') {
//メンバーテーブルに入力されたメールアドレス、パスワードで
//指定出来る行があるかどうか
//MemberPeerに$this->mailaddress, $this->passwordの引数を渡す
$member = MemberPeer::retrieveByPassword
($this->mailaddress, $this->password);
if ($member){
// ログイン状態にする
//認証処理は$this->getUser()で受け取れるuserオブジェクトで
//設定できる。セッション名をいちいち変えなくていい。
$this->getUser()->setAuthenticated(true);
//権限をクリア
$this->getUser()->clearCredentials();
// 会員情報をセッションにセット
$this->getUser()->setAttribute('member_id',
$member->getId(),sfConfig::get('sf_session_name'));
$this->getUser()->setAttribute('nickname',
$member->getNickname(), sfConfig::get('sf_session_name'));
if($member->getAdminYn() == 'y') {
//admin権限付与
$this->getUser()->addCredential('admin');
$this->redirect('/backend');
}elseif ($member->getAdminYn() == 'n') {
//ここでは一般会員権限のみ付与
$this->getUser()->addCredential('member');
// 会員情報をセッションにセット
$this->getUser()->setAttribute('member_id',
$member->getId(),sfConfig::get('sf_session_name'));
$this->getUser()->setAttribute('nickname',
$member->getNickname(), sfConfig::get('sf_session_name'));
$this->redirect('/mypage');
}
}
$this->errormsg = "あてはまるユーザが登録されていません";
}
return sfView::SUCCESS;
}
frontのloginモジュール、index側
<?php slot('pankuzu');?>HOME<?php end_slot();?>
<?php slot('title');?>
TOP
<?php end_slot();?>
<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'login'));?>
<?php end_slot();?>
<?php use_helper('Validation') ?>
<?php echo form_tag('login/index');?>
<div class="tblData">
<?php if ($errormsg != ''):?>
<div><?php echo $errormsg;?></div>
<?php endif;?>
<table>
<tr>
<th>メールアドレス</th>
<td
<?php if ($sf_request->haserror('mailaddress')) :?>
style="background-color:#ffcccc;"
<?php endif;?>>
<?php echo input_tag('mailaddress', $mailaddress, array('size' => 50));?>
<?php echo form_error('mailaddress');?></td>
</tr>
<tr>
<th>パスワード</th>
<td><?php echo input_tag('password', $password, array('size' => 50));?>
<?php echo form_error('password');?></td>
</tr>
</table>
</div>
<?php echo submit_tag('ログインする');?>
</form>
mypageログイン時TOP表示。
mypageのsecurity.yml
default: is_secure: on credentials: [ member ]
action側
public function executeIndex()
{
$this->getUser() -> getAttribute('member_id',
NULL,sfConfig::get('sf_session_name'));
$this->member = MemberPeer::retrieveByPK($member_id);
//$this->comments = CommentPeer::retrieveByComment_Id($cooment_id)
return sfView::SUCCESS;
}
mypageのindex。
<?php slot('title');?>
MYPAGE
<?php end_slot();?>
<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'member_add'));?>
<?php end_slot();?>
mypageのaction。
public function executeIndex()
{
$this->getUser() -> getAttribute('member_id',
NULL,sfConfig::get('sf_session_name'));
$this->member = MemberPeer::retrieveByPK($member_id);
//$this->comments = CommentPeer::retrieveByComment_Id($cooment_id)
return sfView::SUCCESS;
}
奇跡といいたい。でけた。
ていうか現状ではlogoutがbackendしかないからmypageでログアウトするのって
ログインしなおすんだよね・・・・・・権限で判定??
補足設定
backendのsettings.ymlを下記に変更。
#認証できない時はloginページに遷移
login_module: default # To be called when a non-authenticated user
login_action: login # Tries to access a secure page
#管理者権限が無い場合はエラー表示
secure_module: default # To be called when a user doesn't have
secure_action: secure # The credentials required for an action
sessionの有効期限はsettings.ymlの95行目# timeout: 1800 # Session timeout, in seconds
だよー。
来週は自分のプロフィールや投稿のみ編集可能にする。
とバリデートするそーな。
自分的お勧め
PHPエラーの意味を教えてくれるところ
2011年4月7日木曜日
4/7覚書
腰痛で火曜休み、今日は歯医者で遅刻。
4時間目
1.返信するの横に詳細を見るのリンク追加。
ALTER TABLE comment ADD access_cnt int;
4.詳細ページを開くごとにアクセス数に+1させて、
shared/access_cntコンポーネントで、アクセス数多い順のコメント5件表示
午前中にreply_cntでやったところらしい。
CommentPeer
action
5時間目上記答え合わせ。
6時間目
exerciseモジュール作成。indexからstage2へgetとpostの処理を再度勉強。
自信が無い人はstage10ぐらいまでgetとpostで送り続けるのをやろう。
これができないと今後ついていけなくなるそうです。
4時間目
1.返信するの横に詳細を見るのリンク追加。
<?php echo link_to("詳細を見る", "@commentdatail?id=".$comment->getId())?>
2.default/datailでコメント詳細ページ表示action側
public function executeDatail()
{
//GETで渡されてくるコメントIDとか
$id = $this->getRequestParameter("id");
$this->comment = CommentPeer::retrieveByPK($id);
$this->photo = $this->getRequestParameter("photo");
return sfView::SUCCESS;
}
datilSussess.php
<div class="box">
<?php echo $comment->getNickname();?>の投稿<br>
<?php if($comment->getPhoto()):?><br>
<?php echo image_tag("/images/comment/".$comment->getPhoto());?><br><br>
<?php endif;?>
<?php if($comment->getPhoto2()):?><br>
<?php echo image_tag("/images/comments2/".$comment->getPhoto2());?><br><br>
<?php endif;?>
<?php echo $comment->getContent();?><br>
<?php echo $comment->getCreatedAt();?><br>
</div>
3.commentテーブルにaccess_cntカラム追加ALTER TABLE comment ADD access_cnt int;
4.詳細ページを開くごとにアクセス数に+1させて、
shared/access_cntコンポーネントで、アクセス数多い順のコメント5件表示
午前中にreply_cntでやったところらしい。
CommentPeer
static public function retrieveAccessRanking() {
$c = new Criteria();
$c->addDescendingOrderByColumn(self::ACCESS_CNT);
$c->setlimit(5);
return self::doSelect($c);
}
action
public function executeDatail()
{
//GETで渡されてくるコメントID
$id = $this->getRequestParameter("id");
$this->comment = CommentPeer::retrieveByPK($id);
$this->photo = $this->getRequestParameter("photo");
//現在のアクセスカウントを取得
$access_cnt = $this->comment->getAccessCnt();
//取得したアクセスカウントに+1をセット
$this->comment->setAccessCnt($access_cnt + 1);
//更新
$this->comment->save();
return sfView::SUCCESS;
}
5時間目上記答え合わせ。
6時間目
exerciseモジュール作成。indexからstage2へgetとpostの処理を再度勉強。
自信が無い人はstage10ぐらいまでgetとpostで送り続けるのをやろう。
これができないと今後ついていけなくなるそうです。
2011年4月4日月曜日
4/4覚書
1時間目~2時間目
☆複数画像UPとヘルパー
できてる人はアンケート
enquete_add
名前
性別(ラジオボタン)
興味のあること(チェックボックス)
コメント
画像
SQL
CREATE TABLE enquete(
id int not null auto_increment,
name text,
gender int,
hobby int ,
content text,
photo text,
created_at datetime,
primary key(id) );
ここで時間切れ。自習だぬー。
3時間目
☆ルーティング
ルーティングとは、URL マッピングとも呼ばれ、URLから判断して
使用するmoduleを決定する仕組み。
アクセスした時点でどこに飛ばすか、のコントロール機能。
場所はプロジェクト/apps/アプリケーション名/config/routing.yml
ルーティング名称(自由):
url: URL
param: {module: モジュール名, action: アクション名}
※default_symfonyの項目は保留
※URLに*でワイルドカード指定おk
ニュースモジュール作成とsymfony cc
symfony init-module front news
return sfView::SUCCESS;
/news/listにURLを変えるとほかページのリンク修正がめんどい。
そのときにルーティングで処理すると一括でできる。
デフォルトのURLを変更したいときにルーティングを使う。必要なければ使わなくてよい。
※入力ルールparamでは:の後、半角スペース必須。
つけたいルーティングは# default rules(ここから下削除不可)の上に置く。
実例
表示しないルールをつけることもできる。
IDの受け取り
コントローラー側
http://www.shonanbbs.com/news/datail/1111とか入れると数字が出てくるよ
@ルーティング名にするとそのルーティング名に則ったURLにできる。
値はGETで示す。
newsモジュールに以下記述
4時間目
部品化
パーシャル
一番簡単な部品化の方法で、主にロジックを含まないテンプレートを部品化する際に使用する。
指定したモジュール名/templatesディレクトリに、_テンプレート名.phpというファイルを作成する。
読み込むコード
実例
layout.phpの<div id="contentRight">直下に記述。
モジュール名にglobalにすると一番上のモジュールを指定できる。
templates直下に\menu.php作成し、
MENU
会員登録
とかを切り取って貼り付け。
◆練習問題
ヘッダーとフッターをpartial化
◆練習問題
sharedモジュール作成、templateはmessageでお知らせ文作成
member_addとか無いからlayoutにはっつけちゃったYO。
☆スロット
templateからlayoutを操作したい場合に利用
◆練習。
5時間目
◆練習問題 パンくずを実装
◆補足。関数利用可能
◆スロットとパーシャルの組み合わせ
6時間目
◆練習もっかいパーシャル。
☆コンポーネント
パーシャルにロジックが加わったものがコンポーネント。
部品化したいが、その部品を作成するためにはデータベースからデータを取得する
必要がある場合に使用される。
◆練習問題
member_listモジュール無い人は追加
sidemenuにmemberlistを出してみよう。
◆練習問題
最新のコメント5件をsidemenuに出してみよう。
あと_menuの各項目に<div class="sidelist">つけてねー。
今日は何とかついてこれた~~~~。ふぅ。
んで追加のCSS。適宜応用よろ。
☆複数画像UPとヘルパー
できてる人はアンケート
enquete_add
名前
性別(ラジオボタン)
興味のあること(チェックボックス)
コメント
画像
SQL
CREATE TABLE enquete(
id int not null auto_increment,
name text,
gender int,
hobby int ,
content text,
photo text,
created_at datetime,
primary key(id) );
ここで時間切れ。自習だぬー。
3時間目
☆ルーティング
ルーティングとは、URL マッピングとも呼ばれ、URLから判断して
使用するmoduleを決定する仕組み。
アクセスした時点でどこに飛ばすか、のコントロール機能。
場所はプロジェクト/apps/アプリケーション名/config/routing.yml
ルーティング名称(自由):
url: URL
param: {module: モジュール名, action: アクション名}
※default_symfonyの項目は保留
※URLに*でワイルドカード指定おk
ニュースモジュール作成とsymfony cc
symfony init-module front news
return sfView::SUCCESS;
/news/listにURLを変えるとほかページのリンク修正がめんどい。
そのときにルーティングで処理すると一括でできる。
デフォルトのURLを変更したいときにルーティングを使う。必要なければ使わなくてよい。
※入力ルールparamでは:の後、半角スペース必須。
つけたいルーティングは# default rules(ここから下削除不可)の上に置く。
実例
#news/listにURL変更。ルーティングルールは上位ほど強くなる。
newslist:
url: /news/list
param: { module: news, action: index }
※routing.yml変更後は必ずsymfony cc表示しないルールをつけることもできる。
newslist:
url: /news
param: { action: error404 }
IDの受け取り
コントローラー側
public function executeDatail()
{
print $id = $this->getRequestParameter("id");
//$this->id = $this->getRequestParameter("id");
return sfView::SUCCESS;
}
routing.yml側newsdatail:
url: /news/datail/:id
param: { module: news, action: datail }
http://www.shonanbbs.com/news/datail/33とかhttp://www.shonanbbs.com/news/datail/1111とか入れると数字が出てくるよ
@ルーティング名にするとそのルーティング名に則ったURLにできる。
値はGETで示す。
newsモジュールに以下記述
4時間目
部品化
パーシャル
一番簡単な部品化の方法で、主にロジックを含まないテンプレートを部品化する際に使用する。
指定したモジュール名/templatesディレクトリに、_テンプレート名.phpというファイルを作成する。
読み込むコード
実例
layout.phpの<div id="contentRight">直下に記述。
モジュール名にglobalにすると一番上のモジュールを指定できる。
templates直下に\menu.php作成し、
MENU
会員登録
とかを切り取って貼り付け。
◆練習問題
ヘッダーとフッターをpartial化
◆練習問題
sharedモジュール作成、templateはmessageでお知らせ文作成
<?php include_partial("shared/message");?>
_message.php
<div style="boader: 2px; padding: 10px; background-color:#DF8713; margin:10px 0px;">
管理者からの大切なお知らせ。
こちらをごらんください。
</div>
member_addとか無いからlayoutにはっつけちゃったYO。
☆スロット
templateからlayoutを操作したい場合に利用
◆練習。
layoutでtemplate作成。
<div id="pankuzu">
<?php include_slot("pankuzu");?>
</div>
indexSuccessでインクルード。
<?php slot('pankuzu');?>
HOME
<?php end_slot();?>
5時間目
◆練習問題 パンくずを実装
ヘルパー練習ページでも適用できるよ
<?php slot('pankuzu');?>
<?php echo link_to("HOME","/member/list")?>>ヘルパーの練習
<?php end_slot();?>
CSS
#pankuzu {
boder-bottom:1px dotted #ddd;
padding-bottom:5px;
}
◆練習問題 タイトルを変えてみようlayout.phpの<?php include_title() ?>を
<title><?php include_slot("title") ?></title>に変える
indexSuccessはこう
<?php slot('title');?>
TOP | SHONANBBS
<?php end_slot();?>
◆補足。関数利用可能
titleというスロットがあればtemplateを読み込むifが使える。
<title><?php if(has_slot("title")):?>
<?php include_slot("title") ?> | <?php endif;?>
SHONANBBS</title>
templateがより省略できる
<?php slot('title');?>
TOP
<?php end_slot();?>
◆スロットとパーシャルの組み合わせ
layoutのパーシャル切り取り、以下に変更
<?php include_slot("sidemenu");?>
<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'top'));?>
<?php end_slot();?>
ヘルパーページ
<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'help'));?>
<?php end_slot();?>
_menu.php
<?php if ($now == "top"):?>
<a href="/" class="nowpage">TOP</a><br>
<?php else :?>
<a href="/">TOP</a><br>
<?php endif;?>
<?php if ($now == "help"):?>
<a href="/default/help" class="nowpage">ヘルパーの使い方</a><br>
<?php else :?>
<a href="/default/help">ヘルパーの使い方</a><br>
<?php endif;?>
6時間目
◆練習もっかいパーシャル。
<?php include_partial("global/ad");?>
<div class="ad">
広告です。
</div>
☆コンポーネント
パーシャルにロジックが加わったものがコンポーネント。
部品化したいが、その部品を作成するためにはデータベースからデータを取得する
必要がある場合に使用される。
◆練習問題
member_listモジュール無い人は追加
sidemenuにmemberlistを出してみよう。
bbs2/apps/front/modules/shared/templatesに_memberlist.php作成
メンバー一覧
<?php foreach ($members as $member):?>
<div class="sidelist">
<?php echo $member->getNickname();?>
</div>
<?php endforeach;?>
bbs2/apps/front/modules/shared/actionsにcomponents.class.php作成
<?php
class SharedComponents extends sfComponents
{
public function executeMemberlist(){
$c = new Criteria();
$this->members = MemberPeer::doselect($c);
}
}
◆練習問題
最新のコメント5件をsidemenuに出してみよう。
bbs2/apps/front/modules/shared/templatesに_newreplyt.php作成
最新の返信
<?php foreach ($replys as $reply):?>
<div Class="sidelist">
<?php echo $reply->getContent();?>
</div>
<?php endforeach;?>
bbs2/apps/front/modules/shared/actions/components.class.phpの
memberlistの直下に作成
public function executeNewreply(){
$c = new Criteria();
$c->addDescendingOrderByColumn(ReplyPeer::CREATED_AT);
$c->setlimit(5);
$this->replys = ReplyPeer::doselect($c);
}
あと_menuの各項目に<div class="sidelist">つけてねー。
今日は何とかついてこれた~~~~。ふぅ。
んで追加のCSS。適宜応用よろ。
#pankuzu {
boder-bottom:1px dotted #ddd;
padding-bottom:5px;
}
.nowpage {
background-color:#FAB6D6;
padding:1px;
margin-bottom:1px;
}
.ad {
border:1px solid #ddd;
padding:10px;
background-color:#D1DEE0;
}
.sidelist {
border-bottom:1px solid #ddd;
padding:5px 0px;
}
4/1覚書
1時間目
replyに画像追加の続き。
ex.複数画像の続き
2時間目も同様
3時間目
☆ヘルパー
no_script_nameをONにすることでフロントコントローラーがURLに出なくなる。
4時間目
ヘルパー続き
5時間目
ヘルパーをbbs2に適用
6時間目
schema実行後に生成されるomディレクトリの子クラスに変更点を記述。
親クラスには記述しない。
来週はreply以外のデータ参照もあるそうな。
現時点ソース。カテゴリ未完成だよー;
写真複数にするときはphotoカラム追加と
/web/images/comment2とか複数必要だよー。
replyに画像追加の続き。
ex.複数画像の続き
2時間目も同様
3時間目
☆ヘルパー
no_script_nameをONにすることでフロントコントローラーがURLに出なくなる。
4時間目
ヘルパー続き
5時間目
ヘルパーをbbs2に適用
6時間目
schema実行後に生成されるomディレクトリの子クラスに変更点を記述。
親クラスには記述しない。
来週はreply以外のデータ参照もあるそうな。
現時点ソース。カテゴリ未完成だよー;
写真複数にするときはphotoカラム追加と
/web/images/comment2とか複数必要だよー。
コントロール側
public function executeIndex()
{
print_r(sfConfig::get('sf_support_mail'));
//commentテーブル全行表示降順
//昇順 ->addAscendingOrderByColumn(column);
$c = new Criteria();
$c->addDescendingOrderByColumn(CommentPeer::CREATED_AT);
$this->comments = CommentPeer::doSelect($c);
return sfView::SUCCESS;
}
public function executeConfirm()
{
$this->name = $this->getRequestParameter("name");
$this->coment = $this->getRequestParameter("coment");
$this->categorie = $this->getRequestParameter("categorie");
$photo1 = $this->getRequest()->getFile('photo1');
$photo2 = $this->getRequest()->getFile('photo2');
// sleepさせてrootで/tmpを見る
//sleep(10);
//画像の一時ファイル判定
if($photo1["tmp_name"] != '') {
//保存する画像名はセッションID生成し付与
session_regenerate_id();
//myUtil::getFileExtで拡張子判別。帰り値は._gif._png._jpg
$tmpname1 = 'photo1_' . session_id() .myUtil::getFileExt( $photo1["tmp_name"] );
//web/uploads/tmpへ画像を移動する
$this->getRequest()->moveFile('photo1',sfConfig::get('sf_upload_dir').'/tmp/'.$tmpname1);
//templateにパスを渡している
$this->photo1 = $tmpname1;
}
//画像の一時ファイル判定
if($photo2["tmp_name"] != '') {
//保存する画像名はセッションID生成し付与
session_regenerate_id();
//myUtil::getFileExtで拡張子判別。帰り値は._gif._png._jpg
$tmpname2 = 'photo2_' . session_id() .myUtil::getFileExt( $photo2["tmp_name"] );
//web/uploads/tmpへ画像を移動する
$this->getRequest()->moveFile('photo2',sfConfig::get('sf_upload_dir').
'/tmp/'.$tmpname2);
//templateにパスを渡している
$this->photo2 = $tmpname2;
}
return sfView::SUCCESS;
}
public function executeHelp()
{
return sfView::SUCCESS;
}
public function executeResult()
{
//nameとmailを変数にして渡す。
$name = $this->getRequestParameter("name");
$coment = $this->getRequestParameter("coment");
$categorie = $this->getRequestParameter("categorie");
//insertのmember
//インスタンス化。空のオブジェクトを生成。
$comment = new Comment();
//変数にした名前とメールを入力。idカラムは自動なので不要。
//カラムにcreated_at、update_atがあればSymfonyが自動で一緒にやってくれる。
$comment->setNickname("$name");
$comment->setContent("$coment");
$comment->setCategorie("$categorie");
//insert文発行
$comment->save();
//画像データを変数にして渡す
$photo1 = $this->getRequestParameter('photo1');
$photo2 = $this->getRequestParameter('photo2');
//画像の存在判定
if($photo1 != '') {
///uploads/tmp/'.$photo1から画像を取得
$src = sfConfig::get('sf_web_dir').'/uploads/tmp/'.$photo1;
//最新(投稿と同一)のidを取得(autoincrement稼動時)
$saveName = $comment->getId().myUtil::getFileExt($src);
//TEMPから/images/comment/".$saveNameへ保存
$dst = sfConfig::get('sf_web_dir')."/images/comment/".$saveName;
rename($src, $dst);
$comment->setPhoto($saveName);
$comment->save();
}
if($photo2 != '') {
///uploads/tmp/'.$photo2から画像を取得
$src = sfConfig::get('sf_web_dir').'/uploads/tmp/'.$photo2;
//最新(投稿と同一)のidを取得(autoincrement稼動時)
$saveName = $comment->getId().myUtil::getFileExt($src);
//TEMPから/images/comment/".$saveNameへ保存
$dst = sfConfig::get('sf_web_dir')."/images/comments2/".$saveName;
rename($src, $dst);
$comment->setPhoto2($saveName);
$comment->save();
}
return sfView::SUCCESS;
}
index
<div class="line">
<?php echo form_tag("default/confirm","method=post multipart=true")?>
新規投稿<br>
<?php echo textarea_tag("coment",
array("rows" => "10", "cols" => "30")) ?>
<br>
ニックネーム<?php echo input_tag("name", array("size => 20"))?>
カテゴリ
<?php $categorie = sfConfig::get('sf_categorie')?>
<?php echo select_tag("$categorie",
options_for_select($categorie,$value));?><br>
画像1<?php echo input_file_tag("photo1") ?><br>
画像2<?php echo input_file_tag("photo2") ?><br>
<?php echo submit_tag("送信する") ?><br>
</form>
</div>
<div class="comment">
<?php foreach ($comments as $comment):?>
<?php echo $comment->getNickname();?>の投稿
投稿日時<?php echo $comment->getCreatedat();?>
カテゴリ:<?php echo $comment->getCategorie();?><br><br><br>
<?php echo $comment->getContent();?><br><br>
<?php if($comment->getPhoto()):?>
<?php echo image_tag('/images/comment/'
.$comment->getPhoto(),"class=imgmain") ?><br><br>
<?php endif;?>
<?php if($comment->getPhoto2()):?>
<?php echo image_tag('/images/comment/'
.$comment->getPhoto2(),"class=imgmain") ?><br><br>
<?php endif;?>
<?php echo link_to("返信", "/reply_add/input",
array("query_string" => "id=".$comment->getId()))?>
<br><br>
<?php $replys = $comment->getReplys();?>
<?php foreach ($replys as $reply):?>
<div class="reply">
<?php echo $reply->getNickname();?>さんの投稿
返信日時<?php echo $reply->getCreatedat();?><br><br>
<?php echo $reply->getContent();?><br><br>
<?php if($reply->getPhoto()):?>
<?php echo image_tag('/images/reply/'.$reply->getPhoto(),"class=imgmain") ?><br><br>
<?php endif;?>
</div>
<?php endforeach;?>
<?php endforeach;?>
</div>
input
このコメントに返信します
<div>
<?php echo $comment->getContent();?><br>
<?php if($comment->getPhoto()):?><br>
<img src="/images/comment/<?php echo $comment->getPhoto();?>"><br><br>
<?php endif;?>
</div>
<div class="line">
</div>
返信フォーム<br>
<?php echo form_tag("/reply_add/confirm", "method=post multipart=true")?>
<?php echo textarea_tag("coment", array("rows" => "10", "cols" => "30")) ?><br>
ニックネーム<?php echo input_tag("name", array("size => 20"))?><br>
<br>
画像1<?php echo input_file_tag("photo") ?><br><br>
<?php echo input_hidden_tag('id', $comment->getId()) ?>
<?php echo submit_tag("確認する") ?>
</form>
confirm
<?php echo form_tag("/reply_add/result", "method=post multipart=true")?>
返信内容<br>
<?php echo $coment;?>
<?php echo input_hidden_tag('coment', $coment) ?>
<br>
ニックネーム<br>
<?php echo $name;?>
<br>
画像<br>
<?php if($photo !=""):?>
<img src="/uploads/tmp/<?php echo $photo?>">
<br><br>
<div class="line"></div>
<?php echo input_hidden_tag('photo', $photo) ?>
<?php endif;?>
<?php echo input_hidden_tag('name', $name) ?>
<?php echo input_hidden_tag('id', $id) ?>
<br>
<?php echo submit_tag("完了") ?>
</form>
2011年3月31日木曜日
3/31覚書
1時間目
reply_add実装続き
2時間目
reply_add実装
idを引き継ぐ処理以外は基本おなじなのだねー。
ていうかそのreplyを表示させるのががが。
3時間目
画像アップロード
[name] => notice01.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpyCW55n
[error] => 0
[size] => 83218
ファイル送信時次のプログラムの処理が終わるまでの間、
サーバーのTEMPディレクトリに一時保管されている。
sleep(20);を加えると20秒間処理を止めるので、
その間にPuTTYからrootで入ってcd /tmpで中身を見ると、
-rw------- 1 apache apache 83218 3月 25 16:25 phpJNeLpc
ってファイルがsleepで設定した時間分だけ確認できる。
処理が終われば消える。
4時間目
画像アップロード処理続き
TEMPディレクトリ作成とパーミッション変更
cd web/uploads
mkdir tmp
chmod -R 777 tmp
画像のアップロード
実際に表示させてみる
5時間目
photoカラム追加
ALTER TABLE comment ADD photo text;
schema.yml、model作成
/web/images/commentディレクトリ作成
chmod 777 commentでパーミッション作成
あと画像表示
できたらpreplyも。
replyカラム+/web/images/replyカラムつけてね。
6時間目
あと画像表示
できたらpreplyも
作業続き
めんどいからここでコード。
action.class.php
inputSuccess.php
resultSuccess.php
パーミッション解説
自分とグループと他人に対してのアクセス権限。
ファイルへの読み(read) 書き(write) 実行(execute)についての権限を与えること。
できる人だけ。
アップロード3つぐらい送って見る。
複数の条件がどーしても思い浮かばない・・・
$photoをどこで複数化するんだああああ。
おまけ
ntpやってなかったので設定。
教科書のサーバー構築の一番下にあるntp設定やればいいよ。
あとcreated_atの表示で詰まった。
_含むばあいは_取っていいみたい。
例】
投稿日時getCreatedat();?>
reply_add実装続き
2時間目
reply_add実装
idを引き継ぐ処理以外は基本おなじなのだねー。
ていうかそのreplyを表示させるのががが。
3時間目
画像アップロード
[name] => notice01.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpyCW55n
[error] => 0
[size] => 83218
ファイル送信時次のプログラムの処理が終わるまでの間、
サーバーのTEMPディレクトリに一時保管されている。
sleep(20);を加えると20秒間処理を止めるので、
その間にPuTTYからrootで入ってcd /tmpで中身を見ると、
-rw------- 1 apache apache 83218 3月 25 16:25 phpJNeLpc
ってファイルがsleepで設定した時間分だけ確認できる。
処理が終われば消える。
4時間目
画像アップロード処理続き
TEMPディレクトリ作成とパーミッション変更
cd web/uploads
mkdir tmp
chmod -R 777 tmp
画像のアップロード
実際に表示させてみる
5時間目
photoカラム追加
ALTER TABLE comment ADD photo text;
schema.yml、model作成
/web/images/commentディレクトリ作成
chmod 777 commentでパーミッション作成
あと画像表示
できたらpreplyも。
replyカラム+/web/images/replyカラムつけてね。
6時間目
あと画像表示
できたらpreplyも
作業続き
めんどいからここでコード。
action.class.php
<?php
class reply_addActions extends sfActions
{
public function executeConfirm()
{
$this->id = $this->getRequestParameter("id");
$this->name = $this->getRequestParameter("name");
$this->coment = $this->getRequestParameter("coment");
$photo = $this->getRequest()->getFile('photo');
if($photo["tmp_name"] != '') {
//保存する画像名はセッションID生成し付与
session_regenerate_id();
//myUtil::getFileExtで拡張子判別。帰り値は._gif._png._jpg
$tmpname = 'photo_' . session_id() .myUtil::getFileExt( $photo["tmp_name"] );
//web/uploads/tmpへ画像を移動する
$this->getRequest()->moveFile('photo',sfConfig::get('sf_upload_dir').'/tmp/'.$tmpname);
//templateにパスを渡している
$this->photo = $tmpname;
}
return sfView::SUCCESS;
}
public function executeInput()
{
//GETで渡されてくるコメントID
$id = $this->getRequestParameter("id");
$this->comment = CommentPeer::retrieveByPK($id);
$this->photo = $this->getRequestParameter("photo");
return sfView::SUCCESS;
}
public function executeResult()
{
//idとnameとmailを変数にして渡す。
$id = $this->getRequestParameter("id");
$name = $this->getRequestParameter("name");
$coment = $this->getRequestParameter("coment");
//replyのupdate
//インスタンス化。空のオブジェクトを生成。
$reply = new Reply();
//変数にした名前とメールを入力。
$reply->setCommentid("$id");
$reply->setNickname("$name");
$reply->setContent("$coment");
//insert文発行
$reply->save();
$photo = $this->getRequestParameter('photo');
//画像の存在判定
if($photo != '') {
///uploads/tmp/'.$photoから画像を取得
$src = sfConfig::get('sf_web_dir').'/uploads/tmp/'.$photo;
//最新(投稿と同一)のidを取得(autoincrement稼動時)
$saveName = $reply->getId().myUtil::getFileExt($src);
//TEMPから/images/comment/".$saveNameへ保存
$dst = sfConfig::get('sf_web_dir')."/images/reply/".$saveName;
rename($src, $dst);
$reply->setPhoto($saveName);
$reply->save();
}
return sfView::SUCCESS;
}
}
inputSuccess.php
このコメントに返信します <div> <?php echo $comment->getContent();?> <?php if($comment->getPhoto()):?> <img src="/images/comment/<?php echo $comment->getPhoto();?>"><br><br> <?php endif;?> </div> <div class="line"> </div> 返信フォーム<br> <form action="/reply_add/confirm" method="post" enctype="multipart/form-data"> <textarea name="coment"></textarea><br> ニックネーム<input type="text" name="name" size="20"> <br> <input type="file" name="photo"><br> <input type="hidden" name="id" value="<?php echo $comment->getId();?>"> <input type="submit" value="確認する"> </form>confirmSuccess.php
<form action="/reply_add/result" method="post"> 返信内容<br> <?php echo $coment;?> <input type="hidden" name="coment" value="<?php echo $coment;?>"> <br> ニックネーム<br> <?php echo $name;?> <br> 画像<br> <?php if($photo !=""):?> <img src="/uploads/tmp/<?php echo $photo?>"> <br><br> <div class="line"></div> <input type="hidden" name="photo" value="<?php echo $photo;?>"> <?php endif;?> <input type="hidden" name="name" value="<?php echo $name;?>"> <input type="hidden" name="id" value="<?php echo $id;?>"> <br> <input type="submit" value="確認する"> </form>
resultSuccess.php
完了しました。 <a href="/">トップに戻る</a>
パーミッション解説
自分とグループと他人に対してのアクセス権限。
ファイルへの読み(read) 書き(write) 実行(execute)についての権限を与えること。
できる人だけ。
アップロード3つぐらい送って見る。
複数の条件がどーしても思い浮かばない・・・
$photoをどこで複数化するんだああああ。
おまけ
ntpやってなかったので設定。
教科書のサーバー構築の一番下にあるntp設定やればいいよ。
あとcreated_atの表示で詰まった。
_含むばあいは_取っていいみたい。
例】
投稿日時getCreatedat();?>
登録:
投稿 (Atom)
