typecho前台ajax登录与错误处理

尝试了在主题前台做一个登录框,登陆的功能是实现了,有一个小小的不便,就是如果输错了密码,因为页面又跳回了首页,所以弹出式登录框又被隐藏了,登录成功与否不够明显,二次登录的场合操作也较繁琐,所以想实现前台以ajax的方式登录。实现ajax一共需要修改3个位置,分别是:

  1. 登录框本身
  2. 主题footer文件
  3. 后台functions.php

修改登录框

登陆框里主要是增加了一个消息输出的元素,博主给这个元素命名为 primary-login-message

      <div id="primary-login" class="section-header">
        <i class="fa fa-fw fa-user-circle" aria-hidden="true" style=""></i>
        <form id="primary-login-form" action="<?php $this->options->loginAction()?>" method="post" name="login" rold="form">
          <input type="hidden" name="referer" value="<?php $this->options->siteUrl(); ?>">
          <input id="primary-login-username" type="text" name="name" autocomplete="username" placeholder="<?= _t('请输入用户名') ?>" required/>
          <input id="primary-login-password" type="password" name="password" autocomplete="current-password" placeholder="<?= _t('请输入密码') ?>" required/>
          <button id="primary-login-submit" type="submit"><?= _t('登录') ?></button>
          <?php if ($this->options->allowRegister) : ?>
            <span id="primary-register">
              <i class="fa fa-fw fa-user-o" aria-hidden="true"></i>
              <a href="<?php $this->options->adminUrl('register.php'); ?>" target="_blank" rel="noopener noreferrer nofollow"><?= _t('注册') ?></a>
            </span>
          <?php endif; ?>
        </form>
        <div id="primary-login-message"></div>
      </div>

footer文件

footer 里主要是家一段js代码,因为采用了php与js混搭的方式,所以必须写在php文件里,如果直接写在js后缀的文件中会报格式错误。

  <script>
    $('#primary-login-form').submit(function(e) {
      e.preventDefault();
      var $form = $(this);
      var $message = $('#primary-login-message');
      $.ajax({
        type: 'POST',
        url: '<?php $this->options->siteUrl(); ?>',
        data: $form.serialize() + '&action=login',
        dataType: 'json',
        beforeSend: function() {
            $message.html('<p class="loading"><?php _e('正在登录...'); ?></p>');
        },
        success: function(response) {
            if (response && response.success) {
                $message.html('<p class="success"><?php _e('登录成功,正在跳转...'); ?></p>');
                window.location.href = response.referer || '<?php $this->options->siteUrl(); ?>';
            } else {
                var msg = response ? response.message : '<?php _e('登录请求失败'); ?>';
                $message.html('<p class="error">' + msg + '</p>');
            }
        },
        error: function() {
            $message.html('<p class="error"><?php _e('请求出错,请重试'); ?></p>');
        }
      });
    });
  </script>

后台function.php

后台添加对ajax请求的响应:

// 添加 Ajax 登录处理
function themeHandleLogin($archive)
{
    if ($archive->request->isPost() && $archive->request->isAjax() && 'login' == $archive->request->get('action')) {
        $user = Typecho_Widget::widget('Widget_User');
        $name = $archive->request->get('name');
        $password = $archive->request->get('password');
        $remember = false;
        $result = $user->login($name, $password, $remember);
        $response = array(
            'success' => $result,
            'message' => $result ? _t('登录成功') : _t('用户名或密码无效'),
            'referer' => $archive->request->get('referer', $archive->options->siteUrl)
        );
        $archive->response->throwJson($response);
    }
}

// 挂载到 Typecho 的钩子上
Typecho_Plugin::factory('Widget_Archive')->beforeRender = 'themeHandleLogin';

typecho前台ajax登录与错误处理

最终效果如上图。

标签: typecho

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-06-08

聊聊html里的head部分

HTML文档的<head>部分是一个容器,用于包含文档的元数据(metadata)和链接到外部资源的信息,这些内容不会直接显示在网页上,但对网页的功能和表现至关重要。主要元素和功能1. 基础元素<title>:...

建站相关 typecho

thumbnail 2025-06-04

typecho前端实现站点语言的切换

前端修改的数据能及时反馈到后端,那当然需要一个前后端都可以无障碍读取的东西,所以最初是想要用localstorage,但发现php无法直接读取其值,所以就换成了cookie。前端通过js来设置参数值:document.cookie='...

建站相关 typecho

thumbnail 2025-06-02

typecho 主题中的模板与模块的概念

模板是 typecho 主题中一个重要的概念,我们说过typecho的极简主题可以只存在 index.php 这一个文件,但需要展现分类页的时候,typecho事实上会先去寻找名为 category.php 的分类页模板,文章页当然也...

建站相关 typecho

thumbnail 2025-06-02

typecho的几种常见的文章列表调用

处理好了header与面包屑,接下来就按照自己的需求自由发挥了,先放一个分类列表,再挑出一个喜欢的标签,自定义一个该标签下内容展示模块。Typecho 提供了多种文章循环方式,以下是常用的几种方法:标准文章循环<?php whi...

建站相关 typecho

thumbnail 2025-06-02

在typecho里实现面包屑导航

什么是面包屑导航面包屑导航是一种网站导航方式,通常在网站顶部显示,大多会放在站点header的下方,用于显示用户当前位置。 面包屑导航由导航元素构成,每个元素代表一个网站导航项,各个元素通常包含对应链接,供用户跳转。面包屑导航示例首页...

建站相关 typecho

thumbnail 2025-05-29

关于typecho中的路由知识

路由(Routing)是博客系统中将URL地址映射到具体处理逻辑的机制,它决定了当用户访问某个网址时,系统应该执行什么操作、显示什么内容。typecho站点一般都会开启伪静态,伪静态通过URL重写将"漂亮"的URL映射到实际的文件路径...

建站相关 typecho

thumbnail 2025-05-29

Typecho 模板中的翻译函数 _t 与 _e

在 Typecho 模板开发中,_t 和 _e 是用于国际化处理的函数,核心区别在于输出方式:"_t" 函数‌‌功能‌:获取翻译后的字符串但不直接输出,需结合 echo 使用。‌示例‌:<?php echo _t('欢迎语');...

建站相关 typecho

thumbnail 2025-05-26

typecho文章自定义字段的删除与修改

涉及数据库的操作,务必请提前做好备份!提前做好备份!!做好备份!!!小鸟数据的当前主题的缩略图字段命名为augPostThumb,这几天在尝试完善一下原有主题,下载了原站的数据库导入了测试站用于测试页面效果,测试主题的缩略图相关字段拟...

建站相关 typecho

thumbnail 2025-05-26

typecho的文章自定义字段的知识笔记

在typecho中,除了可以自定义设置项之外,我们也可以给文章自定义一些额外的字段,比如给文章编辑界面添加一个缩略图选项,或者增加一个keywords输入框,用来修改编辑当前内容页的关键词信息。// 主题设置 function th...

建站相关 typecho

thumbnail 2025-05-23

typecho前台无法注销用户的原因

尝试制作主题的时候遇到一个奇怪的问题,自定义主题前台死活注销不掉,以为是本地服务器软件配置问题(本地服务器表示锅我不背),结果换其他主题一换一个正常。仔细检查了一下代码,发现是自己复制粘贴代码的时候在退出登录的按钮上也添加了noope...

建站相关 typecho