0

私は SPL と recursiveIterator の初心者です。

私が達成したいこと:

フォルダ ツリーでファイルを検索し、そのパスを取得したいと考えています。

私のフォルダツリーは次のようになります:

./ressources
./ressources/Images
./ressources/Images/Image01
./ressources/Images/Image02
./resources/Images/ImagesSub/Image03
./ressources/Docs
./ressources/Docs/Doc01

等々...

SQLクエリでファイルの名前を取得します(警告:拡張子はありません)。ここで、「./ressources」フォルダーで再帰イテレーターを実行して、ファイルの場所を見つけたいと考えています。

次に、ファイルが見つかったら、リンク全体「./ressources/Folder/File」を返したいと思います。

ゴードンのソリューションを読みましたが、うまくいきません。何かをエコーし​​ようとしましたが、何も表示されません。

これが私のコードです:

$doc_id = $bean->id;
$query = "SELECT a.document_revision_id  FROM  documents as a, document_revisions as b ";
$query .= "WHERE a.document_revision_id = b.id AND a.id = '" . $doc_id . "' LIMIT 1";
$results = $bean->db->query($query, true);
$row = $bean->db->fetchByAssoc($results);

$file_id = $row['document_revision_id'];
$ressources = './ressources/';
$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($ressources, RecursiveDirectoryIterator::KEY_AS_FILENAME), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iter as $entry) {
    if ($entry->getFilename() === $file_id){
        echo '<script> alert('.$entry->getFilepath().');</script>';
    }
}

(エコーにアラートを出すのはでたらめですが、砂糖があると何かを表示するのはかなり難しいです 仕様

SugarCrm CE 6.5.2 logic_hook でこれを実行しようとしていますが、archlinux で実行しています。私のPHPバージョンは5.4.6です

至急なので、お力添えいただけると嬉しいです!!

よろしくお願いします!

EDIT FROM 12/10/09 2pm: 私の砂糖プロジェクトとは何か、データベースからパス名を取得できない理由

Documents モジュールに folder_name_c というカスタム フィールドを作成しました。ドキュメントをアップロードするフォルダー (リソースの下) の名前を入力します。

ドキュメントを編集するときに、アップロードされたファイルを古いフォルダーから新しいフォルダーに移動できるようにしたいと考えています。

ドキュメントを編集するとき、編集時に logic_hook が機能するように after_retrieve フックを実行しました (以前は、編集ビューに対してのみ実行されていました)。

したがって、$bean->folder_name_c を取得すると、フィールドの内容が取得されます。私がSQLを試してみると、「保存」をクリックした後にのみfolder_name_cが選択されます。

そのため、古い folder_name を作成する手がかりがありません

$old_link = '.ressources/'.$old_folder.'/'.$file_id;

しか作成できません

$new_link = '.ressources/'.$bean->folder_name_c.'/'.$file_id;

それで、久しぶりに、リソースフォルダーとサブフォルダーを参照して、$file_id という名前のファイルを見つけて、$old_link を作成できることに気付きました。

参考までに、シュガーのスタジオの下に新しいカスタム フィールドを作成することで、多くの時間を稼ぎました。custom_code 呼び出しデータベースなどを追加することに命を落としたくありません。これは緊急であり、再帰イテレータはシンプルで迅速に思えます。

4

2 に答える 2

1

のようなメソッドはありません。それ自体を使用getFilepathする(Recursive)DirectoryIteratorだけ$entryです。文字列コンテキストで使用すると、そのようなものにキャストされます(アラ__toString):

$file_id = 'test';
$ressources = './ressources/';

// [...]

echo '<script>alert('.$entry.');</script>'; // is casted to a string which contains the full path

// results in alerting ./resources/SubFolder/test

同じ構造で拡張なしでテストしました。

于 2012-10-09T13:55:14.963 に答える
0

だから、私の問題に再帰イテレータを使用する方法を見つけました! これが私のコードです:

$ressources = './ressources/';
$directoryIter = new RecursiveDirectoryIterator($ressources);
$iter = new RecursiveIteratorIterator($directoryIter, RecursiveIteratorIterator::SELF_FIRST);
$old_path = '';
$new_path = $ressources.$bean->folder_name_c.'/'.$file_id;
chmod($new_path,0777);

foreach ($iter as $entry) {

    if (!$directoryIter->isDot()) {

        if ($entry->getFileName() == $file_id) {
            $old_path = $entry->getPathName();
            chmod($old_path, 0777);
            copy($old_path,$new_path);

         }
    }
}

それで、ファイルのオリジンパスを取得することに成功しました! :)

しかし、いつものように、問題があります:

ファイルを $old_path から $new_path にカット アンド ペーストしたい(コードでわかるように)。ここのコピーはうまく機能しますが、どこで old_path を unlink() する必要があるのか​​ わかりません..誰かが知っている場合...(コピーを間違った行に書いた場合は、教えてください! :D )

于 2012-10-09T14:59:28.267 に答える