Oct 17

最新美女
select * from uchome_space s ,uchome_spacefield f where  s.uid=f.uid and sex=2 order by dateline desc limit 0,10

最热美女

select * from uchome_space s ,uchome_spacefield f where  s.uid=f.uid and sex=2 order by viewnum  desc limit 0,10

最新型男

select * from uchome_space s ,uchome_spacefield f where  s.uid=f.uid and sex=1 order by dateline desc limit 0,10

最热型男

select * from uchome_space s ,uchome_spacefield f where  s.uid=f.uid and sex=1 order by viewnum  desc limit 0,10

最新日志

select * from uchome_blog order by dateline desc limit 0,10

最新相册

select * from uchome_album order by dateline desc limit 0,10

随机会员

select * from uchome_space s ,uchome_spacefield f where  s.uid=f.uid order by RAND() desc limit 0,10

人气之星

SELECT * FROM uchome_space ORDER BY viewnum DESC

最新日志

SELECT * FROM uchome_blog FORCE INDEX(dateline) ORDER BY dateline DESC

热点话题

SELECT * FROM uchome_thread ORDER BY dateline DESC

最近3天注册

SELECT * FROM uchome_space WHERE dateline>UNIX_TIMESTAMP()-86400*3 ORDER BY dateline DESC

Oct 17

UCH群组功能增加编辑器。(html+js详解)

 

群组功能发帖时候增加编辑器,其实并不是很复杂,只不过我们要理解,为什么要这样修改代码。

*可能有些听不懂,不过不会影响修改,多学点东西总是好的吧?

 

首先,我们解析一下blog的编辑器。

看模板文件夹下cp_blog.htm里面的这段代码: 

复制内容到剪贴板 

代码:

                                <textarea class=”userData” name=”message” id=”uchome-ttHtmlEditor” style=”height:100%;width:100%;display:none;border:0px”>$blog[message]</textarea>

                                <iframe src=”editor.php?charset=$_SC[charset]&allowhtml=$allowhtml” name=”uchome-ifrHtmlEditor” id=”uchome-ifrHtmlEditor” scrolling=”no” border=”0″ frameborder=”0″ style=”width:100%;border: 1px solid #C5C5C5;” height=”400″></iframe>

第一步呢,我们先要读懂这两行代码:

这就是编辑器的比较核心的部分,用一个隐藏的textarea来提交信息,用js提取框架iframe里面的编辑内容,而iframe里面的部分是编辑器页面。

display:none 表示用css隐藏了textarea,看不到但是提交信息是可以发出去的。

我们会发现,textarea的iduchome-ttHtmlEditor和iframe里面的name和id都很像,对,这两个能合并在一起就是用这个挂钩的,当然,还要借助于js实现。

 

第二步,再看提交的时候,触发了什么,请看这两段代码,还是那个文件。 

复制内容到剪贴板 

代码:

<input type=”button” id=”blogbutton” name=”blogbutton” value=”提交发布” onclick=”validate(this);” style=”display: none;” />

复制内容到剪贴板 

代码:

<input type=”button” id=”issuance” onclick=”document.getElementById(’blogbutton’).click();” value=”保存发布” class=”submit” />

如果刚才认真听课的同学都发现了,“display: none”又一次使用到了隐藏。

但是提交的时候更有趣:

下面的按钮触发的是上面按钮的动作,怎么做到的呢? 

复制内容到剪贴板 

代码:

onclick=”document.getElementById(’blogbutton’).click();” 

这行代码表示在点击的时候,触发一个js事件:document.getElementById(’blogbutton’).click();

而这个事件的js实际上就是点击第一个按钮的动作,等同于触发了第一个按钮的: 

复制内容到剪贴板 

代码:

onclick=”validate(this);” 

这个部分,那么我们就找到了提交的时候,一定会包含处理编辑器的js函数:validate

 

搜索刚才那个文件中的代码,我们很容易找到这段: 

复制内容到剪贴板 

代码:

        function validate(obj) {

            var subject = $(’subject’);

            if (subject) {

                    var slen = strlen(subject.value);

                if (slen < 1 || slen > 80) {

                    alert(”标题长度(1~80字符)不符合要求”);

                    subject.focus();

                    return false;

                }

            }

 

            if($(’seccode’)) {

                        var code = $(’seccode’).value;

                        var x = new Ajax();

                        x.get(’cp.php?ac=common&op=seccode&code=’ + code, function(s){

                                s = trim(s);

                                if(s != ’succeed’) {

                                        alert(s);

                                        $(’seccode’).focus();

                                   return false;

                                } else {

                                        uploadEdit(obj);

                                        return true;

                                }

                        });

            } else {

                    uploadEdit(obj);

                    return true;

            }

        }

这个东西什么意思呢?我们大概看看,我也作简要解释:

function是函数必须的部分,后面表示 validate(obj)函数名和所传递进来的参数。参数是一个对象,所以用obj来命名,不是语法必须,只是比较方便理解。

然后定义了另外一个对象,在函数内部: var subject = $(’subject’);

表示将id为’subject’的部分当作对象给前面的变量,听不懂这些术语没所谓,以后会明白,不会影响这次你学习哦。

 

有这样的对象有啥用啊?

这样的对象可以直接指向某个DOM的节点,更简单的说法是方便操作部分指定的html,哈哈,这样理解了吧?

 

再看这个js函数。我用注释来说明每一行做什么: 

复制内容到剪贴板 

代码:

        function validate(obj) {//创建函数和函数名,声明需要传入什么参数

            var subject = $(’subject’);//设定一个函数内的变量,方便后面用,指向了id为subject的html部分。

            if (subject) {//如果有这个对象,可以理解成,如果有这个html的话

                    var slen = strlen(subject.value);//读取这个html部分的value值的长度

                if (slen < 1 || slen > 80) {//判断长度是否超过80或者小于1.

                    alert(”标题长度(1~80字符)不符合要求”);//提示不合法

                    subject.focus();//将光标焦点放到指定的对象上

                    return false;//返回这个函数的返回值为否(假),目的是告诉浏览器不要继续表单提交了,有问题啦。如果运行到这里,整个函数结束,不再继续运行。但是,刚才的判断部分如果没有进入这个大括号的话,程序继续运行。细节部分参考一下相关描述js函数的书籍或资料,不详细说了。

                }

            }

 

            if($(’seccode’)) {//这个是判断’seccode’部分的,有ajax的部分,跳过大部分,我只简单说,我们直接谈中心部分。

                        var code = $(’seccode’).value;//读取’seccode’的值

                        var x = new Ajax();//创建一个ajax的实例,理解为要做ajax之前的热身,不然程序容易抽筋,那就不能继续了,呵呵

                        x.get(’cp.php?ac=common&op=seccode&code=’ + code, function(s){//将’cp.php?ac=common&op=seccode&code=’ + code作为ajax异步传输读取的地址,返回的是这个地址给的结果,也就是s

                                s = trim(s);//安全处理s

                                if(s != ’succeed’) {//如果s不是’succeed’的话,则运行下面的部分。

                                        alert(s);//警告,内容就是s,估计如果s不是’succeed’的话,会直接返回错误提示。

                                        $(’seccode’).focus();//呵呵,上面见过,将鼠标光标放到’seccode’上。

                                   return false;//返回别继续的指令,刚才说过。

                                } else {//否则运行(也就是说s的内容就是’succeed’)

                                        uploadEdit(obj);//哈哈,bingo~~~就是要照这个,更新编辑器的函数

                                        return true;//告诉浏览器,哈哈,正确了,提交吧,我拿到了编辑器的数据啦~~~

                                }

                        });

            } else {//这两行自己理解一下,自己看看括号是哪里的if和else,如果不知道if-else是什么,参考我之前发过的教程。

                    uploadEdit(obj);

                    return true;

            }

        }

这样我们就找到要得部分了,估计现在有些朋友会晕了,“改一个编辑器这么麻烦啊?”

是啊,如果你熟练的话,其实也不会特别麻烦,所以提醒某些喜欢免费的朋友,无论大家分享什么东西,都要懂得感恩,很多细节的部分你是看不到的,但是很有可能人家用心坐了很久,扯远了,我们继续哦

 

找到刚才那个地方,也就是uploadEdit(obj);

这还不够,你并不了解他具体是怎么运行的,确认一下,看看他在那里呢?

 

找了这个文件没有发现声明这个函数的部分,也就是没有找到 function uploadEdit

 

再看看代码,发现这个: 

复制内容到剪贴板 

代码:

<script language=”javascript” src=”image/editor/editor_function.js”></script>

*html中包含js的一种方法,具体参考html相关书籍和资料

 

好,开心吧,为什么呢?因为这个就是编辑器js的函数集文件了,马上打开看看吧,很快找到(第一个函数就是啊): 

复制内容到剪贴板 

代码:

function uploadEdit(obj) {

        mainForm = obj.form;

        forms = $(’attachbody’).getElementsByTagName(”FORM”);

        albumid = $(’uploadalbum’).value;

        edit_save();

        upload();

}

edit_save();???这个就是保存编辑器内容的东西吧,答对,加十分,哈哈

 

我们拿出来这个函数直接用,因为刚才那个文件已经引用过这个文件了,也就是刚才那句代码: 

复制内容到剪贴板 

代码:

<script language=”javascript” src=”image/editor/editor_function.js”></script>

怎么直接用,估计你也会了,复制,粘贴呗……

 

返回cp_blog.htm文件,我们再次理顺这个流程,我考虑将具体代码修改部分留给各位朋友,多测试,一定会有人做出来的,并不是很难。

 

编辑器运行的过程是这样的:

1、用户首先在这部分使用编辑器输入了想要的内容,编辑器直接呈现了效果,但是资料还是在iframe里面,没有传送到textarea部分: 

复制内容到剪贴板 

代码:

                                <textarea class=”userData” name=”message” id=”uchome-ttHtmlEditor” style=”height:100%;width:100%;display:none;border:0px”>$blog[message]</textarea>

                                <iframe src=”editor.php?charset=$_SC[charset]&allowhtml=$allowhtml” name=”uchome-ifrHtmlEditor” id=”uchome-ifrHtmlEditor” scrolling=”no” border=”0″ frameborder=”0″ style=”width:100%;border: 1px solid #C5C5C5;” height=”400″></iframe>

2、用户继续编辑其他的部分,当要提交的时候,用一个隐藏按钮提交内容: 

复制内容到剪贴板 

代码:

<input type=”button” id=”blogbutton” name=”blogbutton” value=”提交发布” onclick=”validate(this);” style=”display: none;” />

复制内容到剪贴板 

代码:

<input type=”button” id=”issuance” onclick=”document.getElementById(’blogbutton’).click();” value=”保存发布” class=”submit” />

3、触发了js函数validate,这个函数又一次触发了编辑器更新的函数uploadEdit。 

复制内容到剪贴板 

代码:

        function validate(obj) {//创建函数和函数名,声明需要传入什么参数

            var subject = $(’subject’);//设定一个函数内的变量,方便后面用,指向了id为subject的html部分。

            if (subject) {//如果有这个对象,可以理解成,如果有这个html的话

                    var slen = strlen(subject.value);//读取这个html部分的value值的长度

                if (slen < 1 || slen > 80) {//判断长度是否超过80或者小于1.

                    alert(”标题长度(1~80字符)不符合要求”);//提示不合法

                    subject.focus();//将光标焦点放到指定的对象上

                    return false;//返回这个函数的返回值为否(假),目的是告诉浏览器不要继续表单提交了,有问题啦。如果运行到这里,整个函数结束,不再继续运行。但是,刚才的判断部分如果没有进入这个大括号的话,程序继续运行。细节部分参考一下相关描述js函数的书籍或资料,不详细说了。

                }

            }

 

            if($(’seccode’)) {//这个是判断’seccode’部分的,有ajax的部分,跳过大部分,我只简单说,我们直接谈中心部分。

                        var code = $(’seccode’).value;//读取’seccode’的值

                        var x = new Ajax();//创建一个ajax的实例,理解为要做ajax之前的热身,不然程序容易抽筋,那就不能继续了,呵呵

                        x.get(’cp.php?ac=common&op=seccode&code=’ + code, function(s){//将’cp.php?ac=common&op=seccode&code=’ + code作为ajax异步传输读取的地址,返回的是这个地址给的结果,也就是s

                                s = trim(s);//安全处理s

                                if(s != ’succeed’) {//如果s不是’succeed’的话,则运行下面的部分。

                                        alert(s);//警告,内容就是s,估计如果s不是’succeed’的话,会直接返回错误提示。

                                        $(’seccode’).focus();//呵呵,上面见过,将鼠标光标放到’seccode’上。

                                   return false;//返回别继续的指令,刚才说过。

                                } else {//否则运行(也就是说s的内容就是’succeed’)

                                        uploadEdit(obj);//哈哈,bingo~~~就是要照这个,更新编辑器的函数

                                        return true;//告诉浏览器,哈哈,正确了,提交吧,我拿到了编辑器的数据啦~~~

                                }

                        });

            } else {//这两行自己理解一下,自己看看括号是哪里的if和else,如果不知道if-else是什么,参考我之前发过的教程。

                    uploadEdit(obj);

                    return true;

            }

        }

4、我们追寻找到那个函数,终于了解,最终更新编辑器的中心函数是edit_save(); 

复制内容到剪贴板 

代码:

<script language=”javascript” src=”image/editor/editor_function.js”></script>

复制内容到剪贴板 

代码:

function uploadEdit(obj) {

        mainForm = obj.form;

        forms = $(’attachbody’).getElementsByTagName(”FORM”);

        albumid = $(’uploadalbum’).value;

        edit_save();

        upload();

}

我们知道了这些,就可以照猫画虎的制作出来任何地方的编辑器了。

 

附加解释一下edit_save()的内部结构,有朋友可能会问到,还是用注释来解释(之前讲过的部分就不说了,仔细看着个帖子就好): 

复制内容到剪贴板 

代码:

//提交保存

function edit_save() {

        var p = window.frames['uchome-ifrHtmlEditor'];//见下一行

        var obj = p.window.frames['HtmlEditor'];//和上面那句代码一起创建一个对象,指向了’uchome-ifrHtmlEditor’部分

        var status = p.document.getElementById(’uchome-editstatus’).value;//读取了’uchome-ifrHtmlEditor’内’uchome-editstatus’部分的值,用返回值来继续下面的判断

        if(status == ‘code’) {//如果是code的话(英汉字典:code=代码)

                $(’uchome-ttHtmlEditor’).value = p.document.getElementById(’sourceEditor’).value;//将html(也就是编辑器内生成的html)写入那个id为’uchome-ttHtmlEditor’的textarea内部,这样的话,提交表单就不是空值了

        } else if(status == ‘text’) {//如果是text的话(英汉字典:text=文本)

                if(is_ie) {//如果在ie浏览器下,这个is_ie是这个js的全局变量,是有其他代码判断后生成的,不是js语言内置的,这里可能会有朋友乱用,说明一下

                        obj.document.body.innerText = p.document.getElementById(’dvtext’).value;

                        $(’uchome-ttHtmlEditor’).value = obj.document.body.innerHTML;//这两句都是将文本写入指定区域

                } else {//如果是其他浏览器

                        obj.document.body.textContent = p.document.getElementById(’dvtext’).value;

                        var sOutText = obj.document.body.innerHTML;

                        $(’uchome-ttHtmlEditor’).value = sOutText.replace(/\r\n|\n/g,”<br>”);//类似上面的,将文本写入指定区域

                }//这两个不同的部分很典型的体现了js需要写出来不同浏览器兼容的代码,并不是在ie下成功,就在任何地方运行成功,这个是做产品时候的细节部分,也是最基本的,其实很多时候程序是否好坏,这些细节地方体现的最多,但是不用到这里你看不出来开发者的功力,虽然只是一个非常基本和初级的地方,我也想这样拓展说一下,做出来一个功能其实并不是很难,麻烦的是后期测试和修改bug时候,有时候开发时间如果是10的话,测试和后期整理代码要到30,这样1比3的比例和一般人想象还是有出入的。

        } else {//如果是其他类新,则直接写入

                $(’uchome-ttHtmlEditor’).value = obj.document.body.innerHTML;//参考前面注释:写入值

        }

        backupContent($(’uchome-ttHtmlEditor’).value);//这个是方便下次恢复数据的代码。

}

好了,整理了半天,希望对各位有所帮助。

Oct 17

UCH随机头像插件 - 给无头像会员随机生成一个

1.打开 你安装的uc目录下的 avatar.php

查找 

代码:

empty($_GET['check_file_exists'])?header(”Location: images/noavatar_$size.gif”):exit(’0′);

替换成 

代码:

$rand_no = rand(1,30);//修改30即可增加或减少随机头像总数

        empty($_GET['check_file_exists'])?header(”Location: images/noavatar/$size/$rand_no.gif”):exit(’0′);//这种改法只支持全部为GIF的头像。如果改成.jpg即全部必须都为.jpg的头像

2.上传头像目录 noavatar 到 UC的images目录下

里面的文件可以自己定,只要文件名一样就可以.

头像:http://www.discuz.net/attachment.php?aid=311590&k=e3a668b64e0fa6edf60c0b4b7a4741fb&t=1223090859

Oct 17

UCH新用户注册后的默认积分修改方式

./source/function_space.php 文件22行:

$space = array(

        ’uid’ => $uid,

        ’username’ => $username,

        ’dateline’ => $_SGLOBAL['timestamp'],

        ’groupid’ => $gid

);

修改为:

$space = array(

        ’uid’ => $uid,

        ’username’ => $username,

        ’dateline’ => $_SGLOBAL['timestamp'],

        ’groupid’ => $gid,

        ’credit’ => 20

);

便在开通空间时默认给与 20 积分了。

Oct 17

UCH修复排行榜显示$_post[note]的问题

找到\source\cp_credit.php

约第61行 

inserttable(’show’, array(’uid’=>$_SGLOBAL['supe_uid'], ‘username’=>$_SGLOBAL['supe_username'], ‘credit’=>$showcredit, ‘note’=>’$_POST[note]‘), 0, true);

把最后的’note’=>’$_POST[note]‘)改为’note’=>$_POST['note'])

也就是

inserttable(’show’, array(’uid’=>$_SGLOBAL['supe_uid'], ‘username’=>$_SGLOBAL['supe_username'], ‘credit’=>$showcredit, ‘note’=>$_POST['note']), 0, true);

Oct 17

修改index.php文件,找到 

$query = $_SGLOBAL['db']->query(”SELECT uid,username,name,namestatus FROM “.tname(’space’).”

WHERE updatetime > “.($_SGLOBAL['timestamp']-3600*24*7).”

ORDER BY viewnum DESC LIMIT 0,18″);

修改为:

$query = $_SGLOBAL['db']->query(”SELECT uid,username,name,namestatus FROM “.tname(’space’).”

WHERE updatetime > “.($_SGLOBAL['timestamp']-3600*24*7).”

and `avatar` =1 ORDER BY viewnum DESC LIMIT 0,18″);

Oct 17
模板文件 do_register.htm 里的:
<script>
        function register(show_id, result) {
                if(result) {
                        $(’registersubmit’).disabled = true;
                        window.location.href = “space.php”;
修改为:
<script>
        function register(show_id, result) {
                if(result) {
                        $(’registersubmit’).disabled = true;
                        window.location.href = “cp.php?ac=profile”;
Sep 04

原文palmerwebmarketing,转自marsopinion.com

对电子商务来说十个代价高昂的假设:

  • 人们知道你的网站,知道怎么来你网站
  • 他们知道你是卖什么的
  • 事情会按照计划发展
  • 他们知道他们应该点击哪里
  • 他们知道怎样回到首页
  • 他们知道自己在哪
  • 他们知道怎么买东西
  • 他们原体提供大量私人信息
  • 他们遇到困难会联系客服
  • 他们会回来
Sep 04

很久之前看过report说 

1、浏览网页时,人的注意力最容易被人脸吸引 
2、正面的美丽女性人脸最为吸引人 
(听上去很废话,呵呵) 

看到这篇How A Pretty Face Can Push Visitors Away,里面用过我之前提过的广告例子。说的意思是:用漂亮脸蛋吸引了观众之后,还要引导观众去看你想要传递的内容。 

 

好像这幅图,脸蛋没什么问题,看上去舒服,而且专业。 

可是,你的眼睛会怎么动呢? 

1、看网页 
2、看到有PPMM,于是眼睛转移到PPMM脸上 
3、看到PPMM的眼睛正在看自己……于是转移开视线 

结果就是广告商花了钱让你看了MM,却没能把想传递的信息传递给你。 

下面有一个视线追踪对比测试(我之前写过这个测试的局限性),给定两个内容相近的广告: 
 

唯一的区别是model的视线,第一幅是直视观众,第二幅则看向产品。 

得到的热点图如下: 
 

结论很明显: 

1、观众会追踪广告中人物的视线。 
2、在Banner广告上放美女图片时——注意看看那个美女在看哪里,把你想要传达的主要内容放那里。

Sep 01

调整WordPress中新留言到前面,默认为新留言在最后。

进入WP安装目录\wp-includes\
找到\comment-template.php
查找:
ORDER BY comment_date”
修改为:
ORDER BY comment_date DESC”

(注:包括三段)

上传覆盖,打完收工。