Server : Apache
System : Linux iZ6xhqomji47p1Z 5.10.134-15.al8.x86_64 #1 SMP Thu Jul 20 00:44:04 CST 2023 x86_64
User : www ( 1000)
PHP Version : 8.1.30
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Directory :  /www/wwwroot/fsjlkj.cn/application/admin/logic/
Upload File :
Current Directory [ Writeable ] Root Directory [ Writeable ]


Current File : /www/wwwroot/fsjlkj.cn/application/admin/logic/ForeignLogic.php
<?php
/**
 * 易优CMS
 * ============================================================================
 * 版权所有 2016-2028 海南赞赞网络科技有限公司,并保留所有权利。
 * 网站地址: http://www.eyoucms.com
 * ----------------------------------------------------------------------------
 * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
 * ============================================================================
 * Author: 小虎哥 <1105415366@qq.com>
 * Date: 2018-4-3
 */

namespace app\admin\logic;

use think\Db;
use think\Cache;

/**
 * 业务逻辑
 */
class ForeignLogic
{
    public function __construct() 
    {

    }

    /**
     * 更新文档自定义文件名
     * @param  [type] $aid  [description]
     * @param  array  $post [description]
     * @param  string $opt  [description]
     * @return [type]       [description]
     */
    public function update_htmlfilename($aid, $post = [], $opt = 'add')
    {
        if ('add' == $opt) {
            $seo_config = tpCache('seo');
            $seo_pseudo = !empty($seo_config['seo_pseudo']) ? intval($seo_config['seo_pseudo']) : 0;
            if (in_array($seo_pseudo, [2,3])) {
                $foreign_is_status = tpSetting('foreign.foreign_is_status', '', 'cn');
                $seo_titleurl_format = !empty($seo_config['seo_titleurl_format']) ? intval($seo_config['seo_titleurl_format']) : 0;
                if (!empty($foreign_is_status) && !empty($seo_titleurl_format)) {
                    $htmlfilename = $post['htmlfilename'] . $seo_config['seo_title_symbol'] . $aid;
                    Db::name('archives')->where(['aid'=>$aid])->update(['htmlfilename'=>$htmlfilename]);
                }
            }
        }
    }

    /**
     * 获取标题生成外贸链接字符串
     * @param  [type] $post         [description]
     * @param  string $opt          [description]
     * @param  array  $globalConfig [description]
     * @return [type]               [description]
     */
    public function get_new_htmlfilename(&$htmlfilename, $post, $opt = 'add', $globalConfig = [])
    {
        if (empty($globalConfig)) {
            $globalConfig = tpCache('global');
        }
        if (in_array($globalConfig['seo_pseudo'], [2,3])) {
            $foreign_is_status = tpSetting('foreign.foreign_is_status', '', 'cn');
            $seo_titleurl_format = (int)$globalConfig['seo_titleurl_format'];
            if (!empty($foreign_is_status) && !empty($seo_titleurl_format)) {
                $htmlfilename = $this->get_title_htmlfilename(trim($post['title']));
                if ('edit' == $opt) {
                    $htmlfilename .= $globalConfig['seo_title_symbol'] . $post['aid'];
                }
            }
        }
        return $htmlfilename;
    }

    /**
     *  文章标题转成外贸指定格式字母串
     *
     * @param     string $str 字符串信息
     * @param     int $ishead 是否取头字母
     * @param     int $isclose 是否关闭字符串资源
     * @return    string
     */
    public function get_title_htmlfilename($str, $ishead = 0, $isclose = 1)
    {
        $seo_title_symbol = tpCache('seo.seo_title_symbol');
        $str = str_replace(['—'], ' ', $str);
        $str = preg_replace('/(\s+)/i', ' ', $str);
        try{
            $s1 = iconv("UTF-8", "gb2312", $str);
            $s2 = iconv("gb2312", "UTF-8", $s1);
            if ($s2 == $str) {
                $str = $s1;
            }

            static $pinyins = null;
            $restr   = '';
            $str     = trim($str);
            $slen    = strlen($str);
            if ($slen < 2) {
                $str = preg_replace('/([\-\_]+)$/i', '', $str); // 去掉结尾的符号
                return $str;
            }
            if (null === $pinyins) {
                $pinyins = [];
                $fp = fopen(DATA_PATH . 'conf/pinyin.dat', 'r');
                while (!feof($fp)) {
                    $line                         = trim(fgets($fp));
                    $pinyins[$line[0] . $line[1]] = substr($line, 3, strlen($line) - 3);
                }
                fclose($fp);
            }
            for ($i = 0; $i < $slen; $i++) {
                if (ord($str[$i]) > 0x80) {
                    $c = $str[$i] . $str[$i + 1];
                    $i++;
                    if (isset($pinyins[$c])) {
                        if ($ishead == 0) {
                            $restr .= $pinyins[$c];
                        } else {
                            $restr .= $pinyins[$c][0];
                        }
                    } else {
                        $restr .= $seo_title_symbol;
                    }
                } else if (preg_match("/[a-z0-9]/i", $str[$i])) {
                    $restr .= $str[$i];
                } else {
                    $restr .= $seo_title_symbol;
                }
            }
            if ($isclose == 0) {
                unset($pinyins);
            }
            $restr = strtolower($restr);
            $restr = preg_replace('/([\-\_]+)$/i', '', $restr); // 去掉结尾的符号
            $restr = preg_replace('/([\-]+)/i', '-', $restr);
            $restr = preg_replace('/([\_]+)/i', '_', $restr);
            $restr = trim($restr, '-');
            $restr = trim($restr, $seo_title_symbol);
            return $restr;
        }catch (\Exception $e){
            return "";
        }
    }

    /**
     * 批量更新文档的自定义文件名、SEO描述等
     * $achievepage 已完成文档数
     * $batch       是否分批次执行,true:分批,false:不分批
     * limit        每次执行多少条数据
     */
    public function batchHandelUpdate($handle_type, $achievepage = 0, $batch = true, $limit = '')
    {
        $msg                  = "";
        $result               = $this->getArticleData($handle_type, $achievepage, $limit);
        $info                 = $result['info'];
        $data['allpagetotal'] = $pagetotal = $result['pagetotal'];
        $data['achievepage']  = $achievepage;
        $data['pagetotal']    = 0;

        if ($batch && $pagetotal > $achievepage) {
            $msg .= $msg_temp = $this->batchUpdateAll($handle_type, $info);
            $data['achievepage'] += count($info);
        }

        return [$msg, $data];
    }

    /**
     * 获取详情页数据
     */
    private function getArticleData($handle_type, $offset = 0, $limit = 0)
    {
        empty($limit) && $limit = 500;
        $map = [];
        $allow_release_channel = config('global.allow_release_channel');
        $map['channel'] = ['IN', $allow_release_channel];
        // $map['arcrank'] = ['>=', -1];
        $info = [];
        $list = Db::name('archives')->field("aid,title,channel,htmlfilename,seo_description")
            ->where($map)
            ->order('aid asc')
            ->limit($offset, $limit)
            ->select();
        $arc_arr = [];
        foreach ($list as $key=>$val){
            $info_value = [];
            $info_value['aid'] = $val['aid'];
            $info_value['title'] = trim($val['title']);
            $info_value['htmlfilename'] = $val['htmlfilename'];
            $info_value['seo_description'] = $val['seo_description'];
            $info[] = $info_value;

            $arc_arr[$val['channel']][] = $val['aid'];
        }

        // 总文档数
        $pagetotal = Db::name('archives')->field('aid')->where($map)->count();

        if (in_array('up_seo_desc', $handle_type)) {
            $content_arr = [];
            foreach ($arc_arr as $key => $val) {
                $channeltype_info = model('Channeltype')->getInfo($key);
                $row = Db::name("{$channeltype_info['table']}_content")->where(['aid'=>['IN', $val]])->select();
                foreach ($row as $_k => $_v) {
                    $content_arr[$_v['aid']] = $_v;
                }
            }
            foreach ($info as $key=>$val){
                $val['content'] = empty($content_arr[$val['aid']]) ? '' : htmlspecialchars_decode($content_arr[$val['aid']]['content']);
                $info[$key] = $val;
            }
        }

        return ['info' => $info, 'pagetotal' => $pagetotal];
    }

    /*
     * 更新文档的自定义文件名、SEO描述
     */
    private function batchUpdateAll($handle_type, $result)
    {
        $msg = "";
        $globalConfig = tpCache('global');
        $update = [];
        foreach ($result as $key => $val) {
            $update[$key] = [
                'aid' => $val['aid'],
            ];
            if (in_array('up_htmlfilename', $handle_type)) {
                $htmlfilename = $this->get_new_htmlfilename($val['htmlfilename'], $val, 'edit', $globalConfig);
                $update[$key]['htmlfilename'] = $htmlfilename;
            }
            if (in_array('up_seo_desc', $handle_type)) {
                $seo_description = @msubstr(checkStrHtml($val['content']), 0, get_seo_description_length(), false);
                $update[$key]['seo_description'] = $seo_description;
            }
        }
        $archivesModel = new \app\admin\model\Archives;
        $r2 = $archivesModel->saveAll($update);
        if ($r2 !== false) {
            
        } else {
            $msg .= '<span>' . '更新失败!' . $e->getMessage() . '</span><br>';
        }

        return $msg;
    }
}