fastadmin关于cms插件后台栏目列表内容列表中文章链接指向404的调整方案

  • 内容
  • 评论
  • 相关

fastadmin cms后台管理,栏目列表中的 url前台地址指向, 以及内容管理中 标题前台地址指向 都不能很好的链接到前台的地址上,原因之一是因为地址中使用的是后台的入口地址.所以修复方案如下:

为了减少对其他模块代码的污染,所以不直接修改核心函数,而是在公共函数文件 common.php 中新建了一个同功能不同名称的函数,并做了入口地址调整,代码如下:

#.../admin/common.php 新建新的函数
function backtofren_url($url, $vars = [], $suffix = true, $domain = false)
{
    $url = ltrim($url, '/');
    $addon = substr($url, 0, stripos($url, '/'));
    if (!is_array($vars)) {
        parse_str($vars, $params);
        $vars = $params;
    }
    $params = [];
    foreach ($vars as $k => $v) {
        if (substr($k, 0, 1) === ':') {
            $params[$k] = $v;
            unset($vars[$k]);
        }
    }
    $val = "@addons/{$url}";
    $config = get_addon_config($addon);
    $dispatch = think\Request::instance()->dispatch();
    $indomain = isset($dispatch['var']['indomain']) && $dispatch['var']['indomain'] ? true : false;
    $domainprefix = $config && isset($config['domain']) && $config['domain'] ? $config['domain'] : '';
    $rewrite = $config && isset($config['rewrite']) && $config['rewrite'] ? $config['rewrite'] : [];
    if ($rewrite) {
        $path = substr($url, stripos($url, '/') + 1);
        if (isset($rewrite[$path]) && $rewrite[$path]) {
            $val = $rewrite[$path];
            array_walk($params, function ($value, $key) use (&$val) {
                $val = str_replace("[{$key}]", $value, $val);
            });
            $val = str_replace(['^', '$'], '', $val);
            if (substr($val, -1) === '/') {
                $suffix = false;
            }
        } else {
            // 如果采用了域名部署,则需要去掉前两段
            if ($indomain && $domainprefix) {
                $arr = explode("/", $val);
                $val = implode("/", array_slice($arr, 2));
            }
        }
    } else {
        // 如果采用了域名部署,则需要去掉前两段
        if ($indomain && $domainprefix) {
            $arr = explode("/", $val);
            $val = implode("/", array_slice($arr, 2));
        }
        foreach ($params as $k => $v) {
            $vars[substr($k, 1)] = $v;
        }
    }
    \think\Url::root('/'); //此处是添加的调整入口地址的代码
    return url('/'.$val, [], $suffix, $domain) . ($vars ? '?' . http_build_query($vars) : '');
}

然后修改对应模型中访问地址生成的代码

#.../model/Archives.php
public function getUrlAttr($value, $data)
{
    $diyname = $data['diyname'] ? $data['diyname'] : $data['id'];
    return backtofren_url('cms/archives/index', [':id' => $data['id'], ':diyname' => $diyname, ':channel' => $data['channel_id']]); //此处使用了新的函数
}

如果你遇到同样的问题,希望这个能对你有所帮助.


扫一扫与互动
  微信公众号码:kelebl
  微信公众号名称:科勒巴黎