goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

CakePHPの1.X系と、2.X系で何が違うのか-その1

2013-03-21 18:31:53 | PHP
PHPの1.X系と、2.X系で何が違うのか
同じものを作って比較してみる。

今回は、お題1を1.Xで




以下の画面

を表示したら、名前を入れて(wwwとする)Goをクリックすると

と、表示される。
1回目というのは、wwwさんが何回も訪問すれば2、3・・・と
上がっていくが、別の人だと1回から・・・というかんじ。

この場合、モデルはつかわなくてよくて、ビューとコントローラーだけ
使って考える




■1.X(1.3)の場合

・cakephp-cakephp-1.3.15-0-g3ff1ff1.zip
 をダウンロード、解凍したら、フォルダ名を変えて
 (今回はHelloCakeとしました)
 htdocsの下にコピーする

・app以下に、以下のファイルを作成する

app
 |
 |-controllers
 | |
 | *-my_test_controller.php
 |
 *- views
    |
    *-my_test
        |
        |-hello.ctp
        |
        *-index.ctp

・各ファイルの内容は、以下のとおり

my_test_controller.php
<?php
class MyTestController extends AppController {

	var $name = 'MyTest';
	public $uses = null; 

	public function index() {

	}

	public function hello() {
		$yourname =$this->params['form']['yourname'];
		$this->set('yourname',$yourname);

		$kaisu = $this->Session->read($yourname."kaisu") + 1;
		$this->set('kaisu',$kaisu);
		$this->Session->write($yourname."kaisu",$kaisu);
	}
}


hello.ctp

<html>
<head>
<title>Hello, World!</title>
</head>
<body>

こんにちは、
<?php echo $yourname; ?>
さん!
<br />
<?php echo $kaisu; ?>回目のご訪問です
</body>
</html>


index.ctp

<html>
<head>
<title>Hello, World!</title>
</head>
<body>
こんにちは!<br />
お名前をどうぞ。<br />

<form action="MyTest/hello" method="post">
<input type=text name=yourname>
<input type=submit value="Go">
</form>

</body>
</html>





■2.X(2.3)の場合

・cakephp-2.3.1.zip
 をダウンロード、解凍したら、フォルダ名を変えて
 (今回はHelloCake2としました)
 htdocsの下にコピーする

・HelloCake2/app以下に、以下のファイルを作成する

app
 |
 |-Controller
 | |
 | *-MyTestController.php
 |
 *-View
   |
   *-MyTest
      |
      |-hello.ctp
      |
      *-index.ctp

・各ファイルの内容は、以下のとおり

MyTestController.php

<?php
class MyTestController extends AppController {

public function index() {

}

public function hello() {
$yourname =$this->data['yourname'];
$this->set('yourname',$yourname);

$kaisu = $this->Session->read($yourname."kaisu") + 1;
$this->set('kaisu',$kaisu);
$this->Session->write($yourname."kaisu",$kaisu);
}


}


hello.ctp

<html>
<head>
<title>Hello, World!</title>
</head>
<body>

こんにちは、
<?php echo $yourname; ?>
さん!
<br />
<?php echo $kaisu; ?>回目のご訪問です
</body>
</html>


index.ctp

<html>
<head>
<title>Hello, World!</title>
</head>
<body>
こんにちは!<br />
お名前をどうぞ。<br />

<form action="MyTest/hello" method="post">
<input type=text name=yourname>
<input type=submit value="Go">
</form>

</body>
</html>





次回は、詳しい説明へ

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでExcel-PHPExcelの遊び方(6)グラフを描いてみる

2013-02-22 17:10:20 | PHP
前回の

PHPでExcel-PHPExcelの遊び方(5)リンクさせたり、枠を書いたり
http://blog.goo.ne.jp/xmldtp/e/34c211549134c1b89a5257dbc4636830

で、文字をテキトーにいじくったので、今度はグラフ!

といっても、じつは、PHPExcelをダウンロードして、
解凍すると、Testsっていうフォルダができるけど、
そこにある「33chartcreate-bar.php」を、そのまま
ぱくって書いてある(^^;)
いや、ちょっとかえたよ(^^;)




■お題

以下のようなExcelファイル

「PHPExcelSimple1.xls」を読み込み

のように、グラフをつけて
「PHPExcelSimple3.xlsx」に書き出しなさい

*注:xls(Excel5形式)では、グラフを書き出しませんでした。




■ソースコード

こんなかんじ。
<?php

/** エラーのための設定 */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Tokyo');


/** PHPExcelのインクルード */
require_once '/Classes/PHPExcel.php';
require_once '/Classes/PHPExcel/IOFactory.php';
require_once '/Classes/PHPExcel/Chart.php';

// PHPExcel作成
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load('PHPExcelSimple1.xls');

// セル値設定(はじめのシートに値が設定してある)
$objPHPExcel->setActiveSheetIndex(0);

// グラフのデータを設定
$dataseriesLabels = array(
	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B', null, 1),	//	2010
	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C', null, 1),	//	2011
	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D', null, 1),	//	2012
);

$xAxisTickValues = array(
	new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A:$A', null, 4),	// Q1 to Q4
);

$dataSeriesValues = array(
	new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B:$B', null, 4),
	new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C:$C', null, 4),
	new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D:$D', null, 4),
);

//  データ生成
$series = new PHPExcel_Chart_DataSeries(
	PHPExcel_Chart_DataSeries::TYPE_BARCHART,		// plotType
	PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED,	// plotGrouping
	range(0, count($dataSeriesValues)-1),			// plotOrder
	$dataseriesLabels,								// plotLabel
	$xAxisTickValues,								// plotCategory
	$dataSeriesValues								// plotValues
);

// グラフの設定
$series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_BAR);
$plotarea = new PHPExcel_Chart_PlotArea(null, array($series));
$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, null, false);
$title = new PHPExcel_Chart_Title('Test Bar Chart');
$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)');

// グラフ作成	
$chart = new PHPExcel_Chart(
	'chart1',		// name
	$title,			// title
	$legend,		// legend
	$plotarea,		// plotArea
	true,			// plotVisibleOnly
	0,				// displayBlanksAs
	null,			// xAxisLabel
	$yAxisLabel		// yAxisLabel
);


// グラフをワークシートへ
$chart->setTopLeftPosition('A7');
$chart->setBottomRightPosition('H20');
$objPHPExcel->getActiveSheet()->addChart($chart);


// xlsx形式でSave 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->setIncludeCharts(TRUE);
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));


echo 'おわり' ;





■解説
前回と違うところのみを解説

・インクルード
 チャート用に

require_once '/Classes/PHPExcel/Chart.php';

を追加


・グラフのデータを設定
PHPExcel_Chart_DataSeriesValuesを作って、
  $dataseriesLabelsに、年を、
  $xAxisTickValuesにQ1、Q2,Q3,Q4(四半期)を、
  $dataSeriesValuesにデータ
を設定して、それらを、PHPExcel_Chart_DataSeriesで1つにまとめている

・グラフの設定・生成
 いろいろこまごまとした設定をしたあと、
 PHPExcel_Chartでグラフを作成してる

・グラフをワークシートへ
 addChartで、グラフをワークシートの中に追加している

・書き出し
 いつもとちがって、xlsx形式で書き出している
 (xlsだと、グラフを書き出さない)




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでExcel-PHPExcelの遊び方(5)リンクさせたり、枠を書いたり

2013-02-21 13:26:51 | PHP
前回の

PHPでExcel-PHPExcelの遊び方(4)セルの枠を書いたり、グラフを書く資料
http://blog.goo.ne.jp/xmldtp/e/d9de2048dceebe9ee9367ec04fea751b

の実践編?

セルをリンクさせたり、枠を書いたり、文字の色を変えたりしてみます。




■お題

こんなかんじのシートをつくります。

■前提条件

PHPでExcel-PHPExcelの遊び方(3)HelloWorldプログラム:説明
http://blog.goo.ne.jp/xmldtp/e/2def006b5047d95374013c133179b87d

の内容は理解できていて、そこに書かれているソースコードを実行し、

  PHPExcelSimple1.xls

というファイル名で保存されているものとします。

さらに、そのファイルを開き、Sheet1というシートを作り、保存したところから始まります。

■ソースコード

こんなかんじ
<?php

/** エラーのための設定 */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Tokyo');


/** PHPExcelのインクルード */
require_once '/Classes/PHPExcel.php';
require_once '/Classes/PHPExcel/IOFactory.php';

// PHPExcel作成
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load('PHPExcelSimple1.xls');


// セル値設定
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'やふー');
$objPHPExcel->getActiveSheet()->setCellValue('B1', 'YAHOO');
$objPHPExcel->getActiveSheet()->setCellValue('C1', 'ホームページ');


// ハイパーリンクの設定
$objPHPExcel->getActiveSheet()->getCell('A1')->getHyperlink()->setUrl('sheet://Sheet1!A1');
$objPHPExcel->getActiveSheet()->getCell('C1')->getHyperlink()->setUrl('http://www.yahoo.co.jp');


//赤くする
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);

//線を引く
$objPHPExcel->getActiveSheet()->getStyle('A1:C1')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
$objPHPExcel->getActiveSheet()->getStyle('A1:C1')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_DOTTED);

// xls形式でSave 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));


echo 'おわり' ;



■解説

エラーの設定やインクルード、Excelファイルのオープンとセーブに関しては、
前提条件に書いた、第三回と変わらないので省略。

・セル値設定
まず、setActiveSheetIndex(0)で、シートを選択します。
すると、そのシートがActiveSheetになるので、
getActiveSheet()して、setCellValueで値を設定していく。
ここで、=で始めると、数式になる。

・ハイパーリンクの設定
getCell()でセルを取ってきた後、getHyperlink()して、
それに対してsetUrl()で、URLを指定して、リンクが貼れる。
このとき、sheet://Sheet1!A1ってやると、シート間にリンクが貼れる
http://ではじめると、外部のページにアクセスできる。

ただし、上記の見本の図にあるように、このままでは、
普通にリンク設定したときの、青い字に下線にはならない
ので、注意


・赤くする
そこにあるようなかんじで、色指定。
PHPExcel_Style_Colorによる色指定に関しては

色の定数一覧
http://www.24w.jp/study_contents.php?bid=php&iid=phpexcel&sid=const&cid=007

を参照のこと

・線を引く
枠の線に関して。
getStyleは、色のときのように1つのセルでも、ここのように複数セルでもできる
PHPExcel_Style_Borderによるスタイル指定に関しては、

罫線の定数一覧
http://www.24w.jp/study_contents.php?bid=php&iid=phpexcel&sid=const&cid=008

を参照のこと





  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでExcel-PHPExcelの遊び方(4)セルの枠を書いたり、グラフを書く資料

2013-02-13 18:45:59 | PHP
前回の

PHPでExcel-PHPExcelの遊び方(3)HelloWorldプログラム:説明
http://blog.goo.ne.jp/xmldtp/e/2def006b5047d95374013c133179b87d

で書き忘れたけど、これは、

PHPExcel xlsファイルのデータを読み込む
http://d.hatena.ne.jp/deeeki/20090507/phpexceliterator


を参考にしている。




で、更に細かい、枠を書いたりするには?ってことだけど、それは、
ダウンロードしてきて、解凍したPHPExcelのフォルダの中に、
Documentationっていうのがあって、そこのフォルダの中をみると、

ってな感じになっていると思う。
ここで「PHPExcel developer documentation.doc」を開いてもらって
(上記の図では、選択されているやつ)
「4.6 PHPExcel recipes」をみてもらうと、いろいろある。
枠に関しては、「4.6.22 Styling cell borders」かしら・・




グラフに関しては、書き方サンプルが、

PHPExcel_Chart
http://phpexcel.codeplex.com/discussions/357013

にある。




今後は、これらを見て、いろんなものを、遊んでみようと思う。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでExcel-PHPExcelの遊び方(3)HelloWorldプログラム:説明

2013-02-12 18:52:25 | PHP
PHPでExcel-PHPExcelの遊び方(3)HelloWorldプログラム:説明

前回の

PHPでExcel-PHPExcelの遊び方(2)HelloWorldプログラム
http://blog.goo.ne.jp/xmldtp/e/4040fc43add7117e634fa9458b93d4d3


ソースコードしか載せていなかったので、説明します
それと、今日は、Excelファイルの読み込みについても。




■せつめい。

前回のPHPExcelのプログラム
(を見るのがめんどくさかったら、
 このエントリの一番下のプログラムでもいい)
をみると、

  ・エラーのための設定
  ・PHPExcelのインクルード
  ・PHPExcel作成
  ・セル値設定(等、処理を行う)
  ・xls形式でSave

の5つの部分に分かれる。
順を追ってみていく。

●エラーのための設定

よくわからんが、以下の

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Tokyo');

がお題目みたいなんで、唱えてくれ


●PHPExcelのインクルード
PHPExcelを解凍して出てきたClassesフォルダの中にある
PHPExcel.phpを参照するための記述


●PHPExcel作成
$objPHPExcel = new PHPExcel();
でオブジェクトを作成する

●セル値設定(等、処理を行う)
 処理をかく。
 今回は、セルの値を設定している。

●xls形式でSave
保存している。Excel5とは、昔のファイル形式。




■読み込みだとどこが変わるか

まず、「PHPExcel作成」が
   $objPHPExcel = new PHPExcel();
から、
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load('PHPExcelSimple1.xls');

にかわる。ここで、「PHPExcelSimple1.xls」は、読み込みファイル名

つぎに、「PHPExcel_IOFactory」を使ったので、これをrequireする
require_once '/Classes/PHPExcel/IOFactory.php';




■まとめると・・・

 Excelファイルを読み込んで書くのは、こんなかんじ。

<?php

/** エラーのための設定 */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Tokyo');


/** PHPExcelのインクルード */
require_once '/Classes/PHPExcel.php';
require_once '/Classes/PHPExcel/IOFactory.php';

// PHPExcel作成
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load('PHPExcelSimple1.xls');



// セル値設定 Hello World
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', 'はろー');
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('B1', 'PHPExcel');
            


// xls形式でSave 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));


echo 'おわり' ;


UTF-8で、ソースファイルを保存すると、日本語で出力できる。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでExcel-PHPExcelの遊び方(2)HelloWorldプログラム

2013-02-08 18:47:37 | PHP
きのうの

PHPでExcel-PHPExcelの遊び方

のつづき。

Hello Worldを表示するPHPプログラムについて

こんなかんじ
<?php

/** エラーのための設定 */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Tokyo');


/** PHPExcelのインクルード */
require_once '/Classes/PHPExcel.php';


// PHPExcel作成
$objPHPExcel = new PHPExcel();


// セル値設定 Hello World
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', 'Hello');
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('B1', 'World!');
            


// xls形式でSave 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));


echo 'おわり' ;


来週から、いろいろやったり、考えたりしていきます。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでExcel-PHPExcelの遊び方(1)HelloWorld

2013-02-07 13:58:34 | PHP
PHPでExcelファイルを操作するPHPExcel。
インストールしてみたので、メモメモ

■前提
・Apache上にPHPが動いているものとします。
  ちなみに、今使っているのはPHP Version 5.3.18
ダウンロードしてきたinstall.txtには、こんな風に書いてあります。

* PHP version 5.2.0 or higher
* PHP extension php_zip enabled *)
* PHP extension php_xml enabled
* PHP extension php_gd2 enabled (if not compiled in)




 
■ダウンロード

PHPExcel
http://phpexcel.codeplex.com/


のサイトに行って、Downloadをくりっく。
そうしたら、スクロールしてみてください。

今回は、

PHPExcel 1.7.8 - with Documentation in MS Office format

をクリックして、ダウンロードしてきました。




■インストール

(1)まず、ダウンロードしたZIPファイルを解凍します

(2)apacheのhtdocs(公開ファイルを置くところ)に
   (フォルダの中に)
   ClassesとTestsをコピーしてください。
   (Testsはサンプル用なので、コピーしなくてもよいが、
   以下、コピーしたものとして、話を進める)




■Hello出力

今回は、Testsの下の、01pharSimple.phpを動かすことにします。
(1)インストールの(2)でコピーしたTestsフォルダ内にある
   01pharSimple.phpをエディタで開いてください

(2)以下の行(37行目かな?)
require_once '../Build/PHPExcel.phar';





require_once '../Classes/PHPExcel.php';


と修正してください(つまり、コピーしたClasses/PHPExcel.phpを
インクルードで参照するようにしてください)

(3)ブラウザから、
http://localhost/Tests/01pharSimple.php
をみると、


04:32:21 Create new PHPExcel object
04:32:22 Set document properties
04:32:22 Add some data
04:32:22 Rename worksheet
04:32:22 Write to Excel2007 format
04:32:22 File written to 01pharSimple.xlsx
04:32:22 Write to Excel5 format
04:32:22 File written to 01pharSimple.xls
04:32:22 Peak memory usage: 7.25 MB
04:32:22 Done writing files
Files have been created in C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\Tests

と表示されるので

(4)Testsフォルダをみると、
Excelファイル 01pharSimple.xls ができていて、
それを開くと、Hello World!とか書いてあるはず。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPで同じ名前にして、配列で受け取る

2013-01-09 14:51:34 | PHP
名前自体をabc[]のように配列にすれば、配列で受け取れる。



呼び出し側のHTML(samename.htm)
<html>
<head><title>same name test</title></head>
<body>
<form action="samename.php" method="post">
<input type="text" name="abc[]"><BR>
<input type="text" name="abc[]"><BR>
<input type="text" name="abc[]"><BR>
<input type=submit>
</form>
</body>
</html>


受け手のPHP(samename.php)

<?php

print_r($_POST['abc']);

?>


実行結果:

クエリ実行ボタンをクリックすると

配列で表示されましたね!

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP+MySQLで、DBにイメージを保存、DBからデータ読み込み表示

2012-12-10 17:35:12 | PHP
PHP+MySQLで、DBに一旦イメージを保存して、そのイメージを取り出して読み込み表示する
のに、いろいろ手間取ってしまったので、メモメモ。




■御題

denpa13.JPGというファイルがある。

これを、

$host = "localhost";
$user = "root";
$password = "password";
$database = "test";

のDBに、img_tblというテーブルを作成し、


なかんじでできているので、

(1)img_tblテーブルに
   id=2、data=denpa13.JPGのファイル内容(バイナリ)の形で保存

(2)img_tblテーブルから
   id=2、のdataをとってきて表示(=denpa13.JPGが表示されるはず)





■DBにイメージ保存

こんなかんじのPHP
<?php

//==============================//
//	データベースのための値	//
//==============================//
$host = "localhost";
$user = "root";
$password = "password";
$database = "test";


//==============================//
//	データを読んでくる	//
//==============================//
$filename = "denpa13.JPG";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);


//==============================//
//	データベース接続	//
//==============================//
$con = mysql_connect($host, $user, $password)
  or die("データベースとの接続に失敗しました");
mysql_select_db($database)
  or die("データベースの選択に失敗しました");


//==============================//
//	データベースに保存	//
//==============================//
$esc_contents = mysql_real_escape_string($contents)
  or die("エスケープ失敗");
$query = "insert into img_tbl(id,data) VALUES (2,'" . $esc_contents ."');";
$result = mysql_query($query)
 or die(mysql_error());

//==============================//
//	表示			//
//==============================//
header('Content-Type: image/jpeg');
echo $contents;

?>

ファイル内容のイメージが表示される




■DBからイメージ取得
こんなかんじのPHP

<?php

//==============================//
// データベースのための値 //
//==============================//
$host = "localhost";
$user = "root";
$password = "password";
$database = "test";

//==============================//
// データベース接続 //
//==============================//
$con = mysql_connect($host, $user, $password)
or die("データベースとの接続に失敗しました");
mysql_select_db($database)
or die("データベースの選択に失敗しました");

//==============================//
// SQL実行:ID=2を読み込む //
//==============================//
$query = "select data from img_tbl where id = 2;";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_array($result);


//==============================//
// 表示        //
//==============================//
header('Content-Type: image/jpeg');
echo $row['data'];

?>

DB内容が表示される




■ちなみに、

はじめDBにキーも設定しないで、てきとうにやってたら、
blobのところにデータが入らず、たいへんだった。
DBは、まじめに作ろう・・・??


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Zendで、ひとつのセレクタの内容を元に、もうひとつのセレクタの内容を変えたい場合 その1

2012-11-28 15:29:28 | PHP
たとえば、
  都道府県を変えたら、市町村名を変えたいという時や、
  大分類を変えたら、それにあわせて小分類を変えるという時、

こんなふうにしますよね。


で、この

はじめのセレクタ(都道府県とか)が切り替わったら、
サーバーアクセスして
あとのセレクタ(市町村名とか)の中身を変える

方法について。




■概要(一般論)

これは
・はじめのセレクタの値が変わったら、ajaxで、あとのデータを取ってくる
 ように、画面側を書く

・サーバー側では、上記によって呼び出されたら、DBをアクセスして、
 必要な部分だけを書き出す

ということをする。
今回は、これを(後者を)Zendで行う例を示す。




■サンプル

はじめのセレクタで選んだ数に後のセレクタの内容が変わります。

(いや、これじゃあ、2倍する答えが求められるだけで、何の意味もないけど、
 サンプルとして)




■画面側(一般的に)

 画面側は、セレクタの値が変わったら、onChangeで指定された関数に飛んで、
そこで、AJAXで後の値をとってきて、それを、後のセレクタにセットするように
JQueryで書きます。

<HTML>
<HEAD>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
<SCRIPT type="text/JavaScript">
<!--
function henkou(){
	$.ajax({
        	scriptCharset:"UTF-8",
        	dataType:"text",
		data:{add1:$("#add1 option:selected").val()},
        	url:"/ZendAdd5/Index/change",
        	complete : function(data,sts){  
			$("#add2").html(data.responseText);
        	}
      	});
}


//-->
</SCRIPT>
<TITLE>たしざん</TITLE>
</HEAD>
<BODY>
<form action="/ZendAdd5/Index/kotae" method="post">
<select name="add1" id="add1" onChange="henkou()">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
+
<select name="add2" id="add2">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
=
<?php echo $this->formSubmit('','Add'); ?>
</form>

</BODY>
</HTML>





■サーバー側(Zendを使用した場合)

Zendを使う場合、クライアントからの要求に対して、コントローラーとViewが最低でも必要になります。

○コントローラーについて
 画面から呼ばれたコントローラーのActionに対して、値を取得して、それに対応するデータをDBから、本来取ってくるのですが、今回はそれは面どっちいので、DBアクセスしないで、値をそのままadd2にセットしちゃっています。

<?php
require_once 'Zend/Controller/Action.php';
require_once 'My_Test.php';

class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
}

public function changeAction()
{
$add1 = $_GET['add1'];

// 本来は、データベースにアクセスする
// 今回は、DBアクセスを省略
$this->view->assign('add2',$add1);

}

public function kotaeAction()
{
$req = $this->getRequest();
$add1 = $req->getPost('add1');
$add2 = $req->getPost('add2');
$mytest = new My_Test();
$this->view->assign('kotae',$mytest->add($add1,$add2));
$this->_forward('index','ans');
}

}






○画面部分
add2をセットしています。

<option value="<?php echo $this->escape($this->add2);?>"><?php echo $this->escape($this->add2);?></option>






  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZendにおけるMVC(Javaフレームワークとの違い)その7(完)

2012-11-16 10:44:50 | PHP
シリーズ「ZendにおけるMVC(Javaフレームワークとの違い)」の続き

前回Javaとの比較をした。
今回は、このシリーズの最後として、要件定義が決まってから、実装までの流れを
・一般的な設計の流れ
  構造化手法
  オブジェクト設計
ウェブ戦略としての「ユーザーエクスペリエンス」―5つの段階で考えるユーザー中心デザインに基づいた流れの2とおりで紹介する。




■一般的な開発の流れ:構造化手法

-----------Zendに関係ないところ

1.システムが大きすぎる場合、どんな機能が必要か考えて詳細化する
   →DMMが使える。もちろんマインドマップでもいい
   →この時点でMECEにしようとすると、躓くので、まあ、ざっと挙げる程度でよい

2.DFDを使って詳細化する
  一番初め、このシステムの入出力を考え、真ん中に開発するシステムを書き、
  入出力をつないでいく→コンテキストダイアグラム

  そうしたら、コンテキストダイアグラムの中を埋めていく。DMMを参考にしたり、
  う~んと唸りながら?考える。
  このとき、
    ・どんなプロセスがあるか
    ・入出力は何か(DBないしファイル)
  というのを注意して書く。
  もちろん、DFDの記法や決まりに則って書く

  コンテキストダイアグラムから、いくつかのプロセスをDFDで書いたら
  今度はそのプロセスの内部を、(新たなDFDとして)書いていく

  そして、
    ある画面から入力し、DBやファイル、帳票に書き出すプロセス
    (いわゆるアクティビティ)レベルにまで、DFDを落とし込む

3.業務流れ図を書く

  上記のDFDのプロセスは、どの順番で動かすかは、書かれていないので、
 ある業務において、どんな画面から入力し、どうDBに書き出され、どうなるか
 という業務流れ図を書く。

   →つまりここで、画面と帳票名はでてくる。ただし、1画面という区切りではなく、
    画面群になる。たとえば、受注画面というのは出てくるが、実際は受注画面群であり、
    受注画面は
      受注検索
      受注一覧
      受注編集
      確認画面
    などから構成されるということが多い。

4.画面定義、帳票定義を行う

  業務流れ図の中に、画面と帳票が書かれているはずである。
  そこで、その画面を元に、ユーザーとどんな画面レイアウトで、どのように画面遷移
  するか決める
  また、帳票を出す場合、どのような帳票レイアウトにするか決める。

  ここで、入出力項目は決定する。

5.入出力項目をもとにテーブル設計を行う
  入出力項目がわかったので、それをどのようにテーブルに格納するかきめる。
  RDBであれば、正規化手法を使うことによって、テーブルは決められる。


-----------ここからZendに関係

6.画面定義をもとに、viewのスクリプトファイルを作成し、
 それをもとにコントローラーを作成、

 画面が遷移するかどうかたしかめる。

   くわしくは、


ZendにおけるMVC(Javaフレームワークとの違い)その3
http://blog.goo.ne.jp/xmldtp/e/d0d71cc1e7ebe06ece0d2d4c81566aca


7.このコントローラーから呼ばれるアクションに対応するモデル部分の
 ビジネスロジックを作成し、ビジネスロジックにダミーデータを入れて、
 動くかどうか確認する。


8.テーブル定義をもとにDAOを作成する。

   ここまでのモデル作成の流れ、くわしくは


ZendにおけるMVC(Javaフレームワークとの違い)その5
http://blog.goo.ne.jp/xmldtp/e/97742540f6d398d6e15171baf6669496


9.ビジネスロジックから、DAOを呼び、業務ロジックを組み立てていき、実装を
 完了させる。





■ウェブ戦略としての「ユーザーエクスペリエンス」の流れ

ここ

Web構築のワークフロー
http://www.doburoku.com/wiki/index.php?Web%B9%BD%C3%DB%A4%CE%A5%EF%A1%BC%A5%AF%A5%D5%A5%ED%A1%BC

を参考に・・・

・戦略
  上記の「一般的な開発の流れ:構造化手法」では省略した。
  超上流部分。この開発はなぜするかということについてなど。

・要件
  上記1.2.3までの作業。
  ただし、上記は機能要件だけで、非機能要件や制約(blogにするとかは、本来設計で
  決めていいことに対して、縛りを入れることになるので、制約になってくる)も決める

・構造
  4.の画面定義における画面遷移・・だと思う。

・骨格
  4.の画面設計における画面レイアウトの大まかな部分だと思う

・表層
  4.の画面設計がレイアウトまで含めて完成する?

そのあと、5以降を行うことになる。




■一般的な開発の流れ:オブジェクト指向分析

・構造化手法の1.2.に相当する部分を行う
   ユースケースを作成する。
   アクターは出てくるが、データ関係は出てこない。
   DFDのプロセスが、ユースケースとなってくるが、
   ユースケースは、アクティビティにいく「前で」止める

・構造化手法の3に相当する部分を行う
   アクティビティ図を書く。
   アクティビティ図は、原則、あるユースケースに対するアクティビティ図を書く
   ことになる(=対応するユースケース図がある)。

   ただし、アクティビティ図には、画面やDBを書くところはない。
   (オブジェクト指向分析では、この段階では、物理的な層は抽象化されているから)
   そこで、オブジェクトノードで画面やDBを書くか、

   対応するユースケース図のユースケース記述の中で、画面、DB、帳票など、
   入出力を自然言語で書く。

・オブジェクト指向の場合・・・

   クラス図を書くのが好きなので(^^;)
   ここで、概念クラス図を書いてしまうことが多いと思う。

・構造化手法の4.5を行うのであるが・・・

   画面定義書などを作らず、画面をhtmlで記述し、画面遷移をそのhtmlから行う
   ことも多い。
   こうすると、このhtmlが、実装で再利用できることもある。

・以降の手順は同じ。

→注意:概念クラス図を書いてしまい、画面をhtmlで適当に作ってしまうと、
 画面の入出力が、概念クラス図のデータだけで、本当にできるかどうかの
 確証がとれていない(っていうか、たいてい足りないはず)
  これをウォークスルーで補完するわけだが、アジャイルなどで、五月雨式に
 決まっていく場合、どこで確認を取るか、あらかじめ考えていないと、
 矛盾だらけになる。




このしりーず、おしまい。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZendにおけるMVC(Javaフレームワークとの違い)その6

2012-11-14 10:22:21 | PHP
シリーズ「ZendにおけるMVC(Javaフレームワークとの違い)」の続き

前回モデルの部分を具体的に書き、今回は、Javaとの比較をすると書いた。
今回は、それについて書きたいと思う。




■Java(Struts)の場合

 Java、とくにStrutsを使ってMVCを実現する場合、

V : JSP(Strutsタグ入り)
C : Struts→各アクションクラス
M : (ビジネスロジック)/(DBアクセス=DAOなど)

となる。
プログラミング上は、コントローラーから、DBアクセスを仮にしたとしても、
MVCに則っていないというだけで、開発上、大きな問題は起こらないかもしれない。

・・・が、あまりいいアーキテクチャっではない。




■Zendとの比較

Zendの場合、

V : *.phtmlファイル
C : フロントコントローラー→アクションコントローラー
M : (ビジネスロジック)/(DBアクセス=DAOなど)

となる。

ここで問題なのは、画面からのアクション(=ボタンを押された)で呼ばれるのは、
Zendの場合アクションコントローラーの中の、各アクション「メソッド」であるのに対し、
Strutsの場合は、アクション「クラス」であるということだ。

 Strutsの場合は、クラスなので、クラスごとに担当者を分けて実装するということができる
分離がしやすい。
 それに対して、Zendでは、メソッドになってしまっているので、1メソッドだけ、他の人にやってもらうというふうに、分離できない。

 そこで、これを分離するには、コントローラーは、画面から渡ってきた値をビジネスロジックにわたし、ビジネスロジックで処理した結果を、画面に渡すというように、

  処理本体はビジネスロジック(モデル)で行い
  コントローラーは値の受け渡しだけ(せいぜい、値チェック?)

 というふうにするのが、つくりやすいし、柔軟性あるし、ソースきれいだし、再利用しやすい




■ビジネスロジックの分離

 処理をビジネスロジックとしてわけるメリットは、ただ

   つくりやすい
   柔軟性ある
   ソースきれい
   再利用しやすい

 ためだけでない。テストがしやすい。

 画面部分ができていなくても、ビジネスロジック部分だけでテストしたり、
 ビジネスロジック部分ができていないとき、固定の値を返すようにして、
 画面テストがしやすかったりする。

 このとき、
   本当のビジネスロジックを、 /model/BL の下に
   ダミーの固定値を返すものを /model/BLTestの下に
 置くようにすれば(phpファイルの名前は同じにする)

 require_onceで参照する場所を、/model/BLか/model/BLTestに変えるかだけで、
本番環境、ダミー環境かにすぐに切り替えられるので、
 テストしやすい。




とこんな感じ。

次回は、開発の全体像と、いままでやってきた、Zendのフレームワークの関係について

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZendにおけるMVC(Javaフレームワークとの違い)その5

2012-11-09 16:05:14 | PHP
シリーズ「ZendにおけるMVC(Javaフレームワークとの違い)」の続き

前回モデルの部分について書いた。
VCができている前提で、M(モデル)をつなげる方法は、こんなかんじ。


1.index.phpに
   set_include_pathして、モデルのパスを指定する。
   DBをオープンして、Zend_Db_Table_Abstract::setDefaultAdapterで登録

2.DAOを作成する
   Zend/Db/Table/Abstract.phpを継承して作成

3.ビジネスロジックを作成、DAOを呼び出す

4.アクションコントローラーのアクションから、ビジネスロジックを呼び出す



今回は、これの具体例を示します。




■例について


ZendにおけるMVC(Javaフレームワークとの違い)その3
http://blog.goo.ne.jp/xmldtp/e/d0d71cc1e7ebe06ece0d2d4c81566aca

の足し算と同じことをします。

ただし、この計算をコントローラーでするのではなく、

モデルMy_Testクラスのaddメソッドを呼び出し、
addメソッドは、addsテーブルを検索して、答えを返します。
addsテーブルには
id,add1,add2,ansというカラムがあり、
id 主キー(シーケンシャルに番号を振る)
add1 足す数1
add2 足す数2
ans  答え
という形でテーブルに答えが入っています。




■事前準備

・上記「ZendにおけるMVC(Javaフレームワークとの違い)その3」
 で作成したV,C部分は、できているものとします。

・テーブルaddsには、上記の項目(全て型はint、桁数はどうでもよい)で
 データベース上(mysqlのtestデータベース)に作成してあるとします。
 ユーザー名root、パスワードpasswordでアクセスできるものとします。




■1.index.php
 以下のように、パスの追加とDBアクセス部分を追加・修正します。


<?php

require_once 'Zend/Controller/Front.php';


$mp = get_include_path() . PATH_SEPARATOR . 'zendapps/models';
set_include_path($mp);
require_once 'Zend/Db.php';
require_once 'Zend/Db/Table/Abstract.php';

$db = Zend_Db::factory('Pdo_Mysql', array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => 'password',
'dbname' => 'test'
));

Zend_Db_Table_Abstract::setDefaultAdapter($db);


Zend_Controller_Front::run('zendapps/controllers');







■DAO作成

modelsの下に、Tablesというフォルダをきり、その下にadds.phpを置いて
 以下のようにファイルを修正


<?php
require_once 'Zend/Db/Table/Abstract.php';

class Adds extends Zend_Db_Table_Abstract
{
protected $_name = 'adds';

}







■ビジネスロジックを作成

modelsの下に、My_Test.phpというファイルを作成し、以下のようにファイルを修正


<?php

require_once 'Tables/Adds.php';

class My_Test {
public function add($add1,$add2)
{
$test = new Adds();
$select = $test->select();
$select->where('add1 = ' . $add1 . ' and add2 = ' .$add2);
$rows = $test->fetchRow($select);
if (count($rows) == 0 )
{
return "";
}
$row = $rows->toArray();
return $row['ans'];
}
}







■アクションコントローラー修正

controllersの下にあるIndexController.phpというファイルの
 kotaeActionメソッドを、以下のように修正


<?php
require_once 'Zend/Controller/Action.php';
require_once 'My_Test.php';

class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
}

public function kotaeAction()
{
$req = $this->getRequest();
$add1 = $req->getPost('add1');
$add2 = $req->getPost('add2');
$mytest = new My_Test();
$this->view->assign('kotae',$mytest->add($add1,$add2));
$this->_forward('index','ans');
}

}







こんなかんじ。
次回は、javaのStrutsとの比較など

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZendにおけるMVC(Javaフレームワークとの違い)その4

2012-11-08 14:53:00 | PHP
シリーズ「ZendにおけるMVC(Javaフレームワークとの違い)」の続き

前回までは、
Zendの画面構成の問題から、こうするとうまく行くという画面遷移について、
つまりMVCのVとCの関係について書いてきた。

今回から、モデルの関係について書く。
まずは、なぜ、MVCが必要なのかについて書く。




■モデルの必要性

モデルの必要性については、たとえば
(cake phpの例ではあるが)

CakePHP Modelに関する6つの誤解
http://www.1x1.jp/blog/2008/04/cakephp_model_6misinformation.html

に書かれている。

もし、コントローラーのアクション内で、DBアクセスをやってしまうと、
コントローラーが肥大化してしまう。
コントローラーで1クラスで、アクションメソッドに分けるわけには行かないから、
アクションがいっぱいあるコントローラーを担当してしまうと、部分ごとに分けられず、
開発を丸抱えしてしまう。

そこで、アクション時に実行する内容を、ビジネスロジックとして、
アクションコントローラーのアクションメソッドからわけ、
モデル内に作成したいわけだ
(このときビジネスロジックは開発分担しやすいように1ビジネスロジック1クラスとする)




■モデルの構成

そして、ビジネスロジックでは、処理内容を書き、
データアクセス部分は、DAOが担当することになる。

つまり、モデルは、ビジネスロジックとDAOの2層になる。
これを纏めると、全体的にこんな感じ

VIEW
  ↓
コントローラー(フロントコントローラ→アクションコントローラー)
  ↓
モデル(ビジネスロジック→DAO)




■Zendがサポートしていること、してないこと

 ZendはDAOの作成をサポートしてくれる。
 具体的には、Zend/Db/Table/Abstract.phpというのがあって、
 これを継承してDAOを作成する。

 一方、モデルの扱いは任意みたいなので、
 set_include_pathして、モデルのパスを指定する。




■モデル部分の作り方
したがって、モデル部分の作成方法(案)は、こんなかんじ。
(V,Cは前回までで、できているものとする)


1.index.phpに
   set_include_pathして、モデルのパスを指定する。
   DBをオープンして、Zend_Db_Table_Abstract::setDefaultAdapterで登録

2.DAOを作成する
   Zend/Db/Table/Abstract.phpを継承して作成

3.ビジネスロジックを作成、DAOを呼び出す

4.アクションコントローラーのアクションから、ビジネスロジックを呼び出す






次回は、具体的なプログラミング方法について記述する。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ZendにおけるMVC(Javaフレームワークとの違い)その3

2012-11-07 13:26:18 | PHP
シリーズ「ZendにおけるMVC(Javaフレームワークとの違い)」の続き

前回は、Zendの画面構成の問題から、こうするとうまく行くという画面遷移の例を書いた。

具体的には、このようにする。
1.1つの画面につき
    1つのコントローラー
    1つのViewのフォルダーを用意

2.画面に対応するViewのフォルダーには
   index.phtmlに、表示する画面内容を書く
   ボタン等、イベント(アクション)が起こるところについては、
   アクション先(例:フォームのactionで指定する先)を
     画面名/自分で勝手につけたアクション名
   とする

3.画面に対応するコントローラーでは、
  3-1)indexActionと(index.phtmlの表示のため)
    上記2で挙げた「自分で勝手につけたアクション名」Action
    を作成する。

  3-2)上記3-1で作った、
    「自分で勝手につけたアクション名」Actionの
     最後(に実行する部分)で、

      $this->_forward('index','画面名'); 

     として、次画面に遷移させる
     (indexと書いてあるのは、2によって、index.phtmlが
      作成されることが保証されているから)



この方法だと、Actionから、フォワードすることになり、
JavaのStrutsフレームワークに対応する。
具体的には、

       Struts      Zend

画面    画面名.jsp    画面名/index.phtml
Action   各Actionクラス  画面名コントローラーの各Actionメソッド
フォワード     Actionの最後で指定




となる。

今回は、具体的な、作成方法を例に基づいて書いてみる




■例について

昨日、紹介した例について作成する。
つまり、
今、2つの画面がある。

・はじめに、この画面が表示される。

これを、画面名indexとしよう
そして、この画面のボタンを、kotaeという名前にする。

・上記の画面のボタンが押されると、この画面が表示される。


これを、画面名ansとしよう
そして、この画面のボタンを、topという名前にする。

今回は、このWebアプリをZendAdd2という名前で作成する




■作成準備

作成に取り掛かる際に、
apacheのドキュメントフォルダ(htdocs)の下に、

ZendAdd2というフォルダを作成し、そのフォルダ内に、

.htaccess
index.html

と言うファイルと、

zendapps

というフォルダを作成する(バージョンによっては、zendappsじゃないかも)
このとき、.htaccessというファイルはWindowsでは作れない

・・・作れないはずなのだが、私の場合、1回何かの弾みでできて?
(なにかを解凍してできた?)その後、フォルダごとコピー、そのファイルを修正
している。これで問題なく動作している。

.htaccessの内容は、以下のとおり


php_flag magic_quotes_gpc off

RewriteEngine on
RewriteBase /ZendAdd2/
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php




index.phpの内容は、以下のとおり

<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('zendapps/controllers');




最後に>はいらない(以下、基本的にそう)




■1.1つの画面につきコントローラーとビュー作成

上述のzendappsの下に、controllers,views,models
というフォルダを作成し、controllers,viewsについては、
昨日示した構成(下のとおり)で、ファイルを作成する
(中身については後述)


controllers
  |-IndexController.php
  *-ansController.php

views
 *-scripts
    |-index

    |  |

    |  *-index.phtml

    *-ans

      |

      *-index.phtml








2.画面に対応するViewのファイル

画面indexに対応する画面のファイル
views/scripts/index/index.phtml
の中身は、こんなかんじ。

<html>
<title>add</title>
<body>
<form action="/ZendAdd2/Index/kotae" method="post">
<?php echo $this->formText('add1',''); ?> +
<?php echo $this->formText('add2',''); ?> =
<?php echo $this->formSubmit('','Add'); ?>
</form>
</body>
</html>




ボタンのアクションkotaeは、Formのactionで指定されている。

画面ansに対応する画面のファイル
views/scripts/ans/index.phtml
の中身は、こんなかんじ。

<html>
<head><title>answer</title>
<body>
<?php echo $this->escape($this->kotae);?>
<form action="/ZendAdd2/Ans/top" method="post">
<?php echo $this->formSubmit('','Top'); ?>
</form>
</body>
</html>




ボタンのアクションtopは、Formのactionで指定されている。




■画面に対応するコントローラー

画面indexに対するコントローラー
controllers/IndexController.php
に書かれる内容は、こんなかんじ。


<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
}

public function kotaeAction()
{
$req = $this->getRequest();
$add1 = $req->getPost('add1');
$add2 = $req->getPost('add2');
$this->view->assign('kotae',$add1+$add2);
$this->_forward('index','ans');
}

}




画面のためのindexActionと、
ボタンkotaeが押されたときに対応するkotaeActionがあり、
kotaeActionに対応する画面は、ここではなく
$this->_forward('index','ans');
で、ans画面に行くようにしています。

-----

画面ansに対するコントローラー
controllers/AnsController.php
に書かれる内容は、こんなかんじ。


<?php
require_once 'Zend/Controller/Action.php';
require_once 'Zend/Session.php';

Zend_Session::start();

class AnsController extends Zend_Controller_Action
{
public function indexAction()
{
}
public function topAction()
{
$this->_forward('index','index');
}
}





画面のためのindexActionと、
ボタンtopが押されたときに対応するtopActionがあり、
topActionに対応する画面は、ここではなく
$this->_forward('index','index');
で、index画面に行くようにしています。




次回はモデルについて



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする