Di chuyển: Sự khác biệt giữa Chuẩn bị () và Chuẩn bị () là gì?


8

Sử dụng mô-đun Di chuyển: Tôi hiểu rằng readyRow () chạy bộ lọc trên hàng và sẽ trả về TRUE hoặc FALSE dựa trên một số điều kiện, cho phép một hàng được di chuyển hay không, nhưng ai đó có thể làm rõ:

  • Khi nào sử dụng chuẩn bị ()
  • Khi nào nên sử dụng readyRow ()
  • tại sao bạn không thêm bộ lọc trong truy vấn sql ban đầu để lọc kết quả hàng mà bạn có thể xóa / đưa vào một trong các mục trên

Cảm ơn!


1
Một lý do để không lọc tại truy vấn sql là thêm ánh xạ cho các hàng bạn quyết định bỏ qua. Ví dụ: tôi đang nhập người dùng vào một trang web hiện có. Tôi muốn bỏ qua người dùng đã tồn tại ở đích và tôi muốn thêm ánh xạ như thể người dùng thực sự đã được nhập , vì vậy các chuyển đổi khác tùy thuộc vào điều này hoạt động một cách mượt mà.
jonhattan

Câu trả lời:


9

Đây là tất cả được trình bày chuyên sâu trong tài liệu về các lớp Di chuyển do dự án cung cấp. Cụ thể trong trang Phương thức di chuyển được triển khai phổ biến có nội dung như sau và bao gồm các triển khai chức năng ví dụ đơn giản hơn nữa. Từ các tài liệu ...

hàm Chuẩn bị_row ($ hàng)

Phương thức chuẩn bị () được gọi bởi lớp nguồn next (), sau khi tải hàng dữ liệu. Đối số $ row là một đối tượng stdClass chứa dữ liệu thô được cung cấp bởi nguồn. Có hai lý do chính để triển khai Chuẩn bị ():

  1. Để sửa đổi hàng dữ liệu trước khi nó đi qua bất kỳ phương thức và trình xử lý nào khác: ví dụ: tìm nạp dữ liệu liên quan, tách ra các trường nguồn, kết hợp hoặc tạo các trường nguồn mới dựa trên một số logic.
  2. Để có điều kiện bỏ qua một hàng (bằng cách trả về SAI).

chuẩn bị hàm ($ entity, stdClass $ row)

Phương thức Chuẩn bị lớp di chuyển () được gọi bằng phương thức Chuẩn bị () của lớp đích, sau khi nó đã gọi tất cả các phương thức chuẩn bị () cấp trường và ngay trước khi đối tượng đích được lưu. Đối số $ thực thể là đối tượng đích được xác định bởi ánh xạ trường ban đầu và được thao tác bằng các phương thức cấp trường; đối số $ row là một đối tượng chứa dữ liệu sau Chuẩn bị () và mọi cuộc gọi lại đã được áp dụng. Phương thức chuẩn bị () là cơ hội cuối cùng để thao tác đối tượng đích trước khi nó được lưu vào cơ sở dữ liệu Drupal. Điều quan trọng cần nhớ là, vì nó được gọi sau các trình xử lý trường, các trường sẽ ở dạng được mở rộng hoàn toàn (nghĩa là trong Drupal 7, giá trị trường văn bản sẽ $entity->field_textual_data['und'][0]['value']thay vì đơn giản $entity->field_textual_data).

Các Di chuyển mô-đun là một khuôn khổ cho phép bạn đóng gói một quá trình chuyển đổi từ một mảnh nguồn dữ liệu vào một vị trí đích và cấu hình. Một di chuyển bao gồm:

  • xác định nơi dữ liệu
  • xác định nơi dữ liệu sẽ đi
  • lấy một phần dữ liệu (hàng)
  • vệ sinh dữ liệu
  • bắt đầu di chuyển dữ liệu (nói thành một thực thể)
  • thực sự di chuyển dữ liệu
  • sau khi di chuyển dữ liệu thực hiện (các) hành động bổ sung

API cung cấp các hook để ảnh hưởng đến dữ liệu được di chuyển trong vòng đời di chuyển này. Bằng cách loại trừ dữ liệu khỏi quá trình di chuyển thông qua truy vấn ban đầu của bạn, bạn sẽ giới hạn mức độ kiểm soát của bạn đối với tổng dữ liệu bạn có thể di chuyển. Đối với di chuyển phụ, bạn có thể thấy điều này hữu ích. Nhưng trong một di chuyển nội dung chung, bạn sẽ muốn di chuyển của mình được bao quát toàn diện nhất có thể.


Cảm ơn tenken, chính xác những gì tôi đang tìm kiếm. Đánh giá cao những suy nghĩ về việc loại bỏ các yếu tố từ truy vấn ban đầu là tốt.
dùng4984

6

Nếu bạn có thể chọn đúng hàng bằng cách viết nó trong truy vấn, hãy truy cập preprareRow () trong các hệ thống phức tạp hơn, nơi có thể cần một vài tham số trước khi hàng được di chuyển. Trong trường hợp như vậy, việc chạy qua tất cả các hàng và thực hiện logic trên cơ sở mỗi hàng sẽ dễ dàng hơn.

Chuẩn bị () được chạy sau Chuẩn bị () và là cơ hội cuối cùng của bạn để thay đổi thực thể trước khi nó được lưu vào cơ sở dữ liệu.

Một số thông tin thêm về điều này có thể được tìm thấy ở đây: https://www.drupal.org/node/1132582


Tôi thấy điều này ngắn gọn và dễ hiểu
Johnathan Elmore

3

Đây là một câu trả lời một phần và không có cách nào hoàn thành. Tôi cũng muốn tìm hiểu thêm về cả hai điều này. Vì vậy, đây có thể là một phần của một cuộc thảo luận; mặc dù tôi đã viết như một câu trả lời thay vì bình luận vì các đoạn mã sau đây và các ví dụ về cách tôi đã sử dụng các lớp trên.

Hãy để tôi minh họa một số cách sử dụng của tôi readyRow () như - nó làm như nó nói.

Gần đây tôi đã đưa ra một số dữ liệu để nhập từ cơ sở dữ liệu không phải là drupal. Thực thể tôi đang thêm để yêu cầu các trường được nhập mà tôi không có trong nhập dữ liệu của mình.

Vì vậy, trước khi lớp nguồn của tôi được tạo, tôi có thể thêm

  $source_fields = array(
    'changed' => t('Timestamp of when the change was made.'),
    'created' => t('Timestamp of when the node was Created.'),
 );

và sau đó trong chức năng chuẩn bị. Bây giờ tôi có thể làm như sau

$nowtimestamp = mktime(date('Y-m-d'));
$row->changed = $nowtimestamp;
$row->created = $nowtimestamp;

bạn cũng có thể chạy php if / other statement ở đây nếu cần.

Tôi cũng đã sử dụng hàm chuẩn bị trong mã của mình và đang sử dụng nó để gán giá trị cho thực thể.

$account->field_job_location [und][0]['tid'] = $row->job_location_tid;

Tôi chỉ phải sử dụng điều này trong kịch bản này khi tôi tạo plugin nút tùy chỉnh của riêng mình.

Ngoài ra nếu bạn cần tính toán về điều đó thì bạn có thể thực hiện nó trong Chuẩn bị chạy trước khi chuẩn bị ()

Ví dụ: trong quá trình nhập, tôi có một giá trị được gắn nhãn 'Thị trấn' - và có thể biến giá trị này thành Id kỳ hạn.

 if ($TownCity == 'London' ){
            $row->job_location_tid = '10';
      } else {
        $row->job_location_tid = '11';
      } 

Tôi hi vọng cái này giúp được.

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.