web-dev-qa-db-ja.com

ルールのカスタムphpを使用して、アップロードしたcsvファイルのコンテンツをdrupal管理テーブルにインポートするにはどうすればよいですか?

私はdrupal 7を使用しており、データモジュールに自分のテーブルに手動で追加したテーブルを管理/採用させていますdrupal db。私が期待していたのは、 csvファイルは特定のコンテンツタイプを介してアップロードされます。ルールを使用してカスタムphpを実行し、csvをテーブルにインポートできます(表示されているものからfeedsdataprocessorが存在しないため) drupal_write_record =関数ですが、問題は、最初にファイルから配列を取得する方法です。次に、ファイルがテーブルの構造と異なる場合があります。たとえば、csvに列1、2、3、4、および3がある場合があります。 4,5,6,7。ヘッダーを確認して管理テーブルにインポートするにはどうすればよいですか?

4
7wonders

概念的な手順:

  1. ノードからCSVファイルのパスを抽出します。
  2. CSVファイルを開き、ヘッダーからフィールドを読み取ります。
  3. 各行を読み取り、キーを変換し、drupal_write_record()を使用して行を保存します。
  4. CSVを閉じます。

ルール統合がどのように機能するかはわかりませんが、ノードをノードに渡すことができると想定しています。

したがって、ステップ1では、$ nodeに格納され、フィールドの名前がfield_csv_fileであると想定して、fopen()にURLを渡すことができます。

$csv_uri = $node->field_csv_file['und'][0]['uri'];

これで、fopen()を開いてファイルハンドルを取得できます。

$handle = fopen($csv_uri, 'r');

価値がない場合は、先に進みません。

ヘッダー行を読み取ります。

$row = fgetcsv($handle);
$columns = array();
foreach ($row as $i => $header) {
  $columns[$i] = trim($header);
}

次に、各行をロードしてフォーマットを変換します。

while ($row = fgetcsv($handle)) {
  $record = array();
  foreach ($row as $i => $field) {
    // This is pretty brittle... if someone screws up the field 
    // names the data won't be written. 
    $record[$columns[$i]] = $field;
  }
  drupal_write_record('your_table', $record);
}

ファイルを閉じます。

fclose($handle);

だからこれに関する問題:

  • このすべてのコードは完全にテストされていません。
  • 誰かがファイルを再アップロードするとどうなりますか?おそらく重複するでしょう。
  • 誰かがヘッダーを改ざんするとどうなりますか?
9
drewish