Files

857 lines
34 KiB
PHP

<?php namespace Phpcmf\Field;
/**
* https://www.besyun.com
* BESCMS
* 本文件是框架系统文件,二次开发时不可以修改本文件,可以通过继承类方法来重写此文件
**/
class Pays extends \Phpcmf\Library\A_Field {
protected $showfield = [
'image' => '图片',
'price' => '价格',
'quantity' => '数量',
'sn' => '编码',
];
/**
* 构造函数
*/
public function __construct(...$params) {
parent::__construct(...$params);
$this->fieldtype = ['DECIMAL' => '10,2']; // TRUE表全部可用字段类型,自定义格式为 array('可用字段类型名称' => '默认长度', ... )
$this->defaulttype = 'DECIMAL'; // 当用户没有选择字段类型时的缺省值
}
/**
* 字段相关属性参数
*
* @param array $value 值
* @return string
*/
public function option($option, $field = null) {
$myfield = $this->showfield;
!$option['field'] && $option['field'] = [];
!$option['payfile'] && $option['payfile'] = 'buy.html';
foreach ($field as $t) {
$t['fieldtype'] == 'Paystext' && $myfield[$t['fieldname']] = $t['name'];
}
$param_html = '';
foreach ($myfield as $id => $t) {
$param_html.= '<p style="margin-bottom:10px">';
$param_html.= '<input type="checkbox" name="data[setting][option][field][]" '.(dr_in_array($id, $option['field']) ? 'checked' : '').' value="'.$id.'" data-on-text="'.dr_lang('%s已显示', dr_lang($t)).'" data-off-text="'.dr_lang('%s已禁用', dr_lang($t)).'" data-on-color="success" data-off-color="danger" class="make-switch" data-size="small">
';
$param_html.= '</p>';
}
$tpl_group = $this->_get_tpl_group('data[setting][option][sku]');
$tpl_value = $this->_get_tpl_value('data[setting][option][sku]');
$value = $option;
// 显示字段
$result = '';
if (isset($value['sku']['group']) && $value['sku']['group']) {
foreach ($value['sku']['group'] as $id => $name) {
$html = '';
if (isset($value['sku']['name'][$id]) && $value['sku']['name'][$id]) {
foreach ($value['sku']['name'][$id] as $iid => $vname) {
$html.= str_replace(
['{id}', '{name}', '{iid}'],
[$id, $vname, $iid],
$tpl_value
);
}
}
$result.= str_replace(
['{id}', '{name}', '{value}'],
[$id, $name, $html],
$tpl_group
);
}
}
$opt = '
<div class="form-group">
<label class="col-md-2 control-label">'.dr_lang('模板文件').'</label>
<div class="col-md-9">
<label><input type="text" class="form-control" size="20" name="data[setting][option][payfile]" value="'.$option['payfile'].'"></label>
<span class="help-block">'.dr_lang('模板位于./config/pay/模板文件名').'</span>
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">'.dr_lang('定价模式').'</label>
<div class="col-md-9">
<div class="mt-radio-inline">
<label class="mt-radio mt-radio-outline"><input type="radio" value="0" name="data[setting][option][close_one]" '.(!$option['close_one'] ? 'checked' : '').' > '.dr_lang('单一定价+组合定价').' <span></span></label>
&nbsp; &nbsp;
<label class="mt-radio mt-radio-outline"><input type="radio" value="1" name="data[setting][option][close_one]" '.($option['close_one'] ? 'checked' : '').' > '.dr_lang('组合定价').' <span></span></label>
</div>
<span class="help-block">'.dr_lang('可以选择单一定价+组合定价模式、组合定价模式两种方式').'</span>
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">'.dr_lang('固定组合规格').'</label>
<div class="col-md-9">
<div class="mt-radio-inline">
<label class="mt-radio mt-radio-outline"><input onclick="$(\'.gdggb\').show()" type="radio" value="1" name="data[setting][option][is_sku]" '.($option['is_sku'] ? 'checked' : '').' > '.dr_lang('开启').' <span></span></label>
&nbsp; &nbsp;
<label class="mt-radio mt-radio-outline"><input onclick="$(\'.gdggb\').hide()" type="radio" value="0" name="data[setting][option][is_sku]" '.(!$option['is_sku'] ? 'checked' : '').' > '.dr_lang('关闭').' <span></span></label>
</div>
<span class="help-block">'.dr_lang('固定规格会调用指定的规格表,用户不能修改和添加属性').'</span>
</div>
</div>
<div class="form-group gdggb" style="display: '.($option['is_sku'] ? 'blank' : 'none').'" >
<label class="col-md-2 control-label">'.dr_lang('指定规格表').'</label>
<div class="col-md-9">
<div id="dr_field_pays">
<label><button type="button" class="btn blue btn-sm" onclick="dr_sku_add_group()"> <i class="fa fa-plus"></i> '.dr_lang('添加属性').'</button></label>
<div class="portlet light bordered">
<div id="dr_sku_result">
'.$result.'
</div>
</div>
<script type="text/javascript">
var arrayValue = new Array();
var tpl_group = "'.$this->_js_var($tpl_group).'";
var tpl_value = "'.$this->_js_var($tpl_value).'";
var field_name = "_sku";
var sku_field_name = "";
var sku_field_id = "";
</script>
<script type="text/javascript" src="'.ROOT_THEME_PATH.'assets/js/sku.js"></script>
<script type="text/javascript">
$(function(){
dr_sku_init();
});
</script>
</div>
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">'.dr_lang('余额付款').'</label>
<div class="col-md-9">
<input type="checkbox" name="data[setting][option][is_finecms]" '.($option['is_finecms'] ? 'checked' : '').' value="1" data-on-text="'.dr_lang('已开启').'" data-off-text="'.dr_lang('已关闭').'" data-on-color="success" data-off-color="danger" class="make-switch" data-size="small">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">'.dr_lang('显示参数').'</label>
<div class="col-md-9">
'.$param_html.'
</div>
</div>
';
$style = '
<div class="form-group">
<label class="col-md-2 control-label">'.dr_lang('控件宽度').'</label>
<div class="col-md-9">
<label><input type="text" class="form-control" size="10" name="data[setting][option][width]" value="'.$option['width'].'"></label>
<span class="help-block">'.dr_lang('[整数]表示固定宽度;[整数%]表示百分比').'</span>
</div>
</div>
';
return [$this->_search_field().$opt, $style];
}
/**
* 创建sql语句
*/
public function create_sql($name, $value, $cname = '') {
$columns = [
['name' => $name, 'type' => 'DECIMAL(9,2)', 'info' => 'NULL'],
['name' => $name.'_sku', 'type' => 'TEXT', 'info' => 'NULL'],
['name' => $name.'_quantity', 'type' => 'INT(10)', 'info' => 'UNSIGNED NULL'],
['name' => $name.'_sn', 'type' => 'VARCHAR(10)', 'info' => 'NULL'],
];
$db = $this->_db_for_field_sql();
if ($db && method_exists($db, 'sqlAddFields')) {
return $db->sqlAddFields($columns);
}
// 驱动未就绪时回退 MySQL 方言
return 'ALTER TABLE `{tablename}` ADD `'.$name.'` DECIMAL(9,2) NULL, ADD `'.$name.'_sku` TEXT NULL, ADD `'.$name.'_quantity` INT(10) UNSIGNED NULL, ADD `'.$name.'_sn` VARCHAR(10) NULL';
}
/**
* 修改sql语句
*/
public function alter_sql($name, $value, $cname = '') {
return NULL;
}
/**
* 删除sql语句
*/
public function drop_sql($name) {
$names = [$name, $name.'_sku', $name.'_quantity', $name.'_sn'];
$db = $this->_db_for_field_sql();
if ($db && method_exists($db, 'sqlDropFields')) {
return $db->sqlDropFields($names);
}
return 'ALTER TABLE `{tablename}` DROP `'.$name.'`, DROP `'.$name.'_sku`, DROP `'.$name.'_quantity`, DROP `'.$name.'_sn`';
}
// 测试字段是否被创建成功,默认成功为0,需要继承开发
public function test_sql($tables, $field) {
if (!$tables) {
return 0;
}
foreach ($tables as $table) {
if (!\Phpcmf\Service::M()->db->fieldExists($field.'_sku', $table)) {
return '给表['.$table.']创建字段['.$field.'_sku'.']失败';
}
if (!\Phpcmf\Service::M()->db->fieldExists($field.'_quantity', $table)) {
return '给表['.$table.']创建字段['.$field.'_quantity'.']失败';
}
if (!\Phpcmf\Service::M()->db->fieldExists($field.'_sn', $table)) {
return '给表['.$table.']创建字段['.$field.'_sn'.']失败';
}
if (!\Phpcmf\Service::M()->db->fieldExists($field, $table)) {
return '给表['.$table.']创建字段['.$field.']失败';
}
}
return 0;
}
// 显示字段
protected function _get_myfield($field) {
$my = [];
$_field = \Phpcmf\Service::L('field')->fields;
foreach ($field['setting']['option']['field'] as $ff) {
if (isset($this->showfield[$ff])) {
$my[$ff] = $this->showfield[$ff];
} elseif (isset($_field[$ff])) {
$my[$ff] = $_field[$ff]['name'];
} else {
continue;
}
}
return $my;
}
/**
* 字段入库值
*
* @param array $field 字段信息
* @return void
*/
public function insert_value($field) {
if (isset($field['setting']['option']['close_one']) && $field['setting']['option']['close_one']) {
$is_field_pay = 1;
} else {
$is_field_pay = (int)$_POST['is_field_pay'];
}
if ($is_field_pay) {
// 组合
$price = 0;
$quantity = 0;
if (isset($field['setting']['option']['is_sku']) && $field['setting']['option']['is_sku']) {
$sku = $field['setting']['option']['sku'];
$sku['value'] = $_POST['data'][$field['fieldname'].'_sku']['value'];
} else {
$sku = $_POST['data'][$field['fieldname'].'_sku'];
}
if ($sku['value']) {
$price_array = [];
foreach ($sku['value'] as $v) {
$quantity+= intval($v['quantity']);
$price_array[] = $v['price'];
}
$price = min($price_array);
}
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname']] = (float)$price;
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname'].'_sn'] = '';
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname'].'_sku'] = dr_array2string($sku);
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname'].'_quantity'] = abs((int)$quantity);
} else {
// 单一
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname']] = (float)$_POST[$field['fieldname']]['price'];
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname'].'_sn'] = dr_safe_replace($_POST[$field['fieldname']]['sn']);
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname'].'_sku'] = '';
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname'].'_quantity'] = (int)$_POST[$field['fieldname']]['quantity'];
$_field = \Phpcmf\Service::L('form')->fields;
foreach ($field['setting']['option']['field'] as $ff) {
if (isset($_field[$ff])) {
\Phpcmf\Service::L('Field')->data[$_field[$ff]['ismain']][$ff] = (string)$_POST[$field['fieldname']][$ff];
}
}
}
}
/**
* 获取附件id
*/
public function get_attach_id($value) {
if (!$this->field) {
return NULL;
} elseif (!dr_in_array('image', $this->field['setting']['option']['field'])) {
return NULL;
}
$data = [];
$value = dr_string2array($value);
if ($value) {
foreach ($value as $tt) {
if (isset($tt['image']) && $tt['image']) {
$data[] = intval($tt['image']);
}
}
}
return $data;
}
/**
* 附件处理
*/
public function attach($data, $_data) {
if (!$this->field) {
return NULL;
}
$data = isset($_POST['data'][$this->field['fieldname'].'_sku']['value']) ? $_POST['data'][$this->field['fieldname'].'_sku']['value'] : [];
if (isset(\Phpcmf\Service::L('Field')->old[$this->field['fieldname'].'_sku'])) {
$old = dr_string2array(\Phpcmf\Service::L('Field')->old[$this->field['fieldname'].'_sku']);
$_data = isset($old['value']) ? $old['value'] : [];
}
$data = $this->get_attach_id($data);
$_data = $this->get_attach_id($_data);
if (!isset($_data)) {
$_data = [];
}
if (!isset($data)) {
$data = [];
}
// 新旧数据都无附件就跳出
if (!$data && !$_data) {
return NULL;
}
// 新旧数据都一样时表示没做改变就跳出
if (dr_diff($data, $_data)) {
return NULL;
}
// 当无新数据且有旧数据表示删除旧附件
if (!$data && $_data) {
return [
[],
$_data
];
}
// 当无旧数据且有新数据表示增加新附件
if ($data && !$_data) {
return [
$data,
[]
];
}
// 剩下的情况就是删除旧文件增加新文件
// 新旧附件的交集,表示固定的
$intersect = array_intersect($data, $_data);
return [
array_diff($data, $intersect), // 固有的与新文件中的差集表示新增的附件
array_diff($_data, $intersect), // 固有的与旧文件中的差集表示待删除的附件
];
}
/**
* 验证必填字段值
*
* @param string $field 字段类型
* @param string $value 字段值
* @return
*/
public function check_required($field, $value) {
if (isset($field['setting']['option']['close_one']) && $field['setting']['option']['close_one']) {
$is_field_pay = 1;
} else {
$is_field_pay = (int)$_POST['is_field_pay'];
}
if ($is_field_pay) {
if (isset($field['setting']['option']['is_sku']) && $field['setting']['option']['is_sku']) {
$sku = $field['setting']['option']['sku'];
$sku['value'] = $_POST['data'][$field['fieldname'].'_sku']['value'];
} else {
$sku = $_POST['data'][$field['fieldname'].'_sku'];
}
if ($sku['value']) {
foreach ($sku['value'] as $v) {
if (strlen($v['price']) == 0) {
return dr_lang('%s不能为空', $field['name']);
}
}
}
} else {
if (strlen($_POST[$field['fieldname']]['price']) == 0) {
return dr_lang('%s不能为空', $field['name']);
}
}
return '';
}
/**
* 字段值
*/
public function get_value($name, $data) {
$value = [
'price' => $data[$name],
'sku' => dr_string2array($data[$name.'_sku']),
'sn' => $data[$name.'_sn'],
'quantity' => $data[$name.'_quantity'],
];
$field = \Phpcmf\Service::L('field')->fields;
foreach ($field[$name]['setting']['option']['field'] as $ff ) {
if ($field[$ff]['fieldtype'] == 'Paystext') {
$value[$ff] = (string)$data[$ff];
}
}
return $value;
}
/**
* 支付时获取商品属性
*/
public function get_pay_info($rt, $field, $sku) {
$rt[$field['fieldname'].'_sku'] = dr_string2array($rt[$field['fieldname'].'_sku']);
if (!$sku && $rt[$field['fieldname'].'_sku']) {
return dr_return_data(0, dr_lang('没有选择商品属性'));
} elseif (!isset($rt[$field['fieldname'].'_sku']['value'][$sku]) || !$rt[$field['fieldname'].'_sku']['value'][$sku]) {
return dr_return_data(0, dr_lang('商品(#'.$rt['id'].')属性(#'.$sku.')无效'));
}
$sn = (string)$rt[$field['fieldname'].'_sku']['value'][$sku]['sn'];
$quantity = (int)$rt[$field['fieldname'].'_sku']['value'][$sku]['quantity'];
list($sku_name, $sku_string) = dr_sku_name($sku, $rt[$field['fieldname'].'_sku'], 1);
return dr_return_data(1, '', [$sn, $quantity, $sku_name, $sku_string]);
}
/**
* 字段输出
*
* @param array $value 值
* @return string
*/
public function output($value) {
return (float)$value;
}
protected function _get_tpl_value($name) {
return '
<div class="fc-sku-group-value col-md-4" id="dr_sku_value_{id}_{iid}" did="{iid}">
<div class="input-group input-group-sm">
<input type="text" class="fc-sku-value-name-input form-control" onblur="dr_sku_init()" name="'.$name.'[name][{id}][{iid}]" fname="{id}_{iid}" value="{name}">
<span class="input-group-btn">
<button class="btn red" onclick="javascript:dr_sku_del_value(\'{id}\', \'{iid}\');" type="button"><i class="fa fa-trash"></i></button>
</span>
</div>
</div>
';
}
protected function _get_tpl_group($name) {
return '
<div class="portlet-body fc-sku-group" id="dr_sku_group_{id}" did="{id}">
<input type="hidden" id="dr_sku_group_text_{id}" name="'.$name.'[group][{id}]" value="{name}">
<div class="row fc-sku-group-name">
<div class="col-md-6 fc-sku-group-name-input">{name}</div>
<div class="text-right col-md-6">
<button onclick="javascript:dr_sku_add_value(\'{id}\');" type="button" class="btn green btn-sm"> '.dr_lang('添加值').'</button>
<button onclick="javascript:dr_sku_edit_group(\'{id}\');" type="button" class="edit btn blue btn-sm"> '.dr_lang('修改').'</button>
<button onclick="javascript:dr_sku_save_group(\'{id}\');" type="button" class="save btn blue btn-sm" style="display:none"> '.dr_lang('保存').'</button>
<button onclick="javascript:dr_sku_del_group(\'{id}\');" type="button" class="btn red btn-sm"> '.dr_lang('删除').'</button>
</div>
</div>
<div class="row fc-sku-group-body" id="dr_sku_value_{id}">
{value}
</div>
</div>
';
}
/**
* 字段表单输入
*
* @return string
*/
public function input($field, $value = [], $html = []) {
if (!defined('FC_PAY') && (IS_MEMBER || IS_ADMIN)) {
if (!$field['setting']['option']['field']) {
return $this->input_format($field['fieldname'], $field['name'], '<div class="form-control-static">字段Pays没有设置显示参数</div>');
}
// 字段显示名称
$text = ($field['setting']['validate']['required'] ? '<span class="required" aria-required="true"> * </span>' : '').dr_lang($field['name']);
// 字段提示信息
$tips = $field['setting']['validate']['tips'] ? '<span class="help-block" id="dr_'.$field['fieldname'].'_tips">'.$field['setting']['validate']['tips'].'</span>' : '';
$tpl_group = $this->_get_tpl_group('data['.$field['fieldname'].'_sku]');
$tpl_value = $this->_get_tpl_value('data['.$field['fieldname'].'_sku]');
$image_url ='/'.(IS_ADMIN ? SELF.'?c=api' : 'index.php?s=api&c=file').'&m=input_file_list&token='.dr_get_csrf_token().'&siteid='.SITE_ID.'&p='.dr_authcode([
'size' => 10,
'count' => 1,
'exts' => 'jpg,gif,png',
'attachment' => 0,
'image_reduce' => 0,
], 'ENCODE').'&ct=0&one=1';
// 显示字段
$pay_html = ''; // 单一模式下的输出
$myfield = $this->_get_myfield($field);
$sku_field_name = '';
$sku_field_id = [];
foreach ($myfield as $ff => $name) {
if ($ff == 'image') {
} else {
$pay_html.= '<div class="form-group">
<label class="col-md-2 control-label">'.$name.'</label>
<div class="col-md-7">
<input type="text" name="'.$field['fieldname'].'['.$ff.']" value="'.(isset($value[$ff]) ? $value[$ff] : '').'" class="form-control input-inline input-medium">
</div>
</div>';
}
$sku_field_name.= '<th>'.$name.'</th>';
$sku_field_id[] = $ff;
}
if (isset($field['setting']['option']['is_sku']) && $field['setting']['option']['is_sku']) {
$value['sku']['name'] = $field['setting']['option']['sku']['name'];
$value['sku']['group'] = $field['setting']['option']['sku']['group'];
}
$result = '';
if (isset($value['sku']['group']) && $value['sku']['group']) {
foreach ($value['sku']['group'] as $id => $name) {
$html = '';
if (isset($value['sku']['name'][$id]) && $value['sku']['name'][$id]) {
foreach ($value['sku']['name'][$id] as $iid => $vname) {
$html.= str_replace(
['{id}', '{name}', '{iid}'],
[$id, $vname, $iid],
$tpl_value
);
}
}
$result.= str_replace(
['{id}', '{name}', '{value}'],
[$id, $name, $html],
$tpl_group
);
}
}
$ovalue = [];
if (isset($value['sku']['value']) && $value['sku']['value']) {
foreach ($value['sku']['value'] as $ii => $t) {
foreach ($sku_field_id as $if) {
$ovalue[$ii.'_'.$if] = $t[$if];
if ($if == 'image' && $t[$if]) {
$ovalue[$ii.'_'.$if.'_url'] = dr_get_file($t[$if]);
}
}
}
}
$str = '';
// 是否单一模式
if (isset($field['setting']['option']['close_one']) && $field['setting']['option']['close_one']) {
$is_field_pay = 1;
$sku_html = '<p class="margin-bottom-20">
<label><button type="button" class="btn blue btn-sm" onclick="dr_sku_add_group()"> <i class="fa fa-plus"></i> '.dr_lang('添加属性').'</button></label>
<label><button type="button" class="btn green btn-sm" onclick="dr_sku_init()"> <i class="fa fa-refresh"></i> '.dr_lang('更新属性').'</button></label>
</p>
<div class="portlet light isbordered">
<div id="dr_sku_result">
'.$result.'
</div>
</div>';
} else {
$is_field_pay = $result && $ovalue ? 1 : 0;
$str.= '<div class="mt-radio-inline">
<label class="mt-radio">
<input type="radio" onclick="$(\'#dr_field_pay\').show();$(\'#dr_field_pays\').hide();" name="is_field_pay" value="0" '.(!$is_field_pay ? 'checked' : '').'> '.dr_lang('单一价格').'
<span></span>
</label>
<label class="mt-radio">
<input type="radio" onclick="$(\'#dr_field_pays\').show();$(\'#dr_field_pay\').hide();" name="is_field_pay" value="1" '.($is_field_pay ? 'checked' : '').'> '.dr_lang('组合价格').'
<span></span>
</label>
</div>';
$sku_html = '<p class="margin-bottom-20">
<label><button type="button" class="btn blue btn-sm" onclick="dr_sku_add_group()"> <i class="fa fa-plus"></i> '.dr_lang('添加属性').'</button></label>
<label><button type="button" class="btn green btn-sm" onclick="dr_sku_init()"> <i class="fa fa-refresh"></i> '.dr_lang('更新属性').'</button></label>
</p>
<div class="portlet light isbordered">
<div id="dr_sku_result">
'.$result.'
</div>
</div>';
}
$str.= '
<div id="dr_field_pay" style="display:'.(!$is_field_pay ? 'block' : 'none').';">
<div class="portlet light isbordered">
<div class="form-body" style="padding:30px 0 10px 0">
'.$pay_html.'
</div>
</div>
</div>
<div id="dr_field_pays" style="display:'.($is_field_pay ? 'block' : 'none').';">
'.$sku_html.'
<div id="dr_sku_table">
</div>
<script type="text/javascript">
var arrayValue = new Array();
var tpl_group = "'.$this->_js_var($tpl_group).'";
var tpl_value = "'.$this->_js_var($tpl_value).'";
var field_name = "'.$field['fieldname'].'_sku";
var sku_field_name = "'.$this->_js_var($sku_field_name).'";
var sku_image_url = "'.$image_url.'";
var sku_field_id = '.dr_array2string($sku_field_id).';
arrayValue = '.($ovalue ? dr_array2string($ovalue) : 'new Array()').';
</script>
<script type="text/javascript" src="'.ROOT_THEME_PATH.'assets/js/sku.js"></script>
<script type="text/javascript">
$(function(){
dr_sku_init();
});
</script>
</div>
';
return $this->input_format($field['fieldname'], $text, $str.$tips);
} else {
// 付款金额
$html['pay_value'] = $value ? $value : 0;
if (!dr_is_app('pay')) {
return '没有安装「支付系统」插件';
}
// 付款方式
$html['pay_type'] = \Phpcmf\Service::M('pay', 'pay')->get_pay_type(\Phpcmf\Service::C()->member && $field['setting']['option']['is_finecms'] && is_file(ROOTPATH.'api/pay/finecms/config.php'));
// 取默认第一个
if ($html['pay_type']) {
reset($html['pay_type']);
$html['pay_default'] = key($html['pay_type']);
}
// 付款界面模板
if (isset($html['tpl']) && $html['tpl'] && is_file($html['tpl'])) {
$htmlfile = $html['tpl'];
// 验证路径合法性
if (!\Phpcmf\Service::V()->_safe_template_path($htmlfile)) {
return '支付表单模板文件路径不合法:'.$htmlfile.'<br>'.(\Phpcmf\Service::V()->_safe_template_error);
}
} else {
$htmlfile = CONFIGPATH.'pay/buy.html';
if ($field['setting']['option']['payfile']) {
if (is_file(WEBPATH.'config/pay/'.$field['setting']['option']['payfile'])) {
$htmlfile = WEBPATH.'config/pay/'.$field['setting']['option']['payfile'];
} elseif (is_file(CONFIGPATH.'pay/'.$field['setting']['option']['payfile'])) {
$htmlfile = CONFIGPATH.'pay/'.$field['setting']['option']['payfile'];
}
}
}
if (!is_file($htmlfile)) {
return '支付表单模板文件不存在:'.$htmlfile;
}
$member = \Phpcmf\Service::C()->member;
$pay_url = \Phpcmf\Service::L('router')->member_url('pay/pay/index');
// 获取付款界面代码
ob_start();
$file = \Phpcmf\Service::V()->code2php(file_get_contents($htmlfile));
require_once $file;
$code = ob_get_clean();
return $code;
}
}
/**
* 字段表单显示
*
* @param string $field 字段数组
* @param array $value 值
* @return string
*/
public function show($field, $value = null) {
// 字段显示名称
$text = ($field['setting']['validate']['required'] ? '<span class="required" aria-required="true"> * </span>' : '').$field['name'];
$tpl_group = '
<div class="portlet-body fc-sku-group" id="dr_sku_group_{id}" did="{id}">
<input type="hidden" id="dr_sku_group_text_{id}" name="data['.$field['fieldname'].'_sku][group][{id}]" value="{name}">
<div class="row fc-sku-group-name">
<div class="col-md-6 fc-sku-group-name-input">{name}</div>
</div>
<div class="row fc-sku-group-body" id="dr_sku_value_{id}">
{value}
</div>
</div>
';
$tpl_value = '
<div class="fc-sku-group-value col-md-4" id="dr_sku_value_{id}_{iid}" did="{iid}">
<div class="input-group input-group-sm">
<input type="text" class="fc-sku-value-name-input form-control" onblur="dr_sku_init()" name="data['.$field['fieldname'].'_sku][name][{id}][{iid}]" fname="{id}_{iid}" value="{name}">
<span class="input-group-btn">
<button class="btn red" onclick="javascript:dr_sku_del_value(\'{id}\', \'{iid}\');" type="button"><i class="fa fa-trash"></i></button>
</span>
</div>
</div>
';
// 显示字段
$pay_html = '';
$myfield = $this->_get_myfield($field);
$sku_field_name = '';
$sku_field_id = [];
foreach ($myfield as $ff => $name) {
$pay_html.= '<div class="form-group">
<label class="col-md-2 control-label">'.$name.'</label>
<div class="col-md-7">
<div class="form-control-static">'.$value[$ff].'</div>
</div>
</div>';
$sku_field_name.= '<th>'.$name.'</th>';
$sku_field_id[] = $ff;
}
$result = '';
if (isset($value['sku']['group']) && $value['sku']['group']) {
foreach ($value['sku']['group'] as $id => $name) {
$html = '';
if (isset($value['sku']['name'][$id]) && $value['sku']['name'][$id]) {
foreach ($value['sku']['name'][$id] as $iid => $vname) {
$html.= str_replace(
['{id}', '{name}', '{iid}'],
[$id, $vname, $iid],
$tpl_value
);
}
}
$result.= str_replace(
['{id}', '{name}', '{value}'],
[$id, $name, $html],
$tpl_group
);
}
}
$ovalue = $oimg = [];
if (isset($value['sku']['value']) && $value['sku']['value']) {
foreach ($value['sku']['value'] as $ii => $t) {
foreach ($sku_field_id as $if) {
$ovalue[$ii.'_'.$if] = $t[$if];
if ($if == 'image') {
$ovalue[$ii.'_'.$if.'_url'] = dr_get_file($t[$if]);
}
}
}
}
// 是否单一模式
$is_field_pay = $result && $ovalue ? 1 : 0;
$str = '
<div id="dr_field_pay" style="display:'.(!$is_field_pay ? 'block' : 'none').';">
<div class="portlet light isbordered">
<div class="form-body" style="padding:30px 0 10px 0">
'.$pay_html.'
</div>
</div>
</div>
<div id="dr_field_pays" style="display:'.($is_field_pay ? 'block' : 'none').';">
<div class="hide">
<div id="dr_sku_result">
'.$result.'
</div>
</div>
<div id="dr_sku_table">
</div>
<script type="text/javascript">
var arrayValue = new Array();
var tpl_group = "'.$this->_js_var($tpl_group).'";
var tpl_value = "'.$this->_js_var($tpl_value).'";
var field_name = "'.$field['fieldname'].'_sku";
var sku_field_name = "'.$this->_js_var($sku_field_name).'";
var sku_field_id = '.dr_array2string($sku_field_id).';
arrayValue = '.dr_array2string($ovalue).';
</script>
<script type="text/javascript" src="'.ROOT_THEME_PATH.'assets/js/sku.js"></script>
<script type="text/javascript">
$(function(){
dr_sku_init();
});
</script>
</div>
';
return $this->input_format($field['fieldname'], $text, $str);
}
// 格式化js变量
protected function _js_var($html) {
return str_replace([PHP_EOL, chr(13)], "", addslashes($html));
}
}