Loading... 这里简单统计一下群里反馈出来的问题 ## 1.文章预览大图 今天在模板的交流群看到了这么一个问题  复现就不截图了,可以自己尝试一下,这个老哥也提出了自己想到的解决方案:去数据库删,这是个斩草除根的方法,但是很麻烦,不实用;我也想到一个方法,在外链里面填一个0或者空格,让他无法正常载图,但是这样会有一个问题就是文章会有一个图片的框空在那里,不好看  那么想想这个Bug的触发过程:输入大图外链->提交保存->删除外链后再次提交->外链无法正常删除。那么可以推测,问题应该是出在删除外链后保存的环节上,打开了模板的文件看了一下,感觉不太能看懂,于是看看Typecho的代码,找到了这个:`/var/Widget/Base/Contents.php`  这是文章页面的函数,找到了关于自定义字段的保存函数,通过阅读模板的文件可以知道设置列表大图的功能是通过自定义字段实现的,那么我们从这里面下手,就应该可以解决这个问题了。  找到`$this->setField($name, $type, $value, $cid);` 在他前面添加如下代码: ```php // 删除空字段 if(empty($value)){ $this->db->query($this->db->delete('table.fields') ->where('cid = ? AND name = ?', $cid, $name)); continue; } ``` 保存,然后进入文章将大图修改为0,就能触发if判断,即可删除这个字段的内容,简单的尝试一下  可删除首页大图,亦可正常添加外链。 ## 2.附件 添加下载附件后显示异常  根据提示找到这个文件`/freewind/include/file.php`,在第22行找到`<?php echo $fileItem[name] ?></div>`  不难发现这里的`name`没有加引号,不能正常引用数据,手动加上引号即可   ## 3.首页导航链接 这个问题我之前也发现了,以为是偶发问题就没有写到这个文章里,今天早上看到群里有人在反馈那就说明不是我的问题,这里就简单写一下修复思路  如上图,触发的过程是:点击首页左侧添加的页面链接(假设添加的链接为`https://123.abc.com`)→跳转地址最后是形如`https://abc.com/ttps://123.abc.com`的链接,不难发现链接被加上了一个博客站的前缀,并且添加链接开头的`h`不见了,删去`https`重新添加也是这样的,链接前面的`123`的`1`不见了。 那么可以推断出问题肯定是出在模板的header或者sidebar部分,进入模板源码寻找相关代码 在`/freewind/include`文件夹下找到了`header.php`找到如下两段代码 ```PHP // 第一段269-271行,这一段是首页导航里面的链接 <a <?php echo (!$this->is('post') && strpos($_SERVER['REQUEST_URI'], $nav['url']) > -1) ? ' class="nav-active"' : '' ?> href="<?php echo strpos($nav['url'], 'http') == 0 ? $this->options->siteUrl() . (strpos('/', $nav['url']) == 0 ? substr($nav['url'], 1) : $nav['url']) : $nav['url'] ?>" <?php echo $nav['target'] == NavigationExtend::TARGET_NEW ? ' target="_blank"' : '' ?>> // 第二段321-322行,这一段是首页“页面”中的链接 <a href="<?php echo strpos($page['url'], 'http') == 0 ? $this->options->siteUrl() . (strpos( $page['url'],'/') == 0 ? substr($page['url'], 1) : $page['url']) : $page['url'] ?>" <?php echo $page['target'] == NavigationExtend::TARGET_NEW ? ' target="_blank"' : '' ?>> ``` 笔者并没有系统学习过PHP,但是根据自己的一点编程经验和搜索大概可以简单分析一下这两段代码的大概思路(下面仅简单分析第一段代码,如有错误请在评论区指正!) ```PHP // 一点一点来看看这一段代码 <a <?php echo (!$this->is('post') && strpos($_SERVER['REQUEST_URI'], $nav['url']) > -1) ? ' class="nav-active"' : '' ?> // 上面这一段是从服务器中抽取对应的记录,找到其中'url'对应的字段 href="<?php echo strpos($nav['url'], 'http') == 0 ? $this->options->siteUrl() . (strpos('/', $nav['url']) == 0 ? substr($nav['url'], 1) : $nav['url']) : $nav['url'] ?>" // 这里是定义整个<a>标签指向的地址,这里使用一个三元运算符对抽取的'url'进行一个判断,如果url中没有有'http'(不在链接最前面),则执行 $this->options->siteUrl() . (strpos('/', $nav['url']) == 0 的判断 // 这里作者应该是想判断url中是否有'/'字符,写反了,给他改正过来 //如果'/'字符在最链接最前面,则输出siteUrl.substr($nav['url'], 1),就会出现上面的那种情况,如果包含'/'则输出url原本的地址,这里我的表达可能不是太清楚,但是是作者的逻辑写错了 // 我理解的作者思路就是,如果你填写形如 '/friends.html' 的地址则自动加上本站的前缀,如果输入的是 'http://abc.com' 或 'abc.com' 则不做处理 <?php echo $nav['target'] == NavigationExtend::TARGET_NEW ? ' target="_blank"' : '' ?>> // 最后这一行没啥好说的,就是读取设置是否在新页面打开链接 ``` 那么根据以上思路进行修改得到如下代码 ```php // 第一段的270行 href="<?php echo strpos($nav['url'], 'http') !== false ? $nav['url'] : (strpos($nav['url'], '/') !== false ? ($this->options->siteUrl().substr($nav['url'], 1)) : $nav['url']) ?>" // 第二段的321行 <a href="<?php echo strpos($page['url'], "http") !== false ? $page['url'] : (strpos($page['url'],"/") !== false ? ($this->options->siteUrl().substr($page['url'], 1)) : $page['url'])?>" ``` 修改完成保存后在主页刷新即可。 {fwalert type="warning"}注意:修改后的代码在本地运行时是正常的,但在博客中,第二个判断并不能正确识别到 '/' 字符,一切不以 'http' 开头的链接均会被加上本站的链接{/fwalert}  本地运行结果  在博客中 最后修改:2022 年 11 月 20 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏