/ / Jak zaktualizować nowy załącznik produktu do pobrania dla złożonych zamówień w magento - magento, download, magento-1.7

Jak zaktualizować nowy załącznik do pobrania do złożonych zamówień w magento - magento, download, magento-1.7

Mam produkty do pobrania w moim sklepie Magento. Moje produkty do pobrania to płatne narzędzia programowe. Zaktualizowaliśmy te narzędzia oprogramowania do pobrania na podstawie każdej zmiany wersji i ulepszamy nowe funkcje narzędzi oprogramowania.

Pakiet oprogramowania jest gotowy do pobrania, gdy klienci zakończą każdą udaną transakcję płatniczą.

Moje pytanie brzmi :

Version - 1:

Klienci będą kupować i używać Version - 1 pakiety dla order id #101.

Version - 2:

Kiedy aktualizujemy Version - 2 w panelu administracyjnym dla odpowiednich produktów. musimy umieścić Version - 2 pobierz pakiet dla order id #101 zamiast tego id Version - 1.

Czy ta opcja jest możliwa w Magento CE 1.7.0.0?

W tej chwili numer zamówienia 101 ma tylko pakiet w wersji -1 do pobrania na stronie klienta do pobrania.

Ale musimy spakować plik dla każdego zakupionego zamówienia?

Proszę doradź.

Odpowiedzi:

6 dla odpowiedzi № 1

Umieszczam następujący kod w skrypcie .php w katalogu głównym Magento. Możesz to nazwać za pomocą CRON lub przeglądarki internetowej.

<?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 dla odpowiedzi nr 2

Chociaż stary post, z zaakceptowaną odpowiedzią, opublikuję inną odpowiedź jako alternatywne rozwiązanie.

Aby rozwiązać mój problem, stworzyłem rozszerzenie, które zaktualizuje poprzednie zamówienia do wszystkich zmian dokonanych w informacjach do pobrania produktów.

To zawiera:

  1. po prostu aktualizuję istniejący wpis do pobrania (zmieniając tytuł linku i plik do pobrania)
  2. dodawanie nowych plików do listy do pobrania (przykład dodawania plików łaty w miarę upływu czasu)
  3. usuwanie istniejących wpisów

Każde wcześniejsze zamówienie, w którym dostosowywany jest produkt jako zakupiony element, spowoduje aktualizację listy produktów do pobrania do tego, co edytowałeś.

dostępne przez github: https://github.com/ProxiBlue/UpdateDownloadLinks


1 dla odpowiedzi nr 3

Rozwiązanie dostarczone przez proxiblue jest OK, ale nie jest kompletne.

Algorytm ma również błąd, zawsze zabiera wszystkolinki produktu i usuń stare. W ten sposób linki są zawsze odnawiane, a statystyki pobierania są tracone. Aby to naprawić, należy dodać następujący kod:

$currentPurchasedItemsT = $linkPurchasedItems->getItems();
$currentPurchasedItems=array();
foreach( $currentPurchasedItemsT as $c){
$currentPurchasedItems[$c["link_id"]] = $c;
}

Kolejną niedogodnością jest to, że wszystkie nowe linki sądodawane do wszystkich zamówień, nawet jeśli są płatne lub nie. Nie jest OK, aby płatne linki były dodawane domyślnie do wszystkich zamówień, jeśli klienci nie zapłacili za nie.

$data = $newFile->getData();
if ($linkPurchased->getOrderItemId() && $data["price"]=="0.0000") {

Pełny kod to:

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();
}

}
}

}