繁体   English   中英

CakePHP 2.4:通过SecurityComponent获得大型可扩展形式吗?

[英]CakePHP 2.4: Getting large, extensible forms past SecurityComponent?

使用CakePHP(2.4)和SecurityComponent提交大型可扩展表单的最安全方法是什么?

我的应用程序上有一个表单,该表单创建新字段以使用jQuery存储新的子记录(和 -subrecord)。 这与Cake的SecurityComponent冲突,后者希望已提交表单上的所有字段都由FormHelper在服务器端创建。

过去,当我只保存一个关联中的记录时,我已经能够将用户端字段限制为一个高但可使用的数字,例如100,并显式解锁表单可以生成的每个可能字段:

while($i < 100){
    $this->Form->unlockField('ChildModel.' . $i . '.value'); $i++;
    // unlock other fields for that possible record
}

但是,使用这种新形式,我不得不跨一种关系而不是两种关系保存数据。 用户可能会创建很多子记录或子子记录,因此命名空间ChildModel.[1-100].field, ChildModel.[1-100].GrandchildModel.[1-100].field开始获得巨大。 释放一个包含成千上万个可能的字段的命名空间,听起来似乎很疯狂,这些字段很少会被使用,但是所有可能都需要。

其他CakePHP开发人员发现了什么解决方案来解决此问题? 我认为这是其他人遇到的事情,在其中禁用整个操作的安全性根本不是一种选择。

我个人就是这样:

  1. 使用AJAX将要创建的动态字段的信息发送回服务器

  2. 使用新输入生成表单

  3. 从生成的表单HTML中提取令牌值,并将其与新字段的生成的HTML一起传递回去

  4. 将生成的HTML和令牌值注入到现有表单中

  5. ???

  6. 利润!

这是一个来自较旧项目的非常基本的剥离示例,用于为单个关联添加其他输入。

服务器端:

App::uses('Xml', 'Utility');

$formHtml = $this->Form->create('Model');

$this->Form->input('some_field');
$this->Form->input('also_a_field');

$dynamicInputs = array();
for($i = 0; $i < $numberOfEntries; $i ++)
{
    $dynamicInputs[] = $this->Form->input('AssociatedModel.' . $i . '.field');
}

$formHtml .= $this->Form->end();

$xml = Xml::build($formHtml);
$formData = Xml::toArray($xml);

$data = array
(
    'token' => array
    (
        'key' => array
        (
            'id' => $formData['form']['div'][0]['input'][1]['@id'],
            'value' => $formData['form']['div'][0]['input'][1]['@value']
        ),
        'fields' => array
        (
            'id' => $formData['form']['div'][2]['input'][0]['@id'],
            'value' => $formData['form']['div'][2]['input'][0]['@value']
        ),
        'unlocked' => array
        (
            'id' => $formData['form']['div'][2]['input'][1]['@id'],
            'value' => $formData['form']['div'][2]['input'][1]['@value']
        )
    ),
    'dynamicInputs' => $dynamicInputs
);

echo json_encode($data);

前端(使用jQuery):

var form = $('#my-form');

function addEntry()
{
    var inputs = form.find('.associated-model .input');
    var numberOfEntries = inputs.length + 1;

    $.ajax({
        url: '/controller/action/whatever',
        type: 'POST',
        data: 'numberOfEntries=' + numberOfEntries + '&' + form.serialize(),
        dataType: 'json',
        success: function(data)
        {
            updateForm(data);
        }
    });
}

function updateForm(data)
{
    var tokenKey = form.find('input[name=\'data[_Token][key]\']');
    tokenKey.attr('id', data.token.key.id);
    tokenKey.attr('value', data.token.key.value);

    var tokenFields = form.find('input[name=\'data[_Token][fields]\']');
    tokenFields.attr('id', data.token.fields.id);
    tokenFields.attr('value', data.token.fields.value);

    var tokenUnlocked = form.find('input[name=\'data[_Token][unlocked]\']');
    tokenUnlocked.attr('id', data.token.unlocked.id);
    tokenUnlocked.attr('value', data.token.unlocked.value);

    form.find('.associated-model').empty().append(data.dynamicInputs.join('\n'));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM