创建自定义资源 web 服务 PrestaShop
Create a custom resource webservice PrestaShop
我为 PrestaShop 1.6 创建了一个模块,我在其中创建了一个 table,如下所示 mymodule/mymodule。php:
class Mymodule extends Module {
// Some code
public function installDb() {
return Db::getInstance()->execute("
CREATE TABLE IF NOT EXISTS `" . _DB_PREFIX_ . "mytable`(
`id_mdm` INT NOT NULL AUTO_INCREMENT,
`id_category` INT NOT NULL,
`service` INT NOT NULL,
`title` VARCHAR(300) NOT NULL default '',
`title_font_size` VARCHAR(128) NOT NULL default '',
`title_color` VARCHAR(128) NOT NULL default '',
`background_color` VARCHAR(128) NOT NULL default '',
`border_style` VARCHAR(128) NOT NULL default '',
`position` INT NOT NULL,
`count` INT NOT NULL,
PRIMARY KEY (`id_mdm`), UNIQUE (`id_category`)) ENGINE = InnoDB;");
}
// Some code
}
它工作正常,我的 table 已创建。然后我在 mymodule/override/classes/webservice/WebserviceRequest.php:
中覆盖 webservice
class WebserviceRequest extends WebserviceRequestCore {
public static function getResources() {
$resources = parent::getResources();
$resources['myresource'] = array(
'description' => '',
'class' => 'myresource'
);
ksort($resources);
return $resources;
}
}
我在 mymodule/override/classes/Myresource 中创建了一个名为 myresource 的新 class。php:
class MyresourceCore extends ObjectModel {
public $id;
public $id_mdm;
public $id_category;
public $service;
public $title;
public $title_font_size;
public $title_color;
public $background_color;
public $border_style;
public $position;
public $count;
public static $definition = array(
'table' => 'mytable',
'primary' => 'id_mdm',
'fields' => array(
'id_category' => array('type' => self::TYPE_INT),
'service' => array('type' => self::TYPE_INT),
'title' => array('type' => self::TYPE_STRING),
'title_font_size' => array('type' => self::TYPE_STRING),
'title_color' => array('type' => self::TYPE_STRING),
'background_color' => array('type' => self::TYPE_STRING),
'border_style' => array('type' => self::TYPE_STRING),
'position' => array('type' => self::TYPE_INT),
'count' => array('type' => self::TYPE_INT)
)
);
protected $webserviceParameters = array();
}
在后台我为 myresource 生成了一个密钥,但是当我在浏览器 http://mydomain/api/myresource?ws_key=mykey 中测试时,那里是以下错误:
Fatal error: Class 'myresource' not found in /path/mydomain/classes/webservice/WebserviceRequest.php on line 502
我不知道为什么 PrestaShop 没有检测到它。预先感谢您的帮助。
最后我找到了一个不使用本机 PrestaShop 网络服务的替代解决方案。我在 mymodule/webservice/mymodule.php 中创建了一个名为 webservice 的目录。此文件将用于 post PrestaShop 网站的数据。这是我的做法:
<?php
$currentDirectory = str_replace('modules/mymodule/webservice/', '',
dirname($_SERVER['SCRIPT_FILENAME']) . "/");
$sep = DIRECTORY_SEPARATOR;
require_once $currentDirectory . 'config' . $sep . 'config.inc.php';
require_once $currentDirectory . 'init.php';
$hostnameIp = $_SERVER['REMOTE_ADDR'];
if ($hostnameIp == 'AUTHORIZED_IP') {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Some code
http_response_code(200);
} else {
http_response_code(405);
}
} else {
http_response_code(403);
}
然后我只需要在url下面对myresource执行一个POST请求:http://mydomain/modules/mymodule/webservice/mymodule.php。
小心做一些安全验证,比如 IP 地址。如果验证成功,那么您将进行一些处理以将数据插入或更新到 mysql 个表。
如果您检查 PHP 错误日志,您会注意到类型为 Class 未找到的错误。在这种情况下,找不到 class "MyResource"。
为了解决这个问题,您需要像这样在覆盖方法的构造函数中包含您的模型 class
class WebserviceRequest extends WebserviceRequestCore {
public function __construct()
{
include_once(_PS_MODULE_DIR_ . 'myresource' . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'MyResource.php');
}
public static function getResources()
{
$resources = parent::getResources();
$resources['myresource'] = array(
'description' => '',
'class' => 'myresource'
);
ksort($resources);
return $resources;
}
}
并且您需要将模型 Class 放入 /mymodule/classes/MyResource。php
将模型 Class 放置在 mymodule/override/classes/Myresource.php 中是不正确的,因为没有要覆盖的 Myresource class .这将在卸载模块时给你一个错误——你将无法卸载它
在 Prestashop 1.7 中,您可以使用这个钩子:addWebserviceResources
示例:
include_once dirname(__FILE__) . '/classes/Sample.php';
class myAPISample extends Module {
// ...
public function install() {
return parent::install() && $this->registerHook('addWebserviceResources');
}
// ...
public function hookAddWebserviceResources($params) {
return [ 'samples' => ['description' => 'My sample', 'class' => 'Sample' ] ];
}
//...
}
另见(法语):https://www.h-hennes.fr/blog/2018/06/25/prestashop-ajouter-un-objet-dans-lapi/
我为 PrestaShop 1.6 创建了一个模块,我在其中创建了一个 table,如下所示 mymodule/mymodule。php:
class Mymodule extends Module {
// Some code
public function installDb() {
return Db::getInstance()->execute("
CREATE TABLE IF NOT EXISTS `" . _DB_PREFIX_ . "mytable`(
`id_mdm` INT NOT NULL AUTO_INCREMENT,
`id_category` INT NOT NULL,
`service` INT NOT NULL,
`title` VARCHAR(300) NOT NULL default '',
`title_font_size` VARCHAR(128) NOT NULL default '',
`title_color` VARCHAR(128) NOT NULL default '',
`background_color` VARCHAR(128) NOT NULL default '',
`border_style` VARCHAR(128) NOT NULL default '',
`position` INT NOT NULL,
`count` INT NOT NULL,
PRIMARY KEY (`id_mdm`), UNIQUE (`id_category`)) ENGINE = InnoDB;");
}
// Some code
}
它工作正常,我的 table 已创建。然后我在 mymodule/override/classes/webservice/WebserviceRequest.php:
中覆盖 webserviceclass WebserviceRequest extends WebserviceRequestCore {
public static function getResources() {
$resources = parent::getResources();
$resources['myresource'] = array(
'description' => '',
'class' => 'myresource'
);
ksort($resources);
return $resources;
}
}
我在 mymodule/override/classes/Myresource 中创建了一个名为 myresource 的新 class。php:
class MyresourceCore extends ObjectModel {
public $id;
public $id_mdm;
public $id_category;
public $service;
public $title;
public $title_font_size;
public $title_color;
public $background_color;
public $border_style;
public $position;
public $count;
public static $definition = array(
'table' => 'mytable',
'primary' => 'id_mdm',
'fields' => array(
'id_category' => array('type' => self::TYPE_INT),
'service' => array('type' => self::TYPE_INT),
'title' => array('type' => self::TYPE_STRING),
'title_font_size' => array('type' => self::TYPE_STRING),
'title_color' => array('type' => self::TYPE_STRING),
'background_color' => array('type' => self::TYPE_STRING),
'border_style' => array('type' => self::TYPE_STRING),
'position' => array('type' => self::TYPE_INT),
'count' => array('type' => self::TYPE_INT)
)
);
protected $webserviceParameters = array();
}
在后台我为 myresource 生成了一个密钥,但是当我在浏览器 http://mydomain/api/myresource?ws_key=mykey 中测试时,那里是以下错误:
Fatal error: Class 'myresource' not found in /path/mydomain/classes/webservice/WebserviceRequest.php on line 502
我不知道为什么 PrestaShop 没有检测到它。预先感谢您的帮助。
最后我找到了一个不使用本机 PrestaShop 网络服务的替代解决方案。我在 mymodule/webservice/mymodule.php 中创建了一个名为 webservice 的目录。此文件将用于 post PrestaShop 网站的数据。这是我的做法:
<?php
$currentDirectory = str_replace('modules/mymodule/webservice/', '',
dirname($_SERVER['SCRIPT_FILENAME']) . "/");
$sep = DIRECTORY_SEPARATOR;
require_once $currentDirectory . 'config' . $sep . 'config.inc.php';
require_once $currentDirectory . 'init.php';
$hostnameIp = $_SERVER['REMOTE_ADDR'];
if ($hostnameIp == 'AUTHORIZED_IP') {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Some code
http_response_code(200);
} else {
http_response_code(405);
}
} else {
http_response_code(403);
}
然后我只需要在url下面对myresource执行一个POST请求:http://mydomain/modules/mymodule/webservice/mymodule.php。 小心做一些安全验证,比如 IP 地址。如果验证成功,那么您将进行一些处理以将数据插入或更新到 mysql 个表。
如果您检查 PHP 错误日志,您会注意到类型为 Class 未找到的错误。在这种情况下,找不到 class "MyResource"。
为了解决这个问题,您需要像这样在覆盖方法的构造函数中包含您的模型 class
class WebserviceRequest extends WebserviceRequestCore {
public function __construct()
{
include_once(_PS_MODULE_DIR_ . 'myresource' . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'MyResource.php');
}
public static function getResources()
{
$resources = parent::getResources();
$resources['myresource'] = array(
'description' => '',
'class' => 'myresource'
);
ksort($resources);
return $resources;
}
}
并且您需要将模型 Class 放入 /mymodule/classes/MyResource。php
将模型 Class 放置在 mymodule/override/classes/Myresource.php 中是不正确的,因为没有要覆盖的 Myresource class .这将在卸载模块时给你一个错误——你将无法卸载它
在 Prestashop 1.7 中,您可以使用这个钩子:addWebserviceResources
示例:
include_once dirname(__FILE__) . '/classes/Sample.php';
class myAPISample extends Module {
// ...
public function install() {
return parent::install() && $this->registerHook('addWebserviceResources');
}
// ...
public function hookAddWebserviceResources($params) {
return [ 'samples' => ['description' => 'My sample', 'class' => 'Sample' ] ];
}
//...
}
另见(法语):https://www.h-hennes.fr/blog/2018/06/25/prestashop-ajouter-un-objet-dans-lapi/