在prestashop文件夹

时间:2015-08-18 17:22:43

标签: prestashop

我想使用位于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

3 个答案:

答案 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')