Direkt zum Hauptbereich

Benutzung von Tabs in Visualforce


Seit einiger Zeit beschäftige ich mich wieder etwas intensiver mit Visualforce.
Eine neue Visualforce Seite muss die Konfiguration von 10 verschiedenen Objekte ermöglichen.
Die einfachste Lösung ist die Benutzung von apex:tabPanel - was im Endeffekt eine Tabelle mit mehreren Tabs darstellt. Unter jedem Tab wird jeweils ein List View ausgegeben, was mit APEX Mitteln ebenfalls ganz einfach funktioniert.
Eine einzige große Schwachstelle in diesem Konstrukt ist das kurzzeitige Verlassen der Seite. Das passiert immer dann, wenn ein neuen Datensatz erstellt oder ein bestehender Datensatz gelöscht wird. Nach der Aktion wird zwar die Visualforce Seite automatisch geöffnet, aber der falsche Tab ist aktiv.

Mit einer kleinen Anpassung bringt man der Visualforce Seite bei, den richtigen Tab beim Öffnen der Seite zu aktivieren.
Das Ergebnis ist im folgenden Videoschnitt zu sehen. Hier sieht man einen Ausschnitt einer Visualforce Seite mit diversen Tabs und das Verhalten der Seite beim Löschen von Datensätzen aus der in die Seite integrierten Listenansicht.

Anpassungen:
1) Beim Klicken auf die Tabs wird der Name des aktiven Tabs im Cookie festgehalten:
   onTabEnter="jsResetCookie('tab2name');"
Die als ActionFunction deklarierte JavaScript Funktion  apex:actionFunction name="jsResetCookie"  übergibt den aktiven Cookie-Namen an den Controller und die entsprechende Controller Methode resetPageCookie  überschreibt den Cookie.

2) Beim Laden der Seite wird der Name des aktiven Tabs aus dem Cookie über die Page-Action action="{!initSettings}" gelesen und der aktive Tab in der Tabelle markiert <apex:tabPanel ... value="{!cookieValue}" >


VisualForce Page

<apex:page controller="myController" action="{!readPageCookie}">
  <apex:pageMessages />
  <apex:form >
    <!-- ACTION FUNCTIONS -->
    <!-- RESET COOKIE -->
    <apex:actionFunction name="jsResetCookie" action="{!resetPageCookie}" reRender="emtyBlock">
      <apex:param name="firstParam" value="" assignTo="{!cookieValue}" />
    </apex:actionFunction>
    <!-- Empty panel for Cookie Reset -->
    <apex:outputPanel id="emtyBlock" />         
    <!-- ---------------- -->
     
    <!-- TABBED TABLE -->
    <apex:tabPanel switchType="client" selectedTab="{!cookieValue}" value="{!cookieValue}" >
      <!-- TAB 1 -->
      <apex:tab label="Mein Tab1" name="tab1name" id="tab1" onTabEnter="jsResetCookie('tab1name');">  
              hier kommt der Inhalt
      </apex:tab>
         
      <!-- TAB 2 -->
      <apex:tab label="Mein Tab2" name="tab2name" id="tab2" onTabEnter="jsResetCookie('tab2name');">
            hier ist ein List View
           <apex:ListViews type="User__c"  id="ListUsers" />
      </apex:tab>
    
      <!-- TAB 3 -->
      <apex:tab label="Mein Tab3" name="tab3name" id="tab3" onTabEnter="jsResetCookie('tab3name');">
            hier ist noch ein List View
           <apex:ListViews type="Holiday__c"  id="ListHolidays" />
      </apex:tab>
   
    </apex:tabPanel>
  </apex:form>   

</apex:page>



Controller

public without sharing class ControllerResourceManagement {    
     public String cookieValue{get; set;}
     /*++++++++++++++++++
     resetPageCookie
     */
     public void resetPageCookie() { 
          Cookie activeTab = new Cookie('activeTab', cookieValue, null, -1, false);
          // Set the new cookie for the page
          ApexPages.currentPage().setCookies(new Cookie[]{activeTab});
     }

     /*++++++++++++++++++
     readPageCookie
     */
     public void readPageCookie() {
          cookieValue = 'tab1';
          Cookie c = ApexPages.currentpage().getCookies().get('activeTab');
          if(c != null)
               cookieValue = c.getvalue();
     }
}

Kommentare

Beliebte Posts aus diesem Blog

Salesforce.com Certified Advanced Administrator (WI15)

Im Vergleich zu den beiden Consultants Zertifizierungen war die Advanced Admin ein Spaziergang!
Allerdings ganz ohne Vorbereitung schafft man die Prüfung auch nicht.


Hier sind einige Fragen/Antworten aus der aktuellen Prüfung.

1. Capabilities of collaborative forecasting?
- Rename categories
- Forecast using opportunity splits
- Overlay Quota
- Add categories
- Select a default forecast currency setting

2. We have four Sales Regions. Each of the region's VPs wants to have a dashboard emailed every Monday.
- Create a separate dashboard for each VP
- Create one dashboard using Visualforce
- Create one dashboard that includes a filter for each region
- Create a reporting snapshot

3. User is trying to access content in a library, but receiving an insufficent privileges message.
How to troubleshoot?
- has the user's profile the CRM content permission enabled
- user has been granted permission "Viewer" to the library
- user's record has the CRM content permisson enabled
- …

Salesforce - Datensätze sperren (Umsetzung)

Record Lock - nun, die Umsetzung.Wir haben bereits mehrere VisualForce Pages im Einsatz. Aus dem Grund ist das zuvor beschriebene Konzept darauf zugeschnitten. Selbstverständlich lässt sich der Code auch für Standard und Custom Objects verwenden, ohne den Einsatz von VisualForce Pages. Na ja, mindestens eine VF Page brauchen wir eigentlich schon - diejenige, die von dem dem "Edit" Button aufgerufen wird.

Ich zeige jetzt die wichtigsten Bausteine aus der Umsetzung.
1) Diese VF Page wird aufgerufen sobald man den "Edit" Button betätigt

<apex:pagestandardController="myObject"title="{!myObject.Name}"extensions="LockController"action="{!SwitchToPage}">
<!-- READ MODE --> <apex:includepageName="myObjectRead"rendered="{!isEditMode == false}"/>
<!-- EDIT MODE --> <apex:includepageName="myObjectEdit"rendered="{!isEditMode == true}"/>
</apex:page>

Folgendes passiert …

Emails mit APEX | SINGLE_EMAIL_LIMIT_EXCEEDED

Email-Versand mit Visualforce und Apex kann schon manchmal Kopfschmerzen bereiten....

Entweder ist die Email zu groß, oder zu viele Attachments oder der HeapSize "beschwert sich" oder, wenn letztendlich alles läuft,  man wird von den Salesforce Limits zurück zum Ausgangspunkt katapultiert.

Das kann doch nicht so schwer sein!
Ist es auch nicht, wenn man das schon einmal gemacht hat ;-)

Habe eine Visualforce Maske zum Versenden von HTML Emails programmiert.
Diese werden als SingleEmailMessage gesendet:
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
Sobald die Anzahl der pro Tag gesendeten Emails den Salesforce Limit "knackt", wird dem User die entsprechende Meldung eingeblendet.



Die auf die Org bezogene Limitierung lässt sich mit LIMITS.getLimitEmailInvocations() berechnen.

Hier ein Auszug aus den "Execution Governors and Limits"
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm

A Dev Edition org ha…