Zend 表单编辑和 Zend_Validate_Db_NoRecordExists

2024-01-02

我正在通过构建一些供我自己使用的实用程序网站来慢慢增强我的 Zend 技能。我一直在使用 Zend Forms 和表单验证,到目前为止,我很高兴我已经了解了 Zend 的做事方式。然而,我对如何在编辑表单和映射到必须唯一的数据库列的字段的上下文中使用 Zend_Validate_Db_NoRecordExists() 有点困惑。

例如使用这个简单的表

TABLE Test
(
  ID INT AUTO_INCREMENT,
  Data INT UNIQUE
);

如果我只是向表测试添加一个新行,我可以向 Zend Form 元素的数据字段添加一个验证器,如下所示:

$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data') )

在表单验证时,该验证器将检查数据元素的内容是否已存在于表中。因此,可以继续插入到 Test 中,而不会违反数据字段 UNIQUE 限定符。

然而,当编辑测试表的现有行时,情况有所不同。在这种情况下,验证器需要检查元素值是否满足两个互斥条件之一:

  1. 用户已更改元素值,并且新值当前未更改 存在于表中。

  2. 用户有Not改变了元素值。因此价值does当前存在于表中(这是可以的)。

The Zend 验证文档 http://framework.zend.com/manual/en/zend.validate.set.html讨论向 NoRecordExists() 验证器添加一个参数,以便从验证过程中排除记录。这个想法是“验证表查找任何匹配的行,但忽略字段具有此特定值的任何命中”。这样的用例是编辑表格时验证元素所需要的。在 1.9 中执行此操作的伪代码如下(实际上我从 1.9 源代码中得到了这个 - 我认为当前的文档可能是错误的):

$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data',
                     array ('field'=>'Data', 'Value'=> $Value) );

问题是要排除的值 ($Value) 在实例化时(也在实例化表单时)绑定到验证器。但是,当表单编辑记录时,当表单最初填充数据时,该值需要绑定到 $data 字段的内容 - 即最初从测试表行读取的数据值。但在典型的 Zend 模式中,表单是在两个单独的步骤中实例化和填充的,这阻止了将排除值绑定到所需的元素值。

以下 Zend psuedo 代码标记了我希望将 $Value 绑定到 NoRecordExists() 验证器的位置(请注意,这是常见的 Zend 控制器模式):

$form = new Form() 
if (is Post) {
    $formData = GetPostData()
    if ($form->isValid($formData)) {
        Update Table with $formData
        Redirect out of here
    } else {
        $form->populate($formData)
    }
} else {
    $RowData = Get Data from Table
    $form->populate($RowData)     <=== This is where I want ('value' => $Value) bound
}

我可以对 Zend_Form 进行子类化并重写 populate() 方法,以便在初始表单填充中一次性插入 NoRecordExists() 验证器,但这对我来说似乎是一个巨大的黑客攻击。所以我想知道其他人的想法以及是否已经写下一些模式来解决这个问题?

编辑2009-02-04

我一直认为解决这个问题的唯一好的解决方案是编写一个自定义验证器并忘记 Zend 版本。我的表单将记录 ID 作为隐藏字段,因此给定表名和列名,我可以编写一些 SQL 来测试唯一性并排除具有此类 ID 的行。当然,这让我开始思考如何将表单绑定到模型应该隐藏的 dB 层!


它是这样完成的:

  1. 在您的表单中,您添加此验证器(例如电子邮件字段):

 

$email->addValidator('Db_NoRecordExists', true, array('table' => 'user', 'field' => 'email'));
  1. 不要为此添加自定义错误消息,因为此后它对我不起作用,例如:

 

$email->getValidator('Db_NoRecordExists')->setMessage('This email is already registered.');

 

  1. 在您的控制器中添加以下内容:

 

/* Don't check for Db_NoRecordExists if editing the same field */

    $form->getElement('email')
             ->addValidator('Db_NoRecordExists',
                                 false,
                                 array('table' => 'user',
                                       'field' => 'email',
                                       'exclude' => array ('field' => 'id', 'value' => $this->request->get('id'))));

And after this you do verifications, e.g.:

    if ($this->getRequest()->isPost())
            {
                if($form->isValid($this->getRequest()->getPost()))
                {

    ....

就是这样!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zend 表单编辑和 Zend_Validate_Db_NoRecordExists 的相关文章

  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 使用 JavaScript 在 HTML 表中动态添加行并通过提交按钮获取每个文本框的文本框值

    我有一个可以动态添加行的表 当我提交保存按钮时 我想将每行中的数据获取到 php 数组 请有人帮我解决这个问题 我是java脚本的新手 对此知之甚少 谢谢你
  • 我可以使用 WGET 生成给定 URL 的网站的站点地图吗?

    我需要一个可以抓取网站并以纯文本或类似格式返回所有已抓取页面的列表的脚本 我将把它作为站点地图提交给搜索引擎 我可以使用 WGET 生成网站的站点地图吗 或者有没有一个 PHP 脚本可以做同样的事情 wget spider recursiv
  • 如何从MySQL数据库获取今天/昨天的数据?

    我想从数据库中检索今天的数据 但我不知道该怎么做 我实际上想要获取不是过去 24 小时的数据 我只想获取今天的数据 因此基于实际服务器时间 我还想获取昨天的数据 谁能帮我怎么做 示例代码 SELECT id FROM folk WHERE
  • Pinterest 身份验证 url 返回 404 错误?

    我正在测试 pinterest apihttp pinterest com developers api http pinterest com developers api 在上面的身份验证部分的网址上 它说我必须将用户重定向到 pinte
  • 无法使用 php 将大文件上传到服务器

    我无法将大文件加载到服务器 问题出在该文件中 FILES filename tmp name 如果文件稍大于 2mb 则为空 我尝试更改 php ini 中的变量 upload max filesize 700M post max size
  • 类别树的路由

    我正在使用Tree http www gediminasm org article tree nestedset behavior extension for doctrine 2类别树的学说扩展并希望有如下路线 cat subcat1 s
  • php 注意到 $GLOBALS['HTTP_SERVER_VARS']['HTTP_HOST'] 中未定义索引 http_host

    突然 在最近的 php 版本更新后 我从 php 收到了此通知 它在多个地方使用 特别是我的 htmlMimeMail 类 代码是 mail gt setSMTPParams mail xxxx xxx 26 GLOBALS HTTP SE
  • 如何使用具有比较标准的 findBy 方法

    我需要使用使用比较标准 不仅仅是精确标准 的 神奇查找器 findBy 方法 换句话说 我需要做这样的事情 result purchases repository gt findBy array prize gt gt 200 这样我就可以
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • 在 PHP 中将对象作为参数传递[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP PCRE 函数中的 $0 是什么

    我读过一个文档preg filter功能如下 这是来自 php net http php net manual en function preg filter php site subject array 1 a 2 b 3 A B 4 p
  • dompdf:找不到图像或类型未知

    这是我的代码 我几乎尝试了所有在 PDF 上显示图像的方法 但仍然不起作用 你能帮我解决这个问题吗 我还将 DOMPDF ENABLE REMOTE 设置为 true 结果仍然相同 require once dompdf autoload
  • CodeIgniter 路由问题以访问前端和后端文件夹

    我正在使用 CodeIgniter 我在控制器和视图中有前端和后端文件夹 我尝试了服务器步骤甚至检查了几乎所有解决方案 但我仍然无法访问它我的默认控制器 路线 php route default controller frontend Us
  • 使用 jquery 和 php 测试表单输入是否为 1 或 2 位整数

    我有一个表单 其中有五个字段全部设置为 maxlength 2 基本上 我希望唯一可以输入的值是一位或两位整数 因为在将值存储在数据库中之前对这些字段执行计算 是否有任何 jquery 不允许用户输入不是整数的值 另外 用 jquery 和
  • 是否可以在 php.ini 中指示 PHP 使用 postfix 配置?

    是否可以配置 PHP 使用 postfix 的配置集发送电子邮件 WordPress 通过 PHPMailer 依赖于 php ini 中的这些设置是否正确 SMTP localhost http php net smtp port smt
  • 是否可以从插件扩展 Wordpress XMLRPC 接口?

    是否可以创建一个插件 在激活时向 XMLRPC 接口添加新的 功能 并处理其调用 简而言之 是的 您可以将函数添加为插件或添加到主题的functions php 文件中来处理XMLRPC 调用 您将需要以下部分 function xml a
  • 如何使用 Mockery 在第 N 次调用模拟方法时抛出异常

    我需要测试我编写的某些代码多次调用另一个类上的方法时的行为 其中一次调用将导致抛出异常 我在用Mockery http docs mockery io模拟可能引发异常的类 因此 就我而言 该方法将被调用三次 我需要它在第二次抛出异常 这是我

随机推荐

  • 如何为 postgresql 配置 HikariCP?

    我正在尝试在 postgresql 中使用 HikariCP 但在任何地方都找不到 postgresql 的配置 请给我指出带有 HikariCP 的 postgresql 的任何示例或任何相同的配置教程 我尝试像下面那样使用它 但它不起作
  • 创建docx word文档 web api .net core 2.0

    我正在Asp net core 2 0中开发一个Web API项目 我需要一个库或方法来创建 Word 文档 我搜索了一个尝试过的 NPOI 和 DocX 两者都没有想象中那么好 有人能给我推荐一个工具吗 乍一看 以下链接可以有所帮助 ht
  • 如何在 Go 中使用 RSA 密钥加密和解密纯文本?

    我正在尝试编写一个实用程序 使用 RSA 密钥对加密和解密纯文本文件 RSA 密钥是使用 ssh keygen 生成的 并像往常一样存储在 ssh 中 我无法理解如何使用 Go 语言 crypto 和 crypto rsa 包来做到这一点
  • MySQL 缓存和日期函数

    我曾经在性能博客中读到 最好使用 PHP 的日期函数在 MySQL 查询中设置日期 而不是使用像 curdate 这样的 mysql 日期函数 因为 mysql 可以缓存查询或结果或类似的东西 有人对此有任何见解吗 它有水分还是毫无根据 e
  • R-plotly-结合气泡和等值线图

    我想以情节方式将两种类型的地图组合在一张地图中 即气泡图和分区统计图 目标是通过将鼠标悬停在地图上来显示国家级别 分区统计图 以及城市级别 气泡 的人口规模 分区统计图的绘图示例代码如下 library plotly df lt read
  • 'Room' 类是抽象的;无法实例化

    我有一个抽象类Room它有子类Family and Standard 我创造了room new ArrayList
  • 2 Kubernetes pod 在不知道暴露地址的情况下进行通信

    我计划部署 2 个带有 NodePort 服务的 kubernetes pod 将它们暴露到网络中 现在我希望 pod 1 能够通过他的服务访问 pod 2 问题是我编写部署文件 但我不知道 pod 2 将从集群获取的 IP 地址 但我需要
  • WPF:使用虚拟键盘

    我创建了一个虚拟键盘用户控件 可以在应用程序中跨多个窗口使用 我想知道当按下某个键时如何将其输入到窗口中的文本框中 我正在寻找的是这样的 private void keyboardKey Click object sender Routed
  • Angular2 - 将文本框聚焦于组件加载

    我正在 Angular2 Beta 8 中开发一个组件 该组件有一个文本框和一个下拉列表 我想在组件加载或下拉列表更改事件后立即将焦点设置在文本框中 我如何在 Angular2 中实现这一点 以下是该组件的 Html div div
  • TypeError:使用 tf.map_fn 和 keras 功能模型时无法为

    当我尝试在 keras 功能模型的定义中使用 tf map fn 时 出现错误 TypeError Could not build a TypeSpec for
  • 如何使用 AngularJS 在过滤速度慢时显示某些内容

    在 Angular 中 我有一个表格和一个搜索框 用户可以在其中键入内容 Angular 将在数据中搜索并显示表格 问题是我有足够的数据 过滤可能会减慢 在这种情况下 我想显示一个微调器 类似于我的 html 的示例 Search
  • Delphi 同步滚动组件

    我正在尝试同步 VCL Forms 应用程序中两个 TDBGrid 组件的滚动 但在没有堆栈问题的情况下拦截每个网格组件的 WndProc 时遇到困难 我尝试在滚动事件下发送 WM VSCROLL 消息 但这仍然导致错误的操作 它需要用于单
  • 如何禁用 UIPickerView (Swift)?

    我想禁用 UIPickerView 但将其设置为 isEnabled false 不起作用 不 我不想在使用视图时禁用它 而是无法滚动视图 直到完成某个操作才能重新启用它 我在这里尝试的代码不起作用 它甚至可能不是快速代码 如何禁用 UIP
  • 尝试理解 Ember JS 的承诺

    我一直在尝试编写一个代码示例来理解承诺 但我似乎无法弄清楚如何处理回调并稍后获取 thenable 值 以下是我正在研究的两个相关 JSBin 示例 以冗长的风格编写 以模仿烘焙饼干 没有异步的 Ember JS http jsbin co
  • 如何使用 jQuery 默认预加载所有选项卡

    如果我有 4 个选项卡 其中前 2 个使用 ajax 加载 后 2 个是静态的 那么默认情况下如何预加载 2 个 ajax 选项卡 目前 只有第一个选项卡会自动加载 第二个选项卡会在单击时加载 我希望它们都被加载 这样当我单击第二个时 内容
  • 如何在客户端生成JSON

    在项目中 我必须将复杂的 JSON 命令从服务器发送到客户端 生成 JSONObjects 字符串 数字等 将它们转换为字符串然后通过 RequestBuilder 发送它们是否有效 或者是否有更有效的方法 将 JSON 对象转换为字符串是
  • 监听多个事件

    如何在事件驱动架构中处理相关事件 具体来说 如果必须触发多个事件才能执行某些操作怎么办 例如 我有一个监听两个事件的微服务foo and bar并且仅当两个事件到达并且具有相同的相关 ID 时才执行操作 一种方法是在微服务内部保留一个内部数
  • 如何使用 PHP/HTML 保持空白格式?

    我正在解析文件中的文本并将其存储在字符串中 问题是原始文件中的某些文本包含ASCII art以及我想保留的东西 当我打印出字符串HTML page 即使它确实具有相同的格式和所有内容 因为它是HTML 不保留间距和换行符 打印文本的最佳方式
  • 在反应路由器中刷新时出现空白页面

    当我从 home 导航到 dashboard 时 路由器工作正常 但是当我从 home 导航到 profile id 时 路由器将我导航到也工作正常的配置文件页面 但是当我刷新它时 它会变成空白页面并且没有给我任何 404 或重定向回主页
  • Zend 表单编辑和 Zend_Validate_Db_NoRecordExists

    我正在通过构建一些供我自己使用的实用程序网站来慢慢增强我的 Zend 技能 我一直在使用 Zend Forms 和表单验证 到目前为止 我很高兴我已经了解了 Zend 的做事方式 然而 我对如何在编辑表单和映射到必须唯一的数据库列的字段的上