Php 扩展Magento API-路径无效

Php 扩展Magento API-路径无效,php,magento,Php,Magento,我正在尝试扩展MagentoAPI——我已经按照大多数教程中的步骤完成了以下工作。 当我尝试调用任何扩展api方法时,我总是从洋红得到一个无效的资源路径错误 在app/etc/modules中创建一个名为Woe_Services.XML的模块XML描述符 <?xml version="1.0" encoding="UTF-8"?> <config> <modules> <Woe_Services> &

我正在尝试扩展MagentoAPI——我已经按照大多数教程中的步骤完成了以下工作。 当我尝试调用任何扩展api方法时,我总是从洋红得到一个无效的资源路径错误

在app/etc/modules中创建一个名为Woe_Services.XML的模块XML描述符

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Woe_Services>
            <active>true</active>
            <codePool>local</codePool>
        </Woe_Services>
    </modules>
</config>
我的config.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Woe_Services>
            <version>1.0</version>
        </Woe_Services>
    </modules>
    <global>
        <models>
            <catalog>
                <rewrite>
                    <product_attribute_api>Woe_Services_Model_Catalog_Product_Attribute_Api</product_attribute_api>
                </rewrite>
            </catalog>
        </models>
    </global>
</config>
<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <catalog_product_attribute translate="title"
                module="catalog">
                <title>Product attributes API</title>
                <model>catalog/product_attribute_api</model>
                <acl>catalog/product</acl>
                <methods>
                    <create translate="title" module="catalog">
                        <title>Create new product attribute</title>
                        <acl>catalog/product/attribute/create</acl>
                    </create>
                    <delete translate="title" module="catalog">
                        <title>Delete product attribute</title>
                        <acl>catalog/product/attribute/delete</acl>
                    </delete>
                    <addoptions translate="title" module="catalog">
                        <title>Add attribute options</title>
                        <acl>catalog/product/attribute/addoptions</acl>
                    </addoptions>
                </methods>
            </catalog_product_attribute>
        </resources>
        <acl>
            <resources>
            </resources>
        </acl>
    </api>
</config>
<?php
/**
 * @category    Ajzele
 * @package     Ajzele_Mapy
 * @copyright   Copyright (c) Branko Ajzele (http://activecodeline.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Catalog product attribute api
 *
 * @category   Ajzele
 * @package    Ajzele_Mapy
 * @author     Branko Ajzele <ajzele@gmail.com>
 */
class Woe_Services_Model_Catalog_Product_Attribute_Api extends Mage_Catalog_Model_Product_Attribute_Api
{
  /**
     * Create new product attribute.
     *
     * @param string $attributeName
     * @param array $attributeData
     * @param string|int $store
     * @return int
     */
    public function create($attributeName, $attributeData, $store = null)
    {
    // create product attribute
        $installer = new Mage_Catalog_Model_Resource_Eav_Mysql4_Setup('core_setup');
        $installer->addAttribute('catalog_product', $attributeName, $attributeData);

    // get product attribute id
        $storeId = $this->_getStoreId($store);
        $attribute = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->getResource()
            ->getAttribute($attributeName);

    return $attribute->getId();
    }

   /**
     * Create attribute options
     *
     * @param string $attributeId
     * @param array $attributeOptions
     * @return int
     */
    public function addoptions($attributeId, $attributeOptions)
    {
    $setup = new Mage_Eav_Model_Entity_Setup('core_setup');

    for($i = 0; $i < sizeof($attributeOptions); $i++) {
        $option = array();
        $option['attribute_id'] = $attributeId;
        $option['value'][$value][0] = $attributeOptions[$i];

        $setup->addAttributeOption($option);
    }

    return true;
    }

   /**
     * Delete product attribute.
     *
     * @param string $attributeName
     * @param string|int $store
     * @return int
     */
    public function delete($attributeName, $store = null)
    {
        $storeId = $this->_getStoreId($store);
        $attribute = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->getResource()
            ->getAttribute($attributeName);

        if (!$attribute) {
            $this->_fault('not_exists');
        }

        try {
            $attribute->delete();
        } catch (Mage_Core_Exception $e) {
            $this->_fault('not_deleted', $e->getMessage());

            return false;
        }

    return true;
    }
}

1
Woe\u服务\u模型\u目录\u产品\u属性\u Api
我的api.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Woe_Services>
            <version>1.0</version>
        </Woe_Services>
    </modules>
    <global>
        <models>
            <catalog>
                <rewrite>
                    <product_attribute_api>Woe_Services_Model_Catalog_Product_Attribute_Api</product_attribute_api>
                </rewrite>
            </catalog>
        </models>
    </global>
</config>
<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <catalog_product_attribute translate="title"
                module="catalog">
                <title>Product attributes API</title>
                <model>catalog/product_attribute_api</model>
                <acl>catalog/product</acl>
                <methods>
                    <create translate="title" module="catalog">
                        <title>Create new product attribute</title>
                        <acl>catalog/product/attribute/create</acl>
                    </create>
                    <delete translate="title" module="catalog">
                        <title>Delete product attribute</title>
                        <acl>catalog/product/attribute/delete</acl>
                    </delete>
                    <addoptions translate="title" module="catalog">
                        <title>Add attribute options</title>
                        <acl>catalog/product/attribute/addoptions</acl>
                    </addoptions>
                </methods>
            </catalog_product_attribute>
        </resources>
        <acl>
            <resources>
            </resources>
        </acl>
    </api>
</config>
<?php
/**
 * @category    Ajzele
 * @package     Ajzele_Mapy
 * @copyright   Copyright (c) Branko Ajzele (http://activecodeline.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Catalog product attribute api
 *
 * @category   Ajzele
 * @package    Ajzele_Mapy
 * @author     Branko Ajzele <ajzele@gmail.com>
 */
class Woe_Services_Model_Catalog_Product_Attribute_Api extends Mage_Catalog_Model_Product_Attribute_Api
{
  /**
     * Create new product attribute.
     *
     * @param string $attributeName
     * @param array $attributeData
     * @param string|int $store
     * @return int
     */
    public function create($attributeName, $attributeData, $store = null)
    {
    // create product attribute
        $installer = new Mage_Catalog_Model_Resource_Eav_Mysql4_Setup('core_setup');
        $installer->addAttribute('catalog_product', $attributeName, $attributeData);

    // get product attribute id
        $storeId = $this->_getStoreId($store);
        $attribute = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->getResource()
            ->getAttribute($attributeName);

    return $attribute->getId();
    }

   /**
     * Create attribute options
     *
     * @param string $attributeId
     * @param array $attributeOptions
     * @return int
     */
    public function addoptions($attributeId, $attributeOptions)
    {
    $setup = new Mage_Eav_Model_Entity_Setup('core_setup');

    for($i = 0; $i < sizeof($attributeOptions); $i++) {
        $option = array();
        $option['attribute_id'] = $attributeId;
        $option['value'][$value][0] = $attributeOptions[$i];

        $setup->addAttributeOption($option);
    }

    return true;
    }

   /**
     * Delete product attribute.
     *
     * @param string $attributeName
     * @param string|int $store
     * @return int
     */
    public function delete($attributeName, $store = null)
    {
        $storeId = $this->_getStoreId($store);
        $attribute = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->getResource()
            ->getAttribute($attributeName);

        if (!$attribute) {
            $this->_fault('not_exists');
        }

        try {
            $attribute->delete();
        } catch (Mage_Core_Exception $e) {
            $this->_fault('not_deleted', $e->getMessage());

            return false;
        }

    return true;
    }
}

产品属性API
目录/产品属性api
目录/产品
创建新产品属性
目录/产品/属性/创建
删除产品属性
目录/产品/属性/删除
添加属性选项
目录/产品/属性/添加选项
最后,Api.php文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Woe_Services>
            <version>1.0</version>
        </Woe_Services>
    </modules>
    <global>
        <models>
            <catalog>
                <rewrite>
                    <product_attribute_api>Woe_Services_Model_Catalog_Product_Attribute_Api</product_attribute_api>
                </rewrite>
            </catalog>
        </models>
    </global>
</config>
<?xml version="1.0"?>
<config>
    <api>
        <resources>
            <catalog_product_attribute translate="title"
                module="catalog">
                <title>Product attributes API</title>
                <model>catalog/product_attribute_api</model>
                <acl>catalog/product</acl>
                <methods>
                    <create translate="title" module="catalog">
                        <title>Create new product attribute</title>
                        <acl>catalog/product/attribute/create</acl>
                    </create>
                    <delete translate="title" module="catalog">
                        <title>Delete product attribute</title>
                        <acl>catalog/product/attribute/delete</acl>
                    </delete>
                    <addoptions translate="title" module="catalog">
                        <title>Add attribute options</title>
                        <acl>catalog/product/attribute/addoptions</acl>
                    </addoptions>
                </methods>
            </catalog_product_attribute>
        </resources>
        <acl>
            <resources>
            </resources>
        </acl>
    </api>
</config>
<?php
/**
 * @category    Ajzele
 * @package     Ajzele_Mapy
 * @copyright   Copyright (c) Branko Ajzele (http://activecodeline.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Catalog product attribute api
 *
 * @category   Ajzele
 * @package    Ajzele_Mapy
 * @author     Branko Ajzele <ajzele@gmail.com>
 */
class Woe_Services_Model_Catalog_Product_Attribute_Api extends Mage_Catalog_Model_Product_Attribute_Api
{
  /**
     * Create new product attribute.
     *
     * @param string $attributeName
     * @param array $attributeData
     * @param string|int $store
     * @return int
     */
    public function create($attributeName, $attributeData, $store = null)
    {
    // create product attribute
        $installer = new Mage_Catalog_Model_Resource_Eav_Mysql4_Setup('core_setup');
        $installer->addAttribute('catalog_product', $attributeName, $attributeData);

    // get product attribute id
        $storeId = $this->_getStoreId($store);
        $attribute = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->getResource()
            ->getAttribute($attributeName);

    return $attribute->getId();
    }

   /**
     * Create attribute options
     *
     * @param string $attributeId
     * @param array $attributeOptions
     * @return int
     */
    public function addoptions($attributeId, $attributeOptions)
    {
    $setup = new Mage_Eav_Model_Entity_Setup('core_setup');

    for($i = 0; $i < sizeof($attributeOptions); $i++) {
        $option = array();
        $option['attribute_id'] = $attributeId;
        $option['value'][$value][0] = $attributeOptions[$i];

        $setup->addAttributeOption($option);
    }

    return true;
    }

   /**
     * Delete product attribute.
     *
     * @param string $attributeName
     * @param string|int $store
     * @return int
     */
    public function delete($attributeName, $store = null)
    {
        $storeId = $this->_getStoreId($store);
        $attribute = Mage::getModel('catalog/product')
            ->setStoreId($storeId)
            ->getResource()
            ->getAttribute($attributeName);

        if (!$attribute) {
            $this->_fault('not_exists');
        }

        try {
            $attribute->delete();
        } catch (Mage_Core_Exception $e) {
            $this->_fault('not_deleted', $e->getMessage());

            return false;
        }

    return true;
    }
}

确保在服务器配置中打开“重写”


Evan Klein 5月31日17:55

如果您使用的是soap,您缺少一个名为wsdl.xml的关键文件,您需要在模块etc/文件夹中定义该模块;该文件应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:typens="urn:{{var wsdl.name}}" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"
    name="{{var wsdl.name}}" targetNamespace="urn:{{var wsdl.name}}">
    <types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
            <complexType name="TestSvcEntity">
                <all>
                    <element name="testArg" type="xsd:string" minOccurs="1" />
                </all>
            </complexType>
            <complexType name="testArrayOfString">
                <complexContent>
                    <restriction base="soapenc:Array">
                        <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
                    </restriction>
                </complexContent>
            </complexType>                        
        </schema>
    </types>
    <message name="testRequest">
        <part name="sessionId" type="xsd:string" />
        <part name="param1" type="xsd:string" />
    </message>
    <message name="testResponse">
        <part name="test_out" type="xsd:string" />
    </message>     
    <portType name="{{var wsdl.handler}}PortType">
        <operation name="test">
            <documentation>Test</documentation>
            <input message="typens:testRequest" />
            <output message="typens:testResponse" />
        </operation>        
    </portType>
    <binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
        <operation name="test">
            <soap:operation soapAction="urn:{{var wsdl.handler}}Action" />
            <input>
                <soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </input>
            <output>
                <soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </output>
        </operation>        
    </binding>
    <service name="{{var wsdl.name}}Service">
        <port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding">
            <soap:address location="{{var wsdl.url}}" />
        </port>
    </service>
</definitions>

这将显示所有可用的ip方法

还要检查:

  • 此时将显示您的模型,并在“高级”选项卡下启用该模型
  • 清除缓存
  • 根据您的服务器配置,在/tmp文件夹中检查wsdl的缓存版本
  • 让我知道进展如何,以及这是否解决了问题


    干杯

    您是否尝试过以下结构:
    -app--code--local--Woe_Services
    ,或者将其命名为
    WoeServices
    更好。下划线在Zend中有特殊的含义,因此在构建它的Magento中也有特殊的含义,这可能是问题的原因。我没有尝试过,但是,我检查了许多其他模块/扩展,它们大多使用相同的约定。我使用的是SOAP。另外,我正在使用Magja—Magento的Java适配器。但是,不确定这是否太相关。修复了它-确保在服务器配置中打开“重写”。@Evan:也许可以结束这个问题?