我正在尝试创建一个面向对象的表单生成器。请记住,它只会被我们公司的少数人用来解决特定问题。
我目前面临两个小警告。
创建元素的语法
我可以采取的方法很少。
在构造函数中设置所有内容。作为一个缺点,这可能会导致不一致的构造函数使用
Input::create('text', 'name', array('maxlength' => 10));
限制构造函数类型,只公开最常用的属性作为方法(保留一个方法用于大量属性设置)
Input::create('text')->name('name')->value('value')->attribute('max_length', 10);
通过为每个属性创建方法或使用 __call 魔术方法将每个属性公开为方法,这将导致 IDE 不支持自动完成。即使是现在,我也可以保留 attribute 方法。
Input::create()->type('text')->name('name')->value('value')->max_length(10)->id('id'); //etc.
目前,我认为第二种方法是最好的方法,因为它保留了来自两个世界的“好”东西。 As 仍然提供了一种抽象一些工作的方法,因为例如required 方法不仅会设置 required 属性,还会根据需要将此字段标记为验证对象。
使用方法 2 和 3 的代码复制
因为有些属性可以被每个元素使用,但也有只能被 3 或 4 个元素使用的属性,例如HTML5 属性 form.
每个元素都可以从基元素继承,基元素具有对每个元素通用的属性方法(例如 name)。部分可用的属性可以通过接口(interface)来解决,但这会导致代码重复,因为它们不能包含方法体。
Traits 是解决方案,但遗憾的是,我被困在 PHP 5.3 上,无法升级。这让我只能实现 Mixin 或 Composition 模式,这又可能导致不支持自动完成。使用第二种方法可以部分缓解这种情况。
所以对于我的实际问题:
哪种方法最适合结束? (适用于最少的代码重复、可靠的代码重用和易于实现)
我意识到这很可能会产生基于意见的答案,所以如果确实如此,我提前道歉。
最佳答案
我意识到这是一个老问题,但有人在评论中提到了我创建的名为 htmlgen 的项目,镜像在 packagist 上.我在这里提供了一些支持,因为我最近发布了一个新版本 2.x,它使 PHP 中的 HTML 生成变得非常愉快。
use function htmlgen\html as h;
echo h('input', ['name'=>'catQty', 'value'=>500])
将呈现
<input name="catQty" value="500">
但是,就潜力而言,该示例仅触及表面
h('#wrapper',
h('h1.title', 'Hello, World'),
h('p',
h('comment', 'link to duckduckgo'),
h('a', ['href'=>'https://duckduckgo'], 'search the internet')
)
);
这是输出(实际输出没有空格)
<div id="wrapper">
<h1 class="title">Hello, World</h1>
<p>
<!-- link to duckduckgo -->
<a href="https://duckduckgo">search the internet</a>
</p>
</div>
它在渲染数据集合时也非常方便
use function htmlgen\html as h;
use function htmlgen\map;
$links = [
'home' => '/',
'cats' => '/cats',
'milk' => '/milk',
'honey' => '/honey',
'donuts' => '/donuts',
'bees' => '/bees'
];
echo h('nav',
h('ul',
map($links, function($href, $text) { return
h('li',
h('a', ['href'=>$href], $text)
);
})
)
);
会输出(同样,这里的空格只是为了显示)
<nav>
<ul>
<li><a href="/">home</a></li>
<li><a href="/cats">cats</a></li>
<li><a href="/milk">milk</a></li>
<li><a href="/honey">honey</a></li>
<li><a href="/donuts">donuts</a></li>
<li><a href="/bees">bees</a></li>
</ul>
</nav>
这一切都是 100% PHP,没有定制的、专有的搞笑业务。它具有很强的表现力,适合创作伟大的作品。您可以将模板分解为易于重用的函数或 require 调用。
关于PHP 面向对象的表单生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28695224/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调