在php-cli项目中使用prestashop DB API进行测试?

时间:2017-08-08 07:18:15

标签: php prestashop prestashop-1.7

我在nginx服务器上的php 7.1.7上安装了prestashop 1.7.2.0。

我正在为prestashop编写一个模块,如果我可以使用prestashop API for PHP-CLI来测试我的模块的安装和操作,那么对我来说会更快。

特别是现在我需要Db::getIntance()才能工作。

到目前为止,我创建了以下脚本:

<?php
const PRESTASHOP_DIR = __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'prestashop';

spl_autoload_register(function ($className) {
    if (0 === strpos($className, 'InstallControllerConsole')) {
        $fileName = strtolower(str_replace('InstallControllerConsole', '', $className));
        require_once PRESTASHOP_DIR.'/controllers/console/' . $fileName . '.php';
    }
    if (0 === strpos($className, 'InstallControllerHttp')) {
        $fileName = strtolower(str_replace('InstallControllerHttp', '', $className));
        require_once PRESTASHOP_DIR.'/controllers/http/' . $fileName . '.php';
    }
    if (file_exists(PRESTASHOP_DIR.'/classes/' . $className . '.php')) {
        require_once PRESTASHOP_DIR.'/classes/' . $className . '.php';
    }
    if (0 === strpos($className,'Db') && file_exists(PRESTASHOP_DIR.'/classes/db/'.$className.'.php')) {
        require_once PRESTASHOP_DIR.'/classes/db/'.$className.'.php';
    }
});

require_once(PRESTASHOP_DIR.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.'db'.DIRECTORY_SEPARATOR.'DbPDO.php');
require_once(PRESTASHOP_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.inc.php');
require_once(PRESTASHOP_DIR.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php');

$a = Db::getInstance();

我收到以下错误:

PHP Fatal error:  Class 'Db' not found in /Volumes/osx-storage/projects/luckylee/prestashop/prestashop/classes/db/DbPDO.php on line 32

当我尝试为Db类grep prestashop项目时,我只能看到一个抽象类,这意味着其他东西扩展并初始化它。

任何想法如何解决这个问题?

更新

似乎我指向一个只是解压缩但未安装的pestashop目录。当我把它指向一个正确配置prestashop的目录时,只需要config.inc.php就足够了......但是

当我对我创建的表进行插入时,没有任何反应,并且它不会返回错误。有任何想法吗?

我运行命令:

    Db::getInstance()->insert(_DB_PREFIX_.'tuxinmod_cartype',['id_tuxmod_cartype'=>0],true);

并且数据库中没有任何变化。为什么? :)

我创建了表ps_tuxinmod_cartype ..但我仍然会遇到错误而且我不知道。我错过了什么?

更新

确定从插入语句中省略_DB_PREFIX_确实有效! :) 好极了!! 但我真的需要知道什么时候出错。

这些是我的错误相关配置php.ini

display_errors => STDOUT => STDOUT
display_startup_errors => On => On
error_append_string => no value => no value
error_log => no value => no value
error_prepend_string => no value => no value
error_reporting => 32767 => 32767
html_errors => Off => Off
ignore_repeated_errors => Off => Off
log_errors => On => On
log_errors_max_len => 1024 => 1024
track_errors => On => On
xdebug.force_display_errors => On => On
xdebug.force_error_reporting => 32767 => 32767
xdebug.show_error_trace => On => On

当我提供一张不存在的表时,我发现没有任何错误

任何想法?

1 个答案:

答案 0 :(得分:1)

要在cli(或其他脚本)中使用Prestashop功能,我们只需要包含/ require_once config/config.inc.php

此外,与Db::getInstance()->execute()不同,Db::getInstance()->insert()不应指定_DB_PREFIX_。插入函数将处理这个问题。

要获取错误输出,我们需要检查config/defines.inc.php中是否启用了开发模式,并且php设置允许显示错误(使用php -i | grep errorphpinfo();如果使用网络可访问的脚本)