ファイルリストの一覧をソートする

Re: ファイルリストの一覧をソートする

- Tatsuya Shirai の投稿
返信数: 0

リソースの追加/ディレクトリの表示のフォルダ内一覧表示

(1)mod/resource/type/directory/resource.class.php,ソースリストの一番トップ

<?php // $Id: resource.class.php,v 1.34.2.2 2007/11/08 05:36:21 toyomoyo Exp $

// ここから追加
    $sortorderfilelist = optional_param('sortorderfilelist', 0, PARAM_INT);
    if ($sortorderfilelist < 1) {
        if (isset($_SESSION['sortorderfilelist'])) $sortorderfilelist = $_SESSION['sortorderfilelist'];
            else $sortorderfilelist = 1;
    } else $_SESSION['sortorderfilelist'] = $sortorderfilelist;
// ここまで追加

class resource_directory extends resource_base {

(2)同上,function display(): 40行近辺

function display() {
    global $CFG;
    global $sortorderfilelist;  // ( (追加)

/// Set up generic stuff first, including checking for access
    parent::display();

/// Set up some shorthand variables
    $cm = $this->cm;
    $course = $this->course;
    $resource = $this->resource;

(3)同上,113行近辺

    if (trim(strip_tags($resource->summary))) {
        print_simple_box(format_text($resource->summary, FORMAT_MOODLE, $formatoptions, $course->id), "center");
        print_spacer(10,10);
    }

//  $files = get_directory_list("$CFG->dataroot/$relativepath", array($CFG->moddata, 'backupdata'), false, true, true);
// ここから追加
    $dirs = get_directory_list("$CFG->dataroot/$relativepath", array($CFG->moddata, 'backupdata'), false, true, false);
    $files = get_directory_list("$CFG->dataroot/$relativepath", array($CFG->moddata, 'backupdata'), false, false, true);
    $dirlist = $filelist = array();
    foreach ($dirs as $file) {
        switch ($sortorderfilelist) {
          case 3: case 4:
            $sortkeystr = strftime('%Y%m%d%H%M%S', fs_filemtime("$CFG->dataroot/$relativepath/$file"));
            break;
          case 5: case 6:
            $sortkeystr = strval(get_directory_size("$CFG->dataroot/$relativepath/$file"));
            break;
          case 1: case 2: default:
            $sortkeystr = $file;
            break;
  }
        $dirlist['0'.$file] = $sortkeystr; 
        // $dirlist["0"]が$dirlist[0]になってしまうため'0'を付けて$dirlist["00"]とする.
    }
    foreach ($files as $file) {
        switch ($sortorderfilelist) {
          case 3: case 4:
            $sortkeystr = strftime('%Y%m%d%H%M%S', fs_filemtime("$CFG->dataroot/$relativepath/$file"));
            break;
          case 5: case 6:
            $sortkeystr = strval(fs_filesize("$CFG->dataroot/$relativepath/$file"));
            break;
          default:
            $sortkeystr = $file; break;
  }
        $filelist['0'.$file] = $sortkeystr;
        // $filelist["0"]が$filelist[0]になってしまうため'0'を付けて$filelist["00"]とする.
    }
// ここまで追加


//  if (!$files) {  
    if (empty($dirlist) && empty($filelist)) {
        print_heading(get_string("nofilesyet"));
        print_footer($course);
        exit;
    }
    print_simple_box_start("center", "", "", '0' );

    $strftime = get_string('strftimedatetime');
    $strname = get_string("name");
    $strsize = get_string("size");
    $strmodified = get_string("modified");
    $strfolder = get_string("folder");
    $strfile = get_string("file");
// ここから追加
    $reloadurl = "<a href=\"view.php?id={$cm->id}&amp;subdir=".rawurlencode($subdir)."&amp;";
    $strname .= "&nbsp(";
    $strname .= $sortorderfilelist == 1 ? "&#x25B2;/" : $reloadurl."sortorderfilelist=1\">&#x25B2;</a>/";
    $strname .= $sortorderfilelist == 2 ? "&#x25BC;)" : $reloadurl."sortorderfilelist=2\">&#x25BC;</a>)";
    $strmodified .= "&nbsp(";
    $strmodified .= $sortorderfilelist == 3 ? "&#x25B2;/" : $reloadurl."sortorderfilelist=3\">&#x25B2;</a>/";
    $strmodified .= $sortorderfilelist == 4 ? "&#x25BC;)" : $reloadurl."sortorderfilelist=4\">&#x25BC;</a>)";
    $strsize .= "&nbsp(";
    $strsize .= $sortorderfilelist == 5 ? "&#x25B2;/" : $reloadurl."sortorderfilelist=5\">&#x25B2;</a>/";
    $strsize .= $sortorderfilelist == 6 ? "&#x25BC;)" : $reloadurl."sortorderfilelist=6\">&#x25BC;</a>)";
// ここまで追加

    echo '<table cellpadding="4" cellspacing="1" class="files" summary="">';
    echo "<tr><th class=\"header name\" scope=\"col\">$strname</th>".
         "<th align=\"right\" colspan=\"2\" class=\"header size\" scope=\"col\">$strsize</th>".
         "<th align=\"right\" class=\"header date\" scope=\"col\">$strmodified</th>".
         "</tr>";
//  foreach ($files as $file) {
// ここから追加
    switch ($sortorderfilelist) {
      case 2:  case 4: case 6:  arsort($dirlist); arsort($filelist); break;
      case 3:  case 5: default: asort($dirlist);  asort($filelist);  break;
    }
    $files = $dirlist + $filelist;  // 同名のフォルダとファイルは作成不可なので重複してもOK
    foreach ($files as $file => $dummy) {
        $file = substr($file, 1);  // 頭のダミーの'0'を取り除く
// ここまで追加
        if (is_dir("$CFG->dataroot/$relativepath/$file")) {          // Must be a directory
            $icon = "folder.gif";
            $relativeurl = "/view.php?blah";
            $filesize = display_size(get_directory_size("$CFG->dataroot/$relativepath/$file"));


以上で良いはずです.色々な修正を並行して行ったため,Subversionから正確な差分を得られませんでした.何かおかしなことがあったら報告して下さい.