我想使用位于prestashop文件夹之外但仍位于同一服务器上的php脚本(external_script.php)中的prestashop应用程序。
我可以使用Magento执行此操作:
require_once external_folder/magento/app/Mage.php;
我尝试包含 prestashop / config / config.inc.php 和 prestashop / init.php ,但它重定向 external_script.php < / em>到prestashop index.php
非常感谢任何帮助。
STEF
答案 0 :(得分:3)
在PHP脚本的开头添加以下两行,然后您可以使用PrestaShop的所有类和函数:
include(dirname(__FILE__).'/../../config/config.inc.php');
include(_PS_ROOT_DIR_.'/init.php');
另外,包括要在外部脚本中调用其函数的主类文件,它必须是模块的一些文件。例如:
include_once(__PATH__TO__CLASS__FILE__.'/xyzmodule.php');
添加上述代码以包含所需文件后,您只需创建要调用的类文件的对象并使用其代码即可。例如:
$xObj = new Xyzmodule();
$xObj->callingXFunction();
希望这有帮助。
答案 1 :(得分:1)
Magento是一个结构良好的Zend项目,它可以很容易地引导应用程序在HTTP前端控制器之外使用它,PrestaShop是另一个故事,它实际上是一堆乱七八糟的意大利面条代码,用于引导应用程序实际上取决于OS PS版本,在某些情况下还取决于改变核心行为的已安装模块。
首先,你可以先包含PS root目录下的config / config.inc.php文件,如果你在PS上使用另一个自动加载器和旧版本,这将启动PS类加载器和一堆配置定义( &lt; 1.6)你需要解决它,这是一个简单的bootstrap代码,允许进行任何PS调用:
<?php
// Load PS config and autoloader
define ('PS_DIR', __DIR__ . '/../ps-wtf');
require_once PS_DIR .'/config/config.inc.php';
// I use this to load compoper dependencies
require_once __DIR__ . '/../vendor/autoload.php';
// Call old __autoload() if present, required for PrestaShop old versions
if (function_exists('__autoload')) {
spl_autoload_register(function ($className) {
__autoload($className);
});
}
// Init Shop context, required some operation will fail without it
// adust accordly to multistore PS >= 1.6
Shop::setContext(Shop::CONTEXT_ALL);
// Init PS context, some modules require that this context was initialized and with correct data
// some core function fired in the admin require at least a employee
define ('PS_DEFAULT_EMPLOYEE', 1);
$psContext = Context::getContext();
if (!$psContext->employee) {
$psContext->employee = new Employee(PS_DEFAULT_EMPLOYEE);
}
// You can make any API call
$cat = new Category();
$cat->name = [
1 => 'New',
2 => 'Nuevo',
];
$cat->id_parent = 1;
$cat->save();
echo $cat->id;
某些PS功能取决于某些核心类的正确初始化(是的,这很疯狂),您可以查看ControllerCore和FrontControllerCore以查看正常PS请求流中发生的情况。
我希望这可以提供帮助。
答案 2 :(得分:0)
prestashop的设计方式不会让您轻松地执行此类操作。 我认为您最好的选择是使用他们的网络服务API:http://doc.prestashop.com/display/PS16/Using+the+PrestaShop+Web+Service
对此有一个PHP客户端库:https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/PSWebServiceLibrary.php
您也可以使用curl,但要注意:它们在不同的页面上使用很多不同的标记,这很烦人。
以下是一些bash代码,您可以登录自己,获取一些令牌并上传导入文件。您可以使其适应PHP curl并做其他您想做的事情:
r=$(curl -k -c cookies -b cookies -s --request POST -d "ajax=1&token=&controller=AdminLogin&submitLogin=1&passwd=[YOU_PASSWORD_URL_ENCODED]&email=[YOUR_EMAIl_URL_ENCODED]" 'https://[YOUR_PRESTASHOP_HOST_OR_LOCALHOST]/[YOUR_PRESTASHOP_ADMIN_DIR]/index.php')
token=$(echo $r | sed -n 's/.*token=\([0-9a-zA-Z]*\).*/\1/gp')
admin_token=$(curl -k -c cookies -b cookies 'https://[YOUR_PRESTASHOP_HOST_OR_LOCALHOST]/[YOUR_PRESTASHOP_ADMIN_DIR]/index.php?controller=AdminDashboard&token='"$token" | sed -n '0,/.*?_token=\([-_0-9a-zA-Z]*\).*/s/.*?_token=\([-_0-9a-zA-Z]*\).*/\1/p')
brand_file_name=$(curl -k -c cookies -b cookies -F 'file=@local_path_of_a_file.xlsx' 'https://[YOUR_PRESTASHOP_HOST_OR_LOCALHOST]/[YOUR_PRESTASHOP_ADMIN_DIR]/index.php/configure/advanced/import/file/upload?_token='"$admin_token" | sed -nE 's/.*"name":"([^"]*).*/\1/gp')