码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-15 14:16:53      阅读:4113      评论:0      收藏:0      [点我收藏+]

标签:dede   dedecms   自字义字段   

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

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

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

bubuko.com,布布扣

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

二、 删除方法:

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

bubuko.com,布布扣


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

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

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

bubuko.com,布布扣

这一步实际上是更改表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;
}


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

标签:dede   dedecms   自字义字段   

原文地址:http://blog.csdn.net/dustin_php/article/details/41143807

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!