1

すべての製品を表示する次の繰り返しコントロールがあります。

<xp:repeat id="rptProduct" rows="16" value="#{vwProduct}"
        var="productRow">
        <xp:panel styleClass="linkPanel" id="panel1">
            <xp:text escape="false" id="imgHTML">
                <xp:this.value><![CDATA[#{javascript:getImgURLForProduct(productRow.getDocument());}]]></xp:this.value>
            </xp:text>
            <xp:eventHandler event="onClientLoad"
                submit="true" refreshMode="norefresh"></xp:eventHandler></xp:panel>
</xp:repeat>

getImgURLForProduct は、別のデータベースから URL を作成します。

function getImgURLForProduct(doc:NotesDocument) {
    var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
    var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";

    if (resourceDB != null) {
        if (resourceDB.isOpen()) {
            var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");

            if (vwResource != null) {
                var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);

                if (pictureDoc != null) {
                    if (pictureDoc.hasItem("fldThumbImage")) {
                        var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");

                        var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();

                        if (eos.isEmpty() == false) {
                            var eosi:java.util.Iterator = eos.iterator();

                            while (eosi.hasNext()) {
                                var eo:NotesEmbeddedObject = eosi.next();

                                if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
                                    var strImageFile:String = "/" +  applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource(); 
                                    strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") +  "</span>";
    strReturnVal += "</a>";
    return strReturnVal;
}

繰り返しコントロール内のすべてのアイテムに対してデータベースとビューが初期化されないように、コードをどのように改善できるか疑問に思っていましたか?

4

2 に答える 2

3

別のデータベースからのビューを dataContext に格納できる場合があります。dataContext がどの程度リサイクルに安全かはわかりませんが、Domino オブジェクトをそこに格納しても安全かもしれません。Mastering XPages には、dataContext に関する適切なセクションがあります。それは私にとってとても役に立ちました。

于 2012-02-23T14:54:43.840 に答える
1

最善の方法は、ドキュメントデータを取得するデータベースの notesview を変更することです。このビューには、必要なすべてのデータ (ofc.richtext 値を除く) が含まれており、その上に、このコードで生成している計算された URL を含む列があります。そうすれば、参照しているドキュメントごとにセカンダリ データベースを開く必要がなくなります。

もう 1 つの方法は、何らかのキャッシュ手段を追加してコードを改善することです。getImageFromUrl メソッドが常に同じデータベース (同じサーバーなど) を開く場合は、次のように変更できます。

警告このコードには保証がなく、エラー処理はまったくありません;)

    function getImgURLForProduct(doc:NotesDocument) {
        var docid = doc.getUniversalID();
if(inCache(docID){
   return fromCache(docid);
} 

        var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
        var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";

        if (resourceDB != null) {
            if (resourceDB.isOpen()) {
                var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");

                if (vwResource != null) {
                    var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);

                    if (pictureDoc != null) {
                        if (pictureDoc.hasItem("fldThumbImage")) {
                            var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");

                            var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();

                            if (eos.isEmpty() == false) {
                                var eosi:java.util.Iterator = eos.iterator();

                                while (eosi.hasNext()) {
                                    var eo:NotesEmbeddedObject = eosi.next();

                                    if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
                                        var strImageFile:String = "/" +  applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource(); 
                                        strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") +  "</span>";
        strReturnVal += "</a>";
        toCache(strReturnVal);
        return strReturnVal;
    }

function inCache(strKey){
  if(!sessionScope.containsKey("urlcache")){
    sessionScope.put("urlcache",new java.util.HashMap());
}
  var cache = sessionScope.get("urlcache");
  cache.containsKey(strKey);
}

function fromCache(strKey){
  var cache = sessionScope.get("urlcache");
  return cache.get(strKey);
}

function toCache(strKey,strValue){
  if(!sessionScope.containsKey("urlcache")){
    sessionScope.put("urlcache",new java.util.HashMap());
}
  var cache = sessionScope.get("urlcache");
  cache.put(strKey,strValue);
}

参照しているドキュメントに使用できるキャッシュ エントリがあるかどうかを最初に確認することで、データベースを再度開く必要はありません。

于 2012-02-23T14:45:21.250 に答える