CGI-BBS > SO−HO > ショッピングバスケット > バスケット5.14でテキストエリア内の改行を残したい。


カレッヂ
カレッヂ


質問者 かずやん  投稿日 1/31(金) 13:58:11
はじめまして。

<textarea name="REM1" cols=40 rows=14 wrap=PHYSICAL></textarea>という少し大きな
注文欄を準備中なのですが、お客様には次のような注文記入をお願い頂きます。

1商品/材質
2商品/材質
3商品/材質
4商品/材質
5商品/材質
6商品/材質

この場合、バスケットの中身に移ると備考欄と注文メールでは改行が省かれています。
なんとか改行が残るようにカスタマイズしたのですが、どなたかご指導頂ければ幸いです。

プロバイダ参照:http://uspcu.ultra-speed.ne.jp/
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:Peggy
FTPソフト:FFFTP
サーバ移転:していない
改造:していない 改造前正常動作
CGI習熟度:middle

回答者 呑兵衛@大阪  [削除]  投稿日 2/1(土) 17:30:18
2点のクリアが必要です。
1. デコード部分の293行目付近、 $value =~ /\n/ /g; を
$value =~ /\n/ /g if $name ne 'REM1'; とすることで改行コードが生きます。

2. <textarea name="REM1" cols=40 rows=14 wrap=PHYSICAL></textarea> を CGIのHTML
で再現すると、一つの<TABLE BORDER WIDTH=90%></TABLE>内に14の要素が読み込まれますの
で、ユーザ側の画面解像度の制限で意図した結果が再現されないのでは。
思い切って不要な要素を出力しないようにすれば言い訳ですが、これへの対応は出力された
HTMLソースとcargo.cgi を見比べながら対応してください。
対応済なら飛ばしてください。
質問者 かずやん  [削除]  投稿日 2/2(日) 09:58:40
>1. デコード部分の293行目付近、 $value =~ /\n/ /g; を
>$value =~ /\n/ /g if $name ne 'REM1'; とすることで改行コードが生きます。

ショッピングバスケット5.14のcargo.cgiの293行目付近は、、

	$value =~ s/\</&lt;/g;
	$value =~ s/\>/&gt;/g;
	$value =~ s/\"/&quot;/g;
	$value =~ s/\t//g;

となっています。また、「$value =~ /\n/ /g;」を検索しても見当たりません。
お手数ですが再度、調べて頂けないでしょうか。

よろしくお願い致します。
回答者 呑兵衛@大阪  [削除]  投稿日 2/2(日) 16:54:56
V5.14 でしたか。5.24 だと思ってました。
このバージョンは現在公開されていないので同じスクリプトかどうか分かりません。
できればデコード部分を載せていただけませんか?
質問者 かずやん  [削除]  投稿日 2/2(日) 18:09:01
ZEUS対応版、ですので、

http://www.rescue.ne.jp/cgi/cargo5zeus/

は5.14です。

>できればデコード部分を載せていただけませんか?

頼りなくて恐縮です。
デコード部分というのもわかっていません。

よろしくお願い致します。
回答者 呑兵衛@大阪  [削除]  投稿日 2/2(日) 20:25:05
その25行目ほど前にあります。
質問者 かずやん  [削除]  投稿日 2/2(日) 22:11:49
# ここから下をいじったあとの動作確認は自己責任でお願いします. (その場合バグ調査も行いません)

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@wday_array = ('SUN','MON','TUE','WED','THU','FRI','SAT');
$date_now = sprintf("%01d\/%01d(%s)%02d\:%02d",$mon +1,$mday,$wday_array[$wday],$hour,$min);

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
$buffer .= "\&$ENV{'QUERY_STRING'}";

@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {

	($name, $value) = split(/=/, $pair);
	$name =~ tr/+/ /;
	$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

	$name =~ s/\<//g;
	$name =~ s/\>//g;
	$name =~ s/\"//g;
	$name =~ s/\&//g;
	$name =~ s/\t//g;
	$name =~ s/\n/ /g;
	$name =~ s/\r/ /g;
	$value =~ s/\t//g;
	$value =~ s/\n/ /g;
	$value =~ s/\r/ /g;


ここを指示されていると思うのですが、

	$value =~ /\n/ /g;

ではなく、

	$value =~ s/\n/ /g;

と確認されていますので、

	$value =~ s/\n/ /g if $name ne 'REM1';

としてみましたが、バスケット表示結果がおかしくなります。

正確なエディットをご指摘頂けるのであれば、よろしくお願いします。

回答者 呑兵衛@大阪  [削除]  投稿日 2/3(月) 00:07:05
順番がおかしくなってましたので先の投稿は削除しました。
検証しないとだめですねぇ、すんません。
$value =~ s/\r/ /g; $value =~ s/\n/ /g; のとおり元に戻して下さい。
以下改行してますが問題ありません。
437行目付近(メール送信文)
if ($REM1[$i] ne "") { $line .= "  $items[2] $REM1[$i]\n"; } を
if ($REM1[$i] ne "") {
    $len = ' ' x length($items[2]);
    $REM1[$i] =~ s/ +/\n  $len /g;
    $line .= "  $items[2] $REM1[$i]\n";
}
に変更
584行目 と 732行目付近(HTML出力部分)
if ($items[2] ne "") {
    if ($REM1[$i] eq "") { $REM1[$i] = '&nbsp;'; }
    print "<TD ALIGN=RIGHT><FONT COLOR=#000000>$REM1[$i]</FONT></TD>\n";
}
を
if ($items[2] ne "") { 
    if ($REM1[$i] eq "") { $REM1[$i] = '&nbsp;'; }
    elsif ($REM1[$i] =~ / +/) { $REM1[$i] =~ s/ +/<br>/g; }
    print "<TD ALIGN=left><FONT COLOR=#000000>$REM1[$i]</FONT></TD>\n";
} 
に変更。以上。
質問者 かずやん  [削除]  投稿日 2/3(月) 11:17:12
全角表示では問題ありませんでしたが、次のような場合、、

例:商品名 商品タイプ

Sweet Apple / Winter set

と入力しますと、バスケット表示では、

Sweet
Apple
/
Winter
set

となります。

このメールフォーム(技の裏)のように「書いた通りに表示」されるように
したいのですが、、。

それから、注文フォーム送信後の「送信しました」という画面でも、カスタ
マイズが反映されるようにするには新たに何処になるでしょうか。


以上、よろしくお願い致します。


回答者 呑兵衛@大阪  [削除]  投稿日 2/3(月) 21:44:08
パターンがいろいろありますねぇ。
267、268行目を
#$value =~ s/\n/ /g;
#$value =~ s/\r/ /g;
$value =~ s/\x0D\x0A|[\x0D\x0A]/  /g;

$REM1[$i] =~ s/ +/\n  $len /g; $line .= "  $items[2] $REM1[$i]\n";
を
$REM1[$i] =~ s/  +/\n  $len /g; $line .= "  $items[2] $REM1[$i]\n";

elsif ($REM1[$i] =~ / +/) { $REM1[$i] =~ s/ +/<br>/g; }
を
elsif ($REM1[$i] =~ /  +/) { $REM1[$i] =~ s/  +/<br>/g; }

半角空白2つ以上の連続を備考欄1に限って改行コードに変換します。
その他の項目では、ブラウザでは半角1つに処理されます。
「送信しました」の画面でお望みのようにするのはここでは控えます。
後はシェアウェア登録してから呑兵衛サイトで質問してください。
質問者 かずやん  [削除]  投稿日 2/4(火) 17:32:10
シェアウエア登録しましたので、こちらは終了させていただきます。

このページは終了したので返信(回答)は書きこめません
 


Web裏技