26.03.2013

OAF: Атрибут VO как хинт к бину image

Возникла задача присвоить значкам типа image различные всплывающие подсказки из ViewObject. Один из вариантов реализации  - через JavaScript.
Колонка из графических элементов несложно реализуется при помощи иерархии бинов типа switcher:

Наша задача - присвоить хинты из ViewObject каждому из значков (описания и коды хранятся в look up).
Приступим.
  • создаем простейший ViewObject, в котором будут выбираться lookup_code и meaning по определенному lookup_type, соответствющему статусам;
  • открываем исходный код любой страницы OeBS, содержащей значки и смотрим, каким образом встраиваются наши значки. Нас ждет подарок - статусы в неизменном виде содержатся в идентификаторе:
  •  формирование двух строк с параметрами через запятую: кодов и значений. Первые соответствуют значению атрибута в StatusSwitcher, вторые - наименования статусов:
     // Получение статусов
     String statusCodes = "";
     String statusMeanings = "";
     StatusPoplistVOImpl rem = am.getStatusPoplistVO1();
     int rowCount = rem.getRowCount();
     RowSetIterator iter = rem.createRowSetIterator("iter");
     if (rowCount > 0) { 
        iter.setRangeStart(0); 
        iter.setRangeSize(rowCount);
        for (int i = 0; i < rowCount; i++) {
            StatusPoplistVORowImpl row = 
              (StatusPoplistVORowImpl)iter.getRowAtRangeIndex(i);
            if (i > 0){
                statusCodes = statusCodes + ",";
                statusMeanings = statusMeanings + ",";
            }
            statusCodes = statusCodes + "\"" + 
                   row.getWrappedCode() + "\"";
            statusMeanings = statusMeanings + "\"" + 
                   row.getLookupName() + "\"";
        }
     }
     iter.closeRowSetIterator();
    
  • формируем JS-скрипт, в котором используются массивы из элементов наших строк. Суть в следующем: на странице находятся все теги <img> и проверяются на соответствие маске. Если найден - в свойства объекта title и alt записывается соответствующий элемент из массива значений. Продолжаем код:
     // Событие загрузки страницы
     StringBuffer hBuf = new StringBuffer();
     hBuf.append("function initImgHints(){ ");
     hBuf.append("var status_arr = [" + statusCodes + "];");
     hBuf.append("var meaning_arr = [" + statusMeanings + "];");
     hBuf.append("img_iter = document.getElementsByTagName('img');");
     hBuf.append("for(var i=0; i < img_iter.length; i++) {");
     hBuf.append("for (var j=0; j < status_arr.length; j++){");
     hBuf.append("if (img_iter[i].id.indexOf(':' + status_arr[j] + ':') != -1){");
     hBuf.append("img_iter[i].alt = meaning_arr[j];");
     hBuf.append("img_iter[i].title = meaning_arr[j];");
     hBuf.append("break;");
     hBuf.append("}}}}");
     pageContext.putJavaScriptFunction("initImgHints", hBuf.toString());
     OABodyBean bodyBean = (OABodyBean) pageContext.getRootWebBean();
     bodyBean.setOnLoad("javascript:initImgHints();");   
    
    Скрипт будет отрабатывать при загрузке страницы.

Комментариев нет :