web-dev-qa-db-fra.com

Importer CSV, ligne par ligne, dans un tableau personnalisé

J'ai une Drupal 7 méthode d'envoi pour mettre à jour CSV ligne par ligne vers une table personnalisée que j'ai trouvée sous ce lien . J'ai essayé de la mettre à jour pour qu'elle fonctionne en Drupal 8 en vain. Comment puis-je le modifier pour qu'il fonctionne en Drupal 8?

function custom_module_submit($form, &$form_state) {

    $file = $form_state['values']['csv_upload_file'];
    $file->status = FILE_STATUS_PERMANENT;
    $file->filename = str_replace(' ', '_', $file->filename);
    file_save($file);

    $csv_file = file_load($file->fid);
    $file = fopen($csv_file->uri, "r");


    while(! feof($file))
    {
        $customer = fgetcsv($file));
        db_insert('your_db_table')
            ->fields(array(
                'column1' => $customer[0],
                'column2' => $customer[1]
            ))
            ->execute();
    }

    fclose($file);

    drupal_set_message('CSV data added to the database');
}

Le code Drupal 8 que j'essaie d'utiliser est le suivant:

public function submitForm(array &$form, FormStateInterface $form_state)
{
    $file = $form_state->getValue('csv_upload');
    $file->status = FILE_STATUS_PERMANENT;
    $file->filename = str_replace(' ', '_', $file->filename);
    file_save_data($file);

    $csv_file = \Drupal\file\Entity\File::load($file->fid);
    $file = fopen($csv_file->getFileUri(), "r");

    while (!feof($file)) {
        $customer = fgetcsv($file);
        \Drupal::database()->insert('your_db_table')
            ->fields(array(
                'column1' => $customer[0],
                'column2' => $customer[1]
            ))
            ->execute();
    }

    fclose($file);

    drupal_set_message('CSV data added to the database');
}

Les erreurs incluent:

  1. Erreur fatale: appel à une fonction membre getFileUri () sur null dans/home/annuities/public_html/modules/custom_module/src/Form/C‌ ustomForm.php à la ligne 90.

Ligne 90: $file = fopen($csv_file->getFileUri(), "r");

  1. Avertissement: création d'un objet par défaut à partir d'une valeur vide dans Drupal\custom_module\Form\CustomForm-> submitForm () (ligne 85 des modules/custom_module/src/Form/CustomForm.php).

Ligne 85: $file->status = FILE_STATUS_PERMANENT;

  1. Remarque: propriété non définie: stdClass :: $ filename dans Drupal\custom_module\Form\CustomForm-> submitForm () (ligne 86 de modules/custom_module/src/Form/CustomForm.php).

Ligne 86: $file->filename = str_replace(' ', '_', $file->filename);

  1. Le fichier n'a pas pu être créé. Remarque: propriété non définie: stdClass :: $ fid dans Drupal\custom_module\Form\CustomForm-> submitForm () (ligne 89 des modules/custom_module/src/Form/CustomForm.php).

Ligne 89: $csv_file = \Drupal\file\Entity\File::load($file->fid);

  1. Avertissement: array_flip (): ne peut inverser que les valeurs STRING et INTEGER! dans Drupal\Core\Entity\EntityStorageBase-> loadMultiple () (ligne 227 de core/lib/Drupal/Core/Entity/EntityStorageBase.php).
2
Tim Kariuki

J'ai utilisé le code ci-dessous;

public function submitForm(array &$form, FormStateInterface $form_state)
{

    $file = $form_state->getValue('csv_upload_file');

    $destination = $file[0]->toArray()['uri'][0]['value'];

    $file = fopen($destination, "r");

    while (!feof($file)) {
        $customer = fgetcsv($file);
        \Drupal::database()->insert('your_db_table')
            ->fields(array(
                'column1' => $customer[0],
                'column2' => $customer[1]
            ))
            ->execute();
    }

    fclose($file);

    drupal_set_message('CSV data added to the database');
}
2
Tim Kariuki