読者です 読者をやめる 読者になる 読者になる

今日は、学校でまるつけをしようと思って、学校に行ったけど、鍵を忘れたので、

あきらめて、家に帰ってプログラミングをする。

嫌になってくる。
結局、うまい方法が思いつかなかったので、月ごとにフォルダを作って、
その中に、日ごとのファイルを生成させるようにした。
で、一日に複数記事をアップロードできるように、一日のファイルのなかに、
組み込んで作ることに。
こうすると、どうしてもXML.phpの仕様上、ダミー情報を作らないといけないので、相当のファイル容量が増大するが、
うまい方法をが思いつかない。一日850バイトの情報がダミーになる。
ということは、10日で、8.5k 100日で85k 1000日で850kかぁ。
まぁいいか。

もう、今日はうんざりしてきたので、今からFFX-2をする。

今日作ったソース。汚すぎて嫌になってくる。

追記:
そういうわけで、FFX-2を少しやったんで、またプログラミングに戻る。
大体、日記を書き込む処理はめどが経った。だいたい30%程度。
次は、日記を書き込む最初の画面をなんとかしないといけない。
とりあえずの作りしかしてなかったからなぁ。
はっきりいって、このままでも一応動作する。
でも、滅茶苦茶すぎるので、対応したところ、今後対応しないといけないところを列挙。

対応したところ
いきなり、管理者権限からこのページにきたときは、現在の年月日にする。
これまでは、9999年99月99日だった。

対応したいところ
ダイアリーカウントをユーザーの目に触れさせては混乱の元である。
例えば、2006年9月4日の記事が3本しかかいていないのに、
ダイアリーカウントを100とかしてくれる人がいたりすると思う。
そういった悪いことをさせないために、テキストではなく、
option select で、コンボボックスにして、ユーザーに適当な値を
選択できなくさせる。

本当は、$get でとんでもないデータを出してくれる、わるい人もいるのだが、
そういう技術を持った人間は、教師の間ではいないと思いたい。

となると、今度は、日や月、年も上記問題と等価なので、それらも
コンボボックス処理させるか。

でも、そうすると、年に関しては、少なくとも2006年以上は選択できるわけなので、
コンボボックスが、のあーーーっっと、2006個も選択させるのか?という問題になる。
それはいやなので、1900年から2006年とかするんだろうな。でも、それも例えば、
1192年1月1日とかで、世界史でGo!とかする際に、自由度が損なわれそうだ。
というわけで、年に関しては、テキストフィールドの方がよいか。

テキストフィールドにすると、-の西暦を出してくれる場合や、アルファベットを入れてくれる人も
いるので、Javascriptで変な年を入れると警告を出すようにしよう。

でも、javascriptをブラウザ越しで、切ってアクセスしてくれる人もいるかも知れないんで、
サーバー側でも対応する必要ありか。

でも、年を選択すると、他のテキスト情報を変化させるためには、どうしたらいいんだ?
javascriptで、text のイベントでonchangeとかを、年のテキストフィールドに投げてやろうか。

でも、javascriptで特定のファイルにアクセスしようと思ったらAjaxを使うしかない。
でも、Ajaxはまだよくわかっていないしなぁ。innerHTMLを使うとか。
でも、なんとかAjaxを使って動的にjavascriptからファイルに読み込めたとしても、XMLフォーマットだよ。
javascriptでもXMLをParseする方法は・・・と。
たのしいXML: DOMとJavaScript

おおぉ。なんと懐かしいサイトが出てきたのだ。天佑神助なページだ。とりあえず出来そう。
このサイトは、私が大学4回生の時の10月くらいに、研究室に、XMLの本がおいてあって、
XMLとか何なのだ!?」と思い、ちょっとインターネットで調べてみた。
その時にヒットしたページだ。

その当時は、PHPPerlなんて何にも知らなかったから、意味を調べて、
「で?データに意味を持たせて楽しいのか?」と思っただけだし、
卒業研究には関係なさそうだったので、ほったらかしにしていたのである。

でも、ここまでする必要があるんかな。
それもこれも、こんなに苦しむのはみんな
一日に複数の記事を登録できるという仕様
のせいである。

ほんまにだるい。

<?php /* vim: set fdm=marker: */
	include_once( "../db/xml.php" );
	include_once( "./menu.php");
	include_once( "../jcode/jcode.php");
	include_once( "../kses/kses.php" );//HTMLタグを禁止し、特定のタグのみ許可する。
	include("common.php");
	html_start();
	$inifile = "../setup.ini";
	$hash = parse_ini_file( $inifile );
	startHead();
	headers( $hash['diarytitle'], "./", "no-cash" );
	endHead();
	startBody();


	
	/** HTMLタグを許可されたものだけにする.
	* 許可された後は、XMLで保存するため、とりあえず、<>を&lt; &gtlに置換しておく
	*/
	function tagWrapper( $str ) {
		/** {{{*/
		$allowed = array('b' => array(),
		'i' => array(),
		'div' => array('class'=>1),
        'a' => array('href'  => array('minlen' => 3, 'maxlen' => 50),
		'target' => 1,
        'title' => array('valueless' => 'n')),
        'p' => array('align' => 1,
        'dummy' => array('valueless' => 'y')),
        'img' => array('src' => 1), # FIXME
        'font' => array('size' =>
        array('minval' => 4, 'maxval' => 20)),
        'br' => array()
		);
		$str = kses($str, $allowed);
		//置換.
		$str = str_replace("<","&lt;", $str);
		$str = str_replace(">","&gt;", $str);
		return $str;
	}
	/* }}}*/
	
	/** 記事番号をチェックして返す.
	* 新しい記事を作成するならば、記事番号は、1増えるはずで、
	* 前にある記事ならば、記事番号はその時の番号になるはずである。
	* それは、辞書ファイルを元に検索すればよい。辞書ファイルには、
	* ダイアリーカウントも入れる必要あり。かな。
	* @param $year 年
	* @param $month 月
	* @param $day  日
	* @param $count ダイアリーカウント
	*/
	function getNo( $year, $month, $day, $count ) {
		/**{{{*/
		$month++;$month--;
		$day++;$day--;
		//ファイルを読み込む.
		$fp = fopen( "../db/diary.dat", "r" )or die;
		$ret = "";
		while ( !feof( $fp ) ) {
			$row = fgets( $fp, 80  );
			list( $no, $y, $m, $d, $cnt, $category ) = explode(",", $row );
			if ( $y == $year &&
	   			$m == $month &&
				$d == $day &&
				$cnt == $count	) {
				$ret = $no;
				break;
			}
		}
		fclose( $fp );
		print "||||||||||||RET = $ret";
		if ( $ret == "" ) {
			//新しい記事番号
			$fpin = fopen( "../db/articlecount.dat", "r" ) or die;
			$row = trim(fgets($fpin, 10));
			fclose( $fpin );
			$fpout = fopen( "../db/articlecount.dat", "w") or die;
			$row++;
			print "row == $row";
			fputs( $fpout, "$row" );
			fclose( $fpout );
			$ret = $row;
		}
		return $ret;
	}
	/**}}}*/
	
	//REQUEST
	/** {{{ */
	$year = _hs($_REQUEST['year']);
	$month = _hs($_REQUEST['month']);
	if ( strlen($month)<2) {
		$month="0".$month;
	}
	$day = _hs($_REQUEST['day']);
	$diarycount = _hs($_REQUEST['diarycount']);
	$isrow = $_REQUEST['isrow'];
	$choosecategory = $_REQUEST['choosecategory'];
	$diary = tagWrapper($_REQUEST['diary']);
	$diart = mb_convert_encoding( $diary, "SJIS-WIN" );
	$title = _hs($_REQUEST['title']);
	//がぞう
	$imageName[1] = $_REQUEST['image1']['name'];
	$imageName[2] = $_REQUEST['image2']['name'];
	$imageName[3] = $_REQUEST['image3']['name'];
	
	$imagealt[1] = $_REQUEST['imagealt1'];
	$imagealt[2] = $_REQUEST['imagealt2'];
	$imagealt[3] = $_REQUEST['imagealt3'];
	/** }}}*/
	
	//Debug
	/** {{{*/
	//$no = getNo($year, $month, $day, $diarycount);
	/*print "記事番号=$no<br>";
	print "タイトル=$title<br>";
	print "年=$year<br>";
	print "月=$month<br>";
	print "日=$day<br>";
	print "ダイアリーカウント=$diarycount<br>";
	print "一列表示する=$isrow<br>";
	print "カテゴリー=$choosecategory<br>";
	print "コンテンツ=$diary<br>";
	
	print "画像alt1 = $imagealt[1]<br>";
	print "画像alt2 = $imagealt[2]<br>";
	print "画像alt3 = $imagealt[3]<br>";
	*/
	/** }}}*/
	if ( !is_dir("../db/diary/${year}-${month}") ) {
		mkdir("../db/diary/${year}-${month}",0777);
		mkdir("../db/diary/${year}-${month}/img",0777);
	}
	//画像をアップロードする.
	/** {{{*/
	for ( $iCounter = 1; $iCounter < count($imageName)+1; $iCounter++ ) {
		if ( $imageName[$iCounter] != "" ) {
			//画像のアップロードは、空白ならなにもしない。
			$tmp = "image".$iCounter;
			$extension = strtolower( strrchr( $_FILES["$tmp"]['name'], '.'));
			if ( $extension == ".jpg" || $extension == ".png" || $extension == ".gif"	) {
				//指定された拡張子以外はアップロードしない
				if ( is_uploaded_file( $_FILES["$tmp"]['tmp_name'] ) ) {
					//アップロード
					//ファイルのおき場所は、10*ダイアリーカウント+$iCounterとしよ。
					$localfilename = 10*$diarycount+$iCounter.$extension;
					$filepath = getcwd();
					$filepath .= "/../db/diary/${year}-${month}/img/$localfilename";
					$directorypath = getcwd();
					$directorypath .= "/../db/diary/${year}-${month}/img/";
					move_uploaded_file( $_FILES["$tmp"]['tmp_name'], $filepath );
					$imageUrl[$iCounter] = "${year}-${month}/img/$localfilename";
				}	
			}
		}
	}
	/*print "画像1 = $imageUrl[1]<br>";
	print "画像2 = $imageUrl[2]<br>";
	print "画像3 = $imageUrl[3]<br>";
	*/
	/**}}}*/
	
	/** ダミーを作って、XML_unserializeする際、配列にさせる。
	* @param $filepath だみー をつくるファイルパス
	*/
	function putDummy($filepath,$year,$month, $day) {
		/**{{{*/
		$data = "";
		$data .= "<?xml version=\"1.0\"?>\n";
		$data .= "<diary>\n";
		$data .= "\t<year>$year</year>\n";//年
		$data .= "\t<month>$month</month>\n";//月
		$data .= "\t<day>$day</day>\n";//日
		$data .= "\t<diarynum>0</diarynum>\n";//この日の記事の数
		$data .= "\t<article>\n";
		$data .= "\t\t<no></no>\n";
		$data .= "\t\t<diarycount></diarycount>\n";
		$data .= "\t\t<title></title>\n";
		$data .= "\t\t<category></category>\n";
		$data .= "\t\t<contents></contents>\n";
		$data .= "\t\t<images>\n";
		$data .= "\t\t\t<isoneline></isoneline>\n";
		$data .= "\t\t\t<image>\n";
		$data .= "\t\t\t\t<imagealt></imagealt>\n";
		$data .= "\t\t\t\t<imageurl></imageurl>\n";
		$data .= "\t\t\t</image>\n";
		$data .= "\t\t\t<image>\n";
		$data .= "\t\t\t\t<imagealt></imagealt>\n";
		$data .= "\t\t\t\t<imageurl></imageurl>\n";
		$data .= "\t\t\t</image>\n";
		$data .= "\t\t\t<image>\n";
		$data .= "\t\t\t\t<imagealt></imagealt>\n";
		$data .= "\t\t\t\t<imageurl></imageurl>\n";
		$data .= "\t\t\t</image>\n";
		$data .= "\t\t</images>\n";	
		$data .= "\t</article>\n";
		$data .= "\t<article>\n";
		$data .= "\t\t<no></no>\n";
		$data .= "\t\t<diarycount></diarycount>\n";
		$data .= "\t\t<title></title>\n";
		$data .= "\t\t<category></category>\n";
		$data .= "\t\t<contents></contents>\n";
		$data .= "\t\t<images>\n";
		$data .= "\t\t\t<isoneline></isoneline>\n";
		$data .= "\t\t\t<image>\n";
		$data .= "\t\t\t\t<imagealt></imagealt>\n";
		$data .= "\t\t\t\t<imageurl></imageurl>\n";
		$data .= "\t\t\t</image>\n";
		$data .= "\t\t\t<image>\n";
		$data .= "\t\t\t\t<imagealt></imagealt>\n";
		$data .= "\t\t\t\t<imageurl></imageurl>\n";
		$data .= "\t\t\t</image>\n";
		$data .= "\t\t\t<image>\n";
		$data .= "\t\t\t\t<imagealt></imagealt>\n";
		$data .= "\t\t\t\t<imageurl></imageurl>\n";
		$data .= "\t\t\t</image>\n";
		$data .= "\t\t</images>\n";	
		$data .= "\t</article>\n";
		$data .= "</diary>";
		
		$fp = fopen($filepath, "w") or die;
			fputs( $fp, $data );
		fclose( $fp );
		/**}}}*/
	}
	
	////////////////////////////////////////////
	//ファイルの保存場所を確定する。
	////////////////////////////////////////////
	$filepath = "../db/diary/${year}-${month}/$day.xml";//日にちごとにしよう。
	//既に存在していたら・・。ダイアリーカウントによって、上書きか、更新か変わってくる。
	if ( !file_exists( $filepath ) ) {//すでに該当する日が存在しているかどうか・・。
		//存在していないので、ダミーを作って無理矢理存在させる。
		putDummy($filepath,$year,$month,$day);
		/** {{{ */


	}
	//既に存在していた.
	$fp = fopen( $filepath, "r") or die;
	$buffer = "";
	while( !feof( $fp ) ) {
		$buffer .= fgets( $fp, 1024 );
	}
	//$buffer = mb_convert_encoding( $buffer, "UTF-8", "sjis-win" );
	//print $buffer;
	$array = XML_unserialize( $buffer );
	//print_r($array);
	fclose( $fp );
	$isUpdate = 0;
	//ダイアリーカウントによって、更新するか、追加するかを決定する.putDummyによって必ず配列化されているので、その点は心配しなくてよい。
	for ( $iCounter = 0; $iCounter < $array[diary][diarynum]+2; $iCounter++ ) {
		if ( $diarycount == $array[diary][article][$iCounter][diarycount] ) {
			$isUpdate = 1;
			$arraynum = $iCounter;
			//print "BREAK;";
			break;
		}
	}
	if ( $isUpdate == 1 ) {
		//更新 該当する配列番号を上書きすればよい。
		//print "更新";
		$array = Edit($array, $arraynum,$year,$month,$day,$title,$choosecategory,$diary,$imagealt,$imageUrl,$diarycount,$isrow,$isUpdate);
		//更新になるので、辞書ファイルを更新する.
		$fpin = fopen( "../db/diary.dat", "r" )or die;
		$dataUpdate = "";
		while ( !feof( $fpin ) ) {
			$row = fgets( $fpin, 100);
			list($_articlenum, $_year, $_month, $_day, $_diarycount, $_category) = explode(",", $row);
			$_category = trim( $_category );
			if ( $year == $_year && $month == $_month && $day == $_day && $diarycount == $_diarycount ) {
				$dataUpdate .= $_articlenum.",".$_year.",".$_month.",".$_day.",".$_diarycount.",".$choosecategory."\n";			
			} else {
				$dataUpdate .= $row;
			}
		}
		fclose( $fpin );
		$fpout = fopen( "../db/diary.dat", "w")or die;
		fputs($fpout, $dataUpdate);
		fclose( $fpout );
	} else {
		//追加 Editに、新しい配列番号にすればよい。
		print "追加";
		$array = Edit($array, $array[diary][diarynum]+2,$year,$month,$day,$title,$choosecategory,$diary,$imagealt,$imageUrl,$diarycount,$isrow,$isUpdate);//二つ分はダミー
		//追加になるので、辞書ファイルに追加する.
		$a = 1+$array[diary][diarynum];
	//	print_r($array);
		$diarynumber = $array[diary][article][$a][no];
		$fp = fopen( "../db/diary.dat", "a" ) or die;
		fputs($fp, "\n");
		$month++;$month--;
		$day++;$day--;
		$choosecategory = trim( $choosecategory );
		fputs($fp, "$diarynumber,$year,$month,$day,$diarycount,$choosecategory");
		fclose( $fp );
	}
	//print_r($array);	
	
	$data = XML_serialize( $array );
	//print $data;
	$fp = fopen( $filepath, "w" )or die;
	fputs($fp, $data);
	fclose( $fp );

	
	putMenu();
	setH2Logo(".", 2, "日記を書きました", 630);
	htmlcheck("../img/");
	endBody();
	endHtml();
?>

<?php
	/** 日記を追加・更新する/
	* @param $array XML_serializeされた後の配列日記データ
	* @param $num 更新する $article[XX]のところ.
	*/
	function Edit($array, $num,$year, $month,$day,$title,$category,$contents,$imagealt,$imageurl,$diarycount,$isoneline,$isUpdate) {
		/** {{{*/
		//if ( $num >= $array[diary][diarynum]  ) {
		if ( $isUpdate != 1 ) {
			//追加する.
			$array[diary][diarynum]++;//追加するらしいので、記事数を1上げる.
			$array[diary][article][$num][no] = getNo($year,$month,$day,$num,$category,$contents,$imagealt,$imageurl);
			print "記事番号イコール".$array[diary][article][$num][no];
		}
		$array[diary][article][$num][diarycount]= $diarycount;	//ダイアリーカウント
		$array[diary][article][$num][title]		= $title;		//タイトル
		$array[diary][article][$num][category]	= $category;	//カテゴリー
		$array[diary][article][$num][contents]	= $contents;	//コンテンツ
		$array[diary][article][$num][images][isoneline]	= $isoneline;	//一行表示か。
		for ( $iCounter = 0; $iCounter < count($imagealt); $iCounter++ ) {
			$array[diary][article][$num][images][image][$iCounter][imagealt] = $imagealt[$iCounter+1];
			$array[diary][article][$num][images][image][$iCounter][imageurl] = $imageurl[$iCounter+1];
		}
		
		//print_r($array);
	/*	$data = XML_serialize( $array );
		$fp = fopen($filepath, "w") or die;
			fputs( $fp, $data );
		fclose( $fp );
	*/	
		/**}}}*/
		return $array;
	}

?>