Mám výrobky na stiahnutie v mojom obchode Magento. Moje produkty na stiahnutie sú platené softvérové nástroje. Aktualizovali sme tieto softvérové nástroje na stiahnutie na základe každej zmeny verzie a vylepšenia nových funkcií softvérových nástrojov.
Softvérový balík je pripravený na stiahnutie, keď zákazníci dokončia každú úspešnú platobnú transakciu.
Moja otázka je:
Version - 1:
Zákazníci si budú kupovať a používať internet Version - 1
balíky pre order id #101
.
Version - 2:
Keď aktualizujeme Version - 2
v správcovskom paneli pre príslušné produkty. musíme to umiestniť
Version - 2
stiahnuť balík pre order id #101
namiesto toho id Version - 1
.
Je táto možnosť možná v magento CE 1.7.0.0?
Momentálne má objednávka č. 101 k dispozícii iba balík verzie -1 na stiahnutie na stránke, ktorú si môžu zákazníci stiahnuť.
Potrebujeme však zabaliť súbor pre každú zakúpenú objednávku?
Prosím poraď.
odpovede:
6 pre odpoveď č. 1Nasledujúci kód umiestnim do skriptu .php v koreňovom adresári Magento. Môžete ju zavolať cez CRON alebo pomocou webového prehliadača.
<?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);
}
2 pre odpoveď č. 2
Aj keď je to starý príspevok s prijatou odpoveďou, ako alternatívne riešenie uverejním ďalšiu odpoveď.
Na vyriešenie môjho problému som vytvoril rozšírenie, ktoré aktualizuje minulé objednávky na akékoľvek zmeny vykonané v informáciách o produkte na stiahnutie.
Toto zahŕňa:
- iba aktualizácia existujúceho záznamu na stiahnutie (čím sa zmení názov odkazu a súboru na stiahnutie)
- pridanie akýchkoľvek nových súborov do zoznamu na stiahnutie (napríklad pridávanie opravných súborov v priebehu času)
- odstránenie existujúcich položiek
Akákoľvek minulá objednávka, ktorá obsahuje produkt, ktorý upravujete ako zakúpenú položku, potom aktualizuje svoj zoznam produktov na stiahnutie na akýkoľvek produkt, ktorý ste upravili.
dostupné cez github: https://github.com/ProxiBlue/UpdateDownloadLinks
1 pre odpoveď č. 3
Riešenie poskytované proxiblue je v poriadku, ale nie je úplné.
Algoritmus má tiež chybu, vždy berie všetkoodkazy na produkt a vymažte staré. Týmto spôsobom sa odkazy vždy obnovia a štatistika sťahovania sa stratí. Ak to chcete opraviť, mali by ste pridať nasledujúci kód:
$currentPurchasedItemsT = $linkPurchasedItems->getItems();
$currentPurchasedItems=array();
foreach( $currentPurchasedItemsT as $c){
$currentPurchasedItems[$c["link_id"]] = $c;
}
Ďalšou nepríjemnosťou je, že sú to všetky nové odkazypridané ku všetkým objednávkam, aj keď sú zaplatené alebo nie. Nie je v poriadku, že platené odkazy sa štandardne pridávajú ku všetkým objednávkam, ak ich zákazníci nezaplatili.
$data = $newFile->getData();
if ($linkPurchased->getOrderItemId() && $data["price"]=="0.0000") {
Celý kód je:
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();
}
}
}
}