[Seasar-user:15962] Re: [Teeda][提案]forEachにて生成されるidをかぶらないようにする

あきら [E-MAIL ADDRESS DELETED]
2008年 10月 10日 (金) 18:23:48 JST


あきらです

> 実装みたところforeach改造するより DefaultComponentIdLookupStrategy
> を元に独自クラスを作って登録した方がスマートですね(汗)

てことで組んでみました

仕様はおんなじで

===============================
 <div id="title-0">item0_title</div>
 <div id="note-0">item0_note</div>

 <div id="title-1">item1_title</div>
 <div id="note-1">item1_note</div>
===============================

みたいな出力になります
プロジェクトにソースを追加しておいて

src/main/resources/teedaCustomize.dicon に

	<component class="org.seasar.teeda.core.render.PostIndexComponentIdLookupStrategy"
/>

上記を登録するとこの形式になります。
本体を改造しないで使えるので個人的には満足です

中身は : でスプリットして、Itemsで終わる要素の場合に次の要素の番号を
追加しています。

ForEachのinputでも正常に値を引き継げることは確認しました。
可能であればこの手の書式も本体に取り込んでもらい、IDの形式
をユーザーで選べるようになっているとうれしいかなと思いました。

あきら

---------------------------------------------------------------------------------

/*
 * Copyright 2004-2008 the Seasar Foundation and the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.seasar.teeda.core.render;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

/**
 * @author shot
 * @author manhole
 * @author akira
 */
public class PostIndexComponentIdLookupStrategy implements
        ComponentIdLookupStrategy {

    public String getId(final FacesContext context, final UIComponent
component) {
        final String id = component.getId();
        if (id != null) {
            String clientIdList[] = component.getClientId(context).split(":");
            String postIndex = "";
            int i = 0;
            while( i+1 < clientIdList.length ){
                if( clientIdList[i].endsWith("Items") ){
                    // Items
                    postIndex += "-" + clientIdList[i+1];
                    i++;
                }
                i++;
            }

            return context.getExternalContext().encodeNamespace(id) + postIndex;
        }
        return component.getClientId(context);
    }
}


Seasar-user メーリングリストの案内