ajax实现实时聊天,ajax笔记

  ajax实现实时聊天,ajax笔记

  Symfony评论

  经过七个小时的工作,askeet程序已经很不错了。主页显示了一个问题列表,详细信息显示了问题的答案。用户有一个配置页面,各种主题列表也可以通过每个页面的侧边栏访问。我们社区加强的FAQ方向是对的,但是现在用户无法修改数据。

  如果web中的数据操作是基于长表单的,那么今天的AJAX技术可以改变程序的构建方式。这同样适用于askeet。在本指南中,我们将展示如何向askeet添加增强的AJAX交互。它的目标是允许注册用户声明他对某个问题的兴趣。

  向布局添加指示器。

  当发送异步请求时,AJAX网站的用户不需要考虑通常的动作暂停,结果会很快显示出来。这就是为什么所有的AJAX交互页面都应该能够显示一个活动指示器。

  因此,在global layout.php的主体顶部添加以下代码行:

  div id=indicator /div

  尽管这在默认情况下是隐藏的,但是当发送AJAX请求时,将会显示div。它是空的,但是main.css样式表指定了它的形状和内容:

  div #指示器

  {

  位置:绝对;

  100px

  高度:40px

  左:10px

  top:10px;

  z指数:900;

  背景:url(/images/indicator.gif)无重复0 0;

  }

  添加AJAX交互申报利益。

  AJAX交互由三部分组成:调用者(链接、按钮或其他用户发起动作的控件)、服务器动作和向用户显示动作结果的页面区域。

  呼叫者

  让我们回到所示的问题。如果我们记得第四天,问题可以显示在问题列表或问题详细信息中。

  这就是为什么问题标题和兴趣块被重构为_ inter _ user.php片段的原因。再次打开此剪辑并添加一个链接以允许用户声明他们的兴趣:

  ?php use_helper(User )?

  div id=mark_?php echo $question- getId()?

  ?PHP echo $ question-getInterestedUsers()?

  /div

  ?PHP echo link _ to _ user _ interested($ SF _ user,$question)?

  这个链接不仅仅是重定向到另一个页面。实际上,如果用户已经指定了自己对某个问题的兴趣,就不能再声明了。如果这个用户没有被认证,呃,这将是我们稍后讨论的情况。

  这个链接是用一个helper函数写的,需要在askeet/apps/frontend/lib/helper/user helper . PHP中创建:

  ?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

  use _ helper( Javascript );

  函数link_to_user_interested($user,$question)

  {

  if ($user- isAuthenticated())

  {

  $ interested=interest peer:retrieveByPk($ question-getId(),$ user-getSubscriberId());

  如果(感兴趣)

  {

  //已经感兴趣了

  返回“感兴趣!”;

  }

  其他

  {

  //还没有申报利益

  返回link_to_remote(感兴趣吗?,数组(

  url=用户/感兴趣?id=。$question- getId(),

  update =array( success = block _ 。$question- getId()),

  正在加载“=”元素,

  请完成“=”元素。hide( indicator );”。visual_effect(highlight , mark_ )。$question- getId()),

  ));

  }

  }

  其他

  {

  返回link_to(有兴趣吗?,‘用户/登录’);

  }

  }

  ?

  link_to_remote()函数是AJAX交互的第一个元素:调用者。他说明了当用户单击链接时必须请求哪个动作(这里是用户/感兴趣的),以及必须用动作结果更新页面中的哪个区域。添加了两个事件处理程序(loding和complete ),并与原型javascript函数相关联。原型库提供了手动javascript工具,使用简单的函数调用来实现页面中的视觉效果。唯一的缺点是缺少文档,但是源代码相当直接。

  我们选择使用helper而不是partial,是因为这个函数的PHP代码比HTML代码多。

  别忘了加id id=block_?在question/_list片段中。php echo $question- getId()?。

  div id=block_?php echo $question- getId()?

  ?PHP include _ partial( interested _ user ,array(question=$question))?

  /div

  结果区域

  link _ to _ remote()JavaScript helper的update属性指定结果区域。在这个例子中,用户/感兴趣的动作的结果将替换id为block_XX的元素的内容。如果我们仍然困惑,我们可以看看这个模板片段中的综合内容:

  .

  div id=block_?php echo $question- getId()?

  !-在这之间-

  ?php use_helper(User )?

  div id=mark_?php echo $question- getId()?

  ?PHP echo $ question-getInterestedUsers()?

  /div

  ?PHP echo link _ to _ user _ interested($ SF _ user,$question)?

  !-在那里-

  /div

  .

  两个段落的中间区域是结果区域。一旦执行此操作,它将替换这些内容。

  第二个id(mark_XX)的兴趣相当明显。link_to_remote帮助器的完整事件处理程序将突出显示所单击兴趣的interested_mark div层,并返回该动作中某个兴趣的增量数。

  服务器操作

  AJAX调用者指向用户/感兴趣的动作。此操作必须为兴趣表中的当前问题和当前用户创建新记录。在Symfony中,我们可以这样做:

  公共函数executeInterested()

  {

  $ this-quest=question peer:retrieveByPk($ this-getrequest parameter( id );

  $ this-forward 404除非($ this-question);

  $ user=$ this-getUser()-get subscriber();

  $interest=新利息();

  $ interest-set question($ this-question);

  $ interest-setUser($ user);

  $ interest-save();

  }

  这里我们要记住,兴趣对象的-save()方法已经修改,增加了相关用户的interested_user域。所以对当前问题感兴趣的用户数量会在动作调用后自动增加。

  那么结果的interestedSuccess.php模板应该如何显示呢?

  ?PHP include _ partial( question/interested _ user),array(question=$question))?

  他将再次显示问题模块的_ inter _ user.php片段。这是写这个片段最棒的地方。

  我们不得不禁止这个模板的布局(modules/user/config/view.yml):

  有趣的成功:

  has_layout: off

  最后试验

  AJAX兴趣的开发现在结束了。我们可以进行相应的测试,在登录页面输入已有的用户名和密码,显示问题列表,点击‘有兴趣?’链接。当请求发送到服务器时,会显示该指示器。然后,当服务器回答时,增加的数字将被突出显示。我们可以注意到开头的“感兴趣?”现在链接是‘感兴趣’,没有链接。这就是我们的link _ to _ interested助手所做的事情。

  添加嵌入式“登录”表单

  我们前面说过,只有注册用户才能声明自己对某个问题感兴趣。这意味着如果未经授权的用户点击“感兴趣的?”链接,您必须首先显示登录页面。

  但是等一下。为什么用户加载一个新的页面登录,和他声明的兴趣失去联系?更好的方法是在页面上动态加载一个登陆页面。这就是我们将要做的。

  将隐藏的登录表单添加到布局中。

  打开全局布局(askeet/apps/frontend/templates/layout . PHP)并添加以下代码(header和content div之间的内容):

  ?php use_helper(Javascript )?

  div id=登录

  h2请先登录/h2

  ?PHP echo link _ to _ function( cancel ,visual_effect(blind_up , login ,array(duration=0.5))?

  ?php echo form_tag(用户/登录, id=loginform )?

  昵称:php echo input_tag(昵称)?br /

  密码:PHP echo input _ password _ tag( password )?br /

  ?PHP echo input _ hidden _ tag( referer ,$sf_params- get(referer )?$ SF _ params-get( referer ):$ SF _ request-getUri())?

  ?php echo submit_tag(login )?

  /表单

  /div

  同样,这个表单在默认情况下是隐藏的。引用站点隐藏标签包含引用站点请求参数或者是当前URI。

  当未经授权的用户单击感兴趣的链接时显示表单

  我们还记得之前写的用户助手吗?现在我们将处理未授权用户的情况。打开askeet/lib/helper/user helper . PHP文件,并更改以下代码行:

  返回link_to(有兴趣吗?,‘用户/登录’);返回link_to(有兴趣吗?,‘用户/登录’);

  替换为:

  返回link_to_function(有兴趣吗?,visual_effect(blind_down , login ,array( duration =0.5));

  当用户未经授权时,“感兴趣?”上的链接将加载一个原型javascript效果(blind_down)来为登录id腾出空间。

  登录用户

  用户/登录动作已经在第五天写好,第六天重构。我们需要再次修改它。

  公共函数executeLogin()

  {

  if($ this-getRequest()-get method()!=sfRequest:POST)

  {

  //显示表单

  $ this-getRequest()-getParameterHolder()-set( referer ,$ this-getRequest()-get referer());

  返回SF view:SUCCESS;

  }

  其他

  {

  //处理表单提交

  //重定向到最后一页

  返回$ this-redirect($ this-getrequest parameter( referer , @ home page );

  }

  }

  现在工作已经很完美了,保存的referer会将用户重定向到用户之前点击的页面。

  现在测试AJAX函数。当未注册的用户点击时,将显示一个登录页面,而不会离开当前页面。如果用户名和密码通过验证,页面将被刷新,用户可以单击“感兴趣?”他想一拍即合。链接。

  明天见

ajax实现实时聊天,ajax笔记