Liferay DXP SP1 oder höher / Liferay 7 CE
Es gibt viele Projektanforderungen, die die Anzeige des Steuerungsmenüs oben in Liferay steuern möchten. Die Methode zur Behandlung eines solchen Falles wird beschrieben.
Offizielles Dokument: THEMENBEITRÄGE Offizielles Dokument: CONTEXT CONTRIBUTORS Die Erklärung zum Umgang damit wird in beschrieben, aber die tatsächliche Methode zum Erstellen eines Portlets wird hier erläutert.
Es wird davon ausgegangen, dass der Liferay-Arbeitsbereich erstellt wurde und die Blade-Tools und verschiedene Tools zum Erstellen von Designs installiert wurden. Das folgende Dokument erläutert die Einrichtungsmethode.
Als Testszenario, der Standardrolle von Liferay, wird die Spezifikation implementiert, dass das Steuerungsmenü nur Benutzern mit Administratorrechten angezeigt wird.
Verschoben unter $ (liferay_workspace) / modules.
Wir müssen also einen Theme-Contributor erstellen, um das Control Menu-Bundle zu ersetzen. Wählen Sie in Liferay Developer Studio / IDE Datei-> Neu-> Liferay-Modulprojekt aus und wählen Sie unter Projektvorlagenname den Vorlagenkontextbeitrag aus.
Oder an der Kommandozeile
blade create -t template-context-contributor -p com.liferay.product.navigation.control.menu.theme.contributor -c SampleProductNavigationControlMenu sample-product-navigation-control-menu-theme-contributor
Erstellen Sie ein Modulprojekt mit dem Blade-Tool in.
Öffnen Sie die Basisdatei des Steuerungsmenüs
ProductNavigationControlMenuTemplateContextContributor.java
vi /liferay-portal/modules/apps/web-experience/product-navigation/product-navigation-control-menu-theme-contributor/src/main/java/com/liferay/product/navigation/control/menu/theme/contributor/internal/ProductNavigationControlMenuTemplateContextContributor.java
Kopieren Sie den folgenden Teil in SampleProductNavigationControlMenuTemplateContextContributor.java.
@Override
public void prepare(
Map<String, Object> contextObjects, HttpServletRequest request) {
boolean isShowControlMenu = isShowControlMenu(request);
contextObjects.put("isShowControlMenu", String.valueOf(isShowControlMenuFlg));
}
protected boolean isShowControlMenu(HttpServletRequest request) {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
if (themeDisplay.isImpersonated()) {
return true;
}
if (!themeDisplay.isSignedIn()) {
return false;
}
User user = themeDisplay.getUser();
if (!user.isSetupComplete()) {
return false;
}
return true;
}
Wenn Sie die Anzeige nur eingrenzen, wenn Sie über Administratorrechte für die Standardrolle verfügen, und einen Prozess zum Festlegen einer Variablen hinzufügen, die die Anzeigebedingungen auf der Themenseite ausgibt, sieht dies wie folgt aus.
@Override
public void prepare(
Map<String, Object> contextObjects, HttpServletRequest request) {
//Schreiben Sie eine Variable, damit Theme beurteilen kann, ob das Menü angezeigt wird oder nicht.
boolean isShowControlMenu = isShowControlMenu(request);
contextObjects.put("isShowControlMenu", String.valueOf(isShowControlMenu));
}
protected boolean isShowControlMenu(HttpServletRequest request) {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
if(!isAdmin(request)) {
return false;
}
if (themeDisplay.isImpersonated()) {
return true;
}
if (!themeDisplay.isSignedIn()) {
return false;
}
User user = themeDisplay.getUser();
if (!user.isSetupComplete()) {
return false;
}
return true;
}
/**
* Extra check for test
*
* @param request
* @return
*/
protected boolean isAdmin(HttpServletRequest request) {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
boolean bRet = false;
try {
//Ich möchte es nur anzeigen, wenn ich Administratorrechte habe.
//Zur Erläuterung wird hier die Rolle als Zeichenfolge erfasst. Es ist jedoch möglicherweise besser, die Rollen-ID im eigentlichen Projekt zu verwenden.
//(Da sich der Rollenname des Administrators im tatsächlichen Projekt ändern kann. Wenn sich die Rollen-ID für jede Datenbank ändert, ist es möglicherweise besser, eine Zeichenfolge wie Administrator als Schlüssel zu verwenden.)
Role adminRole = RoleLocalServiceUtil.getRole(themeDisplay.getCompanyId(), "Administrator");
List<Role> roles = themeDisplay.getUser().getRoles();
for(Role role : roles) {
if(role.getName().equals(adminRole.getName())) {
bRet = true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return bRet;
}
Ändern Sie als Nächstes die Datei bnd.bnd wie folgt.
bnd.bnd
Bundle-SymbolicName: sampleproductnavigationcontrolmenutemplatecontextcontributor
Bundle-Version: 2.0.6
Liferay-Releng-Module-Group-Description:
Liferay-Releng-Module-Group-Title: Product Navigation
Liferay-Theme-Contributor-Type: product-navigation-control-menu
Web-ContextPath: /product-navigation-control-menu-theme-contributor
Bundle-Version, Liferay-Theme-Contributor-Type und Web-ContextPath kopieren bnd.bnd von ProductNavigationControlMenuTemplateContextContributor.java, das im aktuellen DXP enthalten ist.
Jetzt, da der Theme Contributor bereit ist,
blade deploy
Bereitstellen mit und dann Design erstellen.
Wechseln Sie in das Verzeichnis $ (liferay_workspace) / themes und erstellen Sie ein Thema mit dem klassischen Liferay CE-Thema. (Siehe So erstellen Sie ein Thema in Liferay 7 / DXP)
Ändern Sie Folgendes
init-custom.ftl
<#if isShowControlMenuFlg>
css_class = css_class?replace("has-control-menu", "")
css_class = css_class?replace("open", "")
</#if>
Nach dem Ändern der CSS-Klasse wie
portal_normal.ftl
<@liferay.control_menu />
Zu
portal_normal.ftl
<#assign isShowControlMenu = htmlUtil.escape(isShowControlMenu!) />
<#if "true" == isShowControlMenu >
<@liferay.control_menu />
</#if>
ändern,
gulp deploy
Bereitstellen mit.
Wenn Sie den obigen Contributor / Theme bereitstellen, sollten Benutzer mit Administratorrechten das Steuerungsmenü sehen und keine anderen Benutzer sollten es sehen.