确认弹出窗口链接到自定义验证器 - Zend

时间:2016-02-09 19:19:44

标签: php forms validation zend-framework popup

现在我有一个表单,可以将Dog的实例添加到Owner。我想这样做,如果Dog已经拥有一个所有者,则会弹出一个确认对话框。每次按下按钮时我都会弹出确认信息,但我不太确定如何添加条件。

我的代码如下:

<div class="row-fluid"> 
    <?php echo $this->form()->openTag($form); ?>
    <div class="form-group ">
        <?php echo ctrlGroup($this, AddDogForm::KEY_DOG_ID, !($this->uberAdmin)); ?>

        <?php $addDog = $this->form->get(AddDogForm::KEY_ADD_BTN); ?>
        <?php $addDog->setAttribute("class", "btn btn-info"); ?>
        <?php $addDog->setAttribute('onclick', 'if (confirm("Are you sure?")) { document.form.submit(); } return false;'); ?>

        <?php echo $this->formSubmit($addDog); ?>
    </div>
    <?php echo $this->form()->closeTag(); ?>

每次单击该按钮时都会弹出一个弹出窗口,但是我希望它在弹出弹出窗口之前检查输入的内容。

以下是我的AddDogForm:

class AddDogForm extends Form{
const KEY_PROJECT_ID = "project_id";
const KEY_ADD_BTN = "project_add_btn";

public function __construct($name = null, $options = array()){
    parent::__construct($name);

    $this->setAttribute('method', 'post');
    $this->setAttribute('class', 'form-inline');

    $id = new Text(self::KEY_DOG_ID);
    $id->setAttribute("id", self::KEY_DOG_ID);
    $id->setLabel("dogid to add");
    $this->add($id);


    $add = new Button(self::KEY_ADD_BTN);
    $add->setAttributes(array("id", self::KEY_ADD_BTN));
    $add->setLabel("Add Dog");
    $add->setValue("Add Dog");
    $this->add($add);   
    }


}

更新:我可以通过将此添加到AddDogForm来添加自定义验证器:

public function hasNoOwner($dogId) {
    $drm = DogResourceModel::create();
    $dogs = $drm->find($dogId);  
    $dog = array_values($dogs)[0]; 
    if($dog->getOwnerId()){
        return false; 
    } else {
        return true; 
    }
}

public function getInputFilterSpecification() {
    $hasOwnerValidator = array(
            'required' => true,
            'validators' => array(
                    new Callback(
                            array(
                                    $this,
                                    'hasNoOwner'
                            )),
            ),
    );
    return array(
            self::KEY_PROJECT_ID => $hasOwnerValidator
    );
}   

这将阻止用户输入。我可以改为改变它,以便它要求确认而不是阻止POST发生吗?

2 个答案:

答案 0 :(得分:1)

可能您可以在其中一个字段上的帖子数据上添加自定义验证器以进行验证,然后您只需显示一般信息。

有两种方法可以实现这一目标。

  1. 根据您对控制器中运行时的要求添加验证器/自定义验证器

    public function fooAction() {
        $form = new Dog_Form();
        if ($this->getRequest()->isPost()) {
            // all post data is valid now we validate for dog/owner thing
            $form->getElement('star_tag')->addValidator('Db_NoRecordExists',false,
               [
                   'table' => 'table name', 
                   'field' => 'field to check duplicate', 
                   'messages' => array('recordFound' => 'already_linked')
                ]
            );
            // redirect after successful insert
        }
        $this->view->form = $form;
    }
    
  2. 您可以使用zend表单的isValidPartial方法并在那里进行验证。检查http://framework.zend.com/manual/1.12/en/zend.form.quickstart.html#zend.form.quickstart.validate以查看其工作原理。

答案 1 :(得分:0)

如果hasOwner不为空,则传输变量onclick以查看并添加hasOwner

<?php if (!empty($hasOwner)) $addDog->setAttribute('onclick', 'if (confirm("Are you sure?")) { document.form.submit(); } return false;'); ?>

如果在表单中选择了狗,您可以发出ajax请求以检查所有者。删除onclick属性并添加要检查的js代码。

<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script>
$('form').submit(function() {
    var hasOwner = 0;

    $.ajax('/url/to/check', {
        'async':false,
        'data':{'dog':$('#<?php echo AddDogForm::KEY_DOG_ID; ?>').val()},
        'dataType': 'json',
        'success':function(data){
            hasOwner = data['hasOwner'];
        }
    })

    if (hasOwner) {
        if (confirm("Are you sure?")) return true;
        else return false;
    } else {
        return true;
    }
});
</script>
如果狗有所有者

/url/to/check应该返回json响应

<?php
....
$hasOwner = hasOwner($_REQUEST['dog']); // function
echo \json_encode(['hasOwner'=>$hasOwner]);
exit;
....
?>