A-A+

dedecms会员中心文章有自定义字段不能编辑的错误修复

2014年11月25日 13:53 汪洋大海 暂无评论 阅读 250 views 次

今日一个客户遇到如题的问题,于是下载了最新版的dedecms进行测试,结果很是令人遗憾哦。这里也算是织梦内容管理系统的一个bug了。
模拟问题先,在普通文章模型新增了一个字段,然后注册了测试账号进行发布文章和修改文章的测试,发布正常,但是测试就提示"数据校验不对,程序返回"的错误。
查看编辑页面源码,发现没有dede_fieldshash的input信息,导致$dede_fieldshash为空,如下的检测代码就被执行给出一个提示。

1
2
3
4
5
if (empty($dede_fieldshash) || $dede_fieldshash != md5($dede_addonfields.$cfg_cookie_encode))
        {
            showMsg('数据校验不对,程序返回', '-1');
            exit();
        }

解决办法,修改member\inc\inc_archives_functions.php文件,将

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 *  载入自定义表单(用于编辑)
 *
 * @param     string  $fieldset
 * @param     string  $fieldValues
 * @param     string  $loadtype
 * @return    string
 */
function PrintAutoFieldsEdit(&$fieldset, &$fieldValues, $loadtype='all')
{
    $dtp = new DedeTagParse();
    $dtp->SetNameSpace("field","<",">");
    $dtp->LoadSource($fieldset);
    $dede_addonfields = "";
    if(is_array($dtp->CTags))
    {
        foreach($dtp->CTags as $tid=>$ctag)
        {
            if($loadtype!='autofield'
            || ($loadtype=='autofield' && $ctag->GetAtt('autofield')==1) )
            {
                $dede_addonfields .= ( $dede_addonfields=='' ? $ctag->GetName().",".$ctag->GetAtt('type') : ";".$ctag->GetName().",".$ctag->GetAtt('type') );
                echo GetFormItemValueA($ctag,$fieldValues[$ctag->GetName()]);
            }
        }
    }
    echo "<input type='hidden' name='dede_addonfields' value=\"".$dede_addonfields."\">\r\n";
}

改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 *  载入自定义表单(用于编辑)
 * @bug  修正编辑时候没有输出dede_fieldshash输入框 by  uu6c.com
 * @param     string  $fieldset
 * @param     string  $fieldValues
 * @param     string  $loadtype
 * @return    string
 */
function PrintAutoFieldsEdit(&$fieldset, &$fieldValues, $loadtype='all')
{
    global $cfg_cookie_encode;
    $dtp = new DedeTagParse();
    $dtp->SetNameSpace("field","<",">");
    $dtp->LoadSource($fieldset);
    $dede_addonfields = "";
    if(is_array($dtp->CTags))
    {
        foreach($dtp->CTags as $tid=>$ctag)
        {
            if($loadtype!='autofield'
            || ($loadtype=='autofield' && $ctag->GetAtt('autofield')==1) )
            {
                $dede_addonfields .= ( $dede_addonfields=='' ? $ctag->GetName().",".$ctag->GetAtt('type') : ";".$ctag->GetName().",".$ctag->GetAtt('type') );
                echo GetFormItemValueA($ctag,$fieldValues[$ctag->GetName()]);
            }
        }
    }
    echo "<input type='hidden' name='dede_addonfields' value=\"".$dede_addonfields."\">\r\n";
    echo "<input type=\"hidden\" name=\"dede_fieldshash\" value=\"".md5($dede_addonfields.$cfg_cookie_encode)."\" />";
}

本以为到此为止,奈何编辑提交还是提示错误"提交表单同系统配置不相符,请重新提交",打开文件member\article_edit.php,找到

1
2
3
4
5
6
7
8
// 这里对前台提交的附加数据进行一次校验
        $fontiterm = PrintAutoFieldsAdd($cInfos['fieldset'],'autofield', FALSE);
 
        if ($fontiterm != $inadd_f)
        {
            ShowMsg("提交表单同系统配置不相符,请重新提交!", "-1");
            exit();
        }

将上面的代码删除就可以了,我打印了$fontiterm和$inadd_f,$inadd_f是带有用户输入值的,这两个变量不能直接去判断相等的,很显然这是一个比较低级的bug。

文章来源:http://www.uu6c.com/document/33.html

标签:

给我留言