Hochladen eines Dateianhangs in ein benutzerdefiniertes Produktattribut mit Magento SOAP

8

Dies bezieht sich auf meine Frage; Anleitungen für Produktdateien

Ich möchte ein Skript erstellen (nicht auf dem Server), das das Intellimage_AttachsModul in meiner anderen Frage verwenden kann.

Ich werde wenn möglich Magento SOAP verwenden.

Das Problem, das ich im Moment habe, ist, dass ich das Produkt "samples / files" nicht bekommen / put / update / we bekommen kann.

return $this->handle->call($this->session,'product_custom_option.list', "productnamehere ");

Bringt ein leeres Array für ein Produkt zurück, zu dem ich Anhänge habe :(! Offensichtlich den falschen Seifenaufruf verwenden, welcher wäre der richtige? (Wie in product_custom_option.listist falsch, funktioniert meine Funktion gut mit anderen Aufrufen.)

AKTUALISIEREN

versucht:

return $this->handle->call($this->session, 'product_downloadable_link.list', array( $sku . " "));

Funktioniert jedoch nicht, da die Produkte keine herunterladbaren Produkte sind, obwohl sie verwendet werden samples.

Robert Pounder
quelle
Probleme mit den einzigen herunterladbaren Produkten?
Abdul
Denken Sie, Sie haben ein Missverständnis, keines der Produkte kann heruntergeladen werden. Alle physischen Produkte können jedoch keine Beispieldownloads per Seife erhalten.
Robert Pounder
amasty.com/product-attachments.html Erledigt alles, was Sie benötigen, und gewährt API-Zugriff.
B00MER
Vielen Dank für die Informationen, aber ich würde es vorziehen, sie selbst zu sortieren, anstatt eine Erweiterung zu kaufen, und die Dateien sind bereits integriert. Der Grund, warum ich versuche, die Automatisierung zu sortieren, ist, dass es nur mühsam ist, den Magento-Administrator zu durchlaufen, um Dateien zu aktualisieren, wie bereits erwähnt Ich habe eine Lösung mit den SQL-Tabellen, also würde ich das tun, bevor ich eine Erweiterung kaufe
Robert Pounder

Antworten:

2

In Ihrem Fall müssen Sie einen benutzerdefinierten SOAP-API-Endpunkt implementieren. Glücklicherweise können Sie die Implementierung der herunterladbaren Produkt-API stark wiederverwenden.

Wenn Sie alle unten aufgeführten Dateien erstellen, steht Ihnen die neue SOAP V2-API zur Verfügung: catalogProductAttachLinkList . Um das Hinzufügen / Entfernen von Methoden zu aktivieren, portieren Sie sie einfach von app / code / core / Mage / Downloadable / Model / Link / Api.php nach app / code / community / Intellimage / Attachs / Model / Link / Api.php .

Führen Sie einen der folgenden Schritte aus, um eine neue API zu testen:

<?php
/* SOAP V2 Style */
$client = new SoapClient('http://simple-magento-vagrant.dev/index.php/api/v2_soap/?wsdl');
$sessionId = $client->login('apiUser', 'apiKey');
$productId = 1;
$result = $client->catalogProductAttachLinkList($sessionId, $productId);
print_r($result);

/* SOAP V1 style. If you want to use this style, you may skip creation of custom wsdl.xml and Api/V2.php files proposed below. Adding api.xml and Api.php will be enough */
$client = new SoapClient('http://simple-magento-vagrant.dev/index.php/api/soap/?wsdl');
$sessionId = $client->login('apiUser', 'apiKey');
$productId = 1;
$result = $client->call($sessionId, 'attach_link.list', [$productId]);
print_r($result);

Dateien, die Ihrem Modul hinzugefügt werden sollen:

app / code / community / Intellimage / Attachs / etc / api.xml

<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <catalog_product_attach_link translate="title" module="intellimage_attachs">
                <model>attachs/link_api</model>
                <title>Category API</title>
                <acl>downloadable/link</acl>
                <methods>
                    <list translate="title" module="intellimage_attachs">
                        <title>Retrieve links and samples list from attach product</title>
                        <method>items</method>
                        <acl>downloadable/link/list</acl>
                    </list>
                </methods>
            </catalog_product_attach_link>
        </resources>
        <resources_alias>
            <attach_link>catalog_product_attach_link</attach_link>
        </resources_alias>
        <v2>
            <resources_function_prefix>
                <attach_link>catalogProductAttachLink</attach_link>
            </resources_function_prefix>
        </v2>
    </api>
</config>

app / code / community / Intellimage / Attachs / etc / wsdl.xml (Bitte beachten Sie, dass wsi.xml erstellt werden sollte, wenn SOAP V2 WS-I-Kompatibilität erforderlich ist.)

<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <catalog_product_attach_link translate="title" module="intellimage_attachs">
                <model>attachs/link_api</model>
                <title>Category API</title>
                <acl>downloadable/link</acl>
                <methods>
                    <list translate="title" module="intellimage_attachs">
                        <title>Retrieve links and samples list from attach product</title>
                        <method>items</method>
                        <acl>downloadable/link/list</acl>
                    </list>
                </methods>
            </catalog_product_attach_link>
        </resources>
        <resources_alias>
            <attach_link>catalog_product_attach_link</attach_link>
        </resources_alias>
        <v2>
            <resources_function_prefix>
                <attach_link>catalogProductAttachLink</attach_link>
            </resources_function_prefix>
        </v2>
    </api>
</config>

App / Code / Community / Intellimage / Attachs / Modell / Link / Api / V2.php

<?php

class Intellimage_Attachs_Model_Link_Api_V2 extends Intellimage_Attachs_Model_Link_Api
{
    protected function _prepareData(&$var)
    {
        if (is_object($var)) {
            $var = get_object_vars($var);
            foreach ($var as $key => &$value) {
                $this->_prepareData($value);
            }
        }
    }

    public function add($productId, $resource, $resourceType, $store = null, $identifierType = null)
    {
        $this->_prepareData($resource);
        return parent::add($productId, $resource, $resourceType, $store, $identifierType);
    }
}

App / Code / Community / Intellimage / Attachs / Model / Link / Api.php

   <?php
    class Intellimage_Attachs_Model_Link_Api extends Mage_Catalog_Model_Api_Resource
    {
        public function items($productId, $store = null, $identifierType = null)
        {
            $product = parent::_getProduct($productId, $store, $identifierType);
            $typeInstance = $product->getTypeInstance(true);
            $product->setTypeInstance(Mage::getModel('attachs/product_type', $typeInstance), true);

            $linkArr = array();
            $links = $product->getTypeInstance(true)->getSamples($product);
            $downloadHelper = Mage::helper('downloadable');
            foreach ($links as $item) {
                $tmpLinkItem = array(
                    'link_id' => $item->getId(),
                    'title' => $item->getTitle(),
                    'price' => $item->getPrice(),
                    'number_of_downloads' => $item->getNumberOfDownloads(),
                    'is_shareable' => $item->getIsShareable(),
                    'link_url' => $item->getLinkUrl(),
                    'link_type' => $item->getLinkType(),
                    'sample_file' => $item->getSampleFile(),
                    'sample_url' => $item->getSampleUrl(),
                    'sample_type' => $item->getSampleType(),
                    'sort_order' => $item->getSortOrder()
                );
                $file = Mage::helper('downloadable/file')->getFilePath(
                    Mage_Downloadable_Model_Link::getBasePath(), $item->getLinkFile()
                );

                if ($item->getLinkFile() && !is_file($file)) {
                    Mage::helper('core/file_storage_database')->saveFileToFilesystem($file);
                }

                if ($item->getLinkFile() && is_file($file)) {
                    $name = Mage::helper('downloadable/file')->getFileFromPathFile($item->getLinkFile());
                    $tmpLinkItem['file_save'] = array(
                        array(
                            'file' => $item->getLinkFile(),
                            'name' => $name,
                            'size' => filesize($file),
                            'status' => 'old'
                        ));
                }
                $sampleFile = Mage::helper('downloadable/file')->getFilePath(
                    Mage_Downloadable_Model_Link::getBaseSamplePath(), $item->getSampleFile()
                );
                if ($item->getSampleFile() && is_file($sampleFile)) {
                    $tmpLinkItem['sample_file_save'] = array(
                        array(
                            'file' => $item->getSampleFile(),
                            'name' => Mage::helper('downloadable/file')->getFileFromPathFile($item->getSampleFile()),
                            'size' => filesize($sampleFile),
                            'status' => 'old'
                        ));
                }
                if ($item->getNumberOfDownloads() == '0') {
                    $tmpLinkItem['is_unlimited'] = 1;
                }
                if ($product->getStoreId() && $item->getStoreTitle()) {
                    $tmpLinkItem['store_title'] = $item->getStoreTitle();
                }
                if ($product->getStoreId() && $downloadHelper->getIsPriceWebsiteScope()) {
                    $tmpLinkItem['website_price'] = $item->getWebsitePrice();
                }
                $linkArr[] = $tmpLinkItem;
            }
            unset($item);
            unset($tmpLinkItem);
            unset($links);

            $samples = $product->getTypeInstance(true)->getSamples($product)->getData();
            return array('links' => $linkArr, 'samples' => $samples);
        }
    }
Alex Paliarush
quelle
Netter, wird akzeptieren und Kopfgeld einmal getestet, wird wahrscheinlich morgen sein, obwohl es darum geht, abzustempeln!
Robert Pounder
Klar, lassen Sie es mich wissen, wenn Sie Fragen dazu haben. Fügen Sie der Frage außerdem die Tags "api" und "soap" hinzu.
Alex Paliarush
0

Ok, ich habe mir eine eigene Antwort ausgedacht, aber ich hoffe wirklich, dass dies eine bessere Möglichkeit ist, obwohl diese Methode überraschend einfach zu implementieren ist.

Die 2 verwendeten SQL-Tabellen sind: downloadable_sample downloadable_sample_title

Ich würde es jedoch vorziehen, nicht direkt auf magento sql zuzugreifen, und hoffte, dass es eine eingebaute Vorgehensweise geben würde.

Robert Pounder
quelle
0

Bitte versuchen Sie es mit dem folgenden Code, um einen Dateianhang mit der Magento SOAP API V2 hochzuladen

try {
    $client = new SoapClient('http://magentohost/api/v2_soap/?wsdl'); // api url
    $sessionId = $client->login('test123', 'test123'); // API user name & key 
    $resource = array(
        'title' => 'link_2',
        'price' => '11.99',
        'type' => 'file',
        'file' => array(
            'name' => 'file_test',
            'base64_content' => '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAXABcDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDLooor8XP4DCiiigAooooAKKKKAP/Z'
        )
    );
    $resourceType = 'link';
    $productId =  '4607';
    $result = $client->catalogProductDownloadableLinkAdd($sessionId, $productId, $resource, $resourceType);
}
catch (Exception $e) {
   echo $e->getMessage();
}
print_r($result);
Abdul
quelle