从原理上教你如何删除织梦dedecms自定义字段

由于dedecms后台没有提供删除自定义字段的方法,我们只能自己手动操作删除,下面的内容是删除的方法和原理。

一、增加一个自定义字段,用于下面的示例中讲解删除。

“核心-频道模型-内容模型管理”,选择”普通文章-字段管理-添加新字段“

注意红色框选的地方,后面的讲解会说到。

二、 删除方法:

1、第一步,“核心-频道模型-内容模型管理”,选择”普通文章-字段管理“,删除”模型字段配置“中新增加的内容,即下图中红色框选部分。

这一步实际上是更改表dede_channeltype中的fieldset字段的值。

2、第二步,若在添加自字义字段时,勾选了”使字段可以在列表的底层模板中。。。。“,则执行这一步,否则跳过即可。

第二步,“核心-频道模型-内容模型管理”,选择”普通文章-基本设置“,修改”列表附加字段“,删除其中新增加的部分。如下图,将”body,qq“改为"body"

这一步实际上是更改表dede_channeltype中的listfields字段的值。

3、第三步,删除表dede_addonarticle中我们新增加的字段。

alter table dede_addonarticle drop qq;

完成这三步后,就将我们增加的自定义字段彻底删除了。

三、原理

我们采用逆向思维分析我们这样做的原理,我们查看dedecms源程序,看它在增加自定义字段时都干了什么事情,我们在删除时,把它干的事情撤消掉,就达到了我们的目的。

添加自字义字段时涉及到的主要文件:mychannel_field_add.php、inc_admin_channel.php

一、mychannel_field_add.php中的save方法,下面代码中我用/************    *********/注释的部分,是执行的主要内容

if($action=='save')
{
    //修改字段配置信息
    $dfvalue = trim($vdefault);
    $isnull = ($isnull==1 ? "true" : "false");
    $mxlen = $maxlength;

    if(preg_match("#^(select|radio|checkbox)$#i", $dtype))
    {
        if(!preg_match("#,#", $dfvalue))
        {
            ShowMsg("你设定了字段为 {$dtype} 类型,必须在默认值中指定元素列表,如:'a,b,c' ","-1");
            exit();
        }
    }

    if($dtype=='stepselect')
    {
        $arr = $dsql->GetOne("SELECT * FROM `#@__stepselect` WHERE egroup='$fieldname' ");
        if(!is_array($arr))
        {
            ShowMsg("你设定了字段为联动类型,但系统中没找到与你定义的字段名相同的联动组名!","-1");
            exit();
        }
    }

    //模型信息
    $row = $dsql->GetOne("SELECT fieldset,addtable,issystem FROM `#@__channeltype` WHERE id='$id'");
    $fieldset = $row['fieldset'];
    $dtp = new DedeTagParse();
    $dtp->SetNameSpace("field", "<", ">");
    $dtp->LoadSource($fieldset);
    $trueTable = $row['addtable'];

    //检测被修改的字段类型
    $fieldinfos = GetFieldMake($dtype, $fieldname, $dfvalue, $mxlen);
    $ntabsql = $fieldinfos[0];
    $buideType = $fieldinfos[1];
	/***********给dede_addonarticle表增加字段***********/
    $rs = $dsql->ExecuteNoneQuery(" ALTER TABLE `$trueTable` ADD  $ntabsql ");
    if(!$rs)
    {
        $gerr = $dsql->GetError();
        ShowMsg("增加字段失败,错误提示为:".$gerr,"javascript:;");
        exit();
    }

    //检测旧配置信息,并替换为新配置
    $ok = FALSE;
    $fieldname = strtolower($fieldname);
    if(is_array($dtp->CTags))
    {
        foreach($dtp->CTags as $tagid=>$ctag)
        {
            if($fieldname == strtolower($ctag->GetName()))
            {
                $dtp->Assign($tagid, stripslashes($fieldstring), FALSE);
                $ok = true;
                break;
            }
        }
        $oksetting = $ok ? $dtp->GetResultNP() : $fieldset."\n".stripslashes($fieldstring);
    }
    else
    {
        $oksetting = $fieldset."\r\n".stripslashes($fieldstring);
    }

    $addlist = GetAddFieldList($dtp,$oksetting);
    $oksetting = addslashes($oksetting);
	/***********修改表dede_channeltype中的fieldset和listfields字段**********/
    $rs = $dsql->ExecuteNoneQuery("UPDATE `#@__channeltype` SET fieldset='$oksetting',listfields='$addlist' WHERE id='$id' ");
    if(!$rs)
    {
        $grr = $dsql->GetError();
        ShowMsg("保存节点配置出错!".$grr, "javascript:;");
        exit();
    }

    ShowMsg("成功增加一个字段!", "mychannel_edit.php?id={$id}&dopost=edit&openfield=1");
    exit();
}

二、在inc_admin_channel中的GetAddFieldList方法中判断是否勾选了"使字段可以在列表的底层模板中。。。。"

function GetAddFieldList(&$dtp,&$oksetting)
{
    $oklist = '';
    $dtp->SetNameSpace("field","<",">");
    $dtp->LoadSource($oksetting);
    if(is_array($dtp->CTags))
    {
        foreach($dtp->CTags as $tagid=>$ctag)
        {
			/***********在这里判断是否勾选了"使字段可以在列表的底层模板中。。。。"************/
            if($ctag->GetAtt('islist')==1)
            {
                $oklist .= ($oklist=='' ? strtolower($ctag->GetName()) : ','.strtolower($ctag->GetName()) );
            }
        }
    }
    return $oklist;
}
时间: 2024-08-06 20:47:43

从原理上教你如何删除织梦dedecms自定义字段的相关文章

织梦DedeCMS自定义表单diy_list.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

织梦dedecms自定义搜索可以按照附加表字段进行搜索

因为需要在网上搜索了一下找到此修改方法: 首先 是新建模型:商标信息 模型:附加表为dede_shangbiao ,附加字段先添加了2个,sbID(商标ID)和chuangyi(创意说明)然后 打开需要搜索的模板,我用的是通用的模板,head.htm 稍后有图说明,      <form action="{dede:global.cfg_cmsurl /}/plus/advancedsearch.php" method="post">          

织梦(dedecms)后台删除文章后台还有分页显示解决方法

鸡哥今天在给单位改一个织梦网站的时候发现了一个问题,由于本来的程序有7000多篇文章,鸡哥就直接执行了个sql语句给删除了,但是发现删除之后后台文章的分页还在显示着,错误截图给大家看看 看到没,经过鸡哥百度搜索发现这其实并不是鸡哥的操作问题,而是这本就是织梦5.7的一个bug,下边就给大家写下修复方法很简单: 先找到你的根目录中/dede/content_list.php这个文件打开找到 这段代码,可以直接搜索缓存处理就能找到 把红框中的代码修改为: $arr = $dsql->GetOne(&qu

织梦dedecms建网站技巧:4个细节问题和技巧

相信很多站长朋友都会认识织梦dedecms这个网站程序,并且这一款程序受到很多人的喜爱,原因是他能够生成静态页面,这样是非常便于网站的SEO优化,另外织梦程序使用简单使用,成为大部分企业网站和资讯网站的站长的首选.但在使用织梦的过程中也会遇到一些问题和麻烦,今天彭健跟大家分享一下一些细节的问题和使用技巧. 一.织梦简略标题的应用 大家都知道,搜索引擎对于图片的识别的技术是非常不成熟的,所以我们在图片上加入ALT说明标签便于搜索引擎了解图片,但对于使用织梦程序建站的时候,首页.栏目页面的一些图片缩

织梦Dedecms安全设置

织梦DedeCMS是一款非常流行的CMS,很多刚开始建站人都用的织梦,一方面是织梦比较容易操作;另一方面是织梦的SEO方面做的确实比其他的系统要好一些.这些都导致织梦的用户群是非常庞大的,用的人多了,漏洞自然就多起来,所以织梦的安全性为大家所诟病,很多人在使用中经常会遇到或者担心网站挂马.这里No牛网特意整理一篇关于织梦DedeCMS安全设置的文章,希望对使用织梦的朋友有点帮助. 一般使用织梦建的站只要做到下面一系列针对DEDE网站的安全设置,基本可以避免99% 网站被挂马的情况. 一.精简程序

织梦DedeCMS调用二级子栏目或者多级栏目解决方法

本文是关于织梦DedeCMS调用多级子栏目的,拿来测试分享下.DEDECMS v5.7,后台已建栏目目录,如下图1所示: 图1 DEDECMS后台栏目结构 现在,我们先来调用顶级栏目"站长新闻",以及其下的子栏目,如图2所示: 图2 DEDECMS顶级栏目"站长新闻" 当前栏目typeid值为3,所以代码如下: {dede:channelartlist typeid='3,3'} <a href="{dede:field name='typeurl'

做好织梦dedecms安全防护全部方法

很多同学遇到网站被攻击挂马,大都不是竞争对手所为.多数情况下是黑客利用工具批量扫描入侵的.因此安全防护自关重要. 织梦安装时注意: 修改默认数据库前缀: 在dedecms安装的时候修改下数据库的表前缀,尽量不用默认的前缀dede_ ,随便改个其他的英文字母小写命名即可.以防止黑客猜到. 安装后去除所有再带后门和漏洞 1.修改默认后台路径: 作用:是防止黑客猜到你的后台,进行其他操作.进入网站根目录,就能看到dede文件夹,重命名即可.比如改为lisanbao这个时候访问后台就不是:你的域名/de

织梦dedecms中html和xml格式的网站地图sitemap制作方法

sitemap是网站上各网页的列表.创建并提交sitemap有助于百度(Google)发现并了解您网站上的所有网页,包括百度通过传统抓取方式可能找不到的网页.还可以使用sitemap提供有关你网站的其他信息,如上次更新日期.sitemap文件的更新频率等,供百度 (Google)spider参考. 百度(Google)对已提交的数据,不保证一定会抓取及索引所有网址.但是,百度(Google)会使用sitemap中的数据来了解网站的结构等信息,这样可以帮助百度改进抓取策略,并在日后能更好地对网站进

织梦Dedecms使用Nginx的安全设置

首先需要说明的是,任何程序都是有漏洞的,我们需要做好一些必要的防范,来减少由于程序漏洞造成的损失.织梦的漏洞多,这个是很多人的想法.不过大家如果做好了织梦系统的文件夹权限什么的设置,很多漏洞也是用不上的. 这些安全措施,织梦官方已经给出过很多教程了,如织梦后台中uploads等文件夹执行php文件权限的问题.今天主要说的就是Nginx下取消织梦uploads文件夹权限的问题.如果是在Apache中,可以在.htaccess中通过如下的代码解决: RewriteEngine on  Rewrite