Drupal-Modul so umbiegen, dass CSV in neue Tabelle geschrieben wird.

airliner

Erfahrenes Mitglied
Moin moin,

ich stehe vor einem kleinen Problem bezüglich dem Import von CSV-Dateien.
Das Projekt, an dem ich gerade sitze, soll eine Art Vergleichsportal für Software darstellen. Dazu wird den Herstellern eine Excel-Tabelle zugeschickt, die wir ausgefüllt zurückbekommen. Um die darin enthaltenen Daten darzustellen, wird die bei uns ins CSV-Format exportiert und über das Modul "Tablefield" eingelesen. Das klappt auch ganz gut (von den Umlauten mal abgesehen) und wird auch schön angezeigt. Nun kommt aber die Krux, vor der ich stehe:
Es soll eine Filterung möglich sein. Nur so, wie die CSV importiert wurde, ist das mMn nicht möglich. Sämtliche Daten werden in einer Spalte untergebracht und ich wage zu bezweifeln, dass ich die ohne großen workaround auslesen kann.
Deshalb wollte ich das Modul so anpassen (ich weiß, never toch a running system, gerade bei updates), dass die ausgelesenen Daten der dritten Spalte in einer weiteren Tabelle gespeichert werden (die Spaltennamen und Datentypen sind bereits gesetzt) können. Das würde mir die Erstellung eines Filters bedeutend einfacher machen.
Hier die Funktion aus dem Modul:
PHP:
function tablefield_import_csv($form, &$form_state) {
  // Look for the field name by checking on the clicked button
  if(preg_match('/edit-rebuild-(.*)/', $form_state['clicked_button']['#id'], $id)) {
    // Extract the field and file name from the id of the clicked button
    $file_name = preg_replace('/\-/', '_', $id[1]);
    preg_match('/_([0-9]+)$/', $file_name, $field_delta);
    // Extract the field delta from the field name
    $delta = $field_delta[1];
    $field_name = preg_replace('/_([0-9]+)$/', '', $file_name);

    // @todo fail out if no file
    // @todo validate file type
    $file = file_save_upload('tablefield_csv_' . $file_name);

    if (is_object($file)) {
      if (($handle = fopen($file->filepath, "r")) !== FALSE) {

        tablefield_delete_table_values($form_state['values'][$field_name][$delta]['tablefield']);

        // Populate CSV values
        $max_col_count = 0;
        $row_count = 0;
        while (($csv = fgetcsv($handle, 0, ",")) !== FALSE) {
          $col_count = count($csv);
          foreach ($csv as $col_id => $col) {
            $form_state['values'][$field_name][$delta]['tablefield']['cell_' . $row_count . '_' . $col_id] = $col;
          }
          $max_col_count = $col_count > $max_col_count ? $col_count : $max_col_count;
          $row_count++;
        }
  
        fclose($handle);
     
        $form_state['values'][$field_name][$delta]['tablefield']['count_cols'] = $max_col_count;
        $form_state['values'][$field_name][$delta]['tablefield']['count_rows'] = $row_count;
        $form_state['values']['tablefield_import'] = TRUE;

        drupal_set_message(t('Successfully imported @file. Please preview the result before saving.', array('@file' => $file->filename)));
      }
      else {
        drupal_set_message(t('There was a problem importing @file.', array('@file' => $file->filename)));
      }
    }

    // Remove the temporary file
    db_query("DELETE FROM {files} WHERE fid = %d", $file->fid);
    file_delete($file->filepath);
  }
}

Daneben eine Frage:
Es gibt in der dritten (zum Filtern wichtigen) Spalte einige Zellen, die leer bleiben. Wie kann ich die "heraustrennen", dass diese nicht beachtet werden? Geht es nur über die Kontrolle auf Leerstrings oder kann man das auch fest bestimmen? Es sind immer die selben Zellen, die leer bleiben.
Ein kurzes Beispiel zur Excel-Tabelle:
+------------------+--------------------+--------------------+
|Kategorie |Merkmal |Parameter |
|Produkt | | |
| |Name |Software A |
| |Referenzen |vorhanden |
| | Infos |ja |
|Bewertung | | |
| |Gutacher |ja |
+------------------+--------------------+---------------------+
usw.
Ich hoffe, ich konnte es etwas besser verdeutlichen.
 
über die Zeilnnummer (index) oder halt auf den Inhalt testen. Kannst ja testen ob die erste Spalte abgefüllt ist, dann sind die Spalten 2 und 3 leer....
 
Zurück