如何为magento中的下订单更新新的可下载产品附件

如何为magento中的下订单更新新的可下载产品附件,magento,download,magento-1.7,Magento,Download,Magento 1.7,我的magento商店里有可下载的产品。 我的可下载产品是付费软件工具。 我们已经根据每个版本的变化更新了这些可下载的软件工具,并增强了软件工具中的新功能 当客户完成每个成功的支付交易时,软件包就可以下载了 我的问题是: Version - 1: 客户将购买并使用订单id#101的版本-1软件包 Version - 2: 当我们在管理面板中更新相应产品的版本-2时。我们需要找个地方 Version-2下载order id#101的软件包,而不是idVersion-1 在magento CE

我的magento商店里有可下载的产品。 我的可下载产品是付费软件工具。 我们已经根据每个版本的变化更新了这些可下载的软件工具,并增强了软件工具中的新功能

当客户完成每个成功的支付交易时,软件包就可以下载了

我的问题是:

Version - 1:
客户将购买并使用
订单id#101
版本-1
软件包

Version - 2:
当我们在管理面板中更新相应产品的
版本-2
时。我们需要找个地方
Version-2
下载
order id#101
的软件包,而不是id
Version-1

在magento CE 1.7.0.0中是否可以使用此选项

目前订单id#101只有1版软件包可在客户可下载页面下载

但我们需要为每个采购订单打包文件吗


请注意。

我将以下代码放入Magento根目录中的.php脚本中。您可以通过CRON或web浏览器调用它

<?php

    require('app/Mage.php');
    umask(0);
    Mage::app();

    $select = getDb()->select()
        ->from(getTable('downloadable/link'), array('link_id', 'link_file', 'product_id'));

    if (($links = getDb()->fetchAll($select)) !== false) {
        foreach($links as $link) {
            $linkId = $link['link_id'];
            $productId = $link['product_id'];
            $file = $link['link_file'];

            $select = getDb()->select()
                ->from(getTable('downloadable/link_title'), 'title')
                ->where('link_id=?', $linkId)
                ->limit(1);

            $title = getDb()->fetchOne($select);

            echo sprintf("Updating %s to %s<br />", $file, $title);

            $cond = getDb()->quoteInto('product_id=?', $productId);

            getDb()->update(getTable('downloadable/link_purchased_item'), array('link_id' =>$linkId,'link_title'=>$title,'link_file'=>$file), $cond);
        }
    }

    function getDb($conn = 'core_read') {
        return Mage::getSingleton('core/resource')->getConnection($conn);
    }

    function getTable($table) {
        return Mage::getSingleton('core/resource')->getTableName($table);
    }

虽然是一篇旧帖子,有一个被接受的答案,但我会发布另一个答案作为替代方案

为了解决我的问题,我创建了一个扩展,该扩展将更新过去的订单,以更新产品可下载信息中的任何更改

这包括:

  • 只需更新现有的可下载条目(从而更改要下载的链接标题和文件)
  • 将任何新文件添加到可下载列表(例如随着时间的推移添加修补程序文件)
  • 删除现有条目
  • 任何将您正在调整的产品作为采购项目的过去订单都会将其可下载产品列表更新为您编辑的内容


    可通过github获得:

    proxiblue提供的解决方案可以,但尚未完成

    该算法也有一个错误,它总是采取所有的产品链接和删除旧的。这样,链接总是被更新,下载统计数据也会丢失。 要解决此问题,应添加以下代码:

    $currentPurchasedItemsT = $linkPurchasedItems->getItems();
    $currentPurchasedItems=array();
    foreach( $currentPurchasedItemsT as $c){
        $currentPurchasedItems[$c["link_id"]] = $c;
    }    
    
    另一个不便之处是,所有新链接都会添加到所有订单中,即使是否已付款。 默认情况下,在所有订单中添加付费链接是不合适的,如果客户没有付费的话

    $data = $newFile->getData();
    if ($linkPurchased->getOrderItemId() && $data["price"]=="0.0000") {
    
    完整代码为:

    class ProxiBlue\u UpdateDownloadLinks\u Model\u Observer{
    公共功能目录\u产品\u保存\u之后($observer){
    $product=$observer->getEvent()->getProduct();
    $product=$observer->getProduct();
    返回;
    if($product->getTypeId()==Mage\u Downloadable\u Model\u product\u Type::Type\u Downloadable){
    //获取与产品匹配的所有已购买项目
    $linkPurchasedItems=Mage::getModel('downloadable/link_purchased_item')->getCollection()
    ->addFieldToFilter('product_id',$product->getId())->load();
    $CurrentPurchasedItems=$linkPurchasedItems->getItems();
    $currentPurchasedItems=array();
    foreach($currentPurchasedItemsT作为$c){
    $currentPurchasedItems[$c[“链接id”]]=$c;
    }
    $files=$product->getTypeInstance(true)->getLinks($product);
    //建立用于购买此产品的采购对象(订单)列表
    $productId=$product->getId();
    $collection=Mage::getResourceModel('sales/order\u item\u collection')
    ->addAttributeToFilter('product_id',数组('eq'=>$productId))
    ->加载();
    $purchaseObjects=array();
    foreach($orderItem形式的集合){
    $purchaseObject=mage::getModel('downloadable/link_purchased')->load($orderItem->getOrderId(),'order_id');
    如果($purchaseObject->getId()){
    $purchaseObjects[$purchaseObject->getId()]=$purchaseObject;
    }    
    }
    //确定并向拥有该产品的订单添加任何新文件
    $newFiles=array_diff_key($files,$currentPurchasedItems);
    foreach($newFiles作为$newFile){
    //将每个新文件附加到购买文件
    foreach($purchaseObjects作为$linkPurchased){
    $data=$newFile->getData();
    如果($linkPurchased->getOrderItemId()&&$data[“price”]=“0.0000”){
    $linkHash=strtr(base64_编码(microtime().$linkPurchased->getId().$linkPurchased->getOrderItemId())
    .product->getId(),“+/=”,“-”;
    $linkPurchasedItem=Mage::getModel('downloadable/link_purchased_item');
    $linkPurchasedItem->setData($newFile->getData());
    $linkPurchasedItem->unsItemId();
    $linkPurchasedItem->setPurchasedId($linkPurchased->getId())
    ->setOrderItemId($linkPurchased->getOrderItemId())
    ->setLinkHash($linkHash)
    ->setLinkTitle($newFile->getTitle())
    ->设置状态(可下载的图像、模型、链接、购买的项目、链接状态、可用);
    //->setUpdatedAt(现在为())
    $linkPurchasedItem->save();
    }
    }
    //退出;
    }
    //确定不再作为文件附加的内容,并从下载链接中删除
    $noLongerAttachedAsFiles=array_diff_key($currentPurchasedItems,$files);
    //var_dump(数组_diff_key($currentPurchasedItems,$files));
    //回声“

    ”; //退出; foreach($purchasedLink中的非长期附件文件){ //$purchasedLink->delete(); } } }

    }

    你的代码帮了我大忙!,非常感谢Ben。在我有了一个包含多个可下载文件的产品之前,这段代码一直在为我工作。我将代码中的条件更改为以下内容,现在它可以工作了:
    $cond=array()$C
    
    class ProxiBlue_UpdateDownloadLinks_Model_Observer {
        public function catalog_product_save_after($observer) {
            $product = $observer->getEvent()->getProduct();
            $product = $observer->getProduct();
            return;
            if ($product->getTypeId() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE) {
                // get all the purchased items that match the product
                $linkPurchasedItems = Mage::getModel('downloadable/link_purchased_item')->getCollection()
                                ->addFieldToFilter('product_id', $product->getId())->load();
                $currentPurchasedItemsT = $linkPurchasedItems->getItems();
                $currentPurchasedItems=array();
                foreach( $currentPurchasedItemsT as $c){
                    $currentPurchasedItems[$c["link_id"]] = $c;
                }
            $files = $product->getTypeInstance(true)->getLinks($product);
            //build a list of purchase objects (orders) that were used to buy this product
            $productId = $product->getId();
            $collection = Mage::getResourceModel('sales/order_item_collection')
                ->addAttributeToFilter('product_id', array('eq' => $productId))
                ->load();
            $purchaseObjects = array();
            foreach($collection as $orderItem) {
                $purchaseObject = mage::getModel('downloadable/link_purchased')->load($orderItem->getOrderId(),'order_id');
                if($purchaseObject->getId()) {
                    $purchaseObjects[$purchaseObject->getId()] = $purchaseObject;
                }    
            }
            //determine and add any new files to the orders that have the product
    
            $newFiles = array_diff_key($files, $currentPurchasedItems);
    
    
            foreach ($newFiles as $newFile) {
                //attach each new file to the purchase
    
                foreach ($purchaseObjects as $linkPurchased) {
                    $data = $newFile->getData();
    
                    if ($linkPurchased->getOrderItemId() && $data["price"]=="0.0000") {
    
                        $linkHash = strtr(base64_encode(microtime() . $linkPurchased->getId() . $linkPurchased->getOrderItemId()
                                        . $product->getId()), '+/=', '-_,');
                        $linkPurchasedItem = Mage::getModel('downloadable/link_purchased_item');
                        $linkPurchasedItem->setData($newFile->getData());
                        $linkPurchasedItem->unsItemId();                        
                        $linkPurchasedItem->setPurchasedId($linkPurchased->getId())
                                ->setOrderItemId($linkPurchased->getOrderItemId())
                                ->setLinkHash($linkHash)
                                ->setLinkTitle($newFile->getTitle())
                                ->setStatus(Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_AVAILABLE);
                                //->setUpdatedAt(now())
                        $linkPurchasedItem->save();
                    }
                }
                //exit;
            }
    
            // determine what is no longer attached as files and remove from the download links
            $noLongerAttachedAsFiles = array_diff_key($currentPurchasedItems,$files);
    
            //var_dump(array_diff_key($currentPurchasedItems,$files));
            //echo "<br/><br/>";
            //exit;
            foreach ($noLongerAttachedAsFiles as $purchasedLink) {
                //$purchasedLink->delete();
            }
    
        }
    }