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


Confirmation Popup Linked to Custom Validator - Zend

现在我有一个表单,可以将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
    );
}   

这将阻止用户输入。我可以改为更改它以要求确认而不是阻止开机自检吗?

也许您可以在其中一个要验证的字段上的帖子数据上添加自定义验证器,然后您可以只显示一般消息。

有两种可能的方法可以实现此目的。

  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 以查看其工作原理。

传输变量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;
....
?>