2011年4月11日月曜日

4/11覚書

1時間目自習
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
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.返信するの横に詳細を見るのリンク追加。
<?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(ここから下削除不可)の上に置く。

実例
#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とか複数必要だよー。

コントロール側

 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
<?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();?>

2011年3月29日火曜日

3/29覚書

1時間目
DBstudyにcontactテーブルを追加
create table contact (
id int not null auto_increment,
name text,
cotent text,
created_at datetime,
primary key(id)
);
※primary key(id)が最初抜けててエラーググって判明;
あぶねー。

schema作成
symfony propel-build-schema
model作成
symfony propel-build-model

lib/modelに
contact.phpとcontactPeer.phpができているか確認。

2時間目

insert復習

actions.class.php
  //insertのcontact。
  //インスタンス化。空のオブジェクトを生成。
  $contact = new Contact();
  //名前と内容を入力。
  $contact->setName('ゆっきー');
  $contact->setCotent('今日はなんとなくやれるかな');
  //insert文発行
  $contact->save();
indexSuccess.php
<div class="tblData">

<table>
 <tr>
  <th>名前</th>
  <th>内容</th>
 </tr>
 <?php foreach ($contacts as $contact):?>
 <tr>
  <td><?php echo $contact->getName();?></td>
  <td><?php echo $contact->getCotent();?></td>
 </tr>
 <?php endforeach;?>
</table>

</div>

updateは省略。
1行削除も省略。
  //全行削除
  $c = new Critreria;
  $contacts = ContentPeer::doselect($c);
  foreach($contacts as $contact){
   $contact->delete();
  }

☆練習問題
contact_addモジュール作成してinsert、confirm、result作成。

3時間目
☆練習問題
contact_addに下記追加。
性別 男性 女性 ラジオボタン
都道府県 prefで
興味のあること チェックボックス

4時間目

もっかいbbs2バックアップしてつくり直し。
んで掲示板reply_addつける。
indexで新規投稿と投稿一覧、各投稿に返信リンク、
新規投稿→confirmで確認→resultで完了
返信リンクid渡し→入力画面id渡し→confirmで確認id渡し→resultで完了

create table reply (
id int not null auto_increment,
comment_id int,
nickname text,
content text,
created_at datetime,
primary key(id)
);

symfony init-module front reply_add
symfony propel-build-schema
symfony propel-build-model
symfony cc
忘れないようにねー

シンボリックリンク
webでln -s /usr/share/pear/data/symfony/web/sf ./sf

ラストまで。

返信の表示処理は明日。
不完全なのでコードは明日。