Salesforce PageBlockTable Render an Item's Grandparent - salesforce

I'm trying to display the grandparent of a custom Salesforce Object in a pageblocktable in a Visualforce page.
I can display the parent as expected ie:
<apex:column headerValue="Related Item Parent">
<apex:outputField id="ItemParent" value="{!item.Parent__c}" />
</apex:column>
works great and gives me a nice table with a 'Related Item Parent' column that is linked to the Item parent exactly as I wanted.
but when I try to go up a further level, the Visualforce Page editor tells me
Could not resolve the entity from value binding
'{!item.Parent_c.Parent_c}'. can only be used
with SObject fields.
Is there anyway that this can be made to work? I'm a bit stuck!!
Below is the complete listing for my pageBlockTable , which works correctly if the Related Item Grandparent column is removed.
<apex:pageBlockTable id="RelatedItems" value="{!contact.RelatedItems__r}" var="item">
<apex:column headerValue="Related Item Name">
<apex:outputField id="ItemName" value="{!item.Name}" />
</apex:column>
<apex:column headerValue="Related Item Parent">
<apex:outputField id="ItemParent" value="{!item.Parent__c}" />
</apex:column>
<apex:column headerValue="Related Item Grandparent">
<apex:outputField id="ItemGrandParent" value="{!item.Parent__c.Parent__c}" />
</apex:column>
</apex:pageBlockTable>
Really appreciate any help that anybody can provide.
Best regards
Pete

When referencing fields of relationship objects, you will want to use the __r suffix. For example, you could use item.Parent__c to refer to the Id of the parent record, but accessing any of the fields on that record would require something like item.Parent__r.Name.
In this instance, you're looking for {!item.Parent__r.Parent__c} (which will give you the Id of the grandparent), or even {!item.Parent__r.Parent__r.Name} (if you wish to access fields on the grandparent record).

Related

hide a field using controller extension in salesforce

I am new to salesforce development.
I have a requirement where not much customozation is needed but need to hide or show a couple of fields based on a value of other field.
Can I do this using standard controller and adding an extension controller? if yes How?
e.g I need to show the standard account page with list of accounts. when I click on a account , on the standard detail page there is a field " Rate". if the Rate is below 10% then I have to show "Revenue " field and if its >10% then I have to hide the previous field and show "Approx. Revenue" field.
Is this possible?
THnaks
I assume you're talking about Visualforce page and not the standard page layout? (It should be doable also with standard page layouts but would require some record type juggling, assigning of rec type depending on your conditions)...
It's possible to do what you want in pure Visualforce (just the standard controller, no extension). Do you want to display one account or multiple(in some table?)
Roughly speaking you should read about rendered attribute available on most visualforce tags. Here's a sample based on Opportunities but the principle is the same.
<apex:page standardController="Opportunity" recordSetVar="opps" readonly="true">
<apex:pageBlock>
<apex:pageBlockTable value="{!opps}" var="o">
<apex:column value="{!o.Name}" />
<apex:column value="{!o.Probability}" />
<apex:column headerValue="Amount or Stage">
<apex:outputField value="{!o.StageName}" rendered="{!o.Probability != 100}" />
<apex:outputField value="{!o.Amount}" rendered="{!o.Probability = 100}" />
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>

inputField required mark with custom error msgs

I'm using an inputField that is binded directly to a custom objects field in the controller.
The following will generate a dropdown list with a label.
<apex:inputField value="{!Agency_Profile.Location_Principal_Activity__c}" />
My problem is that I need to add the required mark next to the inputField without losing the label or having default error msgs.
when I used
<apex:inputField value="{!Agency_Profile.Location_Principal_Activity__c}" required="true"/>
I got the required mark but I lost my custom error msgs for validation.
when I used
<apex:outputPanel styleClass="requiredInput" layout="block">
<apex:outputPanel styleClass="requiredBlock" layout="block"/>
<apex:inputField value="{!Agency_Profile.Location_Principal_Activity__c}" />
</apex:outputPanel>
the labels near the dropdown list didnt show anymore..
Is there a way I can accomplish what I need?
I ended up using this.
//this part to add the missing label.
<apex:outputLabel styleclass="labelCol" value="{!$ObjectType.Agency_Profile__c.fields.Location_Principal_Activity__c.Label}" />
<apex:outputPanel styleClass="requiredInput" layout="block">
<apex:outputPanel styleClass="requiredBlock" layout="block"/>
<apex:inputField value="{!Agency_Profile.Location_Principal_Activity__c}" />
</apex:outputPanel>
The best way is to add validation rule for this field for this object.
using raym0nds approach, this is how it looks for a custom controller variable, in my case with the name from a custom field of an object.:
//this part to add the missing label.
<apex:outputLabel for="myId" styleclass="labelCol" value="{!$ObjectType.Agency_Profile__c.fields.Location_Principal_Activity__c.Label}" />
<apex:outputPanel styleClass="requiredInput" layout="block">
<apex:outputPanel styleClass="requiredBlock" layout="block"/>
<apex:inputText id="myId" required="true" value="{!myCustomField}" label="{!$ObjectType.Agency_Profile__c.fields.Location_Principal_Activity__c.Label}" />
</apex:outputPanel>
note the apex:inputText type which now has an label, id and required attribute. The apex:outputLabel now has a for attribute. The for/id is just so clicking on the label will put the cursor into the right field. The required enables form validation, because the rest is just make-up. The label adds a good field name to that validation error - otherwise it would show the internal field id there.
the whole approach is interesting if you have a mass edit table in which all records share certain values (e.g. add multiple leads for the same company)

create a child visual force page

I have a custom Object called "Gift_c" off the Contact record. I would like to replace the standard "Gift_c" page with a visualforce page so that I can selectively hide certain fields.
All is farily straightforward.
<apex:page standardController="Gift__c" showHeader="true" >
<apex:form >
<apex:pageBlock title="" mode="Edit">
<apex:pageMessages />
<apex:pageBlockButtons >
<apex:commandButton value="Save" action="{!save}"/>
<apex:commandButton value="Cancel" action="{!cancel}"/>
</apex:pageBlockButtons>
<apex:pageBlockSection title="Basic Information" columns="1">
<apex:inputField value="{!Gift__c.Contact__c}"/>
<apex:inputField value="{!Gift__c.GiftAmount__c}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
The Challenge:
Normally when you are on a Contact and I click the "New Gift" button and the Contact_c field from the Gift_c object is populated to be the person I just came from. How can I ensure that still happens on the new Visual Force Page
Actually this functionality comes out of the box as long as you override the "New/Edit" button to point to new page.
There is what is known as the lkid hack. It is an undocumented feature that the values for the parent are passed as GET parameters from the New button on a related list. So you could extract the parameters that way, but it is widely accepted that this is a very flimsy solution.
Or there is a very neat solution posted here: hack-to-find-field-ids-allows-a-default-ui-new-page-to-be-pre-populated
This solution is screen scraping the standard edit page for all the lkid values in the html of the page. There are just as many reasons why this could one day just stop working, but it is probably more robust than reverse engineering the get parameters.

Why isn't the bottom of my page Block table being rendered?

The bottom of my table is being cut off, and I don't know why. It's a VF page embedded in between sections on in a page layout.
Any ideas/advice?
Here is the code.
<apex:pageBlock title="Support Tickets">
<apex:pageBlockTable value="{!Cases}" var="c">
<apex:column >
<apex:facet name="header">Support Ticket</apex:facet>
<apex:outputLink value="/{!c.id}">{!c.caseNumber}</apex:outputLink>
</apex:column>
<apex:column >
<apex:facet name="header">Subject</apex:facet>
<apex:outputLink value="/{!c.id}">{!c.subject}</apex:outputLink>
</apex:column>
<apex:column >
<apex:facet name="header">Created Date</apex:facet>{!c.createdDate}
</apex:column>
<apex:column >
<apex:facet name="header">Status</apex:facet>{!c.Status}
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
Most likely this limitation is the actual height of your page layout. This can be changed in the page layout configuration and not from within code. Your page is living in an IFrame with a fixed size controlled by the page layout itself, and not determined by the page(s) contained within it.
Go to: Name|Setup|Customize|Cases (assuming you're extending the Cases object)|Page Layouts|Edit. Click on Visualforce Pages to show your custom page and then click the wrench in the upper right.
If you don't see this or can't get to this section of Salesforce, talk with your admin to get access.

Visualforce apex:inlineEditSuport on Lookup/Reference Field

I have an object with a lookup field, and want to use InlineEditSupport on that field within a VisualForce page.
However the apex:outputField tag renders the lookup field as a hyperlink, which overrides the inlineEditSupport logic.
For example
<apex:page standardController="Contact">
<apex:outputField value="{!Contact.LastName}">
<apex:inlineEditSupport event="ondblclick"/>
</apex:outputField>
<apex:outputField value="{!Contact.AccountId}">
<apex:inlineEditSupport event="ondblclick"/>
</apex:outputField>
</apex:page>
In this example, the LastName field would be rendered by the apex:outputField tag, and convert to an editable field when double clicked.
However the 'Account' field renders as a hyperlink to the Account record itself, which takes action before the click event can fire.
I can make this work by using an alternate javascript event - i.e. mouseover, however that's not particularly user friendly. I need to maintain a consistent user experience and use a double click action.
Is there any way to prevent the Account field from rendering as a link, or a way of inserting an 'edit' icon next to it somehow?
I ran into the same problem with inline editing in a pageBlockTable format. We felt this was not user friendly.
I used JavaScript (jQuery) to convert the link into plain-text and make this behave like other inlineEditable fields:
/// Overwrite default functionality for lookup columns (links to object page)
/// Change to text-only of name to prevent navigation away
$('TABLE[id$=checklistTable] TBODY TR TD A[id^=lookup]').each(function() {
var text = $(this).html();
$(this).parent().html(text);
});
This will convert all SalesForce lookup fields within the matching jQuery selector. It is also dependent upon the resulting output HTML creating anchor links that have ID's starting with "lookup" (meaning SalesForce could change/break this with future updates).
This might not be the simplest way but what I've done before is to create a select list of the names of the records in the lookup. I think this is nicer for the user anyway than a salesforce lookup box (unless there are hundreds, I suppose). What you would need to do is create a list of select options in the controller, and assign them to some variable like theList, and then reference {!theList} where you want to put it (roughly; see documentation). The select options would need to have the record name as label and the record id as value. Then you can assign the Id directly to the lookup field.
Did you try with salesforce doc?
<apex:page standardController="Contact">
<apex:form >
<apex:pageBlock mode="inlineEdit">
<apex:pageBlockButtons >
<apex:commandButton action="{!edit}" id="editButton" value="Edit"/>
<apex:commandButton action="{!save}" id="saveButton" value="Save"/>
<apex:commandButton onclick="resetInlineEdit()" id="cancelButton" value="Cancel"/>
</apex:pageBlockButtons>
<apex:pageBlockSection >
<apex:outputField value="{!contact.lastname}">
<apex:inlineEditSupport showOnEdit="saveButton, cancelButton" hideOnEdit="editButton" event="ondblclick" changedStyleClass="myBoldClass" resetFunction="resetInlineEdit"/>
</apex:outputField>
<apex:outputField value="{!contact.accountId}"/>
<apex:outputField value="{!contact.phone}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>

Resources