CFWheelsが大好きなのと同じくらい、私はフォームヘルパー関数や「ショートカット」機能のファンではないことを認めなければなりません。この例の場合、チェックボックス(フォーム全体ではない場合)を作成するためのより単純で単純なCFMLと、結合テーブルに値を保存するためのループロジックに「戻る」だけです。例えば:
<fieldset>
<legend>PropertyLanguages</legend>
<cfloop query="Languages">
<label>
#Languages.language#
<input type="checkbox" name="Property[PropertyLanguages]" value="#Languages.id#">
</label>
</cfloop>
</fieldset>
次に、更新コントローラーのロジックを次のように変更します。
<!--- CONTROLLER - update.cfm - updateProperty --->
<cffunction name="updateProperty">
<cfscript>
Property = model("Property").findByKey(key=params.Property.id);
Property.update(params.Property);
if (IsDefined("params.Property.PropertyLanguages"))
{
model("PropertyLanguages").deleteAll(where="propertyid=#params.Property.id# AND languageid NOT IN (#params.Property.PropertyLanguages#)");
for (var i = 1; i<=ListLen(params.Property.PropertyLanguages); i++)
{
languageid = ListGetAt(params.Property.PropertyLanguages, i);
if (! IsObject(model("PropertyLanguages").findOne(where="propertyid=#params.Property.id# AND languageid=#languageid#")))
{
pl = model("PropertyLanguages").new();
pl.langugageid = languageid;
pl.propertyid = params.Property.id;
pl.save();
}
}
}
else
{
model("PropertyLanguages").deleteAll(where="propertyid=#params.Property.id#");
}
</cfscript>
</cffunction>
私はこれをテストしていませんが、多かれ少なかれ動作するはずです。ホイールヘルパーを使用するのは(すべきですか?)それほど単純ではありませんが、それほど悪くはないようです。