'与Blog设置中的"文章列表数目"相同','b'=>'单独设定文章列表数目'),
'a','文章数目选项');
$form->addInput($numset->multiMode());
$rndnum = new Typecho_Widget_Helper_Form_Element_Text('rndnum', NULL, '10', _t('随机文章列表数目'));
$rndnum->input->setAttribute('class', 'mini');
$form->addInput($rndnum->addRule('required', _t('必须填写文章列表数目'))
->addRule('isInteger', _t('文章数目必须是纯数字')));
$rndtime = new Typecho_Widget_Helper_Form_Element_Text('rndtime', NULL, '60', _t('随机列表缓存时间'),_t('缓存时间单位为秒,设为0则禁用缓存'));
$rndtime->input->setAttribute('class', 'mini');
$form->addInput($rndtime->addRule('isInteger', _t('缓存时间必须是整数')));
$rndlen = new Typecho_Widget_Helper_Form_Element_Text('rndlen', NULL, '0', _t('随机标题长度'),_t('这里设置截取的长度值,标题过长可能会影响版面,默认为0则不截取。'));
$rndlen->input->setAttribute('class', 'mini');
$form->addInput($rndlen->addRule('isInteger', _t('标题长度必须是整数')));
$listnum = new Typecho_Widget_Helper_Form_Element_Text('hotnum', NULL, '10', _t('热门文章列表数目'));
$listnum->input->setAttribute('class', 'mini');
$form->addInput($listnum->addRule('required', _t('必须填写文章列表数目'))
->addRule('isInteger', _t('文章数目必须是纯数字')));
$title_len = new Typecho_Widget_Helper_Form_Element_Text('hotlen', NULL, '0', _t('热门列表标题长度'),_t('这里设置截取的长度值,标题过长可能会影响版面,默认为0则不截取。'));
$title_len->input->setAttribute('class', 'mini');
$form->addInput($title_len->addRule('isInteger', _t('标题长度必须是整数')));
$mode= new Typecho_Widget_Helper_Form_Element_Radio('mode',
array( 'all' => '所有分类',
'manul' => '选择分类'),
'all', '随机日志列表');
$form->addInput($mode);
$db1 = Typecho_Db::get();
$test = $db1->fetchAll($db1
->select('table.metas.mid', 'table.metas.name')->from('table.metas')
->where('table.metas.type = ?', 'category'));
$a = array();
foreach($test as $item){
$a[$item['mid']]=($item['name']);
}
$category = new Typecho_Widget_Helper_Form_Element_Checkbox('category',
$a,array(),
_t('分类显示随机日志'));
$form->addInput($category->multiMode());
$file = new Typecho_Widget_Helper_Form_Element_Text('file', null, '/usr/ArticleList.xml', _t('缓存文件存放位置'), _t('请确保随机列表缓存文件存放的目录可写!'));
$form->addInput($file);
}
public static function personalConfig(Typecho_Widget_Helper_Form $form) {}
/**
*输出热门列表
*
* @param string $format
*/
public static function hot($format='
[{commentsNum}]{title}'){
$option = Typecho_Widget::widget('Widget_Options')->plugin('ArticleList');
if ($option->numset == 'a'){
$num = Typecho_Widget::widget('Widget_Options')->postsListSize;
}else{
$num = $option->hotnum;
}
$db = Typecho_Db::get();
$rst = $db->fetchAll($db->select('cid','title','slug','created','type','commentsNum')->from('table.contents')
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', 'post')
// ->where('created > ?',$option->gmtTime + $option->timezone - 180*24*3600) //热评收录范围:180天内(可修改对应数字,去掉本行开头两斜杠生效)
->order('table.contents.commentsNum',Typecho_Db::SORT_DESC)
->limit($num));
foreach($rst as $result){
$result['text'] = ''; //fix php5.6 warning
$value = Typecho_Widget::widget('Widget_Abstract_Contents')->push($result);
$title = $option->hotlen ? self::cutstr($value['title'],$option->hotlen) : $value['title'];
echo str_replace(array('{permalink}','{title}','{commentsNum}'),array($value['permalink'],$title,$value['commentsNum']),$format);
}
}
/**
* 输出随机列表
*
* @param string $format 输出格式
*/
public static function random($format='{title}'){
$option = Typecho_Widget::widget('Widget_Options')->plugin('ArticleList');
/**缓存文件*/
$file = '.'.$option->file;
/**获取日志列表数目*/
if ($option->numset == 'a'){
$randomNum = Typecho_Widget::widget('Widget_Options')->postsListSize;
}else{
$randomNum = $option->rndnum;
}
/**处理随机列表*/
$xml1=@simplexml_load_file($file);
/**可以直接返回xml对象*/
if($xml1 && $option->rndtime!=0 && time()-$xml1->attributes()<$option->rndtime){
foreach($xml1->rd as $rd)
{
echo str_replace(array('{permalink}','{title}'),array($rd->link,$rd->title),$format);
}
}else{ //读取数据库,判断是否输出或是更新缓存
/**获取数据库连接*/
$db=Typecho_Db::get();
/**获取日志总数*/
if($option->mode == 'all'){
$rs = $db->fetchRow($db->select(array('COUNT(cid)' => 'total'))->from('table.contents')
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', 'post'));
}else{
$category = implode(",", $option->category);
$sql = 'table.relationships.mid in ('.$category.')';
$rs = $db->fetchRow($db->select(array('COUNT(table.contents.cid)' => 'total'))->from('table.contents')
->join('table.relationships', 'table.relationships.cid = table.contents.cid',Typecho_Db::INNER_JOIN)
->where('table.contents.status = ?', 'publish')
->where($sql));
}
$total=$rs['total'];
/**设置随机数组*/
srand((float) microtime() * 10000000);
$ary=range(0,$total-1);
if($randomNum>$total) $randomNum=$total;
$rand = array_rand($ary, $randomNum);
$list = '';
$xml = new SimpleXMLElement($list);
$xml->addAttribute('time', time());
if($option->mode == 'all'){
foreach($rand as $index){
$result = $db->fetchRow($db->select('cid','title','slug','created','type')->from('table.contents')
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', 'post')
->offset($index)
->limit(1));
$result['text'] = ''; //fix php5.6 warning
$value = Typecho_Widget::widget('Widget_Abstract_Contents')->push($result);
$title = $option->rndlen ? self::cutstr($value['title'], $option->rndlen ) : $value['title'];
echo str_replace(array('{permalink}', '{title}'), array($value['permalink'], $title), $format);
$rd=$xml->addChild('rd');
$rd->addChild('title',$title);
$rd->addChild('link',$value['permalink']);
}
}else{
foreach($rand as $index){
$result = $db->fetchRow($db->select('table.contents.cid', 'table.contents.title','table.contents.created', 'table.contents.slug', 'table.contents.type')->from('table.contents')
->join('table.relationships', 'table.relationships.cid = table.contents.cid',Typecho_Db::INNER_JOIN)
->where('table.contents.status = ?', 'publish')
->where($sql)
->offset($index)
->limit(1));
$result['text'] = ''; //fix php5.6 warning
$value = Typecho_Widget::widget('Widget_Abstract_Contents')->push($result);
$title = $option->rndlen ? self::cutstr($value['title'], $option->rndlen ) : $value['title'];
echo str_replace(array('{permalink}', '{title}'), array($value['permalink'], $title), $format);
$rd=$xml->addChild('rd');
$rd->addChild('title',$title);
$rd->addChild('link',$value['permalink']);
}
}
if($option->rndtime!=0)file_put_contents($file, $xml->asXML());
}
}
/**
*字符串截断
*
* @param string $string
* @param interger $length
* @return string
*/
private static function cutstr($string, $length) {
$wordscut='';
$j=0;
preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $string, $info);
for($i=0; $i 127 ? $j + 2 : $j + 1;
if ($j > $length - 3) {
return $wordscut." ...";
}
}
return join('', $info[0]);
}
}
?>