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:
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.
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.