今日は、学校でまるつけをしようと思って、学校に行ったけど、鍵を忘れたので、
あきらめて、家に帰ってプログラミングをする。
嫌になってくる。
結局、うまい方法が思いつかなかったので、月ごとにフォルダを作って、
その中に、日ごとのファイルを生成させるようにした。
で、一日に複数記事をアップロードできるように、一日のファイルのなかに、
組み込んで作ることに。
こうすると、どうしても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とか何なのだ!?」と思い、ちょっとインターネットで調べてみた。
その時にヒットしたページだ。
その当時は、PHPやPerlなんて何にも知らなかったから、意味を調べて、
「で?データに意味を持たせて楽しいのか?」と思っただけだし、
卒業研究には関係なさそうだったので、ほったらかしにしていたのである。
でも、ここまでする必要があるんかな。
それもこれも、こんなに苦しむのはみんな
一日に複数の記事を登録できるという仕様
のせいである。
ほんまにだるい。
<?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で保存するため、とりあえず、<>を< >lに置換しておく */ 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("<","<", $str); $str = str_replace(">",">", $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; } ?>