CI模型扩展成调用即加载(含缓存模式)
7年前
  • 0
  • 0

CI模型扩展成调用即加载(含缓存模式)

关于CI中的模型的标准用法是先要load然后才能使用的,基于这种调用模型的做法长久下来就让paperen觉得麻烦,一开头就得要将用到的模型手动全部load过来,当然这种算是比较苛刻的做法也是有它的理由,毕竟这就清楚这部分引用了哪些模型与减少加载多余模型的机会。

// 加载用户模型
$this->load->model('user');
// 获取所有用户数据
$this->user->all( $per_page, $offset );

CI的模型文档 http://ellislab.com/codeigniter/user-guide/general/models.html

在开始后续内容之前还是声明一下

调用即加载

paperen想象中要达到的目的就是

// YY一下要实现的调用写法
$this->model_user_all( $per_page, $offset );

我们不需要再先load,调用的时候就会自动加载,格式必须是model_{模型名称}_{方法}( 参数1, 参数2, ... )

如果你觉得这样不适合自己使用就不用往下看了

附带查询缓存的概念
// YY一下要实现的调用写法
$this->model_cache( 'model_user_all', $per_page, $offset );

之前也有一篇关于查询缓存的文章 http://paperen.com/post/ci-querycache-extend

其实就是避免不同模块执行了相同的SQL语句,模块之间的数据完成是可以公用的,而这个querycache就是桥梁,也算是一种解决办法吧,不过在这次扩展中querycache将成为其中的组件,对于我们来说它完全是透明的

强调一下 对插入与更新、删除的动作不要使用查询缓存 paperen在代码中并没有限制这个也就是意味着你可以使用model_cache来完成update、insert、delete等操作,但是这有什么意义呢。。。

阅读更多
关于hook一些研究(CI)
7年前
  • 3
  • 2

关于hook一些研究(CI)

近来因为布置了每个人了解一个框架,paperen依旧选择CI(从这方面也可以看出我很专一…)作为进一步研究,所以paperen又再次看了它的核心代码,而看到hooks的实现时不禁有感而发,感叹之前自己试着在CI的基础上设计一个hook的做法实在太SB。

paperen并不想放什么概念的跟大家分享,而是从自己博客开始。

你看到博客的右边栏,在进入某篇文章详细时是会多出这个附带图片的栏目,就是将该文章中所有的附带图片在此用缩略图形式展现,方便浏览者点击查看。这个地方就是应用了钩子,或许说到这里你还是很模糊,但下面就会进行更多解析。

阅读更多
paperenblog發佈
7年前
  • 2
  • 0

paperenblog發佈

終於算是可以光明正大地發佈自己的博客源碼了,雖然之前一直都有在git,但是都是功能沒完善的版本,而現在正式進行官方發佈paperenblog~~

安装说明

1 将压缩包解压,将相应文件复制到您的www目录下

2 根据自己的情况去修改.htaccess文件第3行RewriteRule

阅读更多
尼玛,早知svn有hook的功能就那个那个
7年前
  • 3
  • 1

尼玛,早知svn有hook的功能就那个那个

原来svn可以利用hook进行一些猥琐的动作,比如paperen之前这个文件版本同步小工具这种小玩意就可以免了,当paperen发觉到这个事实后不禁内牛满面……

下面来隐约地说下这个hook怎实现客户端提交后让服务端的版本自动更新,简直简单到不能在简单……

条件在此就不提了(对了,先声明一下这是在windows条件下的),主要是你要到版本库(比如paperen本地测试时用的是ci-paperen,就是你使用svn create后的目录中的那个hook),进入hook目录中,这里就是放置hook的地方,而对于我们实现这个功能只需要用到post-commit这个钩子,你可以打开post-commit.tmpl看它的说明,所有钩子都有这么一个tmpl文件,里面都有说明。

确保你已经将subversion的bin目录加到环境变量,就是你可以通过命令行进行svn的操作,比如你进入命令行,直接敲上svn试试,看是否支持这个命令,然后使用

阅读更多
久违的博客
7年前
  • 0
  • 0

久违的博客

这是出发去的前一晚,今天抽点空将弄得半调子的后台代码传到空间上就勉强地来发一篇博客了。对,这确实是一篇久违的博客。

我此时的心情也不能说是兴奋,作为工作后第一次旅游,哦,不,应该是说初中之后的第一次旅游,我确实不知道应该怀着什么的心情去享受这次旅行,向公司请了5天假,但是感觉总是怪怪的,好像是做错了什么事情似的,这是不是有点不负责任, 我为公司带来的价值是不是值得公司为我开5天的假,老是觉得自己做得还不够,远远不够,或许我的确缺乏足够的自信。但什么是自信,我也不知道…

阅读更多
用户动作记录器
7年前
  • 0
  • 0

用户动作记录器

当我们设计的站点应用对安全有一定要求的话,就可能会涉及到需要记录使用者的操作记录,比如什么时候登录什么时候做了些什么之类的,你也可以称之为用户操作足迹。

具体来说要实现的最终要得到的数据是如下的:

吴给力在 2012-02-18 01:14:13 上了厕所
吴给力在 2012-02-18 01:17:23 回到床上
吴给力在 2012-02-18 02:26:43 接起电话
吴给力在 2012-02-18 02:27:11 放下电话

就针对上面这个描述来说的话,我们可以有两种解决办法:在吴给力身上装一个记录器,凡是与其身体有接触的东西都会被记录下来同时记录触发的时间;在所有东西上放置记录器,每当触摸人是吴给力时就会连同时间记录下来,理论上两种都是可行的办法,既然这样那就写写试试吧。

阅读更多
年总结Summary
8年前
  • 4
  • 2

年总结Summary

一年又是那么一下子结束掉,还觉得自己好像是毕业没多久。2011这个数字对于我来说也算有点意义,因为是从大学混到社会的一年。我只知道在这一年中自己某些人生观、对待某些事情的看法上确实有了变化,但无法告诉你那是什么,似乎这样的话很无解,但确实是这样的。

我通常不会将自己的生活描述得太过于好,但也不会描述得太过于差,当偶尔在TM上有大学朋友问我过得如何时,我通常是使用“我过得不错(很好)”来回答,我想这是一个很好的消息,无论是对他还是对自己,或许这也是乐观的表现,但老实来说没有什么理由说自己过得不好,做到自己感兴趣工作的同时还赚到钱,能租到自己可以接受的房子,而且在深圳还有亲戚关照,还有什么不好。

有时候在微博上或者是在与别人交流中总是能了解到一些关于价值观与人生观,但自己并不会很轻易就接受那些所谓的观点,或许我是变得保守了,我不知道这算不算是成熟,我只是想问问有多少人觉得自己是个很无趣的人。

阅读更多
解决表单重复提交
8年前
  • 3
  • 0

解决表单重复提交

这应该是个很长久的问题……长久得在网上一搜大把解决方案,就是关于如何防止表单重复提交的问题,而paperen这里也就再来解析一下解决的方法与原理,毕竟也是一个实用的技 术。如果您已经知道如何解决的话那么这篇文章可能不适合你的口味,paperen这里也打算从基础开始讨论,所以希望一步看到解决方案的您也可能不太适合,所以请注意。So~开始吧 ~

paperen想您一定知道表单是什么吧,form元素就是表单,一般网页需要输入的地方必定使用了表单元素,也很常见,一般的代码如下:

<form 

method="post">
<p>
<label for="test">随便输入点什么</label>
<input type="text" name="data" id="test" />
</p>
<p>
<input type="submit" value="提交" name="submit" />
</p>
</ul>
</form>

重点其实是form与input元素,p元素只是paperen私自加上去的,对后续的说明没有任何影响,其实很简单,所谓input就是输入了,你可以完全将input 元素理解为是用作用户输入,只是某些属性的(type)不能作为输入而已(这里就是submit),而form元素你完全可以将它理解为是一个袋子,将所有用户输入数据到装在它里面之后用 来提交回服务端处理,但对于form元素值得注意的是method属性,一般来说有get与post两种方法,其实不要想得太复杂(因为深入的不需要太理解,对于后续的内容没有太多关系,如 有兴趣不妨可以使用浏览器的调试工具查看请求头部信息与发送信息,例如firebug),表现出来就是,使用get提交表单的话所有的input元素的值将会在地址栏处出现,而post则不会, 例如使用get提交此表单后的浏览器地址栏

阅读更多
{生活:工作}
8年前
  • 0
  • 0

{生活:工作}

若不是opera的快速拨号里面有自己博客的一张图片,paperen我都不会想到该来写点东西。最近一下了班就什么都不想做,感觉真的很累,也渐渐地失去了激情~~或者自己早已经预料会有这么一天的到来,但还是觉得来得有点早,还以为能坚持下去,但是发觉越来越难~~

也或许出来社会就是这样,在生命结束的那一刻才会有一种成就感才能对自己的一生做出评价,而之前的日子就像在长跑,可能是每天每夜地在同一个地方绕圈也可能是不断向前迈进。但很多时候我们也会感觉到迷茫,消极,看到成功的人如何如何,很多时候会觉得对那种长跑感到厌倦。大家老是说“成功没有捷径,惟有勤奋而已”,虽然感觉这是一句勉励自己的话,但有时候却觉得这是一句傻子才会说的话。人有时候也总是会表现出消极的一面,却不总是一件坏事。

paperen你是在自我安慰吗?是的,我是在自我修复这种疲倦,但这种方法越来越不奏效。

阅读更多
一个基于Hex-HMVC的模型扩展
7年前
  • 3
  • 2

一个基于Hex-HMVC的模型扩展

为什么要进行这个扩展?

在使用hex提供的HMVC扩展方案以来在模型方面一直有疑问,怎衡量模型放在相应modules/models下还是放app目录/models下?比如模块1中要调用user模型的get_all方法获取所有用户数据 模块2也要获取这些数据 那么若模块1,2的模型中都创建一个user模型实现各自的get_all方法会不会显得没有重用的味道?

通过在微博上询问@hex hex的评论启发了我,他说“感觉还需要有个模型继承的功能吧” 没错继承

于是paperen我尝试按照这个概念去在hex的HMVC基础上扩展这个功能,从而达到这个继承的模式

涉及文件

就一个MY_Loader.php

阅读更多
paperenblog补充说明
3年前
  • 3
  • 3

paperenblog补充说明

在这里我将告诉大家一些paperenblog不足与可能对大家有帮助的地方

首先,很重要的一点就是paperenblog是基于codeigniter框架的,所以它必须继承CI的优缺点,同时它也是遵从CI自身规范的,还有我使用了hex提供的HMVC扩展方案 https://github.com/CodeIgniter/HMVC

关闭调试模式

想去掉调试信息的话,可以修改根目录下的index.php的21行

将常量ENVIRONMENT改为不是development就行了,其实这个常量也是CI里面定义的,我也是顺着CI去的而已,关于环境这个常量你继续往下看就会看到,CI定义的有三种:development、testing、production,而只有是development时我才会将调试信息展示。

关于安全

大部分安全措施都已经由CI帮我们完成,包括注入攻击与XSS。针对代码上的攻击我希望paperenblog已经做得很好,但是不代表绝对的安全。

而这里还要提及一点提高站点安全的方法

阅读更多
一个用户引导的js插件(基于jquery)
7年前
  • 1
  • 0

一个用户引导的js插件(基于jquery)

有时候我们上线的网站可以要对第一次使用的用户进行一个引导,当然我们必须要建立帮助中心,也要附带一些图文说明指引用户进一步操作,而有时候也会使用一些更让人舒服的指引方法,使用一个偏暗遮罩将页面的元素挡住,然后将设定好的操作步骤一步一步加亮强调,从而引导用户去操作并附带一些说明文字与图片,这种方式不会影响太多用户体验,很简洁地引导了用户如何使用应用。

阅读更多
Ci使用HMVC时增加查询缓存
7年前
  • 0
  • 0

Ci使用HMVC时增加查询缓存

如果你有扩展过CI的HMVC(hex提供的方案),你可能会在实际使用的过程中越来越理解HMVC,但也可能会越来越搞不清楚什么是HMVC,正如paperen一样…有时候特别觉得模块这个词实在是抽象,到底什么才能定义为模块,到底概念并不是最重要,重要的是你用起来是否合理,是否有效,是否能更好减少耦合。

在paperen使用hex提供的这个hmvc方案过程中,确实也遇到了一些bug,不过目前的已经得到修复,关于hmvc我觉得重要一点是模块之间数据不能共用,而导致一个页面有可能执行了多条一样的SQL,想体现一下这种现象,也很简单。

这是原始调用模型的写法

$this->load->model('userlog_model');
print_r( $this->userlog_model->all() );

调用了userlog_model中的all方法,是什么不要紧,反正你知道这里就是送出一条SQL就够了

阅读更多
文件版本同步小工具
7年前
  • 0
  • 1

文件版本同步小工具

用了半天的时间完善与整理了上周回家写得半调子的代码,paperen倒是不清楚subversion是否支持这个功能,但是既然自己都写了就放上来吧,用的是python写的,所以也就是半调子水平。

弄这个东西的来源是因为在公司那个项目,因为要给客户看到我们那个项目的原型,所以我们在内网找了一台机子作为服务器,然后设置一下路由的转发,将公司的域名挂上去,那么客户访问指定的域名+端口号就会转发到我们内网那台机子上了,而那台机子并不是我用的开发机子,而每次原型有什么更新我都得过去那台机子上用svn update一下,将那台机子上的demo版本更新到最新,为了保证客户看到的demo与我们目前完善的demo是一致的。

所以嘛,你看我们每次有完善什么都得去那台机子上用鼠标操作一下,虽然不到几分钟,但是paperen也嫌麻烦,于是paperen将那台机子开启允许远程,于是自己就不要过去机子面前操作了,在自己机子上远程过去操作svn,然后就关闭远程,那比亲自走过去爽多了,但是……paperen还是觉得麻烦(不得不承认我很懒……)

阅读更多
同步登陆
7年前
  • 1
  • 1

同步登陆

20120104211336

这不是什么新的技术,所以如果你已经知道如何实现可以忽略此博文了。

关于同步登陆的需求,大网站可能有几个子网站或者是子系统,不能设计成每次进入其他子网站就登陆一次,而应该是在子站点登陆了就可以漫游于其他子站点,当然用户帐号与密码也应当保持一致。

阅读更多
关于控制器与模型间的一些想法
8年前
  • 0
  • 0

关于控制器与模型间的一些想法

用CI也有一段时间了,感觉paperen我也挺喜欢CI的,因为觉得上手真的很容易也很方便,暂时还不会考虑其他框架。不过通过这段时间的使用,加上同事比较多疑问(也算是好事吧),自己也有点对CI中控制器与模型部分使用产生些少疑问,特别是模型,因为之前的开发就带来一些比较混乱的状况,老实说之前写的代码比较糟糕。

20111122011355

很多疑问都是产生在控制器与模型之间的,疑问最严重的是模型的重用性(况且可以这么说吧),平平君与奇奇君本来是分开一人负责一块功能的,但是免不了要涉及一些公用的模型,这就导致了一些不能避免的问题,平平君要与奇奇君协商某个公用的模型方法,但是别扭的是前者可能额外附件一些条件,比如要查询state为3的记录而后者则又会附加其他限制条件,而且paperen不太同意在控制器中对模型进行控制(或者下面的例子展示后你就明白什么意思),结果要写一个能符合两者需求的模型方法,在这个模型方法中写了比较复杂的逻辑,本来比较简单的模型突然看到一段复杂的逻辑,这个真的是我不想要的,paperen提议的是即使你查询的条件不同的话就可以考虑分出来单独作为一个方法了,而不要花太多时间在万能的模型方法,因为那可能会增加了模型的复杂度或者增加了控制器与模型的耦合度。说了这么多还不如看个例子吧。

阅读更多
关于产品与设计的一点思考
8年前
  • 0
  • 0

关于产品与设计的一点思考

20110915211528

最近从迷茫中又坚持了下来,而且还获得了其他一些与技术无关的体会,当然这些体会并不是突然冒出来的,或者也跟这1年的工作有关吧。paperen首先抛出自己的观点吧,“一件好的产品必须而且一定是从源设计中继承并得以延伸的”,无论您认同或者反对,或者中立也好,paperen会在下面用自己的体会去描述自己这个观点。so,这是一篇议论文……

在生活中会不会有这些情景,“我很想弄一个小玩意,能用来这样那样,是啊!很cool啊!”,在想象中确实很吸引很完美,但一旦将其置于实现中就没有下文了,而这种情况paperen认为是很正常的,每个人都爱幻想,而且应该保持幻想,至于能不能实现是其次,因为如果没有这些幻想与这些概念就根本不会有实例的出现,但这里paperen想强调的是,如果连自己(设计思想来源者)都没法做到吸引自己去动手去认为值得实现,那么可能证明了两件事:1.你只是个空幻想家,2.你想象的玩意仍不够吸引。

阅读更多
后知后觉的Mysql锁表应用
8年前
  • 2
  • 1

后知后觉的Mysql锁表应用

在看CI(codeigniter)database那一节的手册发现其自带了事务的处理,之后又不知不觉地查了一些资料,在某个地方看到有个例子,具体描述类似如下:商店现在某商品只有1件库存,然后A与B在网上进行下订,A与B几乎同时(或许也就差几毫秒,A比B快那么一点点)进行。

很明显是只有A才能成功下单的,B则会收到库存不足的提示,但是作为放置在服务端的那个页面(或者称为脚本程序)我们得怎样去处理这个问题呢?或者我先放出一段代码吧。

$sql = "select number from goods where id=1";
$number = intval( $db->result( $db->query( $sql ), 0 ) );
if ( $number > 0 ) {
sleep( 2 );
$sql = "update goods set number=number-1 where id = 1";
if ( $db->query( $sql ) ) {
echo 'Ok!Here you are!';
} else {
echo 'Sorry!Something go wrong!Try it again.';
}
} else {
echo 'No more!you are so late!';
}

这部分代码除了缺少一定注释外都写得没错,当然$db是一个操作数据库的类,我只是将大部分方法封装了,这里的逻辑也是很明显了。

阅读更多