Di chuyển nối tiếp nguồn CSV


7

Tôi đang sử dụng di chuyển để nhập Sản phẩm thương mại từ tệp CSV. Tệp CSV không có sê-ri riêng, vì vậy tôi đang sử dụng caussownum nhưng rõ ràng nó sẽ không hoạt động nếu đã có sản phẩm - Tôi sẽ di chuyển liên tục từ các tệp CSV và vì vậy tôi cần một sê-ri thực. Vì vậy, câu hỏi lớn là, làm thế nào để tôi nói với Migrate để tạo serial của chính nó? prepareRowcảm thấy quá muộn vì dường như tôi cần cung cấp cho MigrateSQLMap một trường chính.

Đây là một phiên bản thô của hàm tạo của lớp:

public function __construct() {
  parent::__construct();
  $this->description = t('Test CSV');

  $columns = array(
    array('product_name', 'title'),
    array('url', 'url'),
    array('price', 'price'),
  );

  $this->source = new MigrateSourceCSV('/tmp/test.csv', $columns, array('header_rows' => 1));

  $this->destination = new MigrateDestinationCommerceProduct('commerce_product', 'product');

  $this->map = new MigrateSQLMap($this->machineName,
    array(
      'csvrownum' => array(
        'type' => 'int',
        'not null' => true,
      ),
    ),
    MigrateDestinationCommerceProduct::getKeySchema('commerce_product')
  );

  $this->addFieldMapping('product_id', 'csvrownum');
  $this->addFieldMapping('title', 'title');
  $this->addFieldMapping('field_url', 'url');
  $this->addFieldMapping('commerce_price', 'price');
}

Bạn đang quay trở lại di chuyển của bạn trong khi thử nghiệm? Nếu không nó có thể dẫn đến các vấn đề trùng lặp. Nó có thể được thực hiện với drush mr YourClassName. Sử dụng csvrownumnhư một lĩnh vực quan trọng không phải là một vấn đề xa như nó là duy nhất ...
drcelus

vâng, và rất nhiều tiến bộ đã xảy ra khi tôi vừa phá hủy cơ sở dữ liệu.

AFAIK bạn có thể sử dụng prepareRownhư xa như bạn cung cấp sân khi tham số thứ tư trong bạn constructor .
drcelus

1
Như câu trả lời cho thấy, Chuẩn bị quá muộn, bạn muốn chuẩn bị.

Câu trả lời:


4

Trong khi đó tôi đã nhận ra điều này. Đối số thứ hai của MigrateSQLMaplà một trường => mảng lược đồ và bạn có thể điền vào các trường đó function prepareKey($source_key, $row)khi cần thiết, giả sử

function prepareKey($source_key, $row) {
  $row->vendor_id = $this->vendorId;
  return parent::prepareKey($source_key, $row);
}

Lưu ý : prepareRowquá muộn, bạn muốn prepareKey.


2

Bạn không cần phải lập bản đồ product_idrõ ràng. Bạn có thể chỉ cần bỏ dòng này:

$this->addFieldMapping('product_id', 'csvrownum');

Mặt khác, bạn sẽ cần một SKU và dựa vào đó csvnumrowlà ID bên ngoài có nghĩa là bạn không thể xóa bất kỳ sản phẩm nào khỏi CSV, chỉ cần thêm một số chi tiết vào cuối ... Tôi rất khuyên bạn nên tìm một bên ngoài đáng tin cậy TÔI.

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.