dedecms自定义字段删除

dedecms织梦系统自定义字段删除方法如下:由于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方法,下面代码中我用/************    *********/注释的部分,是执行的主要内容

 

[php] view plain copy
 
 
  1. if($action=='save')  
  2. {  
  3.     //修改字段配置信息  
  4.     $dfvalue = trim($vdefault);  
  5.     $isnull = ($isnull==1 ? "true" : "false");  
  6.     $mxlen = $maxlength;  
  7.       
  8.     if(preg_match("#^(select|radio|checkbox)$#i"$dtype))  
  9.     {  
  10.         if(!preg_match("#,#"$dfvalue))  
  11.         {  
  12.             ShowMsg("你设定了字段为 {$dtype} 类型,必须在默认值中指定元素列表,如:'a,b,c' ","-1");  
  13.             exit();  
  14.         }  
  15.     }  
  16.       
  17.     if($dtype=='stepselect')  
  18.     {  
  19.         $arr = $dsql->GetOne("SELECT * FROM `ja02opLN2St_stepselect` WHERE egroup='$fieldname' ");  
  20.         if(!is_array($arr))  
  21.         {  
  22.             ShowMsg("你设定了字段为联动类型,但系统中没找到与你定义的字段名相同的联动组名!","-1");  
  23.             exit();  
  24.         }  
  25.     }  
  26.   
  27.     //模型信息  
  28.     $row = $dsql->GetOne("SELECT fieldset,addtable,issystem FROM `ja02opLN2St_channeltype` WHERE id='$id'");  
  29.     $fieldset = $row['fieldset'];  
  30.     $dtp = new DedeTagParse();  
  31.     $dtp->SetNameSpace("field""<"">");  
  32.     $dtp->LoadSource($fieldset);  
  33.     $trueTable = $row['addtable'];  
  34.   
  35.     //检测被修改的字段类型  
  36.     $fieldinfos = GetFieldMake($dtype$fieldname$dfvalue$mxlen);  
  37.     $ntabsql = $fieldinfos[0];  
  38.     $buideType = $fieldinfos[1];  
  39.     /***********给dede_addonarticle表增加字段***********/  
  40.     $rs = $dsql->ExecuteNoneQuery(" ALTER TABLE `$trueTable` ADD  $ntabsql ");  
  41.     if(!$rs)  
  42.     {  
  43.         $gerr = $dsql->GetError();  
  44.         ShowMsg("增加字段失败,错误提示为:".$gerr,"javascript:;");  
  45.         exit();  
  46.     }  
  47.   
  48.     //检测旧配置信息,并替换为新配置  
  49.     $ok = FALSE;  
  50.     $fieldname = strtolower($fieldname);  
  51.     if(is_array($dtp->CTags))  
  52.     {  
  53.         foreach($dtp->CTags as $tagid=>$ctag)  
  54.         {  
  55.             if($fieldname == strtolower($ctag->GetName()))  
  56.             {  
  57.                 $dtp->Assign($tagidstripslashes($fieldstring), FALSE);  
  58.                 $ok = true;  
  59.                 break;  
  60.             }  
  61.         }  
  62.         $oksetting = $ok ? $dtp->GetResultNP() : $fieldset."\n".stripslashes($fieldstring);  
  63.     }  
  64.     else  
  65.     {  
  66.         $oksetting = $fieldset."\r\n".stripslashes($fieldstring);  
  67.     }  
  68.       
  69.     $addlist = GetAddFieldList($dtp,$oksetting);  
  70.     $oksetting = addslashes($oksetting);  
  71.     /***********修改表dede_channeltype中的fieldset和listfields字段**********/  
  72.     $rs = $dsql->ExecuteNoneQuery("UPDATE `ja02opLN2St_channeltype` SET fieldset='$oksetting',listfields='$addlist' WHERE id='$id' ");  
  73.     if(!$rs)  
  74.     {  
  75.         $grr = $dsql->GetError();  
  76.         ShowMsg("保存节点配置出错!".$grr"javascript:;");  
  77.         exit();  
  78.     }  
  79.       
  80.     ShowMsg("成功增加一个字段!""mychannel_edit.php?id={$id}&dopost=edit&openfield=1");  
  81.     exit();  
  82. }  

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

 

[php] view plain copy
 
 
  1. function GetAddFieldList(&$dtp,&$oksetting)  
  2. {  
  3.     $oklist = '';  
  4.     $dtp->SetNameSpace("field","<",">");  
  5.     $dtp->LoadSource($oksetting);  
  6.     if(is_array($dtp->CTags))  
  7.     {  
  8.         foreach($dtp->CTags as $tagid=>$ctag)  
  9.         {  
  10.             /***********在这里判断是否勾选了"使字段可以在列表的底层模板中。。。。"************/  
  11.             if($ctag->GetAtt('islist')==1)  
  12.             {  
  13.                 $oklist .= ($oklist=='' ? strtolower($ctag->GetName()) : ','.strtolower($ctag->GetName()) );  
  14.             }  
  15.         }  
  16.     }  
  17.     return $oklist;  
  18. }  

原理只是参考,只要按前面3步骤操作删除dedecms自定义字段删除即可。

原文转载自:https://blog.csdn.net/dustin_php/article/details/41143807