动态创建 Yii FormModel 对象 (CFormModel)

2024-02-11

我正在开发一个涉及在高抽象级别生成表单的应用程序(它是一个 CMS 应用程序)。我想动态创建 CFormModel 对象并即时设置表单字段。我想我可以通过扩展 CFormModel,然后动态创建代表表单字段的类属性(Yii 行话中的“属性”)来做到这一点。

为了说明这一点,不要在以下类(在文件中定义)中指定登录表单:

// From: http://www.yiiframework.com/doc/guide/1.1/en/form.model
class LoginForm extends CFormModel
{
    public $username;
    public $password;
    public $rememberMe=false;

    private $_identity;

    public function rules()
    {
        return array(
            array('username, password', 'required'),
            array('rememberMe', 'boolean'),
            array('password', 'authenticate'), // assume function authenticate defined elsewhere
        );
    }
}

我想这样做:

class MyFormModel extends CFormModel {

    protected $_rules = array();

    public function __construct($attributes=array(), $rules=array()) {

        foreach ($attributes as $i => $attr) {
            $this->{$attr} = ???; // <<== This is the key here
        }

        // pass in array of rules as described in Yii doc for CFormModel
        $this->_rules = $rules;
    }

    public function rules() {
        return $_rules;
    }
}

并在需要时调用它,如下所示:

$myModelObj = new MyFormModel($attr, $rules);

where :

$attr = array(
            'username',
            'rememberMe',
            'password',
        );
$rules = array(
            array('username, password', 'required'),
            array('rememberMe', 'boolean'),
            array('password', 'authenticate'), // assume function authenticate defined elsewhere
        );

请注意,在我想要完成的任务中,任何文件中都没有写入“LoginClass”,它是在代码中动态创建的。

这将允许我创建表单(在视图中)执行如下操作:

// based on http://www.yiiframework.com/doc/guide/1.1/en/form.view
<?php echo $wForm->textField($myModelObj,'username'); ?>

etc.

我已经尝试过了,$this->{$attr} 行失败并显示:

Property "MyFormModel.username" is not defined.

实际上该行的代码只是:

$this->{$attr};

这 ???表示我不太确定要为此分配什么。在 Yii 文档示例中,他们只是将字段定义为公共类变量。

我应该使用魔法方法吗?

我在这里尝试做的事情可能吗?


你可能知道 Yii 使用面向对象重载 http://php.net/manual/en/language.oop5.overloading.php解析您的 AR 类属性。

您在这里需要做的事情与 Yii 内部所做的类似。

定义一个硬编码属性来存储所有自定义属性,如数组:$_data

该数据将是一个数组,并将保存您在运行时添加的所有属性。您可能需要像 Yii 那样通过覆盖魔术方法(setters、getters、isset)来挑战验证,首先从您的$_data财产持有人。

您会在其中找到某种代码活动记录 http://code.google.com/p/yii/source/browse/tags/1.1.10/framework/db/ar/CActiveRecord.php寻找所有这些__XXX类似的方法。

如果您将 AR 属性处理复制到您的自定义类,您将在您的级别上运行所有这些,并且当您的魔术方法无法解决它时,将回退到 Yii。

此外,我还会研究行为,因为您可以将许多常见功能委托给行为类。

组件行为的使用

一个组件支持mixin http://en.wikipedia.org/wiki/Mixin模式并可以附加一个或多个行为。行为是一个对象,其方法可以通过收集功能而不是专门化的方式由其附加组件“继承”(即正常的类继承)。一个组件可以附加多个行为,从而实现“多重继承”。

行为类必须实现IBehavior界面。大多数行为都可以从CBehavior基类。如果一个行为需要附加到一个模型,它也可以从C模型行为 http://www.yiiframework.com/doc/api/1.1/CModelBehavior or CActiveRecord行为 http://www.yiiframework.com/doc/api/1.1/CActiveRecordBehavior它实现了特定于模型的附加功能。

要使用行为,必须首先通过调用行为的attach()方法。然后我们可以通过组件调用行为方法:

// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

可以像访问组件的普通属性一样访问附加行为。例如,如果一个名为树的行为附加到一个组件,我们可以使用以下方法获取对此行为对象的引用:

$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');

可以暂时禁用行为,以便其方法无法通过组件使用。例如,

$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();

附加到同一组件的两个行为可能具有相同名称的方法。在这种情况下,第一个附加行为的方法将优先。

与一起使用时events http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-event,行为更加强大。行为在附加到组件时,可以将其某些方法附加到组件的某些事件。通过这样做,行为有机会观察或更改组件的正常执行流程。

行为的属性也可以通过其附加的组件来访问。这些属性包括公共成员变量以及通过行为的 getter 和/或 setter 定义的属性。例如,如果某个行为具有名为 xyz 的属性,并且该行为附加到组件 $a。然后我们可以使用表达式$a->xyz访问行为的属性。

更多阅读:
http://www.yiiframework.com/wiki/44/behaviors-events http://www.yiiframework.com/wiki/44/behaviors-events
http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/ http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/

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

动态创建 Yii FormModel 对象 (CFormModel) 的相关文章

  • PHP 正则表达式匹配字符串的最后一次出现

    我的字符串是 text1 A373R12345 我想找到该字符串最后出现的非数字数字 所以我使用这个正则表达式 0 9 然后我得到这个结果 1 A373 2 12345 但我的预期结果是 1 A373R 它有 R 2 12345 另一个例子
  • 获取今天的科普特日期

    我正在寻找获取今天的科普特日期与任何代码类型类似php or javascript在我的网站标题中显示科普特日期 我需要阿拉伯语或英语版本 我试图找到它 但没有找到类似的英文内容 参考 http www copticchurch net e
  • 如何更改codeception phpbrowser/mink超时

    我正在尝试使用代码接收创建测试 以检查页面在高负载的情况下是否正常工作 不幸的是 如果页面负载非常高并且测试开始 我会收到这样的错误 Codeception Exception ModuleConfig Codeception Util M
  • 垃圾邮件打败了我所有的验证码

    我有一个 WordPress 博客 我在上面使用验证码插件的时间最长 因为它有效 最近我收到了大量的垃圾邮件 然后我尝试执行通过 PHP 生成的 将这些随机数添加在一起 但仍然没有成功 我不太确定需要做什么来阻止这些垃圾邮件 但这很烦人 我
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • 将 OAuth WRAP 访问令牌直接保存在客户端计算机上的 cookie 中吗?

    我计划建立一个可以访问 oauth 包装框架的网站 我正在考虑将访问令牌按原样存储在客户端计算机上 我不想在服务器上维护临时令牌等数据库 我应该做吗 或者我应该加密它 首先 为什么他们不使用 OAuth 2 0 您可以将 OAuth 凭据存
  • 如何仅删除页面的自动段落格式,而不删除帖子的自动段落格式(WordPress)

    我已经熟悉这个在 WordPress 中删除自动段落格式的小技巧 remove filter the content wpautop remove filter the excerpt wpautop 但是添加这个函数 php删除整个网站的
  • 如何在 CakePHP 中“验证”人名?

    我有一个 PHP 脚本 应该检查 有效 的人名 但最近破解了带有空格的名称 因此我们向验证器添加了空格 除了这样做之外 有没有办法向 CakePHP 的验证器添加黑名单以阻止所有 无效 字符 而不是允许 有效 字符 注意 我 通常 知道如何
  • jQuery 变量在定义时声称它是未定义的

    我试图在同一页面上有两个自动填充文本框 一个用于手机型号 input1 一个用于固件 input2 当两者都填充时 我希望显示一个带有ID input1input2 的div 但是当在input1 中输入值时 它声称phone 的变量未定义
  • PHP 的脚手架 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 PHP 中有什么东西可以像 Rails 一样创建基本的脚手架吗 编辑 我需要一些东西来快速原型化 一些框架比如Symfony http www sym
  • 自定义类的重写 bool() [重复]

    这个问题在这里已经有答案了 我想要的只是 bool myInstance 返回 False 并且 myInstance 在 if or and 等条件下计算为 False 我知道如何覆盖 gt 我试过这个 class test def bo
  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • Laravel/00webhost 错误 404。在此服务器上找不到请求的 URL

    1 将我的文件上传到 000webhost 我将公用文件夹中的所有文件放置到公共 html然后我创建了一个名为laravel我在那里上传了所有其他文件 这是我的目录结构 laravel app 引导程序 config 公共 html 索引
  • yii2 中的自动完成

    在 Yii2 中 我希望当用户开始输入时 我的输入字段之一能够自动完成 下面是我的代码 它使用Jui Autocomplete 这是行不通的 当我打印我的数组时 我就像 Array 1 gt abc 2 gt xyz 4 gt pqr
  • 付款成功后保存到数据库(paypal)

    我试图找出在客户使用 paypal 支付商品费用后将数据 之前以表单提交 保存到数据库的最佳方法 沿着这个过程的一些事情 1 在实际网站上填写表格 gt 2 登录 Paypal gt 3 立即付款 PayPal gt 4 数据已插入数据库
  • 使用 yum 和 pear 安装 php-soap 均失败

    我正在尝试在 Centos 6 4 服务器上安装 PHP 的 SOAP 扩展 我对包管理器 从 CLI 安装包并在 PHP 中配置它们相当不熟悉 我相当有能力管理 php ini 和其他 PHP 配置文件 soap ini 等 我尝试使用以
  • php date_parse("2010 年 2 月") 给出日期 == 1

    当没有日期时 我将其称为 date parse 中的错误 d date parse Feb 2010 会给 d day 1 请参阅对此的评论date parse 手册页 http php net manual en function dat
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子

随机推荐