开发企业网站8 -- 新闻添加

2019-10-11  本文已影响0人  潘肚饿兵哥哥

\color{rgba(254, 67, 101, .8)}{新闻列表功能的链接之前已经写了}
\color{rgba(254, 67, 101, .8)}{在templates→admin→main.html页面}

<li><a data-href="index.php?m=admin&c=news_list" data-title="新闻列表" href="javascript:void(0)">新闻列表</a></li>
image.png

\color{rgba(254, 67, 101, .8)}{现在要做这个功能,在admin文件夹新建文件news\_list.php}

\color{rgba(254, 67, 101, .8)}{因为这一个页面跟新闻分类差不多}
\color{rgba(254, 67, 101, .8)}{所以把news\_category.php页面的代码直接复制过来}
\color{rgba(254, 67, 101, .8)}{然后在templates→admin下建一个模板news\_list.html}

image.png image.png

\color{rgba(254, 67, 101, .8)}{这个页面也是把新闻分类页面代码复制过来进行修改使用}
\color{rgba(254, 67, 101, .8)}{把news\_category.html页面的代码复制到news\_list.html中}
\color{rgba(254, 67, 101, .8)}{把路径都改过}

<{include file="header.html"}>
<body>
<nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页 <span class="c-gray en">&gt;</span> 新闻中心 <span class="c-gray en">&gt;</span> 新闻列表 <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新" ><i class="Hui-iconfont">&#xe68f;</i></a></nav>
<div class="page-container">
    <div class="cl pd-5 bg-1 bk-gray"> <span class="l"><a href="javascript:;" onclick="datadel()" class="btn btn-danger radius"><i class="Hui-iconfont">&#xe6e2;</i> 批量删除</a> <a class="btn btn-primary radius"  onclick="show_window('添加新闻', 'index.php?m=admin&c=news_add')" href="javascript:;"><i class="Hui-iconfont">&#xe600;</i> 添加新闻</a></span> <span class="r" >共有数据:<strong id="total"> <{$count}> </strong>条</span> </div>
    <div class="mt-20">
        <table class="table table-border table-bordered table-bg table-hover table-sort table-responsive">
            <thead>
                <tr class="text-c">
                    <th width="25"><input type="checkbox" name="" value=""></th>
                    <th width="80">ID</th>
                    <th width="80">新闻</th>
                    <th width="80">排序</th>
                    <th width="60">显示</th>
                    <th width="60">操作</th>
                </tr>
            </thead>
            <tbody>


                <{foreach $list as $v}>
                <!-- 把数组中的值循环赋值,显示在表格中 -->
                <tr class="text-c">
                    <!-- 选中项的name需要写一个数组,如果直接给定一个name的话,选中的所有项name都是这个给定的name -->
                    <td><input type="checkbox" value="<{$v.id}>" name="del[]"></td>
                    <td> <{$v.id}>   </td>
                    <td> <{$v.name}> </td>
                    <td> <{$v.sort}> </td>

                    <!-- 判断是否显示 -->
                    <td class="td-status">
                        <{if $v.is_show == 1}>
                        <span class="label label-success radius">显示</span>
                        <{else}>
                        <span class="label label-danger radius">隐藏</span>
                        <{/if}>
                    </td>
                    

                    <td class="f-14 td-manage">
                        
                        <!-- 用前面封装好的show_window(在header.html页面),来显示弹窗 -->
                        <!-- 修改页面在嵌入的子页面 -->
                        <!-- 添加不需要带id,但是修改要,要确认改的是哪一个 -->
                        <a style="text-decoration:none" class="ml-5" onClick="show_window('修改新闻','index.php?m=admin&c=news_add&id=<{$v.id}>')" href="javascript:;" title="编辑"><i class="Hui-iconfont">&#xe6df;</i></a> 
                        
                        <a style="text-decoration:none" class="ml-5" onClick="article_del(this,'<{$v.id}>')" href="javascript:;" title="删除"><i class="Hui-iconfont">&#xe6e2;</i></a>
                    </td>
                </tr>
                <{/foreach}>
            </tbody>
        </table>
    </div>
</div>


<!--请在下方写此页面业务相关的脚本-->


<script type="text/javascript">

/*资讯-单个删除功能*/
function article_del(obj,id){
    layer.confirm('确认要删除吗?',function(index){
        $.ajax({
            type: 'POST',
            url: 'index.php?m=admin&c=news_del',
            //data:('id', id)等价于下面的 data:(id, id)
            //这是一个键值对,前面的id是键,后面的是值
            data:{id:id},
            dataType: 'json',
            success: function(data){
                if(data == 1){
                    //这个text不给值就是获取值,给值就是修改值
                    //trim  取消空白,以防出现空白问题以致出错
                    //这个总量原本是一个数字,但是经过js获取之后,会变成一个字符串
                    //用parseInt把他转成一个数字
                    var total = parseInt($.trim($("#total").text()));
                    total = total - 1;
                    $(obj).parents("tr").remove();
                    $("#total").text(total);
                    layer.msg('删除成功!',{icon:1,time:2000});
                }else{
                    layer.msg('删除失败!',{icon:2,time:2000});
                }
            },
            error:function(data) {
                console.log(data.msg);
            },
        });     
    });
}



//批量删除项
function datadel(){
    //定义一个名为ID的变量
    var id = '';

    //$是一个函数名,只不过这个函数就只有这一个符号而已,他原本的名字叫jQuery
    //这个函数的意思是:
    //获取name=del[]的input标签,并且要含有checked属性的项
    //当勾选她的时候,他就含有checked,这个之前已经写了
    //然后遍历
    //遍历的目的就是拿到id
    $("input[name='del[]']:checked").each(function(){
        //each要循环,循环到哪一个这个this就是哪一个
        //val()获取里面的值
        //获取值有些用text,有些用val
        //区分的方法是:如果是表单元素就用val,其他的元素用text
        //input、text、error/select等是表单元素
        //这里用text是获取不到的
        //这样就能拿到value的值
        //因为在ajax里传输不能传数组,所以在这里就直接把他写成字符串
        //+=是JS的字符串连接符
        //此时的id已经拿到选项的id了,但是拿到的ID之间没有分隔符,所以加一个逗号
        id += $(this).val()+',';
    });

        //如果用户一项都没有选中,就不能弹出退出按钮,需要判断用户是否选中要删除项
        //如果id为空,证明用户没有选择任何一项
        //这个id就是这个函数中定义的变量id
    if(id == ''){
        layer.msg('至少选择一个分类!',{icon:2,time:2000});
        //在这里需要return,不写的话,会执行下去,用户一个都没有选就直接返回
        //要选了才能看到下面的去人要删除吗
        return false;
    }
        


    layer.confirm('确认要删除吗?',function(index){
        $.ajax({
            type: 'POST',
            //将获取到的id提交到news_category_del.php页面进行处理
            url: 'index.php?m=admin&c=news_del',
            //data:('id', id)等价于下面的 data:(id, id)
            //这是一个键值对,前面的id是键,后面的是值
            data:{id:id},
            dataType: 'json',
            success: function(data){
                //如果data=1,表示删除成功,那么要在页面上取消显示已删除的项
                //同时,右上角的统计总数也要同时减去相应数量
                //并且寻找到他的父级的tr,然后移除
                //$(this).parents('tr')表示选中谁,就找谁的父级
                if(data == 1){
                    //这个text不给值就是获取值,给值就是修改值
                    //trim  取消空白,以防出现空白问题以致出错
                    //这个总量原本是一个数字,但是经过js获取之后,会变成一个字符串
                    //用parseInt把他转成一个数字
                    // total是获取所有项的总量
                    var total = parseInt($.trim($("#total").text()));
                
                    //获取用户选中项的id
                    $("input[name='del[]']:checked").each(function(){
                        $(this).parents('tr').remove();
                        //每移除一项,总数就减1
                        total = total - 1;
                    });

                    //减完之后,把值(统计总数)写到页面中
                    $("#total").text(total);
                    layer.msg('删除成功!',{icon:1,time:2000});
                }else{
                    layer.msg('删除失败!',{icon:2,time:2000});
                }
            },
            error:function(data) {
                console.log(data.msg);
            },
        });     
    });
}
</script> 
</body>
</html>
image.png

\color{rgba(254, 67, 101, .8)}{还差一个添加新闻页面}
\color{rgba(254, 67, 101, .8)}{在admin下建文件news\_add.php}

\color{rgba(254, 67, 101, .8)}{有了news\_add.php,同样的再建html页面}
\color{rgba(254, 67, 101, .8)}{也在templates→admin下建一个news\_add.html}

\color{rgba(254, 67, 101, .8)}{这个添加页面也是和之前的添加页面差不多}

\color{rgba(254, 67, 101, .8)}{所以继续把admin→news\_category\_add.php页面的代码复制到这里news\_add.php}

\color{rgba(254, 67, 101, .8)}{但是页面html就不再是之前那么简单的三项了}
\color{rgba(254, 67, 101, .8)}{不只是名称、显示、和排序了}
\color{rgba(254, 67, 101, .8)}{到模板源码中,找到index.html页面,打开,并找到新增→资讯}

image.png

\color{rgba(254, 67, 101, .8)}{然后把这个页面的框架源代码复制到news\_add.html}

image.png

\color{rgba(254, 67, 101, .8)}{然后对模板进行头尾分离}
\color{rgba(254, 67, 101, .8)}{富文本编辑器:}

<script type="text/javascript" src="lib/ueditor/1.4.3/ueditor.config.js"></script> <!-- 配置文件 -->

ueditor是百度的产品,国外多用kindeditor

\color{rgba(254, 67, 101, .8)}{还是先把公共部分放到header.html文件中去}

image.png

\color{rgba(254, 67, 101, .8)}{因为添加新闻的内容多,所以要调用满屏弹出窗口函数(之前写好的)}

这个函数在header.html页面
//  弹出窗口 - 全屏 
function show_window_full(title,url){
    var index = layer.open({
        type: 2,
        title: title,
        content: url
    });
    layer.full(index);
}

\color{rgba(254, 67, 101, .8)}{在news\_list.html页面把show\_window换成函数名show\_window\_full}

\color{rgba(254, 67, 101, .8)}{此时添加页面就变成满屏的了}

image.png

\color{rgba(254, 67, 101, .8)}{先列出新闻需要的sql字段}

新闻:
id
cat_id 相当于新闻的分类标签
title 标题
thumb 缩略图
content 内容
publish_time 发布时间
add_time 新闻添加时间
resource 新闻来源 ,不能用from,他是关键字,写了还不会报错,但是会出错
remark 新闻摘要
read_num 点击量 阅读量
is_top 置顶

\color{rgba(254, 67, 101, .8)}{然后新建数据表}

\color{rgba(254, 67, 101, .8)}{ID:}

image.png

\color{rgba(254, 67, 101, .8)}{cat\_id:}

image.png

\color{rgba(254, 67, 101, .8)}{title,这里有字符集的问题,因为建库已经写了utf8,所以这里不用再设置}

image.png

\color{rgba(254, 67, 101, .8)}{thumb缩略图}

image.png

\color{rgba(254, 67, 101, .8)}{content,内容,text是没有默认值的}

image.png

\color{rgba(254, 67, 101, .8)}{时间不用datetime,用时间戳,因为可能要处理时间}
\color{rgba(254, 67, 101, .8)}{例如显示一周之前的新闻,所以用int}

image.png

\color{rgba(254, 67, 101, .8)}{add\_time新闻添加时间}

image.png

\color{rgba(254, 67, 101, .8)}{resource,新闻内容来源,不能用from,那是关键字}

image.png

\color{rgba(254, 67, 101, .8)}{remark 摘要}

image.png

\color{rgba(254, 67, 101, .8)}{read\_num 点击量 阅读量 }

image.png

\color{rgba(254, 67, 101, .8)}{is\_top置顶}

image.png

\color{rgba(254, 67, 101, .8)}{建表完成}

image.png

\color{rgba(254, 67, 101, .8)}{分类需要查数据表之后分配过去}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>分类:</label>
            <div class="formControls col-xs-8 col-sm-9"> <span class="select-box">
                <select name="articlecolumn" class="select">
                    <option value="">==请选择分类==</option>
                    <option value="1">新闻资讯</option>
                    
                </select>
                </span> </div>
        </div>

\color{rgba(254, 67, 101, .8)}{在news\_add.php页面进行分配}

<?php
    require_once('init.php');
    if( !empty($_POST)){
        
    }else{
        //修改功能:
        //通过GET方法获取news_category.html带过来的id(这个ID在搜索框中)
        $id = $_GET['id'];
        //逻辑:如果获取到的ID大于0,表示有id,那么就是修改
        //然后用数据库查询函数查出这个id
        //然后用smarty把这个查到的值传递给
        //else是做添加时默认选项功能
        //else后面是把嵌入的news_category_add.html页面的显示和排序的默认值0和1设置默认值
        //这样在添加的时候,就只需要填写名称了,有需要才填显示隐藏和排序
        if($id > 0){
            $row = get_row("select * from news where id=$id limit 1");
        }else{
            $row = [];
        }

        // 分类栏目先写名字和id就够用了
        //根据sort进行排序,如果sort一样,再根据id进行降序排列
        //然后把这个变量分配到news_add.html
        $category = get_all("select id, name from news_category order by sort, id desc");
        
        $smarty->assign('row', $row);
        $smarty->assign('category', $category);
        $smarty->display($tpl_name);
    }
    
?>

\color{rgba(254, 67, 101, .8)}{将在sql查询到的值分配到news\_add.html页面}

<div class="row cl">
    <label class="form-label col-xs-4 col-sm-2"><span class="c-red">*</span>分类:</label>
      <div class="formControls col-xs-8 col-sm-9"> <span class="select-box">
        <select name="cat_id" class="select">
          <option value="">==请选择分类==</option>
          <{foreach $category as $v}>
          <option value="<{$v.id}>"><{$v.name}></option>
          <{/foreach}>
        </select>
     </span> </div>
  </div>

\color{rgba(254, 67, 101, .8)}{结果已经显示在添加新闻页面}

image.png

\color{rgba(254, 67, 101, .8)}{在之前的数据表中添加一个关键词字段}

image.png

\color{rgba(254, 67, 101, .8)}{关键字搜索框:}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">关键词:</label>
            <div class="formControls col-xs-8 col-sm-9">
                <!-- placeholder是这个搜索栏中显示的提示字符 -->
                <input type="text" class="input-text" value="<{$row.keywords}>" placeholder="多个关键词之间用英文半角逗号隔开"  name="keywords">
            </div>
        </div>
image.png

\color{rgba(254, 67, 101, .8)}{摘要部分:}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">摘要:</label>
            <div class="formControls col-xs-8 col-sm-9">
                <textarea name="remark" cols="" rows="" class="textarea"   onKeyUp="$.Huitextarealength(this,100)"><{$row.remark}></textarea>
                <p class="textarea-numberbar"><em class="textarea-length">0</em>/200</p>
            </div>
        </div>

image.png

\color{rgba(254, 67, 101, .8)}{文章来源:}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">来源:</label>
            <div class="formControls col-xs-8 col-sm-9">
                <input type="text" class="input-text" value="<{$row.resource}>" name="resource">
            </div>
        </div>
image.png

\color{rgba(254, 67, 101, .8)}{发布日期,如果没有给定时间,就给一个默认时间:}
\color{rgba(254, 67, 101, .8)}{先在news\_add.php中写好默认值函数}

 if( !empty($_POST)){
        
    }else{
        //修改功能:
        //通过GET方法获取news_category.html带过来的id(这个ID在搜索框中)
        $id = $_GET['id'];
        //逻辑:如果获取到的ID大于0,表示有id,那么就是查询
        //然后用数据库查询函数查出这个id
        //然后用smarty把这个查到的值传递news_add.html
        //else是做添加时默认选项功能
        //else后面是把嵌入的news_add.html页面的显示时间默认值
        //这样在添加的时候,如果没有给时间,就给一个默认当前时间
        //
        if($id > 0){
            $row = get_row("select * from news where id=$id limit 1");
        }else{
            $row = ['publish_time'=>date('Y-m-d H:i:s')];
        }

        // 分类栏目先写名字和id就够用了,所以查询写id和name就够了
        //根据sort进行排序,如果sort一样,再根据id进行降序排列
        //然后把这个变量分配到news_add.html
        $category = get_all("select id, name from news_category order by sort, id desc");
        
        $smarty->assign('row', $row);
        $smarty->assign('category', $category);
        $smarty->display($tpl_name);
    }
    

\color{rgba(254, 67, 101, .8)}{然后把变量publish\_time分配到news\_add.html}
\color{rgba(254, 67, 101, .8)}{此时已经有了默认时间和可选择的时间}
\color{rgba(254, 67, 101, .8)}{为了防止用户随意在框中乱输,用readonly限制权限,设置为只读}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">发布日期:</label>
            <div class="formControls col-xs-8 col-sm-9">
                <input type="text" onfocus="WdatePicker({ dateFmt:'yyyy-MM-dd HH:mm:ss'})"  
                name="publish_time" value="<{$row.publish_time}>" 
                readonly class="input-text Wdate">
            </div>
        </div>
image.png

\color{rgba(254, 67, 101, .8)}{是否置顶功能:}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">是否置顶:</label>
            <div class="formControls col-xs-8 col-sm-9 skin-minimal">
                <div class="check-box">
                    <!-- 如果is_top = 1,则自动选中 checked -->
                    <input type="checkbox" id="checkbox-moban" name="is_top" value="1" <{if $row.is_top == 1}>checked<{/if}>>
                    <label for="checkbox-moban">&nbsp;</label>
                </div>
            </div>
        </div>
image.png

\color{rgba(254, 67, 101, .8)}{缩略图,需要用插件}

如果用 文件域的话:
<input type="file">
一是样式不好看,二是在不同的浏览器效果不同

\color{rgba(254, 67, 101, .8)}{所以在会员列表→添加会员页面,打开框架源码}
\color{rgba(254, 67, 101, .8)}{把‘附件’部分的代码复制过来替换模板原本的代码}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">缩略图:</label>
            <div class="formControls col-xs-8 col-sm-9">
                 <span class="btn-upload form-group">
                <input class="input-text upload-url" type="text" id="uploadfile" readonly  style="width:200px">
                <!-- 这里用a标签,js另外写文件上传按钮,并把下面的file文件域,html原本的上传样式隐藏 -->
                <!-- 所以这里缩略图用的是上面的这个input和下面的a标签和js处理的 -->
                <!-- 然后用户操作之后,会通过js‘把值写入到下面的原生的file中去 -->
                <a href="javascript:void();" class="btn btn-primary radius upload-btn"><i class="Hui-iconfont">&#xe642;</i> 浏览文件</a>
                <input type="file" multiple name="file-2" class="input-file">
                </span> 
            </div>
        </div>
image.png

\color{rgba(254, 67, 101, .8)}{文章内容:}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">文章内容:</label>
            <div class="formControls col-xs-8 col-sm-9"> 
                <!-- 这里使用js写的,html原生的是文本域textarea,是一个多行文本框,input是单行文本框 -->
                <!-- 这里其实也是textarea写的,只不过是用js加强了它的功能而已 -->
                <!-- 这里的editor在本页最下方用js获取,所以如果这里改过的话,下面也相应的要修改 -->
                <!-- 如果用的是textarea的话,需要一个name=“content”,这样表单才能把数据加入到post中 -->
                <!-- 如果不写,js也会给他一个默认值,但是它就不是我们sql写好的content了 -->
                <!-- 所以这里同样也需要加一个name -->
                <!-- 具体写法,就是在此页面最下方的js变量中加第二个参数{"textarea":"content"} -->
                <script id="editor" type="text/plain" style="width:100%;height:400px;"><{$row.content}></script> 
            </div>
        </div>

\color{rgba(254, 67, 101, .8)}{在下方js中加入第二个参数:}

var ue = UE.getEditor('editor', {"textarea":"content"});
//这里相当于<textarea name="content">

\color{rgba(254, 67, 101, .8)}{阅读量:以防没有读者,弄一个假的阅读量}
\color{rgba(254, 67, 101, .8)}{要用随机数}
\color{rgba(254, 67, 101, .8)}{先在html页面写入阅读量}

<div class="row cl">
            <label class="form-label col-xs-4 col-sm-2">阅读量:</label>
            <div class="formControls col-xs-8 col-sm-9">
                <input type="text" class="input-text" value="<{$row.read_num}>" name="read_num">
            </div>
        </div>

\color{rgba(254, 67, 101, .8)}{然后在news\_add.php页面写一个假的阅读量,分配过来}

mt_rand和rand都能产生随机数,区别是:
mt_rand()是更好地随机数生成器,因为它跟rand()相比播下了一个更好地随机数种子;PHP文档也指出性能上比rand()快4倍,mt_getrandmax()所表示的数值范围也更大

if($id > 0){
            $row = get_row("select * from news where id=$id limit 1");
        }else{
            // mt_rand() 使用 Mersenne Twister 算法返回随机整数。
            //不给参数是0-21亿
            $row = ['publish_time'=>date('Y-m-d H:i:s'), read_num=>mt_rand(0, 1000)];
        }
image.png

\color{rgba(254, 67, 101, .8)}{提交按钮不要原本模板那么复杂的,做一个简单的}

<input type="hidden" name="id" value="<{$row.id}>">
<input class="btn btn-primary radius" type="submit" value="&nbsp;&nbsp;提交&nbsp;&nbsp;">
image.png

\color{rgba(254, 67, 101, .8)}{表单验证,把选择分类的name改成cat\_id}
\color{rgba(254, 67, 101, .8)}{然后是要验证的项和ajax}

//表单验证  不需要验证的项都删掉(就是打红色星号的项留下,其他的删掉)
    $("#form-article-add").validate({
        rules:{
            title:{
                required:true,
            },
            cat_id:{
                required:true,
            },
        },
        message:{
            title:{
                required:"必须填写标题",
            },
            cat_id:{
                required:"必须选择分类",
            },
        },
        onkeyup:false,
        focusCleanup:true,
        success:"valid",
        submitHandler:function(form){
            // 把之前news_category_add.html页面写好的ajax提交代码直接复制过来粘到这里
            // ajax提交:
            $(form).ajaxSubmit({
                type: 'post',
                url: "index.php?m=admin&c=news_add",// 提交给谁

                //data就是news_category_add.php页面$ret的值
                success: function(data){
                    if(data == 1){
                        //time:2000这个函数弹出的弹窗默认不会自动关闭
                        //设置时间就是自动关闭提示信息的时间
                        layer.msg('操作成功!',{icon:1,time:2000});

                        //视频中这里不显示弹窗提示,因为程序执行时间太短,所以需要加定时器
                        //但是自己的是显示的
                        //这个函数表示:前面是要做的事,后面设置时间为2秒
                        //这个函数表示2秒之后执行函数里的内容
                        //setTimeout(function(){},2000);
                        setTimeout(function(){
                        //如果添加成功,在提示成功之后,关闭当前窗口
                        //并刷新父级窗口,显示新添加信息
                        //逻辑:程序自身无法杀自身,只能通过其他程序
                        //所以这里要先找到他的父级,再刷新父级,再通过父级关闭它
                        //之所以刷新在中间,而不是先关闭再刷新
                        //是因为关闭了它自己就没有子级父级的概念了
                            var index = parent.layer.getFrameIndex(window.name);
                            parent.location.reload();
                            parent.layer.close(index);
                        },2000);
                    }else{
                        layer.msg('操作失败!',{icon:2,time:2000});// 2000表示提示信息留存时间  icon是一个 X 字体图标
                    }
                },
                error: function(XmlHttpRequest, textStatus, errorThrown){
                    layer.msg('error!',{icon:1,time:1000});
                }
            });
        }
    });
    

\color{rgba(254, 67, 101, .8)}{写好ajax之后,来到news\_category\_add.php页面}
\color{rgba(254, 67, 101, .8)}{之前是一个字段一个字段的接收的,接收完成后写sql语句}
\color{rgba(254, 67, 101, .8)}{之前是这样写的:}

  //在这里接收html页面传过来的三个值
        $name = $_POST['name'];
        $is_show = $_POST['is_show'];
        //这个值有默认值,所以判断一下
        //传值就使用传过来的值,空值就使用默认值0
        $sort = !empty($_POST['sort'])?intval($_POST['sort']):0;
        


        //修改功能,接收html页面传过来的id
        //并进行判断。如果id大于0,就是修改,否则就是添加
        // 如果执行成功,会通过下面的execute函数返回1,到news_category_add.html页面,进行添加操作
        $id = $_POST['id'];
        if($id > 0){
            $sql = "update news_category set name='$name', is_show='$is_show', sort='$sort' where id='$id'";
        }else{
            //接收到上面传递过来的值之后,用sql语句将数据写入表中
            $sql = "insert into news_category(name, is_show, sort) values ('$name','$is_show', '$sort')";
        }

\color{rgba(254, 67, 101, .8)}{字段多了就不能这样写了,}

可以用一个变量接收整个post:
$data=$_POST;
而不是像以前那样:
$name = $_POST['name'];
一个一个的接收
此时的$data是一个数组,数组的项就是接收到的ajax提交数据


\color{rgba(254, 67, 101, .8)}{中间有一些学习内容没有保存到}


\color{rgba(254, 67, 101, .8)}{之前接收到的字段有一些多余的东西}

\color{rgba(254, 67, 101, .8)}{用unset销毁}

//unset()函数用于销毁给定的变量。
//这个name是news_add.html的提交按钮的name
//这样除了file里的值没有,其他的都传过来了
unset($data['file']);

\color{rgba(254, 67, 101, .8)}{添加页面全部代码如下}

<?php
    require_once('init.php');
    if( !empty($_POST)){
        $data = $_POST;


        //之前的php中显示的时间格式是年月日时分秒,但是数据库中写的格式是int
        //需要用strtotime转换为时间戳格式,否则会报错
        $data['publish_time'] = strtotime($data['publish_time']);



        //在添加之前,还要先把添加时间加进来 时间字段 = 当前时间戳
        $data['add_time'] = time();

        //unset()函数用于销毁给定的变量。
        //这个name是news_add.html的提交按钮的name
        //这样除了file里的值没有,其他的都传过来了
        unset($data['file']);
        

        //然后,跟前面一样,如果data里的ID大于0就是修改,否则就是添加
        if($data['id'] > 0){

        }else{
            //添加需要把id删掉,因为id是自增长的
            unset($data['id']);
        //添加的sql语句:
        // implode 把数组元素组合为字符串
        // array_keys 返回包含数组中所有键名的一个新数组
        // $sql = "insert into news ("..")";这是一个整体,两个点的前后都是字符串,中间是变量
        // ")"就是一个括号
        //在这里还不能直接执行,会报错
        //因为sql中的时间字段,数据库中写的是int类型
        //但是实际显示的是2019-10-10 16:20:52这样的类型
        //所以需要在这个if之前用 strtotime 函数把时间类型转换为时间戳
            $sql = "insert into news (".implode(',',array_keys($data)).") values     ('".implode ("','", array_values($data))."')";
        }

        $ret = execute($sql);
        if($ret !== false){
            echo 1;
        }else{
            echo 0;
        }

    }else{
        //修改功能:
        //通过GET方法获取news_category.html带过来的id(这个ID在搜索框中)
        $id = $_GET['id'];
        //逻辑:如果获取到的ID大于0,表示有id,那么就是查询
        //然后用数据库查询函数查出这个id
        //然后用smarty把这个查到的值传递news_add.html
        //else是做添加时默认选项功能
        //else后面是把嵌入的news_add.html页面的显示时间默认值
        //这样在添加的时候,如果没有给时间,就给一个默认当前时间
        //
        if($id > 0){
            $row = get_row("select * from news where id=$id limit 1");
        }else{
            // mt_rand() 使用 Mersenne Twister 算法返回随机整数。
            //不给参数是0-21亿
            $row = ['publish_time'=>date('Y-m-d H:i:s'), read_num=>mt_rand(0, 1000)];
        }

        // 分类栏目先写名字和id就够用了,所以查询写id和name就够了
        //根据sort进行排序,如果sort一样,再根据id进行降序排列
        //然后把这个变量分配到news_add.html
        $category = get_all("select id, name from news_category order by sort, id desc");
        
        $smarty->assign('row', $row);
        $smarty->assign('category', $category);
        $smarty->display($tpl_name);
    }
    
?>

\color{rgba(254, 67, 101, .8)}{可以正常添加内容,此页面只差上传文件,便全部完成}

上一篇下一篇

猜你喜欢

热点阅读