1

バックグラウンド

私が取り組んでいるサイトでは、ダウンロード可能な製品 (書籍) が関連付けられた 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モデルが保存されない理由はわかりません。

4

2 に答える 2

0

私のdie発言がモデルのデータの保存を妨げていたことが判明しました。それを取り出してみると、ダウンロード可能な製品へのリンクが正しく挿入されており、ダウンロード可能な製品を購入した顧客は、アカウント画面から新しいリビジョンをすぐに確認できます。

なぜそうなるのsave()かはわかりませんが、電話をかけた瞬間にデータベースの挿入が行われると思いますが、Magento の領主が世界をどう見ているかは明らかにそうではありません。

データの整合性に関する限り、まだいくつかの問題があります。上で述べたように、download_linkオブザーバーが呼び出された時点ではエントリは作成されませんが、少なくともユーザーは自分のアカウントでリンクを見ることができます。

于 2012-12-05T18:22:23.793 に答える
0

これは、ダウンロード可能な製品のバージョンを更新するための優れた無料のオープン ソース ソリューションです。カスタマイズして追加のリンクを追加するための優れたベースになるはずです - https://github.com/ProxiBlue/UpdateDownloadLinks

于 2017-10-17T07:24:44.727 に答える