Prestashop - 在FrontController中使用ObjectModel

时间:2017-01-05 12:09:26

标签: php prestashop-1.6

我正在开发一个Prestashop模块:

enter image description here

我创建了一个OjectModel(DnDPayment.php)来处理所有Db交互。问题是我无法在FrontController文件中创建此类的新实例。

这是我的FrontController(payments.php):

<?php

class DnDPaymentsPaymentsModuleFrontController extends ModuleFrontController {

    public function initContent() {
        parent::initContent();
        $this->setTemplate('pay.tpl');
    }

     public function postProcess() {

         if (Tools::isSubmit('send-payment-btn')) {
            $bank = Tools::getValue('bank');
            $payer = Tools::getValue('payer');
            $amount = Tools::getValue('amount');
            $reference = Tools::getValue('reference');

            if (!$bank || !$payer || !$amount || !$reference)
                return $this->context->smarty->assign(array("error" => true));

            DnDPayment::savePayment(Tools::getValue('bank'),         Tools::getValue('payer'), Tools::getValue('amount'),   Tools::getValue('reference'));

            return $this->context->smarty->assign(array("ok" => true));
         }
     }
}

目前,我正在使用savePayment静态方法,但我真正想要的是创建一个新对象并将其添加到数据库中,如下所示:

....
$payment = new DnDPayment();
$payment->bank = "bah...";
....
....
try {
    $payment->add();
} catch(Exception $e) {
     //Handle error
}

但如果我尝试使用此代码,则会返回 500错误,仅此而已。似乎问题是new语句的行。如果我在我的模块文件(dndpayments.php)中尝试此代码,那么它可以正常工作,但我想在前端控制器中使用它。

这是我的对象模型(DnDPayments.php),以防万一:

<?php


class DnDPayment extends ObjectModel {

    public $id;
    public $id_dnd_payments;
    public $bank;
    public $payer;
    public $amount;
    public $reference;
    public $date_add;

    public static $definition_array = array(
        'table' => 'dnd_payments',
        'primary' => 'id_dnd_payments',
        'multilang' => false,
        'fields' => array(
            'bank' => array('type' => self::TYPE_STRING),
            'payer' => array('type' => self::TYPE_STRING),
            'amount' => array('type' => self::TYPE_STRING),
            'reference' => array('type' => self::TYPE_STRING),
            'date_add' => array('type' => self::TYPE_STRING)
        )
    );

    public static function savePayment($bank, $payer, $amount, $reference) {
        $logger = new FileLogger(0);
        $logger->setFilename(_PS_ROOT_DIR_ . "/log/debug.log");
        $logger->logDebug($bank . ' :: ' . $payer . ' :: ' . $amount);

        Db::getInstance()->insert('dnd_payments', array(
            'bank' => $bank,
            'payer' => $payer,
            'amount' => $amount,
            'reference' => $reference,
            'date_add' => date('Y-m-d H:i:s')
        ));
    }
}

如何在控制器中实例化新的ObjectModel并将其保存到数据库?

2 个答案:

答案 0 :(得分:1)

在实例化之前,您是否已将此类文件包含在控制器中?如果没有,请加入并重试。

如果您已将类文件包含在控制器中,请检查类的名称和定义范围以及类文件的功能。

答案 1 :(得分:0)

尝试将您的班级包含在控制器文件的开头:

include_once(_PS_MODULE_DIR_ . 'dndpayments/classes/DnDPayment.php');

Prestashop自动加载类,但这不是核心类,因此您必须手动包含它。

祝你好运。