【问题标题】:Magento Adding to Customers Available Downloadable ProductsMagento 向客户添加可用的可下载产品
【发布时间】:2012-11-22 15:27:10
【问题描述】:

背景

我正在开发的网站销售具有与之相关的可下载产品(书籍)的网络广播。用户可以购买图书,也可以购买网络直播免费获取图书。

书籍本身就是手册,每当对最近购买(1 年 +1 个月)的书籍用户进行更新时,都需要收到更新通知,以便他们可以重新下载该书籍。这是有效的。

问题

可下载产品的更新方式是添加新链接。基本文件本身永远不会改变,而是添加了新文件,其中包括人们整理书籍如何组装的说明(这是因为他们是一家绿色公司,他们不希望人们每次都完全打印出这 1000 页的手册他们添加了一个页面)。如果进行了新修订并通知用户,他们将没有下载更改的链接,因为他们最初下订单时不存在该链接。他们看到的只是他们最初下订单时存在的文件的链接,因为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 表中,并为每个条目生成一个新的链接哈希。但是,我不认为这真的是一个好主意(他们当时并没有真正购买它,我必须生成我自己的 link_hash ,我真的觉得这样做不太舒服,我真的会就像他们访问而不弄乱数据)。

我已经被困了半天,试图弄清楚如何解决这个问题,非常感谢任何帮助或指向/推动正确/不那么错误的方向。我对可下载产品或其 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 模型不会保存。

【问题讨论】:

  • 上传文件的新下载工作正常,但文件更新不工作。你能告诉我怎么做吗?

标签: php magento magento-1.4


【解决方案1】:

这是用于更新可下载产品版本的免费开源解决方案,它应该是自定义和添加额外链接的良好基础 - https://github.com/ProxiBlue/UpdateDownloadLinks

【讨论】:

    【解决方案2】:

    原来我的die 声明阻止了模型数据的保存。当我把它拿出来时,可下载产品的链接已正确放入,购买了可下载产品的客户可以立即从他们的帐户屏幕上看到新版本。

    我不知道为什么会这样,我想我打电话给save() 的那一刻就是数据库插入发生的时候,但显然这不是 Magento 的领主们看待世界的方式。

    就数据完整性而言,我仍然存在一些问题。就像我上面所说的,download_link 条目在调用我的观察者时并未创建,但至少用户现在可以看到他们帐户中的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多