Nhập CSV vào các nút / thực thể trong Drupal 8 bao gồm UI


7

Giải pháp tốt nhất để nhập tệp CSV vào các nút hoặc thực thể trong Drupal 8 cung cấp giao diện người dùng để người chỉnh sửa nội dung có thể nhập thường xuyên?

Tôi đã nghe D8 Migrate hoạt động tốt nhưng tôi hiểu hiện tại không có UI cho quá trình nhập.

Nhập CSV qua Nguồn cấp dữ liệu dường như chưa sẵn sàng.


3
Tôi đã thử một thử nghiệm cơ bản bằng cách sử dụng bản phát hành Fats D8 mới nhất và áp dụng bản vá ở số 4 từ chủ đề này drupal.org/node/2443471#comment-9723715 và nó có vẻ hoạt động chính xác. Xem làm thế nào nó đi cho các lĩnh vực phức tạp hơn.
Scott Anderson

Tôi nên nghĩ rằng Drupal đang tiết kiệm wordpress mọi lúc hoặc Drupal vẫn đang phát triển.
Vishal Kumar Sahu

Câu trả lời:


10

Tôi làm điều này mọi lúc, sử dụng các thực thể cấu hình di chuyển (được cung cấp bởi mô-đun Migrate_plus ). Xác định một plugin di chuyển trong thư mục config / install của mô-đun di chuyển của bạn, sử dụng plugin nguồn CSV từ mô-đun Migrate_source_csv - bỏ qua cấu hình nguồn 'path', sẽ được điền từ biểu mẫu. Giả sử ID của di chuyển này là example_csv. Tạo biểu mẫu với thành phần tải lên tệp (có tên 'csv_file' trong trường hợp này) và trong phương thức submitForm ():

  public function submitForm(array &$form, FormStateInterface $form_state) {
    $all_files = $this->getRequest()->files->get('files', []);
    if (!empty($all_files['csv_file'])) {
      $validators = ['file_validate_extensions' => ['csv']];
      if ($file = file_save_upload('csv_file', $validators, 'public://', 0)) {
        $csv_migration = Migration::load('example_csv');
        $source = $csv_migration->get('source');
        $source['path'] = $file->getFileUri();
        $csv_migration->set('source', $source);
        $csv_migration->save();
        drupal_set_message($this->t('File uploaded as @uri.', ['@uri' => $file->getFileUri()]));
      }
      else {
        drupal_set_message($this->t('File upload failed.'));
      }
    }
  }

Điều này cập nhật cài đặt di chuyển với tệp mới. Bạn vẫn phải chạy di chuyển bằng cách sử dụng drush mi example_csvđể thực sự nhập nội dung.

Hoặc thêm một số mã vào hàm để thực sự nhập:

      $migration_instance = \Drupal::service('plugin.manager.migration')->createInstance('example_csv');

      $executable = new MigrateExecutable($migration_instance, new MigrateMessage());

      try {
        $migration_status = $executable->import();
      }
      catch (\Exception $e) {
        \Drupal::logger('migrate_drupal_ui')->error($e->getMessage());
        $migration_status = MigrationInterface::RESULT_FAILED;
      }
      if ($migration_status) {
        drupal_set_message($this->t('Import Successful'));
      }
      else {
        drupal_set_message($migration_status, 'error');
      }

1

Có thể tốt hơn và nhanh hơn để sử dụng Nguồn cấp , nhưng vì phiên bản D8 vẫn đang được phát triển; cách khác, bạn có thể sử dụng Excel + VBA ( Visual Basic cho Ứng dụng , đi kèm với Excel) + Internet Explorer 11.

Dưới đây là một ví dụ về cách bạn có thể nhập nội dung CSV của mình bằng VBA.

Ví dụ: giả sử bạn muốn nhập cái này và tạo các nút mới với thông tin từ CSV của bạn:

nhập mô tả hình ảnh ở đây

Đây là một mã VBA mẫu:

Sub Drupal_Import()

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")

Dim x As Integer

For x = 2 To 4 'this controls which rows get added, so only 2 to 4

myURL = "https://rgr79.ply.st/node/add/article"

With IE
.Visible = True 'makes your Internet Explorer window visible.
.navigate myURL
End With

Do
el = vbNullString
On Error Resume Next
Set HTML = IE.document
el = HTML.getElementsByClassName("visually-hidden")(1).innerText
DoEvents
Loop While el = vbNullString

'the above loops until the visualy-hidden class is detected, which means the edit form has been loaded

Application.Wait (Now + TimeValue("00:00:03")) 'tells the program to wait 3 secs.

Set HTML = IE.document

HTML.getElementById("edit-title-0-value").Value = Cells(x, 1).Value 'here the 1 is the Y (so 1 is Column A)

HTML.getElementById("edit-body-0-value").Value = Cells(x, 2).Value 'here the 2 is the Y (so 2 is Column B)

Cells(x, 3).Value = "Done" 'here we use the 3rd column (Column C) and mark it as Done to keep track.

HTML.getElementsByClassName("button js-form-submit form-submit")(1).Click 'clicks the submit button

Application.Wait (Now + TimeValue("00:00:00")) 'here I have a wait for 0, increase it to 2 or 3 if you see your VBA get stuck after submitting a node.

Do
el = vbNullString
On Error Resume Next
Set HTML = IE.document
el = HTML.getElementsByClassName("messages messages--status")(0).innerText
DoEvents
Loop While el = vbNullString

'all the above does is loops the code until the drupal message is detected, which means the node was loaded, after the submit.

Next x

End Sub

Hãy chắc chắn rằng bạn thay đổi tên miền trong myURL = "https://rgr79.ply.st/node/add/article"dòng thành tên miền của bạn. Tôi đang sử dụng tên miền Simplytest.me , nếu bạn chưa thể biết.

Làm thế nào để thêm mã VBA?

Nhấp vào tab Nhà phát triển và sau đó vào biểu tượng Visual Basic (hoặc ALT + F11)

nhập mô tả hình ảnh ở đây

và Dán mã bên trong Trang tính 1 (Trang tính 1)

nhập mô tả hình ảnh ở đây

Bây giờ trên thanh công cụ, bấm vào toolvà sau đóReferences

nhập mô tả hình ảnh ở đây

Bạn sẽ cần phải cuộn, tìm và đánh dấu

  • Thư viện đối tượng Microsoft HTML
  • Kiểm soát Internet của Microsoft

nhập mô tả hình ảnh ở đây

Lưu ý: Tôi biết nó hoạt động với Internet Explorer 11, không chắc nó có hoạt động với trình duyệt Microsoft Edge mới không.

Bây giờ bạn đã sẵn sàng để chạy tập lệnh. Bạn có thể làm như vậy bằng cách nhấp vào nút Phát

nhập mô tả hình ảnh ở đây

Bạn cũng có thể chạy nó bằng cách nhấp vào Biểu tượng Macros (xem image2), nhưng tôi thích làm điều đó từ cửa sổ VBA.

Vì vậy, bạn nhấn nút play và một cửa sổ IE sẽ tự động mở ra và bạn thấy điều này:

nhập mô tả hình ảnh ở đây

Ồ vâng, bạn quên đăng nhập, lol.

Vì vậy, bạn tiến hành đăng nhập vào Drupal và sau đó bạn đóng explorer (vì lịch sử cookie sẽ lưu thông tin đăng nhập của bạn) và lên kế hoạch nhấn lại nút phát. Nhưng bạn không thể ... bạn thấy nút phát bị mờ đi và không thể thực hiện bất kỳ thay đổi nào đối với mã VBA ... Chuyện gì đang xảy ra?

Vâng, mã của bạn vẫn đang chạy, vì vậy bạn cần nhấn nút Dừng (đặt lại).

nhập mô tả hình ảnh ở đây

Bây giờ bạn có thể nhấp vào nút phát một lần nữa và vui mừng với thế giới tự động hóa.

Quan trọng

Nếu bạn dự định chèn nội dung vào trường Body (như chúng tôi đang làm trong ví dụ này), vì Drupal 8 sử dụng CKEditor cho trường này và CKEditor là JS, chúng tôi không thể nhắm mục tiêu một lớp div hoặc ID; do đó, chúng tôi không thể thêm nội dung bên trong CKEditor.

May mắn thay, có một công việc xung quanh. Đảm bảo cài đặt Bảo mật IE 11 của bạn được đặt thành Cao, điều này sẽ tự động chặn tất cả JS. Do đó, CKeditor sẽ không tải và trường cơ thể sẽ giống như các trường khác.

nhập mô tả hình ảnh ở đây


Nếu bạn cần chỉnh sửa các nút ví dụ:

nhập mô tả hình ảnh ở đây

Sub Drupal_Edit()

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")

Dim x As Integer

For x = 2 To 4 'this controls which rows get added, so only 2 to 4

myURL = "https://rgr79.ply.st/node/" & Cells(x, 3) & "/edit"

With IE
.Visible = True 'makes your Internet Explorer window visible.
.navigate myURL
End With

Do
el = vbNullString
On Error Resume Next
Set HTML = IE.document
el = HTML.getElementsByClassName("visually-hidden")(1).innerText
DoEvents
Loop While el = vbNullString

'the above loops until the visualy-hidden class is detected, which means the edit form has been loaded

Application.Wait (Now + TimeValue("00:00:04")) 'tells the program to wait 3 secs.

Set HTML = IE.document

HTML.getElementById("edit-title-0-value").Value = Cells(x, 1).Value 'here the 1 is the Y (so 1 is Column A)

HTML.getElementById("edit-body-0-value").Value = Cells(x, 2).Value 'here the 2 is the Y (so 2 is Column B)

Cells(x, 4).Value = "Done" 'here we use the 4th column (Column D) and mark it as Done to keep track.

HTML.getElementsByClassName("button js-form-submit form-submit")(1).Click 'clicks the submit button

Application.Wait (Now + TimeValue("00:00:00")) 'here I have a wait for 0, increase it to 2 or 3 if you see your VBA get stuck after submitting a node.

Do
el = vbNullString
On Error Resume Next
Set HTML = IE.document
el = HTML.getElementsByClassName("messages messages--status")(0).innerText
DoEvents
Loop While el = vbNullString

'all the above does is loops the code until the drupal message is detected, which means the node was loaded, after the submit.

Next x

End Sub

Cảm ơn ... đó là một lựa chọn thú vị. Tôi nghĩ rằng tôi sẽ cần một giải pháp đơn giản hơn từ góc độ UI.
Scott Anderson

2
Sẽ không hoạt động nếu người dùng không có IE và có vẻ phức tạp không cần thiết. Tôi nghĩ rằng cách để đi sẽ là một biểu mẫu xác nhận quản trị viên tùy chỉnh, quy trình hàng loạt và quá trình di chuyển ... @mikeryan sẽ là người hỏi.
Kevin

Bạn là kẻ giết người.
Vishal Kumar Sahu

0

Ở trên đang hoạt động tốt đối với tôi nhưng Migratin::Load()save()phương pháp không có sẵn trong Drupal 8 3.x. Tôi đã thực hiện một số thay đổi trong mã đề xuất @Mike Ryan ở trên. Đây là mã làm việc trên mẫu xử lý sumbit.

public function submitForm(array &$form, FormStateInterface $form_state) {
$all_files = $form_state->getValue('csv_file');
if (!empty($all_files)) {
  $file = file_load($all_files[0]);
  if (!empty($file)) {
    $csv_migration = \Drupal::service('plugin.manager.migration')->createInstance('panalist_migration');
    $source = $csv_migration->get('source');
    $source['path'] = $file->getFileUri();
    $csv_migration->set('source', $source);
    drupal_set_message($this->t('File uploaded as @uri.', ['@uri' => $file->getFileUri()]));
    $executable = new MigrateExecutable($csv_migration, new MigrateMessage());

    try {
      $migration_status = $executable->import();
    }
    catch (\Exception $e) {
      \Drupal::logger('migrate_drupal_ui')->error($e->getMessage());
      $migration_status = MigrationInterface::RESULT_FAILED;
    }
    if ($migration_status) {
      drupal_set_message($this->t('Import Successful'));
    }
    else {
      drupal_set_message($migration_status, 'error');
    }
  }
  else {
    drupal_set_message($this->t('File upload failed.'));
  }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.