生成seo文件类

生成seo文件类

<?php defined('SYSPATH') or die('No direct script access.');

class Model_Seo extends Model_Common_Common {

    var $site;//网站地址
    var $directory;//sitemap xx.txt文件存放目录
    var $xml_name;//网站地图xml的名字
    var $num;//每个文件存$num条连接,超出$num的另起一个文件
    
    public function __construct()
    {
        $this->site ='http://www.020yix.cn';
        $this->directory ='sitemap';
        $this->xml_name='sitemap_index.xml';
        $this->num=2000;
    }

    /*创建站点地图文件 xx.txt 或者 xx.xml*/
    function create_sitemap($data)
    {
        $url=isset($data['url'])?$data['url']:"list";
        $flag=isset($data['flag'])?$data['flag']:'txt';//取值txt或者xml

        $res=array();

        switch($url)
        {
            case 'list' :
                $res=DB::select(array('cat_id','id'))->from('category')->where('is_show','=',1)->execute()->as_array();

                break;
            case 'item' :

                $res=DB::select(array('goods_id','id'))->from('goods')->where('is_delete','=',0)
                    ->and_where('is_alone_sale','=',1)->execute()->as_array();

                break;
            case 'help' :

                $cat=DB::select('cat_id')->from('article_cat')->where('parent_id','=',3)->execute()->as_array();

                 foreach($cat as $v)
                 {
                      $cat_list[]=$v['cat_id'];
                 }
                 $res=DB::select(array('article_id','id'))->from('article')->where('cat_id','in',$cat_list)->execute()->as_array();
               
                break;
            case 'particular':

                $res=DB::select(array('goods_id','id'))->from('goods')->where('is_delete','=',0)
                    ->and_where('is_alone_sale','=',1)->execute()->as_array();

                break;
            case 'drawing':

                $res=DB::select(array('goods_id','id'))->from('goods')->where('is_delete','=',0)
                    ->and_where('is_alone_sale','=',1)->execute()->as_array();

                 break;

        }
        if(empty($res)){return;}

        $data['res']=$res;
        if($flag=='txt')
        {   $this->directory ='sitemap2';
            $this->create_txt_sitemap($data);
        }
        elseif($flag=='xml')
        {
            $this->create_xml_sitemap($data);
        }
    }


    /*创建txt类型的站点地图文件*/
    function create_txt_sitemap($data)
    {
        $url=$data['url'];
        $res=$data['res'];
        $num=$this->num;
        $directory=$this->directory;
        $site=$this->site;

        if(empty($res)){return;}

        $pages = ceil(count($res)/$num);

        do{    

        $file_name=$directory.DIRECTORY_SEPARATOR.$url.$pages.".txt";//DIRECTORY_SEPARATOR系统目录分隔符

        $fp = fopen($file_name, 'w+');//写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之
    
        foreach($res as $k=>$vv)
        {
            
            if(($pages-1)*$num<=$k and $k<($pages*$num))
            {

                $string=$site."/".$url."-".$vv['id'].".html  ";

                for ($written = 0; $written < strlen($string); $written += $fwrite)
                {
                    $fwrite = fwrite($fp, substr($string, $written));

                    if ($fwrite === false)
                    {
                        fclose($fp);
                    }

                }

          }

        }

        fclose($fp);

        $pages--;

        }while($pages>0);
    
    }

    /*创建xml类型的站点地图*/
    function create_xml_sitemap($data)
    {
        $url=$data['url'];
        $res=$data['res'];
        $directory=$this->directory;
        $num=$this->num;
        $site=$this->site;
        if(empty($res)){return;}
        $allnum=count($res);
        $pages = ceil($allnum/$num);
        $time=time();
        $now_time=date('Y-m-d',$time);
        $flag=false;

        do{    
        $file_name=$directory.DIRECTORY_SEPARATOR.$url.$pages.".xml";//DIRECTORY_SEPARATOR系统目录分隔符
        $flag=true;
        $fp = fopen($file_name, 'w');//写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之
        foreach($res as $k=>$vv)
        {    
            if(($pages-1)*$num<=$k and $k<($pages*$num))
            {
                $string="";
                if($flag)
                {
                    $string.='<?xml version="1.0"  encoding="UTF-8"?>
                    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
                    $flag=false;    
                }

                $string.='<url><loc>'.$site."/".$url."-".$vv['id'].".html</loc>";
                $string.='<lastmod>'.  $now_time.'</lastmod>';
                if($url=='list')
                {
                    $string.='<changefreq>weekly</changefreq>';
                    $string.='<priority>0.9</priority></url>';
                }
                elseif($url=='item')
                {
                   $string.='<changefreq>daily</changefreq>';
                   $string.='<priority>0.8</priority></url>';                    
                }
                else
                {
                    $string.='<changefreq>daily</changefreq>';
                    $string.='<priority>0.7</priority></url>';    
                }

                if($k==($pages*$num)-1 or ($k+1)==$allnum)
                {
                  $string.="</urlset>";

                }

                for ($written = 0; $written < strlen($string); $written += $fwrite)
                {
                    $fwrite = fwrite($fp, substr($string, $written));

                    if ($fwrite === false)
                    {
                        fclose($fp);
                    }
                }
          }

        }

        fclose($fp);

        $pages--;

        }while($pages>0);
    

    }

/*遍历文件夹文件列表,并返回该文件夹的文件目录*/
   function list_file($path="sitemap")
   {
               $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
               static $file_arr=array();

                while(($file = readdir($current_dir)) !== false)
                {   
                    
                    //readdir()返回打开目录句柄中的一个条目
                    $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
                    if($file == '.' || $file == '..')
                    {
                        continue;
                    }
                    else if(is_dir($sub_dir))
                    {    //如果是目录,进行递归
                        $this->list_file($sub_dir);
                    }
                    else
                    {    //如果是文件,直接输出
                        $ar['path']=str_replace('\\','/',$path);
                        $ar['file']=$file;
                        $ar['url']=$ar['path']."/".$file;
                        $file_arr[]=$ar;
                    }


                }
        
    return $file_arr;
    
  }


  /*根据地图文件夹文件数据$arr创建sitemap_index.xml*/
  function update_sitemap_xml($data)
  {
      $arr=isset($data['arr'])?$data['arr']:'';//网站地图文件夹,xx.txt实际文件目录
      $xml_file_name=$this->xml_name;

      $site=$this->site;

      if($arr=='')
      {
          return ;  
      }
      $time=time();
      $now_time=date('Y-m-d',$time);

      $fp = fopen($xml_file_name, 'w');

      $coun=count($arr);

          foreach($arr as $k=>$vv)
        {
            
            $string='';
            if($k==0)
            {
                $string='<?xml version="1.0" encoding="UTF-8"?><sitemapindex>';
            
            }

            $item_string='<sitemap><loc>'.$site.'/'.$vv['url'].'</loc><lastmod>'.$now_time.'</lastmod></sitemap>';


            $string=$string.$item_string;

            if(($k+1)==$coun)
            {
                $string.='</sitemapindex>';
            }

            for ($written = 0; $written < strlen($string); $written += $fwrite)
            {
                $fwrite = fwrite($fp, substr($string, $written));

                if ($fwrite === false)
                {
                    fclose($fp);
                }

            }

        }

        fclose($fp);

  }


      /*更新站点地图sitemap_index.xml 的lastmod节点时间为当前时间*/
    function update_sitemap_time($data=array())
    {
        $file=isset($data['file'])?$data['file']:'sitemap_index.xml';

        $xml = new DOMDocument();
        $xml->load($file);
        $time=time();

        $now_time=date('Y-m-d',$time);
        foreach($xml->getElementsByTagName('lastmod') as $list)
        {
            $value = $list->nodeValue;

            if($value !=$now_time)//属性中的原内容
            {
                $list->nodeValue = $now_time;
            }
        }

        $xml->save($file);//保存

   }

 

} // End Index