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
相关产品推荐
相关产品推荐

