CGI-BBS > データベース > 簡易データベース > CSVエディタの改造で各項目ごとに細かくアレンジしたい。


カレッヂ
カレッヂ


質問者 オリエ  投稿日 9/16(月) 16:06:14
このCGIですと、データの読み込み方が一括になっています。 
各項目を一つ一つアレンジできないものか、と。
編集画面の入力フォームを一つ一つ設定したいのです。

例えば「人名」のデータなら、編集時の入力フォームも
1行表示のINPUT TYPE=TEXTで十分だと思いますが、
「住所」などになると、TEXTAREAで入力したいところです。
どうにかなりますでしょうか?

(当方CGIやプログラムはわかりませんので
「理解できなくてもいいからとりあえずこうしてみろ」
というご指示を頂けるとありがたいです。)

...一応、少しずつ勉強はしているのですが。

プロバイダ参照:
サーバのOS:(未選択)
パソコンのOS:(未選択)
エディタ:
FTPソフト:
サーバ移転:していない
改造:(未選択)
CGI習熟度:(未選択)

回答者 やまだ  [削除]  投稿日 9/17(火) 02:37:16
254行目あたりからの
		print <<"EOF";
		<tr>
		<th nowrap><font size=-1>$table[$num]</font></th>
		<td nowrap><font size=-2>$items[$num]</font></td>
		<td nowrap><input type=text name="key" value="$items[$num]" size=$size></td>
		</tr>
EOF

を次のようにすると、
		print <<"EOF";
		<tr>
		<th nowrap><font size=-1>$table[$num]</font></th>
		<td nowrap><font size=-2>$items[$num]</font></td>
		<td nowrap>
EOF
		if($num == 4){	# ここの4をtextareaにしたい属性の順番(0から数えて)を入れる。
			print "<textarea name=\"key\" cols=40 rows=4>$items[$num]</textarea>";
		}else{
			print "<input type=text name=\"key\" value=\"$items[$num]\" size=$size>";
		}
		print "</td></tr>";

よいでしょう。
質問者 オリエ  [削除]  投稿日 9/19(木) 18:02:24
重ね重ね申し訳ないです。やまだ様には頭が上がりません。
こういうド素人が相手だとお疲れになるでしょう。すみません。

今回の変更というのは、

$items[$num]の部分で
$numが「4」の時はTEXTAREAにしてくれて、(if...もしも○○だったら、ですもんね)
それ以外はTEXTにしてくれる処理なんですよね?(else...じゃなかったら、でいいのかな?)

だんだんプログラムの仕組みが掴めてきました!
……ような気がします。ちょっと嬉しいです。

ところで、何をそんなに改造したいのかといいますと。
ここの配布CGIじゃないので、今まで書き込みにくかったんですが。

↓こちらの「辞典CGI」を自分のHPで使う予定で、そのメンテ用のCGIを探していたんです。
http://www.k-collect.net/cgi_lab/ziten.htm

やまだ様のご協力でかなり使いやすくなってきましたが(いや本当に助かってます!)
今のままでは上記CGIの「コメント欄」が、最初の1データ分しか呼び出せない状態。

これをどうやったら

「4項目よりあとのデータ(コメント欄の部分)はまとめて表示」で、なおかつ
「 ・コメントデータ
  ・コメントデータ
  ・コメントデータ...  」 のように表示

されるようになるか……。

人様に聞いてばかりいるのも申し訳ないので、
ちょっとキバって「CGI入門書」なるものも買ってしまいました。
ので、頑張って調べてみようと思います!
……………まったく自信ないですが。

でも素人がヘタにいじったら、サーバとかに負担をかけてしまうでしょうか?
回答者 やまだ  [削除]  投稿日 9/24(火) 13:50:44
サーバの負担とかは、さほど心配はいらないですよ。アクセスが一度にすごい集中するなら、
かなり心配ですが。(辞書CGIにはファイルの書き込み時に排他制御がないようなので、)

そして、textareaにコメント欄のデータを幾つか入れることについては、
(やってやれないことはないが、)ちょっとどうなのかと思います。

なぜなら、辞書CGIの記録されたCSVファイルの内容を見ると、コメント欄のデータが複数あると、そ
れぞれ別にカマで区切られているため、レスキューさんのCVSEDITで、以前わたしが言ったような、
ある位置から以下はtextareaにデータを入れるという改造をほどこすと、CSVEDITの記録する関数で、
textareaにあるものは、全て一緒、つまり、CSVデータのカマで区切らないで一まとめにしてしまう
からです。
CSVEDITの記録する関数も改造して、textareaの改行しているものは別々にCSVのカマで区切る対象に
してしまうと、うまくいくとは思います。
質問者 オリエ  [削除]  投稿日 9/26(木) 20:19:14
ぐ、具体的にはどーすればよろしいんでしょうか……?

(CGI入門書を抱えて悪戦苦闘すること二日。
 現在のオリエのステータス=ちょっと泣きそう)


回答者 やまだ  [削除]  投稿日 10/6(日) 21:25:16
具体的にどこなのか、それは、多少個所が多いので、バックアップをとるかしてから
やってみてください。

まず、
91行目あたりを、

 	$value =~ s/<//g;
 	$value =~ s/>//g;
 	$value =~ s/"//g;
	$name eq 'key' || $value =~ s/\n//g; #ここを修正
	$value =~ s/\r//g;
 	$value =~ s/\,//g;

そして、173行目あたり、

 		foreach (@item) {
			$_=~/\,/ and $_=join("<br>",map{"・".$_}split(/\,/,$_)); #ここを追加
 			print "<td nowrap $bgcolor>$_</td>\n";
 		}

246行目あたり、

 	<th nowrap>編集フォーム</th>
 	</tr>
 EOF
# ここから修正個所
	foreach $num (0..$#items) {
		my $size = length($items[$num]) + 10;
		my $ta_size=$#items-$#table+1;
 		if ($table[$num] eq '') { $table[$num] = '(未定義)'; }
 
		if($num <= 3){
			print <<"EOF";
 		<tr>
 		<th nowrap><font size=-1>$table[$num]</font></th>
 		<td nowrap><font size=-2>$items[$num]</font></td>
 		<td nowrap>
 EOF
		}
		if($num == 3){
			print "<textarea name=\"key\" cols=40 rows=$ta_size>$items[$num]";
		}elsif($num >= 4){
			print "\n$items[$num]";
 		}else{
 			print "<input type=text name=\"key\" value=\"$items[$num]\" size=$size>";
 		}
		if($num == $#items){
			print "</textarea>";
		}
		if($num <= 2 || $num == $#items){
			print "</td></tr>";
		}
# ここまで
 	}

284行目あたり、

 	local (@EDIT) = @_;
# ここから追加
	if($EDIT[3]=~/\n/){
		my @comment=split(/\n/,$EDIT[3]);
		pop(@EDIT);
		@EDIT=(@EDIT,@comment);
	}
# ここまで
 	if ($FORM{'action'} eq 'ADD') {


patchコマンドを知っているなら、下記のを使って。

--- csvedit.cgi.oreg	Sun Oct  6 17:34:24 2002
+++ csvedit.cgi	Fri Oct  4 21:49:23 2002
@@ -70,6 +65,8 @@
 @BASE = <IN>;
 close(IN);
 
+@BASE=sort{($m{$a}||=(split(/\,/,$a))[0]) cmp ($m{$b}||=(split(/\,/,$b))[0])}@BASE;
+
 @check = grep(/[<>"]/,@BASE);
 if (@check) { &error("Don't edit","&lt;&gt;&quot;が含まれているデータがあるので編集できません."); }
 
@@ -89,8 +86,8 @@
 	$value =~ s/<//g;
 	$value =~ s/>//g;
 	$value =~ s/"//g;
-	$value =~ s/\n//g;
-	$value =~ s/\r//g;
+	$name eq 'key' || $value =~ s/\n//g;
+$value =~ s/\r//g;
 	$value =~ s/\,//g;
 
 	if ($value =~ /^(-EDIT-|-NEW-)$/) { $edit_num = $name; $EDIT = 1; }
@@ -171,6 +168,8 @@
 EOF
 		foreach (@item) {
 
+#			$_=~s/\,/<br>/g;
+			$_=~/\,/ and $_=join("<br>",map{"・".$_}split(/\,/,$_));
 			print "<td nowrap $bgcolor>$_</td>\n";
 		}
 
@@ -244,18 +243,33 @@
 	<th nowrap>編集フォーム</th>
 	</tr>
 EOF
-	foreach $num (0 .. $#table) {
+	foreach $num (0..$#items) {
 
-		$size = length($items[$num]) + 10;
+		my $size = length($items[$num]) + 10;
+		my $ta_size=$#items-$#table+1;
 		if ($table[$num] eq '') { $table[$num] = '(未定義)'; }
 
-		print <<"EOF";
+		if($num <= 3){
+			print <<"EOF";
 		<tr>
 		<th nowrap><font size=-1>$table[$num]</font></th>
 		<td nowrap><font size=-2>$items[$num]</font></td>
-		<td nowrap><input type=text name="key" value="$items[$num]" size=$size></td>
-		</tr>
+		<td nowrap>
 EOF
+		}
+		if($num == 3){
+			print "<textarea name=\"key\" cols=40 rows=$ta_size>$items[$num]";
+		}elsif($num >= 4){
+			print "\n$items[$num]";
+		}else{
+			print "<input type=text name=\"key\" value=\"$items[$num]\" size=$size>";
+		}
+		if($num == $#items){
+			print "</textarea>";
+		}
+		if($num <= 2 || $num == $#items){
+			print "</td></tr>";
+		}
 	}
 
 	print <<"EOF";
@@ -277,6 +291,11 @@
 
 	local (@EDIT) = @_;
 
+	if($EDIT[3]=~/\n/){
+		my @comment=split(/\n/,$EDIT[3]);
+		pop(@EDIT);
+		@EDIT=(@EDIT,@comment);
+	}
 	if ($FORM{'action'} eq 'ADD') {
 
 		@NEW = @BASE;
@@ -384,3 +403,5 @@
 EOF
 	exit;
 }
+
+
質問者 オリエ  [削除]  投稿日 10/8(火) 21:59:45
ふ、ふえ〜。こんなになるんですね……。
ド素人の私にはかなり無謀な山でした。ここまでするのに何年かかるやらです。
やまだ様、神様みたいに見えます。 m(_ _)m↓深々〜

patchコマンドというのを調べてみたのですが、やっぱりなんだか難しそうで、
(ツールとか必要みたいなことがありました。Macとか関係なくできるんでしょうか)
複数箇所を修正する方を選びました。

いろいろ試してみたところ、
この部分を書き換えるとエラーになってしまうみたいです。

# ここから修正個所
	foreach $num (0..$#items) {
		my $size = length($items[$num]) + 10;
		my $ta_size=$#items-$#table+1;
 		if ($table[$num] eq '') { $table[$num] = '(未定義)'; }
 
		if($num <= 3){
			print <<"EOF";
 		<tr>
 		<th nowrap><font size=-1>$table[$num]</font></th>
 		<td nowrap><font size=-2>$items[$num]</font></td>
 		<td nowrap>
 EOF
		}
		if($num == 3){
			print "<textarea name=\"key\" cols=40 rows=$ta_size>$items[$num]";
		}elsif($num >= 4){
			print "\n$items[$num]";
 		}else{
 			print "<input type=text name=\"key\" value=\"$items[$num]\" size=$size>";
 		}
		if($num == $#items){
			print "</textarea>";
		}
		if($num <= 2 || $num == $#items){
			print "</td></tr>";
		}
# ここまで
 	}

アイテムの3番目から後は〜〜という処理をする、という内容ですよね。
わからないながらに一個一個の単語の意味を調べてみてみたんですけれど・・・
すみません、やっぱりわかりませんでした(T_T) 

返信(回答)する


Web裏技