web-dev-qa-db-ja.com

cck filefieldでアップロードされたcsvのヘッダーを検証する方法は?

ユーザーがcckファイルフィールドを使用してcsvをアップロードする必要があります。次に、列の順序が正しいことを確認します。

私の調査の結果、ファイルフィールド用のカスタムバリデーターを作成するのが最善の選択肢であると思いました。私はこれをリソースとして使用しました: https://drupal.org/node/546146 それを書くために...

次に、csvを開いて読み取る方法の例としてこれを使用しました。 http://oliverhuynh.wordpress.com/2011/06/21/drupal-batch-csv-importing-template/ ...

私はこれに非常に慣れていないので、私が間違っていることを特定する洞察がありません...これが私のコードです:

function MYMODULE_form_alter(&$form, $form_state, $form_id) {
  if($form_id == 'stocklist_node_form') {     

    $form['field_stocklist'][0]['#upload_validators']['stocklist_validation'] = array();
    return $form;
  }

}

/**
 * The validation for the file.
 *
 */

function stocklist_validation($field) {
  // variable for error messages
  $errors = array();


  // do some processing on the field / file
  $filepath = $field->filepath;
  global $base_url;
  $fileurl = $base_url . '/' . $file_path;
 // Open the file
      if ( $handle = fopen($fileurl, 'r') ) {
        $line_count = 1 ;
        $first = TRUE ;
        if ( $line = fgetcsv($handle, 4096) ) {

        // Validate the headers 

         if ( $line[0] !== 'manufacturer' ) {
            $errors[] = t('Unable to verify uploaded file !filepath. Please ensure the file has the correct file type, column names and information.', array('!filepath' => $field->filename));
         }
        }
        fclose($handle);
      }


// in case of error, add error message

          return $errors;
}

私はどんなヘルプやポインタにも本当に感謝します...私はそれを終えるのに一歩離れていると感じますが、Google検索が不足しています...有効なファイルと無効なファイルのどちらをアップロードしても問題ではなく、定義されたエラーメッセージ...なぜそれをしているのですか?

編集:

以下は、「在庫リスト」タイプのノードを表示しながらdevelを使用したスクリーンショットです。それが役立つかもしれないと思った... enter image description here

4
gMaximus

これもうまくいきました:

/**
 * The validation for the stocklist.
 *
 */

function stocklist_validation($field) {
  // variable for error messages
  $errors = array();

  // do some processing on the field / file
  $filepath = $field->filepath;

 // Open the file

      if ( $handle = fopen($filepath, 'r') ) {
        $line_count = 1 ;
        $first = TRUE ;
        if ( $line = fgetcsv($handle, 4096) ) {

        // Validate the headers 
         if ( $line[0] !== 'something' ) {
            $errors[] = t('Please ensure the files 1st column has the something in it. Including something as the heading.'); 
         }

    if ( $line[1] !== 'somethingelse' ) {
            $errors[] = t('Please ensure the files 2nd column has the somethingelse in it. Including somethingelse as the heading.'); 
         }


        fclose($handle);
      }

           else {
        $errors[] = t('Unable to open uploaded file !filepath.', array('!filepath' => $filepath));   
       }
      } 
// in case of errors, return error messages

          return $errors;
}

最初の関数を変更する必要はありませんでした...

2番目の関数では、変更が必要なのはfopen()でした。次に、ばかのように、「有効な」ファイルが実際にはタブ区切りであることに気づきました...これらのファイルも受け入れることができるといいですね。一部のソフトウェアはcsvファイルをその形式で保存するため、私が明らかに使用しているOpenOfficeなどです。

0
gMaximus