ありがとうございました。 「最後の晩餐」

こんにちは

本日のひとこと「最後の晩餐」です。

今日はいろいろと勉強させて頂いていた、学校での最後の授業となりました。
ポートフォリオの発表会が2日前から始まりました。皆さんの作品は半年間続けた勉強の集大成と言える作品で、目を奪われるものばかりでした。まぁ自分の作品は相変わらず皆さんの表情を微妙にするという効果付きでしたが、置いておいて・・・

思い出してみますと、先生方も含め皆さんにはとてもお世話になったと思います。途中でめでたく卒業された方々も勿論ですが、最後まで一緒に頑張ってこられた方々にも感謝しております。

皆さんには身につけた技術や得ることのできた経験を生かして、楽しい人生を歩んでいってもらいたいですね。(自分も便乗したいです)

さて、いつもと書いてる内容が違うのでアレですけど本日は、
ここまで

SQLのテーブル 「天井の蜘蛛」

こんにちは

本日のひとこと「天井の蜘蛛」です。

今日は、前回のニュースフィードのデータベース内のテーブル作成のSQLを書きたいと思います。
まず、puttyを起動して、mysqlを使用可能にした状態にしておいてください。
では、newsfeedのテーブルです。

CREATE TABLE newsfeed
(
  id integer NOT NULL AUTO_INCREMENT,
  title varchar(32) NOT NULL,
  start_date datetime NOT NULL,
  end_date datetime NOT NULL,
  description varchar(256) NOT NULL,
  PRIMARY KEY(id)
);

次にadmin_userのテーブルです。

CREATE TABLE admin_user
(
  id integer NOT NULL AUTO_INCREMENT,
  user varchar(16) NOT NULL,
  password varchar(256) NOT NULL,
  PRIMARY KEY(id)
);

さらにm_categoryのテーブルです。(外部制約と子テーブル付き)

CREATE TABLE m_category
(
id integer NOT NULL AUTO_INCREMENT,
name varchar(64) NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB;

CREATE TABLE newsfeed_category
(
newsfeed_id integer NOT NULL,
category_id integer NOT NULL,
FOREIGN KEY(newsfeed_id)
REFERENCES newsfeed(id),
FOREIGN KEY (category_id)
REFERENCES m_category(id)
)ENGINE=INNODB;


いくつか余計なものもありますが、こんな感じです。

ここまで

ニュースフィード完成 「シーリーコート」

こんにちは

本日のひとこと「シーリーコート」です。

今日は前回の続きであるニュースフィードの完成形の続きです。(PHPファイル)

始めにadmin_delete_confirm.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '削除確認';
$header['logout_url'] = ADMIN_LOGOUT_URL;
//var_dump( $_GET );

// idの初期値を決定する
$id = NULL;

// 入力チェックをする
if ( $_GET['i'] ) {
	// 値があって、しかも数値型の場合は
	if ( is_numeric( $_GET['i'] ) ){
		// idに入力値を設定する
		$id = $_GET['i'];
	}
}

// DBに接続する
$dbh = new PDO('mysql:host=localhost;dbname=arimoto222_d', 'arimoto222', 'arimoto222' );
//var_dump( $dbh );

// SQLを用意する
$sql = "SELECT * FROM newsfeed WHERE id = :id;";

$stmt = $dbh->prepare( $sql );
  // 値をバインドする
$stmt->bindParam( ':id', $id, PDO::PARAM_INT );

  // SQLを実行する
$r = $stmt->execute();

// データを取得する
$data = $stmt->fetch();
//var_dump( $data );

// データが空っぽ(false)の場合はエラーとして、
// 一覧画面に戻す
if ( !$data ) {
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
	exit;
}

// 削除するデータのIDをセッションに登録する
$_SESSION['delete_data'] = $id;

// 共通化のため
$data['header'] = $header;
$tpl_file = 'admin_delete_confirm.tpl';

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

次にadmin_delete_finish.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '削除完了';
$header['logout_url'] = ADMIN_LOGOUT_URL;


// 更新するデータのIDを取得しておく
$id = $_SESSION['delete_data'];

// (正常処理なので)セッションもう使わないので消しておく
$_SESSION['delete_data'] = array();
unset( $_SESSION['delete_data'] );

// ニュースフィード削除処理ファイルを読み込む
require_once( './include/delete_newsfeed.inc.php' );

// 削除処理を行う
delete_newsfeed( $id );

// 一覧画面に遷移する
header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
exit;

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

続きましてadmin_edit_confirm.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );
// カテゴリーデータクラスファイルを読み込む
require_once( './include/data/m_category_data.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '編集確認';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// セッションから更新するデータのidを取得する
$id = $_SESSION['edit_data'];

// 入力された値をとりあえず表示(デバッグ用)
//var_dump( $_POST );

// 入力チェック
  // エラー有無のチェックを無しにしておく
$is_error = false;
  // エラー用の配列を初期化する
$errors = array();

// タイトルがなかったらエラー
if ( $_POST['title'] == '' ) {
	$is_error = true;
	$errors['title'][] = 'タイトルを入力してください。';
} else {
	// 文字数が2〜100文字じゃなかったらエラー
	$string_count = mb_strlen( $_POST['title'] );
	if ( $string_count < 2 || $string_count > 100 ) {
		$is_error = true;
		$errors['title'][] = 'タイトルは2文字以上100文字以下で入力してください。';
	}
}

// 開始日時がなかったらエラー
if ( $_POST['start_date'] == '' ) {
	$is_error = true;
	$errors['start_date'][] = '開始日時を入力してください。';
}
// 終了日時がなかったらエラー
if ( $_POST['end_date'] == '' ) {
	$is_error = true;
	$errors['end_date'][] = '終了日時を入力してください。';
}
// 一言がなかったらエラー
if ( $_POST['description'] == '' ) {
	$is_error = true;
	$errors['description'][] = '一言を入力してください。';
}


// セッションに値をいれておく
$_SESSION['post_data'] = $_POST;


// 入力値にエラーがあったら
if ( $is_error ) {
	// エラー用のSESSIONを設定する
	$_SESSION['input_error'] = $errors;
	// 一覧画面にリダイレクトする
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
	exit;
}

// 共通化のため
$tpl_file = 'confirm.tpl';
$data = $_POST;
$data['id'] = $id;
$data['header'] = $header;
$data['return_url'] = 'admin_edit_input.php?i=' . $id;
$data['regist_url'] = 'admin_edit_finish.php';

// カテゴリのデータをデータベースからもらってくる
// DBに接続する
$m_category_data = new m_category_data();
// Where句用の配列を作る
$where = array( 'id' => $data['category'] );
$tmp = $m_category_data->select($where);
$data['category_name'] = $tmp[0]['name'];

//var_dump( $data );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

お次はadmin_edit_finish.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// データベースクラスファイルを読み込む
require_once( './include/db_handle.inc.php' );
// ニュースフィードデータクラスファイルを読み込む
require_once( './include/data/newsfeed_data.inc.php' );
// 中間データクラスファイルを読み込む
require_once( './include/data/newsfeed_category_data.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '編集完了';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// ニュースフィードのデータを取得しておく
$data = $_SESSION['post_data'];

// 更新するデータのIDを取得しておく
$id = $_SESSION['edit_data'];
$data['id'] = $id;

// (正常処理なので)セッションもう使わないので消しておく
$_SESSION['post_data'] = array();
unset( $_SESSION['post_data'] );
$_SESSION['edit_data'] = array();
unset( $_SESSION['edit_data'] );

// 日付の加工
$data['start_date'] = $data['start_date'] . ' ' . $data['start_time'];
$data['end_date'] = $data['end_date'] . ' ' . $data['end_time'];

// データベースクラスを呼び出す
$db = new newsfeed_data();
// データを渡してINSERTしてもらう
$db->update($data);

// カテゴリを登録する
$category_data = array(
    'newsfeed_id' => $id,
    'category_id' => $data['category']
);
// 中間データクラスを使う
$newsfeed_category_data = new newsfeed_category_data();
// データを渡してINSERTしてもらう
$newsfeed_category_data->regist( $category_data, 'newsfeed_id' );

// 一覧画面に遷移する
header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
exit;

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

さらにadmin_edit_input.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// データベースクラスファイルを読み込む
require_once( './include/db_handle.inc.php' );
// ニュースフィードデータクラスファイルを読み込む
require_once( './include/data/newsfeed_data.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '編集';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// セッションを消しておく
$_SESSION['edit_data'] = array();
unset( $_SESSION['edit_data'] );

// idの初期値を決定する
$id = NULL;

// 入力チェックをする
if ( $_GET['i'] ) {
	// 値があって、しかも数値型の場合は
	if ( is_numeric( $_GET['i'] ) ){
		// idに入力値を設定する
		$id = $_GET['i'];
	}
}

// ニュースフィードデータクラスを呼び出す
$newsfeed_data = new newsfeed_data();
// where句用の配列を作る
$where = array( 'id' => $id );
// データをもらう
$tmp = $newsfeed_data->select_with_category( $where );
$data = $tmp[0];
//var_dump( $tmp );
// 表示用に日付を加工する
$start_datetime = $data['start_date'];
$data['start_date'] = substr( $start_datetime, 0, 10 );
$data['start_time'] = substr( $start_datetime, 11, 8 );

$end_datetime = $data['end_date'];
$data['end_date'] = substr( $end_datetime, 0, 10 );
$data['end_time'] = substr( $end_datetime, 11, 8 );

//var_dump( $data );
// データが空っぽ(false)の場合はエラーとして、
// 一覧画面に戻す
if ( !$data ) {
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
	exit;
}

// idをセッションに渡す
$_SESSION['edit_data'] = $id;

// 戻り先URLの指定
$_SESSION['return_url'] = 'admin_edit_input.php?i=' . $id;

// データをもらう
$db = new db_handle();
$db->set_table_name('m_category');
$list_data = $db->select();

$data['category_list'] = $list_data;

// 共通化のため
$tpl_file = 'input.tpl';
$data['header'] = $header;
// Formの送信先を指定する
$data['form_action_url'] = './admin_edit_confirm.php';

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

まだまだadmin_login.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/initialize.inc.php' );

// 共通化のため
$tpl_file = 'admin_login.tpl';
$data['header'] = '';

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

これからこれからadmin_login_check.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/initialize.inc.php' );

echo "ログイン情報入力しました。";

// POSTの値をチェックする(DEBUG用)
//var_dump( $_POST );

$user = $_POST['user'];
$password = $_POST['password'];

//( $user );

// ハッシュします。
$h = $password;
for( $i = 0 ; $i < 1000 ; $i ++ ) {
	$h = hash('sha1', $user . $h );
}
//var_dump( $h );
//exit;

// DBに接続してログインしていいか確かめる
  // DBに接続する
$dbh = new PDO('mysql:host=localhost;dbname=arimoto222_d', 'arimoto222', 'arimoto222' );
//var_dump( $dbh );
  // SQLを用意する
$sql = 'SELECT id FROM admin_user '
     . ' WHERE user = :user '
     . '   AND password = :password;';
$stmt = $dbh->prepare( $sql );
  // 値をバインドする
$stmt->bindParam( ':user', $user );
$stmt->bindParam( ':password', $h );
  // SQLを実行する
$stmt->execute();

  // データがあれば正常
if ( $stmt->fetch() ) {
	// ログイン時のセッションを設定する
	$_SESSION['login_info'] = $user;
	// トップページに遷移する
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/index.php' );
	exit;
} else {
	// ログインページに遷移する
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/admin_login.php' );
	exit;
}	

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

先は長いです、admin_logout.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// セッションを消す
$_SESSION['login_info'] = array();
unset( $_SESSION['login_info'] );
$_SESSION['edit_data'] = array();
unset( $_SESSION['edit_data'] );


// ログインページに遷移する
header( 'Location: http://133.242.133.66/arimoto222/newsfeed/admin_login.php' );
exit;

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

次行きましょう、category_finish.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = 'カテゴリ登録完了';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// 入力された値をとりあえず表示(デバッグ用)
//var_dump( $_POST );

// 入力チェック
  // エラー有無のチェックを無しにしておく
$is_error = false;
  // エラー用の配列を初期化する
$errors = array();

// カテゴリがなかったらエラー
if ( $_POST['category'] == '' ) {
	$is_error = true;
	$errors['category'][] = 'カテゴリーを入力してください。';
} else {
	// 文字数が2〜100文字じゃなかったらエラー
	$string_count = mb_strwidth( $_POST['category'] );
	if ( $string_count > 24 ) {
		$is_error = true;
		$errors['category'][] = 'タイトルは24文字以下で入力してください。';
	}
}


// 入力値にエラーがあったら
if ( $is_error ) {
	// セッションに値をいれておく
	$_SESSION['post_data'] = $_POST;
	// エラー用のSESSIONを設定する
	$_SESSION['input_error'] = $errors;

	// input画面にリダイレクトする
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/category_input.php' );
	exit;
}


  // DBに接続する
$dbh = new PDO('mysql:host=localhost;dbname=arimoto222_d', 'arimoto222', 'arimoto222' );
//var_dump( $dbh );
  // SQLを用意する
$sql = 'INSERT INTO m_category '
     . ' ( name )'
     . ' VALUES( '
     . '   :name );';
$stmt = $dbh->prepare( $sql );
  // 値をバインドする
$stmt->bindParam( ':name', $_POST['category'] );
  // SQLを実行する
$stmt->execute();

// 指定された画面に戻る
$return_url = $_SESSION['return_url'];
// 使ったセッションを消しておく
$_SESSION['return_url'] = NULL;
unset( $_SESSION );
// 指定画面にリダイレクトする
header( 'Location: http://133.242.133.66/arimoto222/newsfeed/' . $return_url );
exit;

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

気合を出してください、category_input.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

//var_dump( $_SESSION );

if ( isset( $_SESSION['post_data'] ) ) {
	$data = $_SESSION['post_data'];
	// 使い終わったセッションは消しておく
	$_SESSION['post_data'] = array();
	unset( $_SESSION['post_data'] );
}

// 共通化のため
$tpl_file = 'category_input.tpl';
$data['header'] = '';
$data['return_url'] = $_SESSION['return_url'];

if ( isset( $_SESSION['input_error'] ) ) {
	$data['errors'] = $_SESSION['input_error'];
	// 使い終わったセッションは消しておく
	$_SESSION['input_error'] = array();
	unset( $_SESSION['input_error'] );
}


$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

疲れてきました、entry_confirm.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// カテゴリーデータクラスファイルを読み込む
require_once( './include/data/m_category_data.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '新規登録確認';
$header['logout_url'] = ADMIN_LOGOUT_URL;


// 入力された値をとりあえず表示(デバッグ用)
//var_dump( $_POST );

// 入力チェック
  // エラー有無のチェックを無しにしておく
$is_error = false;
  // エラー用の配列を初期化する
$errors = array();

// タイトルがなかったらエラー
if ( $_POST['title'] == '' ) {
	$is_error = true;
	$errors['title'][] = 'タイトルを入力してください。';
} else {
	// 文字数が2〜100文字じゃなかったらエラー
	$string_count = mb_strlen( $_POST['title'] );
	if ( $string_count < 2 || $string_count > 100 ) {
		$is_error = true;
		$errors['title'][] = 'タイトルは2文字以上100文字以下で入力してください。';
	}
}

// 開始日時がなかったらエラー
if ( $_POST['start_date'] == '' ) {
	$is_error = true;
	$errors['start_date'][] = '開始日時を入力してください。';
}
// 終了日時がなかったらエラー
if ( $_POST['end_date'] == '' ) {
	$is_error = true;
	$errors['end_date'][] = '終了日時を入力してください。';
}
// 一言がなかったらエラー
if ( $_POST['description'] == '' ) {
	$is_error = true;
	$errors['description'][] = '一言を入力してください。';
}


// セッションに値をいれておく
$_SESSION['post_data'] = $_POST;


// 入力値にエラーがあったら
if ( $is_error ) {
	// エラー用のSESSIONを設定する
	$_SESSION['input_error'] = $errors;

	// input画面にリダイレクトする
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/entry_input.php' );
	exit;
}


// 共通化のため
$tpl_file = 'confirm.tpl';
$data = $_POST;
$data['id'] = '';
$data['header'] = $header;
$data['return_url'] = 'entry_input.php';
$data['regist_url'] = 'entry_finish.php';


// カテゴリのデータをデータベースからもらってくる
// DBに接続する
$m_category_data = new m_category_data();
// Where句用の配列を作る
$where = array( 'id' => $data['category'] );
$tmp = $m_category_data->select($where);
$data['category_name'] = $tmp[0]['name'];

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );


// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

もう少し、entry_finish.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// データベースクラスファイルを読み込む
require_once( './include/db_handle.inc.php' );
// ニュースフィードデータクラスファイルを読み込む
require_once( './include/data/newsfeed_data.inc.php' );
// 中間データクラスファイルを読み込む
require_once( './include/data/newsfeed_category_data.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '新規登録完了';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// ニュースフィードのデータを取得しておく
$data = $_SESSION['post_data'];

// (正常処理なので)セッションもう使わないので消しておく
$_SESSION['post_data'] = array();
unset( $_SESSION['post_data'] );


// 日付の加工
$data['start_date'] = $data['start_date'] . ' ' . $data['start_time'];
$data['end_date'] = $data['end_date'] . ' ' . $data['end_time'];

// ニュースフィードデータクラスを呼び出す
$newsfeed_data = new newsfeed_data();
// データを渡してINSERTしてもらう
$newsfeed_data->insert($data);
// インサートしたデータのIDをもらう
$id = $newsfeed_data->get_last_inserted_id();

// カテゴリを登録する
$category_data = array(
    'newsfeed_id' => $id,
    'category_id' => $data['category']
);
// 中間データクラスを使う
$newsfeed_category_data = new newsfeed_category_data();
// データを渡してINSERTしてもらう
$newsfeed_category_data->insert( $category_data );

// 共通化のため
$tpl_file = 'entry_finish.tpl';
$data['header'] = $header;

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );


// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

パンクしそう、entry_input.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// データベースクラスファイルを読み込む
require_once( './include/db_handle.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '新規登録';
$header['logout_url'] = ADMIN_LOGOUT_URL;


// セッションの値を表示する(DEBUG用)
//var_dump( $_SESSION );

// もしセッションの値があったら
if ( isset( $_SESSION['post_data'] ) ) {
	$data = $_SESSION['post_data'];
} else {
	// なかったら空っぽにしとく
	$data = array();
}

// もしエラーのセッションの値があったら
if ( isset( $_SESSION['input_error'] ) ) {
	$errors = $_SESSION['input_error'];
} else {
	// なかったら空っぽにしとく
	$errors = array();
}

// セッションは使い終わったら消しておく
$_SESSION['post_data'] = array();
unset( $_SESSION['post_data'] );
$_SESSION['input_error'] = array();
unset( $_SESSION['input_error'] );

// データベースクラスを呼び出す
$db = new db_handle();
// データをもらう
$db->set_table_name('m_category');
$list_data = $db->select();

$data['category_list'] = $list_data;

// 共通化のため
$tpl_file = 'input.tpl';
$data['header'] = $header;
$data['errors'] = $errors;
// Formの送信先を指定する
$data['form_action_url'] = './entry_confirm.php';

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

大変ですね〜、index.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = 'TOP';
$header['logout_url'] = ADMIN_LOGOUT_URL;


// 共通化のため
$tpl_file = 'index.tpl';
$data['header'] = $header;

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

もう一歩前に、newsfeed.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/initialize.inc.php' );
// 表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );
// ニュースフィードデータクラスファイルを読み込む
require_once( './include/data/newsfeed_data.inc.php' );

// DBに接続する
$newsfeed_data = new newsfeed_data();
// 表示開始日の降順でソート
$order_by = array( 'start_date' => 'DESC' );
$newsfeed_data->make_order($order_by);
// 頭から5件表示
$newsfeed_data->make_limit( 0, 5 );
// データを取得する
$list_data = $newsfeed_data->select_with_category();
//var_dump( $list_data );
$data['list_data'] = $list_data;

// smarty変数を準備する
$smarty = new display_html();
$smarty->execute( $data, 'newsfeed.tpl' );

根性、根性、newsfeed_detail.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '一覧詳細';
$header['logout_url'] = ADMIN_LOGOUT_URL;
//var_dump( $_GET );

// idの初期値を決定する
$id = NULL;

// 入力チェックをする
if ( $_GET['i'] ) {
	// 値があって、しかも数値型の場合は
	if ( is_numeric( $_GET['i'] ) ){
		// idに入力値を設定する
		$id = $_GET['i'];
	}
}

// DBに接続する
$dbh = new PDO('mysql:host=localhost;dbname=arimoto222_d', 'arimoto222', 'arimoto222' );
//var_dump( $dbh );

// SQLを用意する
$sql = "SELECT * FROM newsfeed WHERE id = :id;";

$stmt = $dbh->prepare( $sql );
  // 値をバインドする
$stmt->bindParam( ':id', $id, PDO::PARAM_INT );

  // SQLを実行する
$r = $stmt->execute();

// データを取得する
$data = $stmt->fetch();
//var_dump( $data );

// データが空っぽ(false)の場合はエラーとして、
// 一覧画面に戻す
if ( !$data ) {
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
	exit;
}

// 共通化のため
$data['header'] = $header;
$tpl_file = 'newsfeed_detail.tpl';

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

粘りましょう、newsfeed_detail_delete.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '削除完了';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// 更新するデータのIDを取得しておく
$id = $_GET['i'];

// ニュースフィード削除処理ファイルを読み込む
require_once( './include/delete_newsfeed.inc.php' );

// 削除処理を行う
delete_newsfeed( $id );

// 一覧画面に遷移する
header( 'Location: http://133.242.133.66/arimoto222/newsfeed/newsfeed_list.php' );
exit;

// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

一段落newsfeed_list.php

<?php
// 初期設定ファイルを読み込む
require_once( './include/admin_initialize.inc.php' );
// ニュースフィードデータクラスファイルを読み込む
require_once( './include/data/newsfeed_data.inc.php' );

// ヘッダ用変数の設定
$header['user'] = $_SESSION['login_info'];
$header['pagename'] = '一覧';
$header['logout_url'] = ADMIN_LOGOUT_URL;

// 不要なセッションを削除する
if ( isset( $_SESSION['delete_data'] ) ) {
	$_SESSION['delete_data'] = array();
	unset( $_SESSION['delete_data'] );
}
if ( isset( $_SESSION['input_error'] ) ) {
	// エラー変数を取り込んでおく
	$data['errors'] = $_SESSION['input_error'];
	$_SESSION['input_error'] = array();
	unset( $_SESSION['input_error'] );
}


// ページの初期値(Default値)を指定する。
$page = 1;
// 1ページの表示数を指定する。
$line_max = 5;
// ページ数が設定されていれば、取得する
if ( isset( $_GET['p'] ) ) {
	$page = $_GET['p'];
}


// DBに接続する
$newsfeed_data = new newsfeed_data();
$tmp = $newsfeed_data->select_count();
$count_max = $tmp[0][0];
//var_dump( $count_max );

// 最大ページ数を取得する
$page_max = (integer) ( $count_max / $line_max );
if ( $count_max % $line_max != 0 ) {
	$page_max ++;
}

// ページ数をチェックする
if ( !is_numeric( $page ) ) {
	$page = 1;
} else {
	if ( $page < 1 || $page_max < $page ) {
		$page = 1;
	}
}

// 表示順序を決める
$column = '';
$order = '';
$order_by = '';
if ( isset( $_GET['sc'] ) && isset( $_GET['so'] ) ) {
	if ( $_GET['sc'] == 'start_date' ) {
		$column = 'start_date';
	}
	if ( $_GET['so'] == 'DESC' ) {
		$order = 'DESC';
		$tpl_order = 'ASC';
	} else if ( $_GET['so'] == 'ASC' ) {
		$order = 'ASC';
		$tpl_order = 'DESC';
	}
	if ( $column != '' && $order != '' ) {
		$order_by = array( $column => $order );
                $newsfeed_data->make_order( $order_by );
		$data['sort']['start_date'] = $tpl_order;
	}
} else {
	// デフォルトの値を設定しておく
		$data['sort']['start_date'] = 'DESC';
}


$page_top = $line_max * ( $page - 1 );
// SQLを用意する

$newsfeed_data->make_limit( $page_top, $line_max );
$list_data = $newsfeed_data->select_with_category();

// ページャー用のデータを作る
$pager = array();
$pager['prev'] = $page - 1;
$pager['next'] = $page + 1;
$pager['current'] = $page;
$pager['max'] = $page_max;

// 共通化のため
$data['header'] = $header;
$data['list_data'] = $list_data;
$data['pager'] = $pager;
$tpl_file = 'newsfeed_list.tpl';

// 詳細表示処理ファイルを読み込む
require_once( './include/display_detail.inc.php' );

$view = new display_html();
$view->execute( $data, $tpl_file );


// 終了共通処理ファイルを読み込む
require_once( './include/finalize.inc.php' );

これから書くPHPはincludeフォルダになります。まず、admin_initialize.inc.php

<?php
// 共通の前処理を読み込む
require_once( './include/initialize.inc.php' );

// 管理画面のログアウトURL(相対)
define ( 'ADMIN_LOGOUT_URL', 'admin_logout.php' );

// ログインチェックして、ログインしてなかったら
if ( !isset( $_SESSION['login_info'] ) ) {
	// ログインフォームに飛ばす
	header( 'Location: http://133.242.133.66/arimoto222/newsfeed/admin_login.php' );
	exit;
}

いくであります、db_handle.inc.php

<?php
/**
 * db_handle
 * 
 * データベースの取り扱いをしてくれるクラス
 * 
 *
 * @author 31
 */
class db_handle {

    // DBエンジン名
    protected $db_engine;
    // ホスト名
    protected $host_name;
    // DB名
    protected $db_name;
    // DBユーザー名
    protected $db_user;
    // DBユーザーパスワード
    protected $db_pass;
    // データベースハンドラ
    protected $dbh;
    protected $table_name;
    protected $column_list;
    protected $order_by;
    protected $limit;
    
    // コンストラクタ
    public function __construct() {
        $this->db_engine = 'mysql';
        $this->host_name = 'localhost';
        $this->db_name   = 'arimoto222_d';
        $this->db_user   = 'arimoto222';
        $this->db_pass   = 'arimoto222';
        
        $this->connect();
    }

    // DBに接続する
    protected function connect() {
        // PDOでDBに接続する
        $this->dbh = new PDO($this->make_dsn(), $this->db_user, $this->db_pass );
    }

    // 結果を取得する(ない場合もある)
    public function get_result( $statement ) {
        $tmp = array();
        while ( $row = $statement->fetch() ) {
            $tmp[] = $row;
        }
        return $tmp;
    }

    // INSERTした後に、そのデータのIDを返す
    public function get_last_inserted_id() {
        // 多分こんな感じ
        return $this->dbh->lastInsertId();
    }

    // データをINSERTする
    public function insert( $data ) {
        // 与えられたデータ配列から、テーブルカラムと
        // 同じ名前をもつものだけ抜き出す
        $data = $this->select_match_column( $data );
        // キーのみの配列を作る
        $key_array = array_keys($data);
        // バインド用の配列を作る
        $db_data = $this->make_bind_array( $data );
        // バインド変数のみの配列を作る
        $bind_array = array_keys($db_data);
        // SQLを作る
        $sql = 'INSERT INTO ' . $this->table_name;
        $sql .= '(' . implode( ',',$key_array ) . ') ';
        $sql .= 'VALUES(' . implode( ',', $bind_array ) . ');';
        
        $statement = $this->dbh->prepare( $sql );
        // 実行する
        return  $statement->execute($db_data);
    }
    
    // DSNを作る
    protected function make_dsn() {
        $dsn = $this->db_engine;
        $dsn .= ':host=' . $this->host_name;
        $dsn .= ';dbname=' . $this->db_name;
        return $dsn;
    }

    // テーブル名を設定する。
    // ついでに、テーブルが存在するか調べて、
    // テーブルがあればそのテーブルのカラムに
    // なにがあるのかも調べておく
    public function set_table_name($name) {
        // ひとまずテーブル名を保存しておく
        $this->table_name = $name;
        // テーブルにどんなカラムがあるか調べる
        return $this->show_columns();
    }

    // テーブルのカラムを調べる
    public function show_columns() {
        // カラムを取得するSQL
        $sql = 'SHOW COLUMNS FROM ' . $this->table_name;
        // 実行準備
        $statement = $this->dbh->prepare( $sql );
        // 実行して結果を取得する
        $result = $statement->execute();
        // 実行した結果が正常(取得できた)ならば
        if ( $result ) {
            // カラムリストを初期化する
            $column_list = array();
            // カラムリストを取得する
            while( $row = $statement->fetch() ) {
                $column_list[] = $row['Field'];
            }
            // カラムリストをクラス変数に保存する
            $this->column_list = $column_list;
        }
        // 結果を返却する
        return $result;
    }

    // 与えられたデータ配列から、テーブルカラムと
    // 同じ名前をもつものだけ抜き出す
    protected function select_match_column($data) {
        $tmp = array();
        foreach( $this->column_list as $column_name ) {
            if ( isset( $data[$column_name] ) )
            $tmp[$column_name] = $data[$column_name];
        }
        return $tmp;
    }

    // バインド用の配列を作成する
    protected function make_bind_array($data) {
        // データの配列のキーだけを取り出す
        $key_array = array_keys($data);
        $value_array = array_values($data);
        // キーの配列から、バインド用の変数を作る
        $bind_array = array();
        foreach( $key_array as $key ) {
            $bind_array[] = ':' . $key;
        }
        return array_combine($bind_array, $value_array);
    }

    public function update( $data, $key = 'id' ) {
        // 与えられたデータ配列から、テーブルカラムと
        // 同じ名前をもつものだけ抜き出す
        $data = $this->select_match_column( $data );
        // キーのみを持つ配列を作る
        $key_array = array_keys($data);
        // バインド用の配列を作る
        $db_data = $this->make_bind_array( $data );

        // 各項目のSET文を作る
        $tmp = array();
        foreach( $key_array as $key_name ) {
            if ( $key_name != $key ) {
                $tmp[] = $key_name . '=:' . $key_name;
            }
        }
        $set = implode( ',', $tmp );
        
        // SQLを作る
        $sql = 'UPDATE ' . $this->table_name;
        $sql .= ' SET ' . $set;
        $sql .= ' WHERE ' . $key . ' = :' . $key;

        $statement = $this->dbh->prepare( $sql );
        // 実行する
        return $statement->execute($db_data);
    }

    public function select( $where = null ) {
        $sql = 'SELECT * FROM ' . $this->table_name;
        // Where句用の配列が設定されていたら、
        // Where句を作る
        if ( $where != null ) {
            $sql .= $this->make_where( $where );
            // Where句用のバインド配列を作る
            $bind_array = $this->make_bind_array($where);
        } else {
            $bind_array = array();
        }
        $statement = $this->dbh->prepare( $sql );
        // 実行する
        $result = $statement->execute($bind_array);
        
        if ( $result ) {
            // 結果セットを取得して返す
            return $this->get_result( $statement );
        }
        return $result;
    }

    public function select_count( $where = null ) {
        $sql = 'SELECT COUNT(*) FROM ' . $this->table_name;
        // Where句用の配列が設定されていたら、
        // Where句を作る
        if ( $where != null ) {
            $sql .= $this->make_where( $where );
            // Where句用のバインド配列を作る
            $bind_array = $this->make_bind_array($where);
        } else {
            $bind_array = array();
        }
        $statement = $this->dbh->prepare( $sql );
        // 実行する
        $result = $statement->execute($bind_array);
        
        if ( $result ) {
            // 結果セットを取得して返す
            return $this->get_result( $statement );
        }
        return $result;
    }

    // 指定された配列でWhere句を作る
    public function make_where($where) {
        $where_phrase = ' WHERE';
        foreach( $where as $key => $value ) {
            $where_phrase .= ' ' . $key . ' = :' . $key;
        }
        return $where_phrase;
    }

    /**
     * ORDER BY句を作る
     * 配列には、カラム名=>昇順、降順が入る
     * @param array $order_by
     */
    public function make_order($order_by) {
        $order = 'ORDER BY ';
        $tmp = array();
        foreach( $order_by as $key => $value ) {
            $tmp[] = $key . ' ' . $value;
        }
        $order .= implode( ',', $tmp );
        // order句をクラス変数に入れておく
        $this->order_by = $order;
    }

    /**
     * LIMIT句を作る
     * @param integer $offset
     * @param integer $count
     */
    public function make_limit($offset, $count) {
        $limit = "LIMIT $offset,$count";
        $this->limit = $limit;
    }

    /**
     * データがあったらUPDATE,
     * データがなかったらINSERTする
     * @param arrayr $data
     * @param string $key
     */
    public function regist($data, $key = 'id' ) {
        //まずデータがあるか探しに行く
        $where = array( $key => $data[$key] );
        if ( $this->select( $where ) ) {
            return $this->update( $data, $key );
        } else {
            return $this->insert( $data );
        } 
    }    

}

?>

これからであります、delete_newsfeed.inc.php

<?php

function delete_newsfeed( $id ) {
	// DBに接続する
	$dbh = new PDO('mysql:host=localhost;dbname=arimoto222_d', 'arimoto222', 'arimoto222' );
	// SQLを用意する
	$sql = 'DELETE FROM newsfeed '
	 . 'WHERE id = :id;';
	$stmt = $dbh->prepare( $sql );
	// 値をバインドする
	$stmt->bindParam( ':id', $id, PDO::PARAM_INT );
	// SQLを実行する
	$stmt->execute();
}

続きますよ、display_detail.inc.php

<?php

class display_html {

	// smarty変数
	private $smarty;

	// コンストラクタ
	// クラスインスタンスを生成したときに
	// 自動的に実行される
	function __construct() {
		// 初期化を行う
		$this->prepare_setting();
	}

	function prepare_setting() {
		// smartyの設定

		// Smartyをinclude
		require_once('/opt/www/Smarty-3.1.12/libs/Smarty.class.php');
		// インスタンスを作成
		$this->smarty = new Smarty();
		// Smartyにテンプレートのあるディレクトリを教える
		$this->smarty->template_dir = '/home/arimoto222/htdocs/newsfeed/templates/';
		// Smartyの作業ディレクトリを設定
		$this->smarty->compile_dir  = '/home/arimoto222/smarty/newsfeed/templates_c/';
	}

	function assign_data( $data ) {
		// テンプレートに値を割り当てる
		$this->smarty->assign( 'data', $data );
	}

	function display( $tpl_file ) {

		// テンプレートを表示する
		$this->smarty->display( $tpl_file );
	}

	// インターフェース互換性のため
	function execute( $data, $tpl_file ) {
		// データ割り当て
		$this->assign_data( $data );
		// テンプレート表示
		$this->display( $tpl_file );
	}

}

終わらないのであります、finalize.inc.php

<?php
//-----------ここから共通の後処理------------------------------------------------
// 外部出力バッファの内容を出力し、バッファを破棄する
ob_end_flush();

そろそろであります、initialize.inc.php

<?php
// 外部バッファ開始
ob_start();

// エラー制御

// エラー出力を強制的にONにする
ini_set('display_errors', 'on');
// 出力するエラーを制限しない(全部出す)
error_reporting(E_ALL);

// セッション変数の設定
session_start();

// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

これから書くのはincludeの中のdataフォルダの中のものです。m_category_data.inc.php

<?php
/**
 * m_category_data
 * 
 * カテゴリーデータの取り扱いをしてくれるクラス
 * 
 *
 * @author 31
 */
require_once( 'include/db_handle.inc.php' );

class m_category_data extends db_handle {

    public function __construct() {
        // 親クラスのコンストラクタを呼んで、DBに接続する
        parent::__construct();
        // テーブル名を設定しておく
        $this->set_table_name('m_category');
    }    
    
}
?>

ラストスパートnewsfeed_category_data.inc.php

<?php
/**
 * newsfeed_category_data
 * 
 * ニュースフィードとカテゴリーデータの
 * 昼間テーブルの取り扱いをしてくれるクラス
 * 
 *
 * @author 31
 */
require_once( 'include/db_handle.inc.php' );

class newsfeed_category_data extends db_handle {

    public function __construct() {
        // 親クラスのコンストラクタを呼んで、DBに接続する
        parent::__construct();
        // テーブル名を設定しておく
        $this->set_table_name('newsfeed_category');
    }
    
}
?>

これで終わりにしましょう、newsfeed_data.inc.php

<?php
/**
 * db_handle
 * 
 * データベースの取り扱いをしてくれるクラス
 * 
 *
 * @author 31
 */
require_once( 'include/db_handle.inc.php' );

class newsfeed_data extends db_handle {

    public function __construct() {
        // 親クラスのコンストラクタを呼んで、DBに接続する
        parent::__construct();
        // テーブル名を設定しておく
        $this->set_table_name('newsfeed');
    }

    /**
     * カテゴリーもまとめてSELECTしてくれるメソッド
     */
    public function select_with_category( $where = null ) {
        $sql = 'SELECT '  
             . '    nf.*,'
             . '    mc.id AS category_id,'
             . '    mc.name AS category'
             . '  FROM newsfeed AS nf'
             . '    LEFT JOIN newsfeed_category AS nc'
             . '      ON nf.id = nc.newsfeed_id'
             . '    LEFT JOIN m_category AS mc'
             . '      ON nc.category_id = mc.id';
        // Where句用の配列が設定されていたら、
        // Where句を作る
        if ( $where != null ) {
            $sql .= ' WHERE nf.id = ' . $where['id'];
            // Where句用のバインド配列を作る
            $bind_array = $this->make_bind_array($where);
        } else {
            $bind_array = array();
        }
        $sql .= ' ' . $this->order_by . ' ' . $this->limit;
        $statement = $this->dbh->prepare( $sql );
        //var_dump( $sql );
        // 実行する
        $result = $statement->execute($bind_array);
        
        if ( $result ) {
            // 結果セットを取得して返す
            return $this->get_result( $statement );
        }
        return $result;
    }


}
?>

長〜〜〜〜文お疲れ様です。実際にはコレにデータベースのテーブル作成などがありますが、プログラム的にはこんな感じですね。

ここまで

ニュースフィード完成 「モナーク・バタフライ」

こんにちは

本日のひとこと「モナーク・バタフライ」です。

今日は以前から少しずつ作業していた、ニュースフィードの完成形を書きたいと思います。

まぁファイル数が多いので、cssとテンプレートファイルを書きます。
続きは次回にします。

最初はcssからです。

.error_text {
	color: red;
	font-weight: bold;
}

ul {
	list-style: none;
	margin: 2px;
	padding: 0;
}

ul li {
	clear: both;
}

ul li.even {
	background-color: #ccccee;
}

ul li.odd {
	background-color: #eecccc;
}

ul li div {
	display: block;
	float: left;
        height: 20px;
        overflow: hidden;
        border-right: 1px solid;
	border-bottom: 1px solid;
	padding: 3px 5px;
}

li div.header {
	border-top: 1px solid;
	text-align: center;
	background-color: #00cc88;
}

li div.headcolumn {
	border-left: 1px solid;
}

li div.col_startdate {
	width: 160px;
	text-align: center;
}

li div.col_enddate {
	width: 160px;
	text-align: center;
}

li div.col_category {
	width: 120px;
}

li div.col_title {
	width: 200px;
}

li div.col_edit {
	width: 50px;
	text-align: center;
}

li div.col_delete {
	width: 50px;
	text-align: center;
}

次にテンプレートを書いていきます。
まず、テンプレートフォルダの中のcommonフォルダの中にあるadmin_header.tplです。

<!-- contents header -->
	<div class="header">
		<h1>ニュースフィード管理画面 - {$data.header.pagename}</h1>
		<h3>ユーザー:{$data.header.user} <a href="{$data.header.logout_url}">ログアウト</a></h3>
	</div>
<!-- /contents header -->

次にテンプレートフォルダのファイルです。admin_delete_confirm.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<title>ニュースフィード管理画面 - {$header.pagename}</title>
	<link rel="stylesheet" href="css/newsfeed.css"></style>
</head>

<body>
	{include file='common/admin_header.tpl'}
		<dl>
			<dt>タイトル</dt>
			<dd>{$data.title|escape:'html'}</dd>
			<dt>表示開始日時</dt>
			<dd>{$data.start_date|escape:'html'}</dd>
			<dt>表示終了日時</dt>
			<dd>{$data.end_date|escape:'html'}</dd>
			<dt>内容</dt>
			<dd>{$data.description|escape:'html'}</dd>
		</dl>
		<p>
			このデータを削除します。
		</p>
		<a href="newsfeed_list.php">戻る</a>
		<a href="admin_delete_finish.php">削除</a>
</body>
</html>

続いてadmin_login.tpl

<!document html>
<head>
	<meta charset="UTF-8">
</head>

<body>
	<h1>管理者ログイン</h1>
	<form action="admin_login_check.php" method="post">
		<p>ユーザー:<input type="text" name="user"></p>
		<p>パスワード:<input type="password" name="password"></p>
		<p><input type="submit" value="ログイン"></p>
	</form>
</body>
</html>

次にcategory_input.tpl

<!document html>
<head>
	<meta charset="UTF-8">
</head>

<body>
	<h1>カテゴリー入力</h1>
	<form action="category_finish.php" method="post">
		{if isset( $data.errors.category )}
			{foreach from=$data.errors.category item=message}
				<span class="errortext">{$message}</span>
			{/foreach}
		{/if}

		<p>カテゴリー名<input type="text" name="category" value="{if isset($data.category)}{$data.category|escape:"html"}{/if}"></p>
		<p><input type="submit" value="登録"></p>
		<p><a href="{$data.return_url}">戻る</p>
	</form>
</body>
</html>

続きましてconfirm.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<title>ニュースフィード管理画面 - {$header.pagename}</title>
	<link rel="stylesheet" href="css/newsfeed.css"></style>
</head>

<body>
	{include file='common/admin_header.tpl'}
		<dl>
			<dt>タイトル</dt>
			<dd>{$data.title|escape:'html'}</dd>
			<dt>表示開始日時</dt>
			<dd>{$data.start_date|escape:'html'}&nbsp;{$data.start_time|escape:'html'}</dd>
			<dt>表示終了日時</dt>
			<dd>{$data.end_date|escape:'html'}&nbsp;{$data.end_time|escape:'html'}</dd>
			<dt>カテゴリー</dt>
			<dd>{$data.category_name|escape:'html'}</dd>
			<dt>内容</dt>
			<dd>{$data.description|escape:'html'}</dd>
		</dl>
		<a href="{$data.return_url}">戻る</a>
		<a href="{$data.regist_url}">登録</a>
</body>
</html>

それからentry_finish.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<title>ニュースフィード管理画面 - {$header.pagename}</title>
</head>

<body>
	{include file='common/admin_header.tpl'}
		<p>登録しました。</p>
		<a href="index.php">TOPに戻る</a>
</body>
</html>

お次はindex.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<title>ニュースフィード管理画面 - {$header.pagename}</title>
</head>

<body>
	{include file='common/admin_header.tpl'}
	<p><a href="./entry_input.php">新規登録</a></p>
	<p><a href="./newsfeed_list.php">一覧画面</a></p>
	<p><a href="./admin_logout.php">ログアウト</a></p>
</body>
</html>

さらにinput.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<title>ニュースフィード管理画面 - {$header.pagename}</title>
	<link rel="stylesheet" href="css/newsfeed.css"></style>
	<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
	<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
	<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
	<script type="text/javascript">
		$(function(){
			$('#start_datepick').datepicker({
									dateFormat: "yy-mm-dd"
			});
			$('#end_datepick').datepicker({
									dateFormat: "yy-mm-dd"
			});
		});
	</script>

	<title>ニュースフィード管理画面 - {$data.header.pagename}</title>
	
</head>

<body>
	{include file='common/admin_header.tpl'}
	<form action="{$data.form_action_url}" method="post">
		<dl>
			<dt>タイトル
				{if isset( $data.errors.title )}
					{foreach from=$data.errors.title item=message}
						<span class="errortext">{$message}</span>
					{/foreach}
				{/if}
			</dt>
			<dd><input type="text" name="title" value="{if isset( $data.title )}{$data.title|escape:'html'}{/if}"></dd>
			<dt>表示開始日
				{if isset( $data.errors.start_date )}
					{foreach from=$data.errors.start_date item=message}
						<span class="errortext">{$message}</span>
					{/foreach}
				{/if}
			</dt>
			<dd><input type="text" name="start_date" id="start_datepick" value="{if isset( $data.start_date )}{$data.start_date|escape:'html'}{/if}"></dd>
			<dt>表示開始時間</dt>
			<dd><select name="start_time">
				{section name=time start=0 loop=24 max=24}
					<option value="{$smarty.section.time.index}:00:00" {if isset( $data.start_time )}{if $smarty.section.time.index == $data.start_time}selected{/if}{/if}>{$smarty.section.time.index}:00</option>
				{/section}
				</select>
			</dd>
			<dt>表示終了日
				{if isset( $data.errors.end_date )}
					{foreach from=$data.errors.end_date item=message}
						<span class="errortext">{$message}</span>
					{/foreach}
				{/if}
			</dt>
			<dd><input type="text" name="end_date" id="end_datepick" value="{if isset( $data.end_date )}{$data.end_date|escape:'html'}{/if}"></dd>
			<dt>表示終了時間</dt>
			<dd><select name="end_time">
				{section name=time start=0 loop=24 max=24}
					<option value="{$smarty.section.time.index}:00:00">{$smarty.section.time.index}:00</option>
				{/section}
				</select>
			</dd>
			<dt>カテゴリー&nbsp;<a href="category_input.php">カテゴリー登録</a>
				{if isset( $data.errors.category )}
					{foreach from=$data.errors.category item=message}
						<span class="errortext">{$message}</span>
					{/foreach}
				{/if}
			</dt>
			<dd>
				<select name="category">
					{foreach from=$data.category_list item=category_row}
						<option value="{$category_row.id}" {if isset($data.category_id)}{if $data.category_id == $category_row.id}selected{/if}{/if}>{$category_row.name}</option>
					{/foreach}
				</select>
			</dd>
			<dt>内容
				{if isset( $data.errors.description )}
					{foreach from=$data.errors.description item=message}
						<span class="errortext">{$message}</span>
					{/foreach}
				{/if}
			</dt>
			<dd><textarea name="description">{if isset( $data.description )}{$data.description|escape:'html'}{/if}</textarea></dd>
		</dl>
		<a href="index.php">TOPに戻る</a>
		<input type="submit" value="確認">
	</form>
</body>
</html>

もう少しnewsfeed.tpl

<!document html>
<head>
	<meta charset="UTF-8">
</head>

<body>
	<h1>新着一覧</h1>
	<ul>
	{foreach from=$data.list_data item=row}
		<li>{$row.start_date|date_format:"%Y年%m月%d日"} &nbsp;[{$row.category}]<a href="#">{$row.title}</a></li>
	{/foreach}
	</ul>
</body>
</html>

頑張れ〜newsfeed_detail.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<script type="text/javascript">
function delete_dialog(id){
	if ( window.confirm('本当に削除してもよろしいですか?' ) ) {
		location.href = 'newsfeed_detail_delete.php?i=' + id;
	}
}
	</script>

	<title>ニュースフィード管理画面 - {$header.pagename}</title>
</head>

<body>
	{include file='common/admin_header.tpl'}
	<p>
		<a href="#" onclick="delete_dialog({$data.id});">このデータを削除する</a>
	</p>
	<dl>
		<dt>タイトル</dt>
		<dd>{$data.title}</dd>
		<dt>表示開始日時</dt>
		<dd>{$data.start_date}</dd>
		<dt>表示終了日時</dt>
		<dd>{$data.end_date}</dd>
		<dt>内容</dt>
		<dd>{$data.description}</dd>
	</dl>
	<a href="newsfeed_list.php">戻る</a>
</body>
</html>

最後です、newsfeed_list.tpl

<!document html>
<head>
	<meta charset="UTF-8">
	<title>ニュースフィード管理画面 - {$data.header.pagename}</title>
	<link rel="stylesheet" href="css/newsfeed.css"></style>
</head>

<body>
	{include file='common/admin_header.tpl'}
	<a href="index.php">TOPに戻る</a>
	<a href="entry_input.php">新規登録</a>
	{if isset( $data.errors )}
	<p class="error_text">
		{foreach from=$data.errors item=error}
			{$error.0}<br />
		{/foreach}
	</p>
	{/if}

	<ul>
		<li>
			<div class="header headcolumn col_startdate">
				表示開始日時&nbsp;<a href="newsfeed_list.php?sc=start_date&so={$data.sort.start_date}">{if $data.sort.start_date == 'DESC'}▼{else}▲{/if}</a>
			</div>
			<div class="header col_enddate">
				表示終了日時
			</div>
			<div class="header col_category">
				カテゴリ
			</div>
			<div class="header col_title">
				タイトル
			</div>
			<div class="header col_edit">
				編集
			</div>
			<div class="header col_delete">
				削除
			</div>
		</li>
	{foreach from=$data.list_data item=row}
		<li>
			<div class="headcolumn col_startdate">
				{$row.start_date}
			</div>
			<div class="col_enddate">
				{$row.end_date}
			</div>
			<div class="col_category">
				<a href="newsfeed_detail.php?i={$row.id}">{$row.category}</a>
			</div>
			<div class="col_title">
				<a href="newsfeed_detail.php?i={$row.id}">{$row.title}</a>
			</div>
			<div class="col_edit">
				<a href="admin_edit_input.php?i={$row.id}">編集</a>
			</div>
			<div class="col_delete">
				<a href="admin_delete_confirm.php?i={$row.id}">削除</a>
			</div>
		</li>
	{/foreach}
	</ul>
	<p class="data.pager" style="clear:both;">
		{if $data.pager.prev > 0}
			<a href="./newsfeed_list.php?p={$data.pager.prev}">&lt;</a>
		{else}
			&lt;
		{/if}
		 &nbsp;
		{if $data.pager.next <= $data.pager.max}
			<a href="./newsfeed_list.php?p={$data.pager.next}">&gt;</a>
		{else}
			&gt;
		{/if}
	</p>
	<p>{$data.pager.current} ページ / {$data.pager.max} ページ中</p>
</body>
</html>


とりあえず、テンプレートはこんな感じです。次回はPHPになります。

ここまで

ビジネスのスタンス 「ガリー・トロット」

こんにちは

本日のひとこと「ガリー・トロット」です。

今日はこれから仕事をしていく上で、必要なスタンスについてです。

これからのビジネスについて・・・
現代の業務状況は10年前と比べると、大分変化していることがわかります。
終身雇用という制度は、これから働こうとしている人達にはあまり縁のないお話となっていますし、正社員になることも難しい就職氷河期のあおりが続いています。(正社員も解雇される時代になるようです)
そこで、これからのビジネスを考えるのなら自分のスタンスをハッキリさせる必要があります。
まず、今までの常識をベースに考えないことです。これからは自分の仕事量や幅が広がることを覚悟する必要がありますので技術と知識は常にアンテナを高くしておきましょう。(自分の知らないことは沢山あります)

また、仕事は自分に余裕を持たせておきましょう。
現状が変更できないのであれば、できることからしましょう。できることを箇条書きでもいいので羅列してみてから手をつけましょう。
例えば、金銭の余裕を持たせる為に下請けを構築したりするのもありです。(メールフォームや友人との交流など)
自分だけが働く環境を固定してしまうと、イレギュラー時に時間・精神・金銭などのストックが底を尽きます。

先を見据えるのなら、余裕を持たせる為の策をとりあえず考えましょう。

ここまで。

web業界で仕事をする 「大厄の闘牛士」

こんにちは

本日のひとこと「大厄の闘牛士」です。

今日は、web業界で仕事をする際(主にフリー)の知っておきたい情報を書いてみたいと思います。
まずこれからの狙い目についてです。
これからは少子化の影響で参考書や塾などが流行ると思いますが、大人向けの塾となるとあまり多くありません。専門学校ではなく少人数の塾を展開すると需要があるのではないかと考えています。ポイントとして授業料を続けて払える金額にすることがよいかも知れません。また、場所は狭くてもよいが、時間帯に気を配る必要があります。

では、仕事をする上での情報をいくつか書いていきます。
ユーザー側(お客様)が閲覧するサイトを制作しなければなりません。素晴らしい内容でも見てもらえないものは意味がなくなってしまいます。
お客様が沢山来店されるお店には、やはり理由があると思います。例えば、地図を載せる際にわかりやすくする必要があるため、写真を景色ごとに貼ったり、手書き線のようなもので道順を感覚で地図を見やすくしたりなどしています。

商売には手順と言うものがあり、基本を理解して行動する必要があります。というわけで早速下に手順を書いてみます。
1.目的
何を売ろう?
どのように売ろう?
そのために何を使うか?
2.手段
チラシ?
雑誌広告?
ポスター?
インターネット?
カタログを配る?
3.内容
何を伝えよう?
新製品の情報?
キャンペーン情報?
関連商品の情報かも?
4.順番
新製品の情報
キャンペーン情報
関連商品の情報
会社情報
連結先・その他
5.製作者・作業者
営業などで判断し、依頼する。

このように企画を練る段階でも考えることは多いです。だからこそひとつひとつも意味を深めていくことで、より良い企画となるでしょう。作業する際の注意点を書いておきます。
情報の順番を決めることが大事です。(CSSのことを思い浮かべましょう)
どこに何を設置することも全てに理由を追求する必要があります。(距離感や余白計算などの何気ないものの調整がデザイナーになれるかどうかの決め手になります)例えば、小説形式なら中央に集めて周りに余白を作り、チラシなどなら逆に隙間のないようにします。

技術的な点として、デザインのスキルを持ち上げたいのなら勉強すべき点を広げてみるのも良いかと思います。
例えばこんな感じです。
色相・彩度・明度の意味を考えましょう。例えば、白なら未来を意識させたりしたりするイメージを与えてくれます。他にもおめでたい催しには黒色の品を送ったりしてはいけないなどです。日本の場合は四季を大切にするので、それに合わせることでキャンペーンを成功させることができます。

マーケティングもするならやはり設計を考える必要があります。念頭に置くことは購入理由を作ってあげることです。
第一段階 観念の設計
第二段階 欲求の設計
第三段階 感情(嗜好)の設計
第四段階 知覚、感覚の設計
このようにして、企画を寝る必要があります。

成功したいのなら上記のようルールを守り、加えて独自のルールで攻める必要があります。

ここまで

PHPの便利ツール 「ガブリエル・ラチェット」

こんにちは

本日のひとこと「ガブリエル・ラチェット」です。

今日は、PHPの便利ツールについて書きたいと思います。
今回ご紹介するのはコチラ↓↓
プログラムのDreamWeaver的なツール、ネットビーンズ(Net Beans)です。
https://ja.netbeans.org/
これはPHPJavaScriptのソースを書く際にとても便利なものです。具体的には、編集やリファクタリングHTML5のソース制作などをサポートしてくれます。

HTML,CSSなどを使用する際のサポートととして、DreamWeaverがありますが、Net Beansはそのプログラム用だと思って大丈夫でしょう。
ダウンロードは無料になりますので、一度試してみるのも良いかと思います。(puttyも使えるようにしておきましょう)

大事な注意点として、赤色の!がでるエラー表示はその状態ではセーブ効果がないので、保存されません。とりあえず赤信号はまずいので、確認してから閉じましょう。

最初の設定は色々混乱することがあるので、とりあえず箇条書きで書いておきます。(インストールが終了しているとします)

新規プロジェクトを選びます。
phpプロジェクトを選び、リモートサーバーから接続を選びます。
次へ
プロジェクト名は自由にしてください。
phpvar5.4を指定してください。
リモート接続の場所ですが、URLhttp://133./a/newsfeed/のようにサーバーを書いておきます。
管理のボタンを押します。
名前は自由です。
SFTPにします。
サーバー名を書きます。133.
ユーザー名を書きます。arimoto222
秘密鍵ファイルはputtygenから読み込みます。
変換はOPENにしましょう。
ホスト名は133.です。
ユーザー名 a
初期ディレクト
/home/a/htdocs/newsfeed/
接続を確認してOKがでましたら大丈夫です。
アップロードディレクトリはすでに書き込んであるので/のみで大丈夫です。

こんな感じで設定を終えたら開始してみましょう。indexが表示されかと思います。(ファイルが表示されない場合は作り直す必要があるかもしれません)

ここまで