menu


2017年4月30日日曜日

サイトを簡単に作る④ファビコンとサイトアイコンを作る

これは、サイトをブラウザーで見た時にサイト名の横に表示されたり、リンクを保存した時に表示される画像です。
作るのは、簡単!
ネットでイメージ画像を探して正方形にカットします。
そして、ネットでファビコンで検索すれば、作成してくれるサイトがみつかります。
私が、さっき使ってみたのは、以下のサイトです。
https://ao-system.net/favicongenerator/
こんなのを作ってみました!
複数のサイズのpng 画像を作成してくれて、その中にfavicon.icoが入っています。
サイトのリンク時の画像に適当なpng ファイルを利用し、ブラウザーに表示されるアイコンにfavicon.icoを使います。
png ファイルは、サイトに指定します。
私のindex.html の以下の記載かそうです。

<link rel="apple-touch-icon" href="http://comicfrt.webcrow.jp/img/comicfrt.png" />

このまま使うと、私のサイトの画像が表示されます。
favicon.icoは、名前も変えずにそのままindex.html のある場所に入れて下さい。
それだけで、サイトアイコンとして表示されます。

サイトを簡単につくるには!③トップ画面を作る

「サイトを簡単に作るには」で、画面構成は、決まったと思います。
トップ画面を作りましょう!
①のイメージで、私の作った画面です。

サブメニューもメインも何も無いのでヘッダーとフッターが目立っています。表の枠も今は、ライン表示していますが、最終的には、消すつもりです。ベースイメージは、アニメフロンティア別館です。
ソースも、公開します。

簡単な物です。
ついでに、今回使っているスタイルシートとjavascript も公開します。
スタイルシートは、基本の設定しかしてません。
javascript は、まだ使っていませんが、私のcsv ファイルの読み込み処理と、引数取得処理を入れてあります。
今後どこかで使うでしょう!
スタイルシート(page_styles.css)



javascript ファイル(script.js)

一応現在の物は、以下でみられます。
コミックフロンティア
最終的なサイト公開予定場所です。




サイトを簡単につくるには!②フォルダー構成を決める

サイトの画面構成は、決まりましたか?
私は、結局①でいこうかと思います。
では、作りはじめる前にフォルダー構成を決めてしまいます。
私のは、よくあるパターンですませます。
img(サイト固有の画像保存するフォルダー)
rss(rssファイル[サイト情報ファイル] )
css(スタイルシートファイルフォルダー)
js(javascriptフォルダー)
こんな感じでフォルダー構成を決めます。
後は、サイトを作りながら、data とかcsv とか、用途に合わせて作ります。
次は、サイトの中心となるindex.htmlを作ります。
これは、サイトに訪れた方が、最初に見るページで、トップ画面となります。
実は、私も新規サイトの立ち上げ中なので、これから作る予定です。
まだサイトタイトルしか決めていません。
作りながら、アップします!

サイトを簡単につくるには!

サイトを簡単に作るにはどうしたら良いでしょうか?
それは、レイアウトを決めて作るのが、一番簡単です。
まずは、どんなレイアウトで、画面を配置するかです。
基本パターンは、以下の4パターンですかね!

ヘッダー


サイド
メニュー



サイトメイン


フッター


ヘッダー


サイド
メニュー



サイトメイン




サイド
メニュー
フッター


ヘッダー
メニュー


サイド
メニュー



サイトメイン


フッター


ヘッダー
メニュー


サイド
メニュー



サイトメイン




サイド
メニュー
フッター
私がよく使う のが①です。
どのように作るかわかりますか?
普通にhtml の本とか読むと大変難しいです。
そこで、画面を表に見立てて大きな表を作ります。後は各表の枠の中に書きたい事や付けたい物を並べるだけです。
私の場合は、ヘッダーとフッターは<div></div> で作ります。
表は、枠線を付けるか付けないかでイメージを変えられますし、基本は、枠線無しでサイドメニューの中に<div></div>を入れて枠線を付けるか、枠線ありの表を入れてしまう方法をとります。
サイトメインの中も、画面によって表で区切って表現したりします。
サイトメインの横に縦長の広告がでてる時などが、そうです。
この画面は、メインが広すぎるなって画面の時などに使います。
私のサイトは、情報が多いので、普通に表現すると、画面がすごくスクロールしてしまいます。それだと、せっかくの広告が流れてしまいます。そこで、メインの中にスクロールエリアを作成して全体のスクロールエリアを制限します。
私のアニメサイトのストーリーの枠と同じ方法で、<div></div> で縦のサイズを設定して、オートスクロール指定すれば、実現できます。縦の表示量が指定サイズ以上になるとスクロールします。
例)
<div style='height: 110px;border:1px solid #555;overflow: auto;' align='left'>
ここに書く内容がスクロールします
</div>
説明
height: 110px;
縦サイズ110ピクセル

border:1px solid #555;
境界線1ピクセル色#555 

overflow: auto;'
表示オーバー時はオートスクロール

align='left'
表示左詰め

こんな感じで作成していきます。

2017年4月29日土曜日

ftp 転送プログラム

以下のソースは、転送先にコピーして実行させるファイル情報取得プログラムです。

このプログラムは、サイトのindex.php のある場所にGetFileList.php の名前で保存して下さい。

以下のソースは、自由な名前で携帯環境直下に適当なフォルダーを作り保存して下さい。

以下の修正が必要です。

 $contents = file_get_contents("http://サイトアドレス/GetFileList.php?dir=".$dir);
これは、あなたのサイト直下のGetFileList.php を読み込め!って命令です。
php プログラムを読み込む事を指示すると、php は、実行した結果をよみこませようとします。
結果として、php を実行します。
この関数は、制限されていないphp 環境でないと実行されません。携帯php 環境では、問題ありません!
レンタルサーバー等で実行される場合は、DMM コミック広告取得で使用した処理を使用してください。

以下は、ftp 接続情報の定義です。契約サイトで確認して、設定して下さい。
 $ftp_server = "サーバー名";
 $ftp_user   = "ユーザー名";
 $ftp_pass   = "パスワード";

以下にコピーしたいフォルダーを設定して下さい。
全てコピーする場合""
個々をコピーする場合"ホルダー名/"
を設定してください。
FtpUpdate("コピーしたいホルダー名");

ftp の基本処理は以下になります。

 $ftp_server = "サーバー名";
 $ftp_user = "ユーザー名";
 $ftp_pass = "パスワード"; 
$connect_id = ftp_connect( $ftp_server );サーバーに接続する
 if( ftp_login( $connect_id , $ftp_user , $ftp_pass ) ) {ログインする
  echo 'FTPログイン成功<br>';
 }
 else {
  echo 'FTPログイン失敗<br>';
  ftp_close( $connect_id );接続を終了する
  exit;プログラムを終わらせる
 }

ここにftp の処理をプログラムする

 ftp_close( $connect_id );接続を終了する

こんな感じです。

☕コーヒーブレイクftp

ftp は、簡単なんです!
php のftp の各関数を呼ぶだけ!
問題なのは、使い方ではなく考え方なんです!
普通にphp のftp でファイル転送しただけでは、ツールで全てコピーするより遅いのです。
そこで、私は考えました。
ファイル名と日付と時間とファイルサイズを比較して、条件に一致したファイルだけ転送します。比較条件をftp を経由して確認すると、これも時間がかかります。そこで、転送先も、php サーバーとした場合、転送先で独自に取得した方が早い事がわかりました。
プログラムを2つにします。
転送先用ファイル情報取得プログラムと携帯でのコピープログラムです。
転送プログラムを実行すると、コピー先のサーバーのファイル情報取得プログラムを実行させます。
転送先サーバーでは、コピー先の全フォルダーとファイルの日付とサイズを取得し、ファイルに保存します。
転送元では、処理終了を待ち、終了後の一覧のファイルを取得(コピー)して読み込みます。
そして、コピー元でもコピーするフォルダーやファイルの情報を取得します。
2つの情報から、コピー対象を抽出し、条件に合ったファイルのみコピーします。
ftp 処理には、よく実行中にエラーが発生します。ネット接続が切れたりアクセス遅延などです。
処理中に切断したりすると、コピーしきれていないゴミファイルができたりします。
そこで、ファイルサイズが一致してないファイルは、ゴミとしてコピーし直します。
そのためのサイズ比較です。
比較条件は、存在するかしないか?
日付時間は元より新しいか?
サイズは元と同じか?
以上です。
ftp 処理は、時間がかかります。php サーバーでは、デフォルトで、処理が30秒以上かかると、エラーで止まります。そこで、プログラムで3分に設定して実行します。
次回にソースを公開します。
今は、コミック情報登録処理ができたので、コミックサイトのデザインを考えています。
基本は、上部にタイトルで左右に情報ですよね!
これってアニメサイトと同じなんですよね!
なんか良いデザインないかな?
下手に携帯対応入れるとメディアによって出力しなくなったりするからどうするか考えています。
しばらく検討中となります。
よろしくね!(^_^)ノ

DMM コミック広告取得処理

これは、詳しい説明は、しません。
内容自分で解析するかして理解して下さい。
わからない方は、そういうもんだと考えてお使い下さい。
この中の処理は、実際にコミックページのhtml を解析し、必要な情報を取得するのに必要なキーワードを見つけ、必要情報を取得してデータを作成する処理です。
それを説明するのは、サイトに失礼ですし、やるべきでは無いと考えます。
サイトの各ページの癖を解析し、記載ルールを調査して作成しました。
以下にソースをのせます。

いかがでしょうか?
結構大きいプログラムとなってます。
取得される情報は、タイトルや画像URL 立ち読み先リンクURL コミックページURLコミック内容 などです。実際にサイトで使用する時は自分のDMM アフィリエイトID を加えて使用する必要があります。
getFileMain
この処理は、file_get_contents関数を作り直した処理です。結果は同じになります。
file_get_contents関数は、制限があり、携帯php では使えますが、レンタルサーバーでは、制限に引っかかって使えない事が多いので、ネットで調べて作成しました。
この処理は、他のサーバーのファイル情報をテキストに全て読み込みます。
この処理によりDMM サイトのコミックページの内容を全て読み込み解析し、広告に必要な情報を抽出してファイルに保存します。
この処理は、実行すると、test.html ファイルを保存します。
これは、実際に読み込みしたDMM サイトの情報を保存した物です。
取得エラーが出た時の確認用です。デバッグに使用します。
次は、ftp のファイルアップを公開しますね!



コミック情報編集ページ作成

これは、すでに、入力されたコミック情報の編集ページへ行くためのページです。
編集ページと言っても、前回の新規作成ページを編集フォルダー名とmode を設定して実行するだけです。同じようなページなら使い回す!
それだけの為の設定ページです。
以下にソースをのせます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />

<title>コミック編集</title>
</head>
<body>
<?php
function getkazu($str,$c){
$b=explode($c,$str);
return count($b)-1;
}

function getcsv($handle){
$str="" ;
do{
$str = $str.fgets($handle);
$cun = getkazu($str,"\"") ;
}while( ($cun%2)!=0 );
$str = str_replace("\"", '', $str);
return explode(",",$str) ;
}

function ReadCsv($fname){
$records = array() ;
$fname = str_replace(array("\r\n", "\r", "\n"), '', $fname);
if (($handle = fopen($fname, "r")) !== false) {
while (!feof($handle)){
$line = getcsv($handle) ;
if( count($line) == 1 && $line[0] == "" ){
}
else {
       $records[] = $line;
}
 } 
 fclose($handle); 

return $records ;
}

function list_dir($dir){
$list = array();
$files = scandir($dir);
$cunt = 0 ;
foreach($files as $file){
if($file == '.' || $file == '..'){
    continue;
} else if (is_dir($dir . $file)){
if( is_file($dir.$file."/comicInfo.csv")){
$tb = ReadCsv($dir.$file."/comicInfo.csv");
if( count($tb[0]) >1 ){
$list[$cunt][0] = $file;
if( $tb[0][0] != "" ){
$list[$cunt][1] = $tb[0][0] ;
}
else {
$list[$cunt][1] = $file ;
}
$cunt++;
}
}
else{
$list[$cunt][0] = $file;
$list[$cunt++][1] = $file;
}
}
}
return $list;
}

$result = list_dir("../csv/");
print "<div>コミック編集</div><br>";
print "<input type=\"button\" onclick=\"window.location.href='./index.php';\" value=\"メニューに帰る\" /><br><br>";
print "<form method=\"POST\" action=\"newcomic.php\" name=\"main_form\">";
print "<div>";
print "<input id=\"mode\" type=\"hidden\" name=\"mode\" value=\"3\" />";

print "コミック選択<select id='comic_dir' name='comic_dir' >";
for($mi=0;$mi<count($result);$mi++ ){
print "<option value=\"".$result[$mi][0]."\">".$result[$mi][1]."</option>";
}
print "</select><br>";
print "<input id=\"edit\" type=\"submit\" name=\"edit\" value= \"編集\" />";

print "</div>";
print "</form>";
?>
</body>
</html>
編集したいコミック情報のフォルダーを選択してボタンを押して作成ページを呼ぶだけです。
フォルダー名の取得に少し細工をしてます。
すでにコミック情報があれば、表示されるのは、フォルダー名では、なくコミック情報のコミック名になります。
次回は、DMM コミック広告取得処理を上げます。


コミック情報入力ページ作成

実は、ここが結構大変でした。
まっさらな新規作成なら問題なかったんですが、私の場合は、アニメデータとかぶったフォルダーになり、すでに、タイトルフォルダーが作成されていて、コミック情報ファイルが無い状態で、エラーが続出しました!
コミック情報は、ホルダー名が各コミック名を示し、フォルダー内にcomicInfo.csvファイルにコミック情報を出力します。
ちなみにDMM.com のコミック情報は、comic.csv に保存されます。
この構造は、私のアニメサイトに合わせてあり、このフォルダーに関連アニメ情報が一緒に管理されていて、アニメリストの表示の際にcomic.csv があれば、自動でコミック一覧を出力します。
ちなみにbook.csv があれば、文庫一覧を出力するなどの機能もあります。
これで、私のサイトは、ファイルの追加をするだけで表示情報が増える作りです。
以下にソースを載せます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script>
function setMode(mode){
document.getElementById("mode").value = mode;
}
function setComic(){
document.getElementById("tgt").value ="../csv/"+document.getElementById("comic_dir").value;
}
</script>

<title>作者編集</title>
</head>
<body>
<?php;
function getkazu($str,$c){
$b=explode($c,$str);
return count($b)-1;
}

function getcsv($handle){
$str="" ;
do{
$str = $str.fgets($handle);
$cun = getkazu($str,"\"") ;
}while( ($cun%2)!=0 );
$str = str_replace("\"", '', $str);
return explode(",",$str) ;
}

function ReadCsv($fname){
$records = array() ;
$fname = str_replace(array("\r\n", "\r", "\n"), '', $fname);
if (($handle = fopen($fname, "r")) !== false) {
while (!feof($handle)){
$line = getcsv($handle) ;
if( count($line) == 1 && $line[0] == "" ){
}
else {
       $records[] = $line;
}
 } 
 fclose($handle); 

return $records ;
}

function list_files($dir){
$list = array();
$files = scandir($dir);
$cunt = 0 ;
foreach($files as $file){
        if($file == '.' || $file == '..'){
            continue;
        } else if (is_file($dir.$file)){
            $list[$cunt][0] = $file;
            $tb = ReadCsv($dir.$file);
            $list[$cunt++][1] = $tb[0][0];
        }
    }
    return $list;
}

function writeComic($comic_dir,$comic_title,$comic_yomi,$path_dir,$Publishing_company,$Journal_title,$Comment){
if( !is_dir("../csv/".$comic_dir) ){
mkdir("../csv/".$comic_dir,0777);
}
$file = fopen("../csv/".$comic_dir."/comicInfo.csv","w");
fwrite($file,$comic_title.",".$comic_yomi.",".$path_dir.",".$Publishing_company.",".$Journal_title.",\"".$Comment."\"");
fclose($file);
}

$result = list_files("../autho/");
print "<div>コミック新規登録</div><br>";
print "<input type=\"button\" onclick=\"window.location.href='./index.php';\" value=\"メニューに帰る\" /><br><br>";
print "<div style=\"margin: 5px;\" >";
print "<form method=\"POST\" action=\"newcomic.php\" name=\"main_form\">";
$comic_dir = "";
if( isset($_POST["comic_dir"])){
$comic_dir = $_POST["comic_dir"];
}
if( isset($_POST["path_dir"])){
$path_dir = $_POST["path_dir"];
}
$comic_title = "";
if( isset($_POST["comic_title"])){
$comic_title = $_POST["comic_title"];
}
$comic_yomi = "";
if( isset($_POST["comic_yomi"])){
$comic_yomi = $_POST["comic_yomi"];
}
$Publishing_company = "";
if( isset($_POST["Publishing_company"])){
$Publishing_company = $_POST["Publishing_company"];
}
$Journal_title = "";
if( isset($_POST["Journal_title"])){
$Journal_title = $_POST["Journal_title"];
}
$Comment = "";
if( isset($_POST["Comment"])){
$Comment = $_POST["Comment"];
}

$mode = 1;
$err = 0 ;
if( isset($_POST["mode"])){
if( $_POST["mode"] == 1 ){
if( $comic_dir == "" ){
$err = 1 ;
}
else {
if( is_file("../csv/".$comic_dir."/comicInfo.csv") ){
$mode = 2 ;
}
else {
writeComic($comic_dir,$comic_title,$comic_yomi,$path_dir,$Publishing_company,$Journal_title,$Comment);
}
}
}
else if( $_POST["mode"] == 2 ){
writeComic($comic_dir,$comic_title,$comic_yomi,$path_dir,$Publishing_company,$Journal_title,$Comment);
}
else if( $_POST["mode"] == 3 ){
$mode = 1 ;
if( is_file("../csv/".$comic_dir."/comicInfo.csv") ){
$tb = ReadCsv("../csv/".$comic_dir."/comicInfo.csv");
$comic_title = $tb[0][0] ;
$comic_yomi = $tb[0][1] ;
$path_dir = $tb[0][2] ;
$Publishing_company = $tb[0][3] ;
$Journal_title = $tb[0][4] ;
$Comment = $tb[0][5] ;
}
}
}


print "<input id=\"mode\" type=\"hidden\" name=\"mode\" value=\"".$mode."\" />";
print "登録コミックフォルダ名<br><input id=\"comic_dir\" type=\"text\" name=\"comic_dir\" size=\"50\" value=\"".$comic_dir."\" />";
if( $mode == 2 ){
print "<font color=\"#ff0000\">すでにファイルが存在します。強制保存で上書き保存するか、フォルダ名を変更して通常保存してください!</font>";
}
else {
if( $err == 1 ){
print "<font color=\"#ff0000\">フォルダ名を入力してください!</font>";
}
}
print "<br>";
print "コミックタイトル<br><input id=\"comic_title\" type=\"text\" name=\"comic_title\" size=\"50\" value=\"".$comic_title."\" />";
print "<br>";
print "ひらがな読み<br><input id=\"comic_yomi\" type=\"text\" name=\"comic_yomi\" size=\"50\" value=\"".$comic_yomi."\" />";
print "<br>";
print "著者選択<select id='path_dir' name='path_dir' >";
for($mi=0;$mi<count($result);$mi++ ){
$op="";
if( $result[$mi][0] == $path_dir ){
$op = "selected";
}
print "<option value=\"".$result[$mi][0]."\" ".$op." >".$result[$mi][1]."</option>";
}
print "</select><br>";
print "出版社<input id=\"Publishing_company\" type=\"text\" name=\"Publishing_company\" size=\"50\" value=\"".$Publishing_company."\" /><br>";
print "雑誌名<input id=\"Journal_title\" type=\"text\" name=\"Journal_title\" size=\"50\" value=\"".$Journal_title."\" /><br>";
print "コメント<br>";
print "<textarea id=\"Comment\" name=\"Comment\" rows=\"8\" cols=\"60\">".$Comment."</textarea><br><br>";
if( $mode == 1 ){
print "<input id=\"save\" type=\"submit\" name=\"save\" value= \"保存\" />";
}
else if( $mode == 2 ){
print "<input id=\"save\" type=\"submit\" name=\"save\" value= \"強制保存実行\" />";
print " <input id=\"save\" type=\"submit\" name=\"save\" onclick=\"setMode(1);\" value= \"通常保存実行\" />";
}
print "</form>";

print "</div>";
print "<div style=\"margin: 5px;\" ><br><br>";
print "<form method=\"POST\" action=\"comic.php\" name=\"main_form\">";
print "<input id=\"tgt\" type=\"hidden\" name=\"tgt\" />";
print "<input id=\"type\" type=\"hidden\" name=\"type\" value=\"コミック\" />";
print "<input id=\"comic_input\" type=\"submit\" name=\"comic_input\" onclick=\"setComic();\" value= \"DMMコミック入力\" />";
print "</form>";
print "</div>";
?>
</body>
</html>
基本は、全て今までのソースと同じ作りです。新しい処理は、setComicくらいです。これは、すでに、作成されているDMM.com のコミック情報取得ページの実行の為の引数設定をしてます。
引数type にコミックを入れてtgt に保存するフォルダーを設定して実行すると、その場所にコミック広告情報をcomic.csv に出力します。便利でしょ!
次回は、コミック情報編集を載せます。

作者データ修正ページ作成

いたって簡単に作ります。
前回作成したページのノウハウを集めて作者データ一覧を作り修正する作者を選択し、前回作成したページを呼びます。あのページの再読み込み処理は、修正処理としてそのまま使えます。
以下にソースを載せます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />

<title>作者編集</title>
</head>
<body>
<?php
function getkazu($str,$c){
$b=explode($c,$str);
return count($b)-1;
}

function getcsv($handle){
$str="" ;
do{
$str = $str.fgets($handle);
$cun = getkazu($str,"\"") ;
}while( ($cun%2)!=0 );
$str = str_replace("\"", '', $str);
return explode(",",$str) ;
}

function ReadCsv($fname){
$records = array() ;
$fname = str_replace(array("\r\n", "\r", "\n"), '', $fname);
if (($handle = fopen($fname, "r")) !== false) {
while (!feof($handle)){
$line = getcsv($handle) ;
if( count($line) == 1 && $line[0] == "" ){
}
else {
       $records[] = $line;
}
 } 
 fclose($handle); 

return $records ;
}

function list_files($dir){
$list = array();
$files = scandir($dir);
$cunt = 0 ;
foreach($files as $file){
        if($file == '.' || $file == '..'){
            continue;
        } else if (is_file($dir . $file)){
            $list[$cunt][0] = $file;
            $tb = ReadCsv($dir.$file);
            $list[$cunt++][1] = $tb[0][0];
        }
    }
    return $list;
}

$result = list_files("../autho/");
print "<div>作者編集</div><br>";
print "<input type=\"button\" onclick=\"window.location.href='./index.php';\" value=\"メニューに帰る\" /><br><br>";
print "<form method=\"POST\" action=\"newautho.php\" name=\"main_form\">";
print "<div>";
print "<input id=\"mode\" type=\"hidden\" name=\"mode\" value=\"2\" />";

print "作者選択<select id='path_dir' name='path_dir' >";
for($mi=0;$mi<count($result);$mi++ ){
print "<option value=\"".$result[$mi][0]."\">".$result[$mi][1]."</option>";
}
print "</select><br>";
print "<input id=\"edit\" type=\"submit\" name=\"edit\" value= \"編集\" />";

print "</div>";
print "</form>";
?>
</body>
</html>
今まで順番に見た方なら解ると思いますが、基本は、全て一緒です。
前回ディレクトリだった所がファイルに変更され、結果が二次元配列にし、表示されるのが、作成ファイル内の作者名にしてあります。ファイル名では、作者が誰だかわからないかもしれないので、ファイル内の作者名を出すように変更しました。
mode は、3固定で、再読み込みにしてあります。これで、前回のページを呼ぶ事により、編集処理となります。
次回は、コミック情報入力処理です。

☕コーヒーブレイクデバッグ中!

現在私の携帯では、すでに、できた処理をうごかして、何件かデータを入力してテストしてます。これをデバッグと言います。
すでに、作者編集処理にも不満が何点か出ています。
コミックのリンク選択とか、作者の説明入力エリアせまいとか!
まだ上げてないコミック情報入力処理にコミック名にひらがな名入力追加したりしてます。
作者名やコミック名になんでひらがな入力を入れると思いますか?
作者名は、読み方が難しい人がいるからって意味もありますが、アニメサイトを作ったときに後悔したからなんです!
アニメタイトルにひらがなの読みデータがあったらメニューのあいうえお順のメニューを自動で作成できたんですよね!
今は、いちいち手作業で追加してます。
コミックは、自動でメニューを作る為にひらがな入力を付けるようにしました。
新規追加したら自動であいうえお順にすれば、メニュー作成楽ですからね!
もう少しデバッグしたら、次のソースをアップします!

2017年4月28日金曜日

保存・再読み込み機能を付ける⑨補足

これは、最終ソースから不要なデータ入力を削除します。そして、メニューに戻るボタンを追加しました。
削除したのは、タイトル情報のタイトルリンク意外です。
これは、コミックデータに付けるべきデータですので削除します。
以下にソースを載せます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>新規作者編集</title>
<script>
function setMode(mode){
document.getElementById("mode").value = mode;
}

function addtcount(){
document.getElementById("tcount").value = parseInt(document.getElementById("tcount").value)+1;
}
</script>
</head>
<body>
<?php
function list_dirs($dir){
$list = array();
$files = scandir($dir);
foreach($files as $file){
        if($file == '.' || $file == '..'){
            continue;
        } else if( is_dir($dir . $file) ) {
            $list[] = $file;
        }
    }
    return $list;
}

function WriteCsv($fname,$tbl){
$file = fopen($fname,"w");
if( $file != FALSE ){
$tbl[0][3]="\"".$tbl[0][3]."\"";
for( $i=0;$i < count($tbl) ; $i++ ){
for( $j=0 ; $j < count($tbl[$i]) ; $j++ ){
fwrite( $file,$tbl[$i][$j]) ;
if( $j < (count($tbl[$i])-1) ){
fwrite($file,",");
}
else {
fwrite($file,"\n");
}
}
}
fclose($file);
}
return $file ;
}

function GetParam(){
$tcount = $_POST["tcount"] ;
$tb = array();
$tb[0][0] = $_POST["name"] ;
$tb[0][1] = $_POST["yomi"] ;
$tb[0][2] = $_POST["path_dir"] ;
$tb[0][3] = $_POST["info"] ;
for( $i = 0 ; $i < $tcount ; $i++ ){
$tb[$i+1][0]=$_POST["title_".$i];
$tb[$i+1][1]=$_POST["dir_link_".$i];
}
return $tb ;
}

function getkazu($str,$c){
$b=explode($c,$str);
return count($b)-1;
}

function getcsv($handle){
$str="" ;
do{
$str = $str.fgets($handle);
$cun = getkazu($str,"\"") ;
}while( ($cun%2)!=0 );
$str = str_replace("\"", '', $str);
return explode(",",$str) ;
}

function ReadCsv($fname){
$records = array() ;
$fname = str_replace(array("\r\n", "\r", "\n"), '', $fname);
if (($handle = fopen($fname, "r")) !== false) {
while (!feof($handle)){
$line = getcsv($handle) ;
if( count($line) == 1 && $line[0] == "" ){
}
else {
       $records[] = $line;
}
 } 
 fclose($handle); 

return $records ;
}

$tcount = 1 ;
$tb = array();
$result = list_dirs("../csv/");
$err = 0;
if( isset($_POST["mode"])){
if( $_POST["mode"] == "1" ){
print "<div>作者編集(保存)</div>";
$tcount = $_POST["tcount"] ;
$tb = GetParam();
if( $tb[0][2]!="" ){
if( WriteCsv("../autho/".$tb[0][2],$tb) == FALSE ){
$err = 2 ;
}
}
else {
$err = 1 ;
}
}
else if( $_POST["mode"]=="2"){
print "<div>作者編集(再読み込み)</div>";
$tb = GetParam();
if( $tb[0][2]!="" ){
$tb = ReadCsv("../autho/".$tb[0][2]);
if( count($tb) < 2 ){
$err = 4 ;
$tb = GetParam();
}
else {
$tcount = count($tb)-1 ;
}
}
else {
$err = 3 ;
$tb = GetParam();
}
}
else {
print "<div>作者編集(タイトル追加)</div>";
$tcount = $_POST["tcount"] ;
$tb = GetParam();
}
}
else {
print "<div>新規作者編集</div>";
$tb[0]=array("","","","");
$tb[1]=array("","","","","");
}
print "<br>";
print "<input type=\"button\" onclick=\"window.location.href='./index.php';\" value=\"メニューに帰る\" /><br>";
print "<form method=\"POST\" action=\"newautho.php\" name=\"main_form\">";
print "<div>";
print "<div style=\"border: solid 1px #202020;margin: 5px 5px 3px;\">";
print "<div style=\"border: solid 0px #202020;margin: 5px 5px 5px 5px;\">";
print "<input id=\"mode\" type=\"hidden\" name=\"mode\" />";
print "<input id=\"tcount\" type=\"hidden\" name=\"tcount\"value=".$tcount." />";
print "著者名:<input id=\"name\" type=\"text\" name=\"name\" size=\"50\" value=\"".$tb[0][0]."\" /><br>";
print "  読み:<input id=\"yomi\" type=\"text\" name=\"yomi\" size=\"50\" value=\"".$tb[0][1]."\" /><br>";
print "ファイル名:<br>";
print "<input id=\"path_dir\" type=\"text\" name=\"path_dir\" size=\"50\" value=\"".$tb[0][2]."\" />";
if( $err != 0 ){
if( $err==1 ){
print "<font color=\"#ff0000\">ファイル名が指定されてません!</font>";
}
else if( $err == 2 ){
print "<font color=\"#ff0000\">保存ファイルが作成できませんでした!</font>";
}
else if( $err == 3 ){
print "<font color=\"#ff0000\">読み込みファイル名が指定されてません!</font>";
}
else if( $err == 4 ){
print "<font color=\"#ff0000\">読み込みファイルが異常で読み込めません!</font>";
}
}
print "<br>";
print "追記事項:<br>";
print "<textarea id=\"info\" name=\"info\" rows=\"4\" cols=\"50\">".$tb[0][3]."</textarea><br>";
print "</div>";
print "<input id=\"renewal\" type=\"submit\" name=\"renewal\" onclick=\"setMode(1);\" value= \"保存\" />";
print "<input id=\"renewal\" type=\"submit\" name=\"renewal\" onclick=\"setMode(2);\" value= \"再読み込み\" />";
print "</div>";
print "</div>";
print "<div style=\"border: solid 1px #202020;margin: 5px 5px 3px;\">";
print "作品リスト<br>";
for( $i = 0 ; $i < $tcount ; $i++ ){
print "<div style=\"border: solid 1px #202020;margin: 5px 5px 5px 5px;\">";
print "<div style=\"border: solid 0px #202020;margin: 5px 5px 5px 5px;\">";
print "タイトル<input id=\"title_".$i."\" type=\"text\" name=\"title_".$i."\" size=\"50\" value=\"".$tb[$i+1][0]."\" /><br>";

print "リンク<select id='dir_link_".$i."' name='dir_link_".$i."' value=\"".$tb[$i+1][1]."\" >";
for($mi=0;$mi<count($result);$mi++ ){
$op="";
if( $result[$mi]==$tb[$i+1][1] ){
$op = "selected";
}
print "<option value=\"".$result[$mi]."\" ".$op.">".$result[$mi]."</option>";
}
print "</select><br>";

print "</div>";
print "</div>";
}
print "<input id=\"add\" type=\"submit\" name=\"add\" onclick=\"setMode(31);addtcount();\" value= \"追加\" />";
print "</div>";

print "</div>";
print "</form>";

?>
</body>
</html>
いかがですか?
これで、作者データ入力ページをいったん終了します。
次回は、作者データ修正ページを作ります。

保存・再読み込み機能を付ける⑧ホルダー名一覧

フォルダー名一覧作成と選択処理をつくります。
これは、後で同じような作りでファイル名一覧を作りますが、そのベース処理となります。
簡単です。参考にして下さい。
では、ソースを載せて説明します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>新規作者編集</title>
<script>
function setMode(mode){
document.getElementById("mode").value = mode;
}

function addtcount(){
document.getElementById("tcount").value = parseInt(document.getElementById("tcount").value)+1;
}
</script>
</head>
<body>
<?php
function list_dirs($dir){
$list = array();
$files = scandir($dir);
foreach($files as $file){
        if($file == '.' || $file == '..'){
            continue;
        } else if( is_dir($dir . $file) ) {
            $list[] = $file;
        }
    }
    return $list;
}

function WriteCsv($fname,$tbl){
$file = fopen($fname,"w");
if( $file != FALSE ){
$tbl[0][3]="\"".$tbl[0][3]."\"";
for( $i=1;$i < count($tbl) ; $i++ ){
$tbl[$i][4]="\"".$tbl[$i][4]."\"";
}
for( $i=0;$i < count($tbl) ; $i++ ){
for( $j=0 ; $j < count($tbl[$i]) ; $j++ ){
fwrite( $file,$tbl[$i][$j]) ;
if( $j < (count($tbl[$i])-1) ){
fwrite($file,",");
}
else {
fwrite($file,"\n");
}
}
}
fclose($file);
}
return $file ;
}

function GetParam(){
$tcount = $_POST["tcount"] ;
$tb = array();
$tb[0][0] = $_POST["name"] ;
$tb[0][1] = $_POST["yomi"] ;
$tb[0][2] = $_POST["path_dir"] ;
$tb[0][3] = $_POST["info"] ;
for( $i = 0 ; $i < $tcount ; $i++ ){
$tb[$i+1][0]=$_POST["title_".$i];
$tb[$i+1][1]=$_POST["dir_link_".$i];
$tb[$i+1][2]=$_POST["Publishing_company_".$i];
$tb[$i+1][3]=$_POST["Journal_title_".$i];
$tb[$i+1][4]=$_POST["Comment_".$i];
}
return $tb ;
}

function getkazu($str,$c){
$b=explode($c,$str);
return count($b)-1;
}

function getcsv($handle){
$str="" ;
do{
$str = $str.fgets($handle);
$cun = getkazu($str,"\"") ;
}while( ($cun%2)!=0 );
$str = str_replace("\"", '', $str);
return explode(",",$str) ;
}

function ReadCsv($fname){
$records = array() ;
$fname = str_replace(array("\r\n", "\r", "\n"), '', $fname);
if (($handle = fopen($fname, "r")) !== false) {
while (!feof($handle)){
$line = getcsv($handle) ;
if( count($line) == 1 && $line[0] == "" ){
}
else {
       $records[] = $line;
}
 } 
 fclose($handle); 

return $records ;
}

$tcount = 1 ;
$tb = array();
$result = list_dirs("../csv/");
$err = 0;
if( isset($_POST["mode"])){
if( $_POST["mode"] == "1" ){
print "<div>作者編集(保存)</div>";
$tcount = $_POST["tcount"] ;
$tb = GetParam();
if( $tb[0][2]!="" ){
if( WriteCsv("../autho/".$tb[0][2],$tb) == FALSE ){
$err = 2 ;
}
}
else {
$err = 1 ;
}
}
else if( $_POST["mode"]=="2"){
print "<div>作者編集(再読み込み)</div>";
$tb = GetParam();
if( $tb[0][2]!="" ){
$tb = ReadCsv("../autho/".$tb[0][2]);
if( count($tb) < 2 ){
$err = 4 ;
$tb = GetParam();
}
else {
$tcount = count($tb)-1 ;
}
}
else {
$err = 3 ;
$tb = GetParam();
}
}
else {
print "<div>作者編集(タイトル追加)</div>";
$tcount = $_POST["tcount"] ;
$tb = GetParam();
}
}
else {
print "<div>新規作者編集</div>";
$tb[0]=array("","","","");
$tb[1]=array("","","","","");
}
print "<br>";
print "<input type=\"button\" onclick=\"window.location.href='./index.php';\" value=\"メニューに帰る\" /><br>";
print "<form method=\"POST\" action=\"newautho.php\" name=\"main_form\">";
print "<div>";
print "<div style=\"border: solid 1px #202020;margin: 5px 5px 3px;\">";
print "<div style=\"border: solid 0px #202020;margin: 5px 5px 5px 5px;\">";
print "<input id=\"mode\" type=\"hidden\" name=\"mode\" />";
print "<input id=\"tcount\" type=\"hidden\" name=\"tcount\"value=".$tcount." />";
print "著者名:<input id=\"name\" type=\"text\" name=\"name\" size=\"50\" value=\"".$tb[0][0]."\" /><br>";
print "  読み:<input id=\"yomi\" type=\"text\" name=\"yomi\" size=\"50\" value=\"".$tb[0][1]."\" /><br>";
print "ファイル名:<br>";
print "<input id=\"path_dir\" type=\"text\" name=\"path_dir\" size=\"50\" value=\"".$tb[0][2]."\" />";
if( $err != 0 ){
if( $err==1 ){
print "<font color=\"#ff0000\">ファイル名が指定されてません!</font>";
}
else if( $err == 2 ){
print "<font color=\"#ff0000\">保存ファイルが作成できませんでした!</font>";
}
else if( $err == 3 ){
print "<font color=\"#ff0000\">読み込みファイル名が指定されてません!</font>";
}
else if( $err == 4 ){
print "<font color=\"#ff0000\">読み込みファイルが異常で読み込めません!</font>";
}
}
print "<br>";
print "追記事項:<br>";
print "<textarea id=\"info\" name=\"info\" rows=\"4\" cols=\"50\">".$tb[0][3]."</textarea><br>";
print "</div>";
print "<input id=\"renewal\" type=\"submit\" name=\"renewal\" onclick=\"setMode(1);\" value= \"保存\" />";
print "<input id=\"renewal\" type=\"submit\" name=\"renewal\" onclick=\"setMode(2);\" value= \"再読み込み\" />";
print "</div>";
print "</div>";
print "<div style=\"border: solid 1px #202020;margin: 5px 5px 3px;\">";
print "作品リスト<br>";
for( $i = 0 ; $i < $tcount ; $i++ ){
print "<div style=\"border: solid 1px #202020;margin: 5px 5px 5px 5px;\">";
print "<div style=\"border: solid 0px #202020;margin: 5px 5px 5px 5px;\">";
print "タイトル<input id=\"title_".$i."\" type=\"text\" name=\"title_".$i."\" size=\"50\" value=\"".$tb[$i+1][0]."\" /><br>";
print "リンク<select id='dir_link_".$i."' name='dir_link_".$i."' value=\"".$tb[$i+1][1]."\" >";
for($mi=0;$mi<count($result);$mi++ ){
$op="";
if( $result[$mi]==$tb[$i+1][1] ){
$op = "selected";
}
print "<option value=\"".$result[$mi]."\" ".$op.">".$result[$mi]."</option>";
}
print "</select><br>";
print "出版社<input id=\"Publishing_company_".$i."\" type=\"text\" name=\"Publishing_company_".$i."\" size=\"50\" value=\"".$tb[$i+1][2]."\" /><br>";
print "雑誌名<input id=\"Journal_title_".$i."\" type=\"text\" name=\"Journal_title_".$i."\" size=\"50\" value=\"".$tb[$i+1][3]."\" /><br>";
print "コメント<br>";
print "<textarea id=\"Comment_".$i."\" name=\"Comment_".$i."\" rows=\"4\" cols=\"50\">".$tb[$i+1][4]."</textarea><br>";
print "</div>";
print "</div>";
}
print "<input id=\"add\" type=\"submit\" name=\"add\" onclick=\"setMode(31);addtcount();\" value= \"追加\" />";
print "</div>";

print "</div>";
print "</form>";

?>
</body>
</html>
フォルダー名一覧取得処理
フォルダー名一覧を配列に入れてかえします
function list_dirs($dir){
$list = array();配列を初期化します
$files = scandir($dir);指定先のファイルやホルダー名を取得します
foreach($files as $file){取得したデータをループ処理します
        if($file == '.' || $file == '..'){取得データが. か.. だったら何もしない!
            continue;
        } else if( is_dir($dir . $file) ) {取得データがフォルダーなら保存
            $list[] = $file;
        }
    }
    return $list;結果を返す
}
scandir
指定フォルダー内の全てのファイルやファイルを返します。
is_dir
指定先がフォルダーかを返します

$result = list_dirs("../csv/");
一つ上のホルダーの中のcsvフォルダーの中のフォルダー一覧を取得します。

フォルダー名選択処理
print "リンク<select id='dir_link_".$i."' name='dir_link_".$i."' value=\"".$tb[$i+1][1]."\" >";
for($mi=0;$mi<count($result);$mi++ ){フォルダー一覧を選択リストに展開するループ
$op="";
if( $result[$mi]==$tb[$i+1][1] ){選択リストがすでに、選択された物か判定し、選択された物なら選択状態を設定する
$op = "selected";
}
    選択リスト出力
print "<option value=\"".$result[$mi]."\" ".$op.">".$result[$mi]."</option>";
}
print "</select><br>";選択リスト終了

以上が作者データ入力処理です。
いかがですか?
そんなに大きいプログラムでは無いと思っています。
次は、編集画面を載せたいのですが、補足を載せます!
じつは、コミックデータ入力を作りながら、不要なデータが出ました。
不要データ入力を削除したソースを載せてから次に進みます!
では、次回は、補足です。