バックグラウンド
私が取り組んでいるサイトでは、ダウンロード可能な製品 (書籍) が関連付けられた Web キャストを販売しています。ユーザーは本を購入するか、Web キャストを購入して本を無料で入手できます。
書籍自体はマニュアルであり、最近購入したユーザー (1 年 + 1 か月) の書籍に更新が加えられるたびに、更新を通知して、書籍を再ダウンロードできるようにする必要があります。これは機能しています。
問題
ダウンロード可能な製品が更新される方法は、新しいリンクが追加されることです。基本ファイル自体は決して変更されず、代わりに新しいファイルが追加され、人々が本をどのように組み立てるかについて照合するための指示が含まれています (これは、彼らが環境に配慮した会社であり、人々がこれらの 1000 ページのマニュアルを毎回完全に印刷することを望んでいないためです) 1 ページを追加します)。新しいリビジョンが作成され、ユーザーに通知された場合、変更をダウンロードするためのリンクがありません。これは、最初に注文したときに存在しなかったためです。表示されるのは、最初に注文したときに存在していたファイルへのリンクだけです。それがdownloadable_link_purchased_item
テーブルに存在するためです。
私が必要としているのは、顧客が製品を購入したことを前提として、ダウンロード可能な製品のすべてのリビジョン (利用可能なすべてのリンクを読んでください) をダウンロードできるようにする方法です。
$productModel->getLinks()
とを試し$productModel->getDownloadableLinks()
ましたが、両方とも null を返します。
$purchased = Mage::getResourceModel('downloadable/link_purchased_collection')
->addFieldToFilter('customer_id', $session->getCustomerId())
->addOrder('created_at', 'desc');
if(count($purchased)) {
$this->setPurchased($purchased);
$purchasedIds = array();
foreach ($purchased as $_item) {
$purchasedIds[] = $_item->getId();
$order = Mage::getModel('sales/order')->load($_item->getOrderId());
$items = $order->getAllItems();
foreach($items as $item) {
if('downloadable' == $item->getProductType()) {
$product = Mage::getModel('catalog/product')->load($item->getProductId());
echo('Links: <pre>');
var_dump($product->getLinks());
echo('</pre>');
die;
}
}
}
}
downloadable_link_purchased_item
また、更新が行われるたびに、更新された本を購入した顧客ごとにテーブルに新しいエントリを追加し、エントリごとに新しいリンク ハッシュを生成できるのではないかと考えました。しかし、これは本当に良いアイデアだとは思いません (当時彼らは実際にそれを購入していませんでした。データをいじらずにアクセスできるようにするのが好きです)。
私はこれに取り組む方法を見つけようとして半日立ち往生しており、正しい/それほど間違っていない方向に助けたり、指摘したり、突っ込んだりしていただければ幸いです。ダウンロード可能な製品やその URL の仕組みについてはあまり経験がありません。前もって感謝します。
アップデート
downloadable_link_purchased_item
管理者から製品が更新されるたびに起動するオブザーバーで、次のコードを使用してテーブルにリンクを挿入するルートを試してみました。
$product = $observer->getProduct();
echo('<pre>');
if('downloadable' == $product->getTypeId()) {
foreach($_POST['downloadable']['link'] as $link) {
if('0' == $link['link_id']) {
// This is a new file being added. Insert a record into
// downloadable_link_purchased_item for each customer
// that has purchased this item.
$file = json_decode($link['file']);
$orderItems = Mage::getModel('sales/order_item')->getCollection()
->addFieldToFilter('product_id', $product->getId());
foreach($orderItems as $orderItem) {
$order = Mage::getModel('sales/order')->getCollection()
->addFieldToFilter('entity_id', $orderItem->getOrderId())
->getFirstItem();
$downloadPurchase = Mage::getModel('downloadable/link_purchased')
->setOrderId($orderItem->getOrderId())
->setOrderIncrementId($order->getIncrementId())
->setOrderItemId($orderItem->getId())
->setCreatedAt(date('Y-m-d H:i:s'))
->setUpdatedAt(date('Y-m-d H:i:s'))
->setCustomerId($order->getCustomerId())
->setProductName($product->getName())
->setProductSku($product->getSku())
->setLinkSectionTitle('Click here to download');
var_dump($downloadPurchase->save());
// I got this line from /app/code/core/Mage/Downloadable/sql/downloadable_setup/mysql4-upgrade-0.1.12-0.1.13.php
$linkHash = strtr(base64_encode(microtime() . $downloadPurchase->getId() . $orderItem->getId() . $product->getId()), '+/=', '-_,');
$downloadItem = Mage::getModel('downloadable/link_purchased_item')
->setProductId($product->getId())
->setNumberOfDownloadsBought(0)
->setNumberOfDownloadsUsed(0)
->setLinkTitle($link['title'])
->setIsShareable($link['is_shareable'])
->setLinkFile($file[0]->file)
->setLinkType('file')
->setStatus('available')
->setCreatedAt(date('Y-m-d H:i:s'))
->setUpdatedAt(date('Y-m-d H:i:s'))
->setLinkHash($linkHash)
->setOrderItemId($orderItem->getId())
->setPurchasedId($downloadPurchase->getId());
var_dump($downloadItem->save());
echo('Download Purchase ID: ' . $downloadPurchase->getId() . '<br>');
echo('Download Item ID: ' . $downloadItem->getId() . '<br>');
}
}
}
}
echo('</pre>');
die;
問題は、モデルをデータベースに保存しているように動作することです (両方のモデルの ID とすべてを取得します) が、どちらも実際には保存していません。$downloadItem
リンクIDを指定していないため、保存されていない可能性があると確信しています(catalog_product_save_after
リンクがオブザーバーにまだ存在しないイベントを使用しているにもかかわらず、まだそれを理解しようとしています) )。ただし、$downloadPurchase
モデルが保存されない理由はわかりません。