织梦获得新文件名函数GetFileNewName()

admin2020-01-10959

这个函数只有一个地方用到就是在生成html的时候用到,也就是在文档类include/arc.archives.class.php里面。如果没有这个函数也是不行的,虽然,这个函数用到的地方少,所以,我们这里对这个函数进行分析一下,以便以后那一次用到作准备。
  函数名:GetFileNewName($aid,$typeid,$timetag,$title,$ismake=0,$rank=0,$namerule='',$typedir='',$money=0,$filename=''
  所在文件:include/helpers/channelunit.helper.php
  参数: 
* @param     int  $aid  文档ID
* @param     int  $typeid  栏目ID
* @param     int  $timetag  时间戳
* @param     string  $title  标题
* @param     int  $ismake  是否生成
* @param     int  $rank  阅读权限
* @param     string  $namerule  名称规则
* @param     string  $typedir  栏目dir
* @param     string  $money  需要金币
* @param     string  $filename  文件名称
* @return    string
功能:获得文件名(本函数会自动创建目录)
代码分析开始:
不知道大家还记得不,在获取文件名GetFileName()函数里面,有一个条件判断,若阅读权限不为0,消费大于零时,若没有开启伪静态,那么,这个生成的内容页就会是动态网址形式,如下图所示。

360截图20200110210135005.jpg

既然有这种情况,那么,就要处理这种情况,在生成新文件函数里,若遇到这种情况,就直接返回这个文件名。
若$cfg_arc_dirname='Y'(是否允许用目录作为文档文件名),并且以符号"/"结尾的,例如:http://www.dedebase.com/a/webbase/92/形式的文件名,那么,就在这个链接后面加上index.html,
即:http://www.dedebase.com/a/webbase/92/ndex.html,这个功能是由下面的代码来实现的:

        if($cfg_arc_dirname=='Y' && preg_match("/\/$/", $articlename))
        {
            $articlename = $articlename."index.html";
        }

程序接下来查找获取文件名后,文件的路径,代码为:

        $slen = strlen($articlename)-1;
        for($i=$slen;$i>=0;$i--)
        {
            if($articlename[$i]=='/')
            {
                $subpos = $i;
                break;
            }
        }

首先,查询一下获得的文件名的长度,这地方为什么要减1 ? 因为,我们查询出来的有可能类似上面的/a/webbase/92/这样的,如果是这样的我们减法1后,如果从最后开始查斜杠"/",那么,找到的第一个斜杠就是92前面的,这样通过上面for遍历,这个遍历是从最后开始的,当找到第一个'/'时,把$i位置记录在$subpos里面,然后,跳出循环,接行下面的代码。

  $okdir = substr($articlename,0,$subpos);

当执行到这行代码后,程序会截取从0到$i位置的字符串,即,把/a/sebase截取出来,这样程序就可以通过下面的代码:CreateDir($okdir);来创建一个目录了。
可能有的人问,若是函数获得的文件名为:http://www.dedebase.com/plus/view.php?aid=92形式呢?其实是一样的,这个减去10也没有问题。因为最后一个斜杠后面的字符串很长。
然后,返回创建的好的文件名。

网友评论