非插件实现Emlog时间轴归档代码分享 emlog

文件缓存型时间轴归档,后台更新缓存或者发布新文章的时候会自动更新;本站这个代码是使用缓存系统的,是需要修改内核文件的。慎用!

1、修改include/lib/cache.php文件,添加归档缓存函数


<pre style="overflow:auto" ;class="prettyprint lang-php linenums">private $logalias_cache;
之后添加
private $loglists_cache;

添加在其他缓存函数位置添加归档缓存


<pre style="overflow:auto" ;class="prettyprint lang-php linenums"> /** 文章归档列表缓存 /
private function mc_loglists() {
$query = $this->db->query('select gid,title,date from ' . DB_PREFIX . "blog WHERE hide='n' and checked='y' and type='blog' ORDER BY date DESC");
$loglists_cache = array();
while ($row = $this->db->fetch_array($query)) {
$loglists_cache[]= $row;
}
$cacheData = serialize($loglists_cache);
$this->cacheWrite($cacheData, 'loglists');
}
不懂的朋友只请直接下载本文件覆盖include/lib/cache.php(请做好备份)cache.zip

2、此方法因不同的模板修改的有所差异,本站讲述以默认模板为例,首先复制模板目录下的page.php并重新命名为guidang.php(ps:这个自己可自行修改),把其中的<?php echo $log_content; ?>更改为如下代码即可



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><div class="guidang">
<?php
global $CACHE;
$loglists_cache = $CACHE->readCache('loglists');
$year_month = 0;
foreach($loglists_cache as $value):
if($year_month != 0&&$year_month != date("Y-m",$value['date'])){
echo '</ul>';}
if($year_month != date("Y-m",$value['date'])){
$year_month = date("Y-m",$value['date']);
echo '<h2 class="guidang-tt">'.$year_month.'</h3><ul>';}
?>
<li><a href="<?php echo Url::log($value['gid']);?>" target="_blank" title="<?php echo $value['title']; ?>"><span><?php echo date("Y-m-d",$value['date']);?></span><div class="atitle"><?php echo $value['title'];?></div></a></li>
<?php endforeach;?></div>
css文件如下



<pre style="overflow:auto" ;class="prettyprint lang-css linenums">.guidang h2{font-size:150%;}
.guidang li a{padding:8px 0;display:block}
.guidang li a:hover .atitle:after{background:#ff5c43}
.guidang li a span{display: inline-block;width:100px;font-size:12px;text-indent:20px}
.guidang li a .atitle{display: inline-block;padding:0 15px;position:relative;width:550px;white-space:nowrap;text-overflow:ellipsis;}
.guidang li a .atitle:after{position:absolute;left:-2px;background:#ccc;height:8px;width:8px;border-radius:6px;top:8px;content:""}
.guidang li a .atitle:before{position:absolute;left:-4px;background:#fff;height:12px;width:12px;border-radius:6px;top:6px;content:""}
.guidang{margin:10px;position:relative;padding:10px 0}
.guidang:before{height:100%;width:4px;background:#eee;position:absolute;left:100px;content:"";top:0}
.guidang-tt{position:relative;margin:10px 0;cursor:pointer}
.guidang-tt:hover:after{background:#ff5c43}
.guidang-tt:before{position:absolute;left:93px;background:#fff;height:18px;width:18px;border-radius:6px;top:3px;content:""}
.guidang-tt:after{position:absolute;left:96px;background:#ccc;height:12px;width:12px;border-radius:6px;top:6px;content:""}


然后建立一个页面,在页面模板处填写 guidang 即可,演示地址:https://mrxn.net/guidang.html



标签: emlog

admin 发布于  2015-8-2 15:17 

Emlog判断首页与列表页的方法分享 emlog

判断首页函数的方法下(ps:测试5.3.1版本正常使用)

1、在模版文件module.php最低部加入如下代码


<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php //判断是否是首页
function blog_tool_ishome(){if (BLOG_URL . trim(Dispatcher::setPath(), '/') == BLOG_URL){ return true; } else { return FALSE;}}?>
2、判断方法示例



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php if (blog_tool_ishome()) :?>加载的文件代码<?php endif; ?>
如果在首页不需要加载日志列表部分。则应用如下:



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php if (blog_tool_ishome()) :?>
<?php include View::getView('index');?>
<?php else:?>
加载日志列表部分
<?php endif;?>


标签: emlog

admin 发布于  2015-8-2 15:17 

实现分类、tag、作者标题像文章标题一样可在后台SEO设置里面控制 emlog

找到根目录文件include/controller/sort_controller.php,将其中的


$site_title = $sortName . ' - ' . $site_title;


替换成


<pre style="overflow:auto" ;class="prettyprint lang-php linenums">switch ($log_title_style) {
case '0':$site_title = $sortName;break;
case '1':$site_title = $sortName . ' - ' . $blogname;break;
case '2':$site_title = $sortName . ' - ' . $site_title;break;
}
这样即可实现分类标题像文章标题一样可在后台 SEO设置里面控制。(PS更改之前请先备份,以免造成不必要的损失)


标签标题实现的方法,找到根目录文件include/controller/tag_controller.php,将其中的

$site_title = stripslashes($tag) . ' - ' . $site_title;

替换成



<pre style="overflow:auto" ;class="prettyprint lang-php linenums">switch ($log_title_style) {
case '0':$site_title = stripslashes($tag); break;
case '1':$site_title = stripslashes($tag) . ' - ' . $blogname;break;
case '2':$site_title = stripslashes($tag) . ' - ' . $site_title;break;
}
作者标题实现的方法,找到根目录文件include/controller/author_controller.php,将其中的

$site_title = $author_name . ' - ' . $site_title;

替换成



<pre style="overflow:auto" ;class="prettyprint lang-php linenums">switch ($log_title_style) {
case '0':$site_title = $author_name; break;
case '1':$site_title = $author_name . ' - ' . $blogname;break;
case '2':$site_title = $author_name . ' - ' . $site_title;break;
}
emlog 5.3.1版本测试无bug,其他版本未做测试。



标签: emlog

admin 发布于  2015-8-2 15:17 

不修改内核实现Emlog分页的上页、下页效果 emlog

本文章总结了很多种不同的关于emlog修改分页样式(分页函数)方法,下面我来给各位整理一下,有需要自行修改emlog分页样式的同学可参考参考。

    不修改内核实现emlog分页的上页、下页效果

1、先在你使用的模板的module.php文件中增加自定义的分页函数,代码如下:


<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php
//blog:自定义分页函数
function my_page($count, $perlogs, $page, $url, $anchor = '') {
$pnums = @ceil($count / $perlogs);
$re = '';
$urlHome = preg_replace("|[?&/][^./?&=]*page[=/-]|", "", $url);
if($page > 1) {
$i = $page - 1;
$re = ' <a href="'.$url.$i.'">上页</a> ' . $re;
}
if($page < $pnums) {
$i = $page + 1;
$re .= ' <a href="'.$url.$i.'">下页</a> ';
}
return $re;
}
?>
2、在调用分页的地方(一般是log_list.php)文件加入下列代码:



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php $page_loglist = my_page($lognum, $index_lognum, $page, $pageurl); echo $page_loglist; ?>
3、若碎语页面也要调用修改过的分页样式,则在t.php文件中加入下列代码:



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php $page_t = my_page($twnum, Option::get('index_twnum'), $page, BLOG_URL.'t/?page='); echo $page_t; ?>
4、module.php评论列表函数调用时用以下代码替换掉原来的分页函数:



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php $page_comment = my_page($comnum, Option::get('comment_pnum'), $page, BLOG_URL.'guestbook/comment-page-'); echo $page_comment;?>


标签: emlog

admin 发布于  2015-8-2 15:16 

给emlog5.3.1版本验证码添加点击刷新功能的方法 emlog

Emlog默认模板下验证码是没有点击刷新功能的,要刷新验证码的话还是得按F5刷新整个页面重新获得验证码,虽然emlog验证码看得比较清楚,但要通过重新刷新网页来获得新的验证码的方法对于网站负荷和用户体验来讲都并不合适,所以有必要给验证码添加点击刷新功能了。

    若要给emlog验证码添加点击刷新功能,还是很简单的,因为emlog的验证码也是img形式存在的,所以和其它类似的验证码一样,为img标签添加onclick属性就行了。

    Emlog有用到验证码的源代码有如下文件:

Emlog碎语:/t/index.php

Emlog评论:/include/controller/log_controller.php

Emlog管理后台登录:include\lib\loginauth.php


将以上文件的验证码位置的img标签添加以下语句即可实现点击刷新验证码功能:


<pre style="overflow:auto" ;class="prettyprint lang-php linenums">style=\"cursor:pointer;\" alt=\"未显示?请点击刷新\" title=\"看不清楚?请点击刷新\" onclick=\"this.src=this.src+'?'\"
如Emlog评论:/include/controller/log_controller.php, 有以下验证码源码:



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><img src=\"".BLOG_URL."include/lib/checkcode.php\" align=\"absmiddle\" /><input name=\"imgcode\" type=\"text\" class=\"input\" size=\"5\" tabindex=\"5\" />
改成如下代码即可添加上点击刷新验证码功能:



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><img src=\"".BLOG_URL."include/lib/checkcode.php\" align=\"absmiddle\" style=\"cursor:pointer;\" alt=\"未显示?请点击刷新\" title=\"看不清楚?请点击刷新\" onclick=\"this.src=this.src+'?'\" /><input name=\"imgcode\" type=\"text\" class=\"input\" size=\"5\" tabindex=\"5\" />
其它几个页面中添加验证码刷新功能方法类似,此略,注:此方法在em5.3.1正常使用,其他版本未测试。



另一种方法,来源于论坛,简爱发布:前提是当前模板要加载过 jQuery,没有的可以自己添加一下,直接在后台 添加统计代码的位置添加即可 (下面的代码 也在此位置添加,适用于全部正规模板)



<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><font size="4" face="黑体">$('img[src="checkcode.php"]') // jQuery 筛选器
.attr('title', '单击刷新验证码') // 添加 title
.click(function(){ // 单击事件
this.src = this.src.replace(/\?.
$/, "") +'?'+ new Date().getTime(); // 重新设置 验证码 图片地址 checkcode.php?r=当前毫秒数
});</font>



admin 发布于  2015-8-2 15:16 

emlog模板调用多个侧边栏教程 emlog

正在写新板子,想尝试一下三栏的,但是不知道如何调用多侧边栏。查了emlog官方文档(5.0 版以后的),可以调用多个多个侧边栏。下面emlog官方文档原文:


<pre style="overflow:auto" ;class="prettyprint lang-js linenums">Sidebar Amount:标记该模板有几个侧边栏,一般为1,有些模板有两个侧边栏则标记2。这样可以在后台widgets里识别管理(具体可下载体验官方收录的模板G7)。
但是如何调用,文档说参考 G7 模板,但是我在应用中心没找到那个那个板子。后来也在emlog官方论坛发帖询问,也没人回答。

于是干脆自己想办法吧。学了这么久的php,这点还不会,那真是白学了。我突然发现我有一个缺点,就是不相信自己的实力,那可能就是自卑吧。总是再找别人的方法, 而自己没有真正去想。其实动脑想了之后,然后动手实践很容易解决。



下面是我的解决方法:

1、申明侧边栏目数

在header.php文件的页头申明栏目数:【Sidebar Amount:3】表示此模板支持三个栏目。看了一下数据库,似乎最多也只能是4个。但是3个已经足够了。

2、设置侧边栏



emlog模板调用多个侧边栏教程

3、调用侧边栏



<pre style="overflow:auto" ;class="prettyprint lang-php linenums">①$widgets = !empty($options_cache['widgets1']) ? unserialize($options_cache['widgets1']) : array(); //原文
②$widgets = !empty($options_cache['widgets2']) ? unserialize($options_cache['widgets2']) : array();//调用侧边栏1
③$widgets = !empty($options_cache['widgets3']) ? unserialize($options_cache['widgets3']) : array();//调用侧边栏2
④$widgets = !empty($options_cache['widgets4']) ? unserialize($options_cache['widgets4']) : array();//调用侧边栏3
将side.php 复制三份并重命名如:side1.php、side2.php、side3.php,然后分别把第①句替换为第②、③、④句。



最后include这三个文件中的任何一个,就可以出现不同的侧边栏。理想情况下,首页(列表页)、文章页、页面(微语)可以分别调用不同的侧边栏。



结语

emlog模板调用多侧边栏教程就是这样,是不是很简单。凡事多动脑,问题就解决了……



标签: emlog

admin 发布于  2015-8-2 15:16 

Emlog程序实现多域名全站访问的方法 emlog

我们很多朋友可能有这样的需要,如果你手上有空余的域名,你也可以试试,让你的emlog支持多域名,只需要修改一个文件,增加几行代码就能够轻松实在多域名支持,理论上是多少域名都没有限制的,当然如果你的emlog使用了静态化插件,那么请你谨慎修改,因为我没有测试过是否对静态化有效,好了,开始动手

第一步: 打开emlog根目录下的 init.php

找到以下代码:

//站点固定地址 define('BLOG_URL', Option::get('blogurl'));

把上面的代码替换成如下代码



<pre style="overflow:auto" ;class="prettyprint lang-php linenums">//define('BLOG_URL', Option::get('blogurl'));
preg_match_all('/{(.*?)}/',Option::get('blogurl') ,$blogurl, PREG_SET_ORDER);
$BLOGURL = explode("|",$blogurl[0][1]);
if( in_array($_SERVER['HTTP_HOST'],$BLOGURL) === true ){
$BLOG_URL_EXP = "http://".$_SERVER['HTTP_HOST']."/";
}else{
$BLOG_URL_EXP = "http://www.shuyong.net/"; //这个域名修改为你的默认域名,
}
define('BLOG_URL', $BLOG_URL_EXP);


第二步:

打开你的emlog后台 ->设置 ,把站点地址改成如下格式

http://{域名1|域名2|域名3|以此类推}/

把多个域名用 | 隔开 ,理论上是没有限制的,当然前提是你有那么多的域名……

注意:本方法5.3.1正常使用,其他版本未做测试


标签: emlog

admin 发布于  2015-8-2 15:16 

Emlog实现调用分类下第一篇文章图片函数 emlog

Emlog实现调用分类下第一篇文章图片函数分享

效果图大家先看看

的在模板文件下的module.php下添加如下函数


<pre style="overflow:auto" ;class="prettyprint lang-php linenums"><?php //分类文章调用
function sort_log($sortid){
$db = MySql::getInstance();
$sql = $db->query ("SELECT FROM ".DB_PREFIX."blog WHERE sortid='$sortid' AND type='blog' AND hide='n' order by date DESC limit 0,1");
$row = $db->fetch_array($sql);
if (!empty($row['excerpt'])){
preg_match_all("/\<img.
?src\=\"(.?)\"[^>]>/i", $row['excerpt'], $match);
if(empty($match[0][0]))
{preg_match_all("/\<img.?src\=\"(.?)\"[^>]>/i", $row['content'], $match);}
}else{preg_match_all("/\<img.
?src\=\"(.?)\"[^>]>/i", $row['content'], $match);}
$logpost = !empty($row['excerpt']) ? $row['excerpt'] : ''.$row['content'].'';
$num = rand(1,$imgnum);
$img = isset($match[0][0]) ? $match[0][0] : '<img src="'.TEMPLATE_URL.'images/shuyong_net/'.$num.'.jpg">';
$content = strip_tags($logpost,'');
$content = mb_substr($content,0,68,'utf-8');//
$out .='<div class="sort-tw"><div class="sort-img"><a href="'.Url::log($row['gid']).'" title="'.$row['title'].'" >'.$img.'</a></div>
<div class="sort-tt"><a href="'.Url::log($row['gid']).'" title="'.$row['title'].'" >'.$row['title'].'</a></div><div class="sort-nr">'.$content.'...</div></div>
';
$sort_log_num = $sort_log_num -1;
$logs = $db->query ("SELECT * FROM ".DB_PREFIX."blog WHERE sortid='$sortid' AND type='blog' AND hide='n' order by date DESC limit 1,10");//1表示从第2篇文章开始,10为数量
while ($trow = $db->fetch_array($logs)){
$date = gmdate('m-d', $trow['date']);
$trow['title'] = mb_substr($trow['title'],0,180,'utf-8');
$out .='<li><p><a href="'.Url::log($trow['gid']).'" title="'.$trow['title'].'">'.$trow['title'].'</a></p><span>'.$date.'</span></li>
';
}echo $out;}?>
Emlog模板文件log_list.php下使用如下代码

<?php global $CACHE;$sort_cache = $CACHE->readCache('sort'); ?>

<?php echo $sort_cache[1]['sortname'];?>调用分类名称,其中[1]代表分类id

<?php sort_log(1); ?>

最后写上css就ok,css文件自己折腾吧


标签: emlog

admin 发布于  2015-8-2 15:16 

emlog实现全文+标题搜索方法 emlog

emlog官方默认默认搜索引擎,只支持搜索日志标题,我想着应该是处于多方面的考虑,基本各位站长自己的需求,我们还是可以做更改的,只要你的服务器允许的话。

找到文件include/controller/search_controller.php中的以下代码:

$sqlSegment = "and title like '%{$keyword}%' order by date desc"; 

替换为:

【仅全文搜索】

$sqlSegment = "and content like '%{$keyword}%' order by date desc"; 

【标题+全文搜索】


<pre style="overflow:auto" ;class="prettyprint lang-php linenums">$sqlSegment = "and ( title like '%{$keyword}%' or content like '%{$keyword}%' ) order by date desc";
注意:全文检索对服务器会造成一定的压力,特别是你的文章特别多的时候,是不建议的,万一当机了就不好玩了,是吧。


标签: emlog

admin 发布于  2015-8-2 15:16 

emlog模板防止跨站漏洞教程(所有模板作者请务必阅读) emlog

进过我的调查,发现大家贡献很多的模板中都没有对URL中的参数进行必要的过滤,从而给黑客留下跨站攻击的空子。

在这里我举一个典型的例子供大家参考,下面是某个CMS模板输出搜索关键词的代码,

?php }elseif($params[1]=='keyword'){ ?> 关键词 <b><?php echo urldecode($params[2]);?></b> 的搜索结果


注意$params[2]变量没有任何过滤的就直接输出了,而我们可以构造/index.php?keyword=8<img src=1
width=500 height=500 onerror=alert(1)>在页面上运行javascript代码alert(1).
黑客在攻击时可以把alert(1)替换为攻击代码(比如获取访问者的cookie信息)后发给站长。如果站长不小心点了链接,那么黑客就能获取站长登陆
状态的cookie,有了cookie,就能冒充站长登陆站点后台做他想做的任何事情了。


综上所述,为了各位用户的安全着想,请各位模板作者在输出URL参数时使用PHP的htmlspecialchars函数来进行过滤,防止XSS攻击,像上面例子中的代码可以修改为


<pre style="overflow:auto" ;class="prettyprint lang-php linenums">?php }elseif($params[1]=='keyword'){ ?> 关键词 <b><?php echo htmlspecialchars(urldecode($params[2]));?></b> 的搜索结果


最后还是要感谢各位模板的作者为emlog的无私付出,希望这篇教程能给大家做出安全好用的模板提供一定的帮助。



本文来源于emlog论坛,由em管理员:朦胧之影 发布

标签: emlog 跨站

admin 发布于  2015-8-2 15:14