これは理解しにくい場合はお詫びします。説明するのは非常に難しく、PHP開発の初心者です。私は行ごとにCSVファイルを読み込み、各行を配列に格納するスクリプトを持っています。 CSVファイルは、そう(3列の一例)のようにフォーマットされている:これらの行は、次にMagentoのAPIに製品を輸出し、ループを介して実行されるPHPループ - 最後の非空白値を配列から使用する
。
<?php
// Interpret the CSV file and store each row as an array.
$csv = array();
$new_csv = array();
if (FALSE !== $handle = fopen("http://csvfilelink.csv", "r")) {
while (FALSE !== $row = fgetcsv($handle)) {
$csv[] = $row;
}
}
foreach ($csv as $row) {
$new_row = array();
for ($i = 0, $c = count($csv[0]); $i < $c; ++$i) {
$new_row[$csv[0][$i]] = $row[$i];
}
$new_csv[] = $new_row;
}
// Create client session.
$client = new SoapClient('API-URL');
$sessionId = $client->login('User', 'Pass');
// Product variables.
$attributeSets = $client->catalogProductAttributeSetList($sessionId);
$attributeSet = current($attributeSets);
$total_rows = count($csv);
// Create Products from CSV.
for ($sku = 1, $name = 1, $price = 1, $desc = 1, $table = 1, $qty = 1, $cond = 1, $pos = 1, $image = 1, $brand = 1, $color = 1, $material = 1, $style = 1;
$sku < $total_rows, $name < $total_rows, $price < $total_rows, $desc < $total_rows, $table < $total_rows, $qty < $total_rows, $cond < $total_rows, $pos < $total_rows, $image < $total_rows, $brand < $total_rows, $color < $total_rows, $material < $total_rows, $style < $total_rows;
++$sku, ++$name, ++$price, ++$desc, ++$table, ++$qty, ++$cond, ++$pos, ++$image, ++$brand, ++$color, ++$material, ++$style) {
if ($new_csv[$sku]['Product SKU'] != '') {
try {
// Create product data.
$client->catalogProductCreate($sessionId, 'simple', $attributeSet->set_id, $new_csv[$sku]['Product SKU'], array(
'name' => $new_csv[$name]['Product Name'],
'price' => $new_csv[$price]['Price'],
'categories' => array(
'category' => 'DifferentCategory'
),
'description' => $new_csv[$desc]['Product Description (Including HTML)'] . "<br><br>" . $new_csv[$table]['Param table'],
'weight' => 1,
'status' => 1,
'visibility' => 4,
'tax_class_id' => 1,
'stock_data' => array(
'qty' => $new_csv[$qty]['Stock Quantity'],
'is_in_stock' => 1
),
'additional_attributes' => array(
'single_data' => array(
array('key' => 'condition', 'value' => $new_csv[$cond]['Condition (Including HTML)']),
array('key' => 'brand', 'value' => $new_csv[$brand]['Brand']),
array('key' => 'color', 'value' => $new_csv[$color]['Color']),
array('key' => 'material', 'value' => $new_csv[$material]['Material']),
array('key' => 'style', 'value' => $new_csv[$style]['Style'])
)
)
),0);
// Add product images.
$client->catalogProductAttributeMediaCreate($sessionId, $new_csv[$sku]['Product SKU'], array(
'file' => array(
'content' => base64_encode(file_get_contents($new_csv[$image]['Main Image'])),
'mime' => 'image/png',
),
'position' => $new_csv[$pos]['Image Rank Position'],
'types' => array('image')
), 0);
// Echo success message.
echo '<div class="success_box"><span class="success_box_text"><b>Success:</b> Product <b>' . $new_csv[$sku]['Product SKU'] . '</b> has been created.</div>';
} catch (SoapFault $e) {
// Echo error message.
echo '<div class="error_box"><span class="error_box_text"><b>Error:</b> Cannot create product <b>' . $new_csv[$sku]['Product SKU'] . '</b> - ' . $e->getMessage() . '.</span></div>';
}
} else {
$client->catalogProductAttributeMediaCreate($sessionId, $new_csv[$sku]['Product SKU'], array(
'file' => array(
'content' => base64_encode(file_get_contents($new_csv[$image]['Main Image'])),
'mime' => 'image/png',
),
'position' => $new_csv[$pos]['Image Rank Position'],
'types' => array('image')
), 0);
}
}
?>
これが唯一の1つの製品イメージを持っている製品のための素晴らしい作品が、私はに追加する必要があります私はこれらのイメージとして読み込まProduct Image
列を持つ行を処理する必要があるだろうことに気づい:以下の私のコードを参照してください。以前のループでcatalogProductCreate
が実行されたときに以前に作成されたものと同じ製品。これを処理するために、Product SKU
列の現在の値が空であるかどうかを確認し、空でない場合はcatalogProductAttributeMediaCreate
コードのみを実行するように、if/else
ステートメントを追加しました。これに
問題がelse
ステートメントが実行されるときにループしたがって$sku
変数をインクリメントし、スクリプトは、同じ行内のProduct SKU
列の現在の値にイメージを追加しようとし、したがって、無効を投げていることですデータエラー。
最後の空でないProduct SKU
の値にスクリプトを戻す方法を考えて、エラーを返す代わりにその製品にイメージを追加する方法はありません。私はif/else
ステートメントを遡及的に取り除かなければならないかもしれませんが、これは当初期待していた方法で問題を処理しませんでした(愚かなことに、変数が各ループで増分されることを認識しませんでした)。しかし、私はif ($new_csv[$sku]['Product SKU'] != '')
行がまだこれが動作するためには別の場所で必要とされるだろうと想像しています。
私はどのように私がこれを克服することができるのアイデアには開いています。あなたが提供できる洞察力があれば、事前に感謝します。これが不明確で、明確化が必要な場合はお知らせください、ありがとうございます!
これを追加していただきありがとうございます。私の無知を許してください。しかし、最初のコードブロックは何ですか?私はこれを理解するのに時間がかかりますが、それがどのように進むのかを教えてくれます。 –
私は前の投稿にいくつかのコメントを追加しました。それは良いですか? :) –
本当にありがとうございました。これは、あなたのコードに当てはまるように変数の名前を変更すべきですか? 'foreach($ csv as $ row)'を 'foreach($ data as $ iLineNumber => $ line)'に置き換えます。 –