EOの配列をソートして使っているときに、ソートキーの属性値を変更するとsubmitアクションが呼ばれなくなる現象について報告します。
ちょっと状況説明がややこしいのですが:
(1)EOのリストをRepitationで表示します。このとき、ソートした配列をRepitationのlistに設定します。例ではTableのTRにRepitationを設定しています。
(2)表示結果が図1です。データは名称とソート順という名の属性を持っています。

(3)編集はインラインで行います。例ではソート順だけが変更できるようになっています。そして値を変更して順番が変わる場合を見てみましょう。図3のようになりました。


(4)WOBuilderでの設定は図4です。
WORepitationで複数のTRを囲み、編集対象の行であるかどうかを判定して表示行を使うか、編集行を使うかをWOConditionalを使って設定しています。

WORepitationのlistに設定しているのは以下で得たtypeListです。
public NSArray _typeList;
public Main(WOContext context) {
super(context);
_typeList = EOUtilities.objectsForEntityNamed(
session().defaultEditingContext(), "MPCategoryType" );
}
/** @TypeInfo MPCategoryType */
public NSArray getTypeList()
{
return EOSortOrdering.sortedArrayUsingKeyOrderArray(
_typeList,
new NSArray( EOSortOrdering.sortOrderingWithKey(
"sortOrder", EOSortOrdering.CompareAscending ) )
);
}
そしてサブミットボタンを押すと以下のアクションを実行します。
public WOComponent actionSave()
{
selectedType = null;
session().defaultEditingContext().saveChanges();
return null;
}
しかし上記の例では、実はactionSave()メソッドは呼ばれません。
Formデータを受け取った後、typeListの順が変わってしまうとWebObjectsはなぜかinvokeAction()を呼ばずそのままResponseを作ってしまうのです。
ちょっと理由はわかりませんが、フォームデータがRepitaionで順番に評価するときに、配列の評価をして表示したときと、データを読み込むときで不整合になるのでどこかでエラーになるのかもしれません。
結果、ブラウザ上では編集中の画面のままもどってしまいます。
対策は簡単で、ソートキーそのものを編集させるのをやめる図5のようにすればいいのです。ソート順属性をEOから取ってくるのではなく、編集用の変数を用意して、これを保存するときにEOの属性値に代入します。

コードはこうなります。
public WOComponent actionSave()
{
selectedType.takeValueForKey( sortOrder, "sortOrder" );
selectedType = null;
session().defaultEditingContext().saveChanges();
return null;
}
対応は簡単なのですが、サブミットボタンに設定したアクションにプリント文を設定しても表示しないのでどうなっているのかかなり悩みました。同じ失敗を繰り返さないために、記録しておきます。
確認:Mac OS X 10.4.2/WebObjects 5.2.2