You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Smarty模板单选框选中判断及PHP/OXID无刷新变量赋值方案

没问题,我来帮你一步步搞定OXID结账流程里的这个单选框需求,无需刷新页面就能把值传递到控制器!

步骤1:修正Smarty模板里的单选框代码

你原来的单选框写法不太对,单个输入框没法实现「选Ja/Nein」的功能,得拆成两个同name的单选按钮:

<div class="checkout-terms-selection">
    <label class="radio-label">
        <input type="radio" name="AcceptTerms" value="Ja" /> Ja
    </label>
    <label class="radio-label">
        <input type="radio" name="AcceptTerms" value="Nein" checked /> Nein
    </label>
</div>

这样用户就能切换选择,默认选中「Nein」符合常规逻辑。

步骤2:添加AJAX监听脚本(无需刷新传值)

在模板里加入jQuery脚本(OXID默认自带jQuery,直接用就行),监听单选框的变化事件,实时把值传给控制器:

<script>
$(document).ready(function() {
    // 监听单选框切换
    $('input[name="AcceptTerms"]').on('change', function() {
        const selectedAnswer = $(this).val();
        
        // 发送AJAX请求到结账控制器的自定义方法
        $.ajax({
            url: oxAjaxUrl + 'cl=checkout&fnc=saveCustomerAnswer',
            type: 'POST',
            data: {
                customerAnswer: selectedAnswer,
                // 传递OXID会话标识,确保请求合法性
                oxsid: oxRegistry.getSession().getId()
            },
            success: function(res) {
                // 可选:给用户反馈,比如控制台日志或页面提示
                console.log('Antwort erfolgreich gespeichert: ' + selectedAnswer);
            },
            error: function(xhr) {
                console.error('Fehler beim Speichern: ' + xhr.responseText);
            }
        });
    });
});
</script>

这里用了OXID全局变量oxAjaxUrl和会话ID,保证请求能正常被控制器识别。

步骤3:在结账控制器中实现接收方法

修改OXID的结账控制器(application/controllers/checkout.php,如果是用模块开发,建议写自定义子控制器避免修改核心文件),添加saveCustomerAnswer方法来处理AJAX请求:

public function saveCustomerAnswer()
{
    // 验证是合法的AJAX请求且参数存在
    if ($this->isAjaxCall() && isset($_POST['customerAnswer'])) {
        $customerAnswer = trim($_POST['customerAnswer']);
        // 做参数校验,防止非法输入
        $validAnswers = ['Ja', 'Nein'];
        if (!in_array($customerAnswer, $validAnswers)) {
            $customerAnswer = 'Nein';
        }

        // 存储值:优先存在用户对象(如果用户已登录),否则存在会话中
        $oUser = oxRegistry::getUser();
        if ($oUser->isLoggedIn()) {
            // 注意:如果要存在用户表,需要先给oxuser表加一个自定义字段(比如`acceptterms`)
            $oUser->oxuser__acceptterms = new oxField($customerAnswer);
            $oUser->save();
        } else {
            // 未登录用户存在会话里,后续结账流程可以直接取
            oxRegistry::getSession()->setVariable('sCustomerAnswer', $customerAnswer);
        }

        // 返回成功响应
        echo json_encode(['status' => 'success', 'answer' => $customerAnswer]);
        exit;
    }

    // 非法请求返回错误
    echo json_encode(['status' => 'error']);
    exit;
}

另外,要确保这个方法能被公开访问,在控制器的_getAllowedMethods里添加:

protected function _getAllowedMethods()
{
    $allowedMethods = parent::_getAllowedMethods();
    $allowedMethods[] = 'saveCustomerAnswer';
    return $allowedMethods;
}
步骤4:在结账流程中使用$customerAnswer

后续需要用到这个变量时,直接从会话或用户对象中取出即可:

// 从会话或用户对象获取值,默认Nein
$customerAnswer = 'Nein';
$oUser = oxRegistry::getUser();

if ($oUser->isLoggedIn()) {
    $customerAnswer = $oUser->oxuser__acceptterms->value ?? 'Nein';
} else {
    $customerAnswer = oxRegistry::getSession()->getVariable('sCustomerAnswer') ?? 'Nein';
}

// 如果要在模板里使用,分配到Smarty
$this->assign('customerAnswer', $customerAnswer);

内容的提问来源于stack exchange,提问作者Dextranovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:04:16