カテゴリ:HTML JavaScript CGI PHP 

リストやテーブルの項目をドラッグ&ドロップで順番を入れ替えてみましょう。

jQuery UIをつかいます。該当するものをググってもってきましょう。

<form action="sort.php" method="post">
<table border=1>

<thead>
<tr><th>No</th><th>List</th></tr>
</thead>

 

<tbody id="jquery-ui-sortable">

<tr>
<input type="hidden" name="disp[a]" id='disp_a' value="1">
<td name="num_data" var="a">1</td><td>a</td>
</tr>

<tr>
<input type="hidden" name="disp[b]" id='disp_b' value="2">
<td name="num_data" var="b">2</td><td>b</td>
</tr>

<tr>
<input type="hidden" name="disp[c]" id='disp_c' value="3">
<td name="num_data" var="c">3</td><td>c</td>
</tr>

</tbody>
</table>
<input type="submit" value="送信">
</form>

 

<script src="jquery.js"></script>
<script type="text/javascript" src="jquery.ui.core.js"></script>
<script type="text/javascript" src="jquery.ui.widget.js"></script>
<script type="text/javascript" src="jquery.ui.mouse.js"></script>
<script type="text/javascript" src="query.ui.sortable.js"></script>

 

<script>
$(function() {

    $('#jquery-ui-sortable').sortable();
    $('#jquery-ui-sortable').bind('sortstop',function(){
        $(this).find('[name="num_data"]').each(function(idx){
            $(this).html(idx+1);
            var id = $(this).attr('var');
            $("#disp_"+id).val(idx+1);
        });
    });

});

</script>

 

テーブルのTDタグに属性としてname="num_data"をつけましょう。

その部分がソート可能となります。移動すると、同じ行も一緒についてきます。↑の例では項目は

・a
・b
・c

の3っつ。これを属性varの値として設定しておいて、入れ替えが起こったら、formのhidden項目で、そのときの順番を即時反映して、表示Noを入れ替えています。

formに値を渡さないで、単に並べ替えるだけなら、こういったことはいっさい必要ありません。

    $('#jquery-ui-sortable').sortable();
    $('#jquery-ui-sortable').disableSelection();

だけでOKです。
 

PHP側でソートしたものを受け取ってみます。

<?php

var_dump($_POST['disp']);

?>

c,b,aの順になっていたら、disp[c]が1、disp[b]が2、disp[a]が1となります。


リストで使いたい場合は、次のようなカンジ。
こちらの場合、入れ替え時にNoを表示しないので都度何もせず、送信時にそのときの値をいれて送信すればOKです。

<form action="sort.php" method="post" id="form1">
<ul id="jquery-ui-sortable">

<li name="num_data" var="a">a
<input type="hidden" name="disp[a]" id='disp_a' value="1"></li>

<li name="num_data" var="b">b
<input type="hidden" name="disp[b]" id='disp_b' value="2"></li>

<li name="num_data" var="c">c
<input type="hidden" name="disp[c]" id='disp_c' value="3"></li>

</ul>
<input type="button" value="送信" id="sbmt">
</form>

(略)

<script>
$(function() {
    $('#jquery-ui-sortable').sortable();
    $('#jquery-ui-sortable').disableSelection();

    // 送信時にそのときの順番を入れる
    $('#sbmt').click(function() {
        $('#jquery-ui-sortable').find('[name="num_data"]').each(function(idx){
            var id = $(this).attr('var');
            $("#disp_"+id).val(idx+1);
        });
        $('#form1').submit();
    });
});
</script>



 

2019-05-09 11:57 

 カテゴリ:HTML JavaScript CGI PHP 

複数のファイルアップロード領域で、ドラッグ&ドロップを作ってみます。

こんなの何に使うんだ?とお思いでしょうが、使ったことがあったんです!

最初は何も出てきません。
「追加」という部分をクリックしたら「ここにドラッグ&ドロップ」領域ができます。ここにファイルをアップロード。「追加」ボタンを押すたびに増えます。
領域1、領域2という具合です。

※↓デザインもなにも考えてないものなので、大変見難いです。

<form id="form" enctype="multipart/form-data">

<input type="hidden" name="count" value="0" id="count">
<div id="addarea"></div>
<div id="add">追加</div>

<button type="button" id="sbm">送信</button>
</form>


<script src="jquery-3.3.1.js"></script>
<script type="text/javascript">

$(function(){
    var file_list = new Array();

    $('#sbm').click(function() {
        var form = $('#form').get()[0];
        var formData = new FormData(form);
        if(file_list){
            for (var k in file_list) {
                var i;
                var num = file_list[k].length;
                for(i=0;i< num;i++)
                    formData.append('upfiles['+(k)+'][]', file_list[k][i]);
            }

        }
        $.ajax({ url: 'upload.php', method: 'post', data: formData,
            processData: false, contentType: false
        }).done(function(res) {
            if(res == '1') alert('送信できました');
            else alert('送信できませんでした');
        }).fail(function( jqXHR, textStatus, errorThrown ) {
            alert('送信エラー');
        })
    });

 

  // ドラッグ&ドロップ領域をつくる

    $('#add').on('click', function() {
        var r = Number($('#count').val());
        var str = '<div id="upfiles_'+(r)+'" name="upfiles['+(r)+'][]">ここにドラッグ&ドロップ</div><div id="upfiles_'+(r)+'_filename"></div>';
        $('#addarea').append(str);
        inittarget('upfiles_'+(r), r);

        file_list[r] = '';
        $('#count').val(r+1);
    });

 

    function inittarget(target, r) {
        var fileArea = document.getElementById(target);
        fileArea.addEventListener('dragover', function(evt){
            evt.preventDefault();
            fileArea.classList.add('dragover');
        });
        fileArea.addEventListener('dragleave', function(evt){
            evt.preventDefault();
            fileArea.classList.remove('dragover');
        });
        fileArea.addEventListener('drop', function(evt){
            evt.preventDefault();
            fileArea.classList.remove('dragenter');
            file_list[r] = evt.dataTransfer.files;
        
            $("#"+target+'_filename').text('');
            for (var i = 0; i < file_list[r].length; i++)
                $("#"+target+'_filename').append(file_list[r][i].name + '<br>');
        });
    }

});
</script>

 

upfiles[領域1][複数ファイル]、upfiles[領域2][複数ファイル]という状況で格納され、「送信」ボタンでまとめてアップロード。

受け取り側は、領域ごとに複数受け取るようにします。

<?php

foreach($_FILES['upfiles']['tmp_name'] as $k => $v) {

  // 領域ごとのまとまり
    foreach($v as $k1 => $v1) {
        $fname = $_FILES['upfiles']['name'][$k][$k1];
        $ext = pathinfo($fname, PATHINFO_EXTENSION);
        $filename = date("YmdHis") . '_' . $k . '_' . $k1 . '.' . $ext;
        move_uploaded_file($v1, $filename);
    }
}

echo 1;

?>

これもファイルチェックなどなにも入れてないのでご自由に。

 

jsのメモリ領域ってどうなってんの?という状態なので、正直結構ムリヤリ技かも。とりあえずこれで動きます。

今はもっと便利なやりかたがあるかもしれません。

2019-05-02 11:40 

 カテゴリ:HTML JavaScript CGI PHP 

ファイルをドラッグ&ドロップでアップロードします。
即自動アップロードはよくあるので、一度formに貯めてから「送信」ボタンでアップロードします。送信はajax、つまり非同期で画面遷移なしです。
他に一緒に送るフォーム項目があるときなどにこの方法を使います。

まずはHTML側。

<form id="form" enctype="multipart/form-data">

<div id="drop-zone">ここにドラッグ&ドロップ</div>
<div id="filenames"></div>

<button type="button" id="sbm">送信</button>
</form>


<script src="jquery-3.3.1.js"></script>
<script type="text/javascript">

$(function(){
    var file_list;

    $('#sbm').click(function() {
        var form = $('#form').get()[0];
        var formData = new FormData(form);
        if(file_list){
            var i;
            var num = file_list.length;
            for(i=0;i< num;i++){
                formData.append('upfiles[]', file_list[i]);
            }
        }
        $.ajax({ url: 'upload.php', method: 'post', data: formData,
            processData: false, contentType: false
        }).done(function(res) {
            if(res == '1') alert('送信できました');
            else alert('送信できませんでした');
        }).fail(function( jqXHR, textStatus, errorThrown ) {
            alert('送信エラー');
        })
    });

 

  //ドラッグ&ドロップ処理
    var fileArea = document.getElementById('drop-zone');
    fileArea.addEventListener('dragover', function(evt){
        evt.preventDefault();
        fileArea.classList.add('dragover');
    });
    fileArea.addEventListener('dragleave', function(evt){
        evt.preventDefault();
        fileArea.classList.remove('dragover');
    });
    fileArea.addEventListener('drop', function(evt){
        evt.preventDefault();
        fileArea.classList.remove('dragenter');
        file_list = evt.dataTransfer.files;
      //念のためにファイル名を表示
        $("#filenames").text('');
        for (var i = 0; i < file_list.length; i++)
            $("#filenames").append(file_list[i].name + '<br>');
    });

});
</script>

 

デザインもなにもないです。「ここにドラッグ&ドロップ」部分にアップロードしたいファイルをドラッグ&ドロップして、「送信」ボタンで送信します。

jsでは、ドラッグ&ドロップしたファイルを一時file_listにとって、それを送信時にformDataに追加しています。他に送信するデータがあれば、それもformDataにいれておきます。

ファイル名表示処理はわかりやすくするために入れてあります。普通は不要でしょう。

formデータをupload.phpに送り、返ってきた値で色々処理をします。↑では単にalertを出してるだけですが、form領域を消してかわりにメッセージを表示すると、一見画面遷移したように見えます(笑)。

 

受け取るPHP側。upload.phpとします。ファイルのチェックとかは色々省略。特に注意することはありませんが、ajaxで渡してきているので、結果を適当に返しましょう。今回はOKだったら1を返しています。

<?php

foreach($_FILES['upfiles']['tmp_name'] as $k => $v) {
    $fname = $_FILES['upfiles']['name'][$k];
    $ext = pathinfo($fname, PATHINFO_EXTENSION);
    $filename = date("YmdHis") . '_' . $k . '.' . $ext;
    move_uploaded_file($v, $filename);
}

echo 1;

?>

 

拡張子だけ生かして、ファイル名は独自につけてます。元のファイル名をつけておくことは可能ですが、日本語ファイル名だとサーバ側の環境によって注意が必要です。windowsサーバなどではSJISにしておかないと文字化けすることがあります。

当時作ったときは結構苦労したんですが、今調べると結構同じ事をやっている人がいる。やっぱりみんなおなじことやってるんだなー。

 

 

 

2019-05-01 11:22 

 カテゴリ:CGI PHP 

方法1:ZipArchiveを利用する。

phpでzipファイルを作成した場合は、phpのZipArchiveを使いましょう。

zipファイルの作り方はこんなカンジ。

$zip = new ZipArchive();
$result = $zip->open('zipファイル名',
     ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if($result) {
     $zip->addFile('zipに追加したいファイル名');
     $zip->close();
}

 

zipファイルを作ってすぐにダウンロードさせたい場合でも、zipはメモリ上にデータとして作れないので、一度どこかファイルに保存して、それを読み取って流します。

zipに追加したいファイルは、どこかに作ってある必要があります。

例えばDBからデータ取得、csvにしてさらにzipで固めてダウンロードさせたい場合、まずはcsvファイルを作って保存し、さらにzipファイルも作って保存する形になります。最後に必要ないならつくったzipファイルは削除して終了。

header('Content-Type: application/zip; name="'.
    'zipファイル名' .'"');
header('Content-Disposition: attachment; filename="'.
    'zipファイル名' .'"');
header('Content-Length: '.filesize('zipファイル名'));
echo file_get_contents('zipファイル名');
unlink('zipファイル名');

  

方法2:zipコマンドを利用する

ZipArchiveを使う場合、いまのところパスワードつきのzipファイルを作ることはできません。

その場合、システムに作ってもらいましょう。

exec('zip -jP ' . 'パスワード' . ' ' . 'zipファイル名' .  ' ' .
        'zipに追加したいファイル名');

オプションに-jPをつけます。パスワードを作る-Pだけだと、解答ソフトによってはうまくいきません。

あと、解凍したファイルをpcで使う場合は、ファイル名や中身をSJISにしておいたほうが問題がありません。ファイル名のせいで解凍できないことがあるようです。

 

2019-04-22 12:44 

1

【最新記事】


技術ブログ

    よく使うネタを適当に書き留めます。
    古い情報もあるので、各自最新のものをチェックしてください。 (最新のほうが、基本的に使える機能は増えてます)

カテゴリ

  • HTML
  • JavaScript
  • CGI
  • PHP
  • Perl

過去ログ

  • 2019年05月 (3)
  • 2019年04月 (1)
ページのトップへ戻る