【问题标题】:Confirmation Popup Linked to Custom Validator - Zend链接到自定义验证器的确认弹出窗口 - Zend
【发布时间】:2016-05-19 22:24:02
【问题描述】:

现在我有一个将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 发生?

【问题讨论】:

    标签: php forms validation zend-framework popup


    【解决方案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 以了解其工作原理。

    【讨论】:

    • 我正在查看addValidator 方法,您似乎可以添加自定义验证器,但文档似乎并不太清楚如何执行此操作。有什么建议吗?
    • 您可以通过以下方式添加验证器
    • 所以我让验证器工作了!但是,它只是阻止了 POST 操作。有没有办法将其与确认联系起来?
    • 是的,你可以做到。第一次显示错误消息时,您的表单中可能有一些隐藏的值,所以让我们说“忽略”。因此,当用户第一次提交表单时,您会在运行时添加自定义验证器并显示错误。尽管您可以在显示消息时为用户提供某种选项(例如忽略)。当用户说忽略时,您在隐藏字段中设置一些值,那时您不会在运行时添加自定义验证器,只会继续正常的发布数据验证。希望它对你有用。
    【解决方案2】:

    如果hasOwner不为空,则发送变量hasOwner查看并添加onclick

    <?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;
    ....
    ?>
    

    【讨论】:

    • 好吧,在我们弄清楚他们所指的狗之前,我们不知道是否有所有者。在这种情况下,它是一个文本框,他们在其中输入 Dog 的 ID。在发送发布请求之前,我如何检查他们在点击按钮时输入的内容?
    • 你应该向服务器发出ajax请求以检查所选狗是否有主人。
    • 既然我使用 Zend 制作表单,我还能在 .phtml 中这样做吗?我想我不确定我如何引用文本框
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2016-10-24
    • 2013-11-08
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多