'图片', '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.= '

'; $param_html.= ' '; $param_html.= '

'; } $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 = '
'.dr_lang('模板位于./config/pay/模板文件名').'
   
'.dr_lang('可以选择单一定价+组合定价模式、组合定价模式两种方式').'
   
'.dr_lang('固定规格会调用指定的规格表,用户不能修改和添加属性').'
'.$result.'
'.$param_html.'
'; $style = '
'.dr_lang('[整数]表示固定宽度;[整数%]表示百分比').'
'; 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 '
'; } protected function _get_tpl_group($name) { return '
{name}
{value}
'; } /** * 字段表单输入 * * @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'], '
字段Pays没有设置显示参数
'); } // 字段显示名称 $text = ($field['setting']['validate']['required'] ? ' * ' : '').dr_lang($field['name']); // 字段提示信息 $tips = $field['setting']['validate']['tips'] ? ''.$field['setting']['validate']['tips'].'' : ''; $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.= '
'; } $sku_field_name.= ''.$name.''; $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 = '

'.$result.'
'; } else { $is_field_pay = $result && $ovalue ? 1 : 0; $str.= '
'; $sku_html = '

'.$result.'
'; } $str.= '
'.$pay_html.'
'.$sku_html.'
'; 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.'
'.(\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'] ? ' * ' : '').$field['name']; $tpl_group = '
{name}
{value}
'; $tpl_value = '
'; // 显示字段 $pay_html = ''; $myfield = $this->_get_myfield($field); $sku_field_name = ''; $sku_field_id = []; foreach ($myfield as $ff => $name) { $pay_html.= '
'.$value[$ff].'
'; $sku_field_name.= ''.$name.''; $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 = '
'.$pay_html.'
'.$result.'
'; return $this->input_format($field['fieldname'], $text, $str); } // 格式化js变量 protected function _js_var($html) { return str_replace([PHP_EOL, chr(13)], "", addslashes($html)); } }