좋아, 제목은 약간 혼란 스럽지만 한 문장으로 내 문제를 해결하는 방법을 알아낼 수 없습니다.<p:menuitem>의 아이콘 대신 <o : graphicImage>를 구현하십시오. <p:megaMenu>
나는 Primefaces (또는 더 좋게, Omnifaces에서 graphicImage 구성 요소를 구현해야합니다. 데이터베이스에서 이미지를로드하고 이미 응용 프로그램에서 o : graphicImage를 사용하고 있기 때문에)를 표시하려면 MenuItem 구성 요소에 넣어야합니다. MegaMenu 구성 요소는 백킹 빈에서 작성된 DefaultMenuModel을 사용하여 프로그래밍 방식으로 생성됩니다. 또한 (위에서 언급 한대로) 이미지는 데이터베이스에서로드되므로 이미지를 동적으로 사용할 수 있으므로 CSS를 통해 해당 이미지 (아이콘)를로드하는 솔루션이 적용되지 않습니다.
불행히도 필자는 불행히도 실패한 비참한 결과를 보았습니다. :-(. 전체 스택 Primefaces 사용자 정의 구성 요소를 작성한 경험이 없으므로 MegaMenu 구성 요소에 대한 기본 사용자 정의 렌더러를 사용해 보았습니다. 예를 들어, 나는 o : graphicImage 구성 요소 (encodeBegin 및 encodeEnd)에서 코드를 사용하려고 시도하고 그것을 내 CustomMegaMenuRenderer (MegaMenuRenderer를 확장)에서 구현했습니다. encodeMenuItemContent 재정의 된 메서드에서 사용했습니다. EL 표현식을 전달하기 위해 약간의 해킹을 사용했습니다 (예 : # {imageStreamer.getImage (23)}, 여기서 23은 실제 이미지 ID입니다.) 모델에서 MenuItem 구성 요소의 'icon'필드의 값으로이 문자열을 전달하면 재정의 된 encodeMenuItemContent에서 실제로 엘 (아이콘 이름이 아님)인지 확인합니다.
writer.startElement("img", null);
writer.writeURIAttribute("src", getSrc(context, expresion), "value");
writeAttributes(writer, this, GraphicImage.ATTRIBUTE_NAMES);
writer.endElement("img");
0 getSrc (문맥, 식)과 같이 구현된다
: graphicImage 성분 :
private String getSrc(FacesContext context, String expression) throws IOException {
Resource resource;
ExpressionFactory ef = context.getApplication().getExpressionFactory();
ValueExpression dynExpression = ef.createValueExpression(context.getELContext(), expression, Object.class);
resource = GraphicResource.create(context, dynExpression, null);
return context.getExternalContext().encodeResourceURL(resource.getRequestPath());
}
하지만 불행히도 getSrc (컨텍스트 표현식)는 내부 통상 O를 상자에 포장하는 것처럼 캐릭터 콘텐츠를 반환하지.
가 나는 또한 ... 프로그램 개체에 내 렌더링 한 후 호출 encodeAll 방법에 (Primefaces 또는 Omnifaces에서) graphicImage 구성 요소를 인스턴스화하지만이 또한 실패와 같은 다른 방법을 시도GraphicImage gi = (GraphicImage) application.createComponent(GraphicImage.COMPONENT_TYPE);
gi.getAttributes().put("value", expression);
gi.encodeAll(context);
그래서 나는 결론을 내렸다 저기서 정말 큰 것을 놓치고 있습니다. 나는 SO와 구글에서 비슷한 것을 찾으려고했지만 성공하지 못했습니다. (내 접근이 나쁜 가정) 그래서, 여기 내 진짜 질문은 여기에 있습니다 : 그것은 모든 primefaces/omnifaces에게 사용자 정의 렌더러 내부 구성 요소를 인스턴스화하고 그래서 (이 정상적으로 작동하는 것처럼 작동하게 할 수 이벤트가
- 인가 예상대로 자체 렌더링)? 이 은 내 렌더러를 원하는대로 작동시키는 가장 쉬운 방법이 될 것입니다 ...
- 이 "custom renderer"접근 방식으로 진행해야합니까, 아니면 이 경우 쓸모 없습니까?
- 위에서 설명한이 기능을 만들려면 주문에 사용자 지정 MenuModel, MenuItem 또는 MegaMenu 클래스를 만들어야합니까?
- 마지막으로 이론적으로 가장 쉬운 방법은 이며이를 달성하는 "가장 좋은"방법은 무엇입니까 ( primefaces 구성 요소 디자인과 맞 춥니 다. 실제로 어떻게해야합니까?). 난 JSF 인 Mojarra 2.2.9, 제
감사 미리 톰캣 5.1, 2.0 및 Omnifaces 용접 Primefaces 사용
또한 언급 (하지만 그 범위 밖으로 추측).실제로 작동하지 않습니다
<p:menuitem ... icon="#{imageStreamer.getImage(23)}" />
이 :
감사합니다. BalusC, 진정으로 도움이됩니다. 내 코드의 유일한 문제는 모델 코드에서 다음과 같은 줄입니다 :'item.setIcon ("# {imageSteramer.getImage ("+ c.getIcon() .getId() + ")}");'item은 DefaultMenuItem 객체입니다. 그냥 이미지 ID를 전달한 다음 내 렌더러에서 표현을 위조해야합니다. 대답에서 지적한 것처럼 말입니다. 오류 메시지는 _FATAL : Target Unreachable이었습니다. 'imageSteramer'식별자가 null_으로 확인되었지만 올바르게 이해할 수 없습니다. 그래서, 네 말이 맞았을 것 같아. 나는 정말로 아주 가까웠다. :). 다시 한번 감사드립니다. – Andrija
반갑습니다. – BalusC