Category Archives: Salesforce

apex:outputPanel and layout=”none”

If you’re like me, a web developer first and visualforce “expert” second, you might hate the way Salesforce adds spans and crazy string ID’s to everything. It makes the HTML incredibly, well, ugly.

I had fixed this by using layout=”none” on everything possible. It made the HTML very pretty. It also caused a ton of problems when my team tried to add rerenders later.

Some notes on apex:outputPanel and rerendering and layout.

  • If there is no rerendering required, you can use layout=”none”.
  • If you don’t have layout set, it will default to “inline”. What this means is you will have a ton of invalid HTML if you put a
    or an tag inside of your code. So make sure you always set something to keep your HTML valid and pretty.
  • If you have to rerender your panel, make sure that you don’t have anything set to layout=”none” and make sure your HTML validates. Wacky stuff happens if you try to rerender something with invalid HTML or layout=”none”. In other words, always manually write in layout=”block” or layout=”inline”. Don’t trust Visualforce to fix it for you.

best of luck!

Loop through an apex:repeat and split the contents into multiple containers

I was trying to build a slider from a list.
<apex:repeat value="{!People}" var="item"> 
	<div class="user-card">
		<div class="thumb">{!item.ImageUrl}</div>
		<div class="name">{!item.Name}</div>
		<div class="department">{!item.Department}</div>
	</div>                                        
</apex:repeat>
The problem is I needed to show FOUR User Cards in one slide. The above method will only do one person per slide. So – with apex:variable and MOD(), we can make make magic happen!

<ul class="birthday-slider">
    <li class="birthday-slide">
        <apex:variable value="{!1}" var="count"/>
        <apex:repeat value="{!People}" var="item"> 
            
            <div class="user-card">
                <div class="thumb">{!item.ImageUrl}</div>
                <div class="name">{!item.Name}</div>
                <div class="department">{!item.Department}</div>
            </div>     
            
            {!MOD(count, 4)} <br/>
            <apex:outputText value="</li><li class='birthday-slide'>" rendered="{!MOD(count, 4) == 0}" escape="false" />
            
            <apex:variable value="{!count + 1}" var="count"/>
        </apex:repeat>
    </li>
</ul>



SOQL Queries: Handling GROUP BY aggregation with the Force.com PHP Toolkit

I needed to run a query and pull a distinct set of values. Easy in Force.com Explorer.
SELECT Field_Name FROM Table_Name GROUP BY Field_Name

Not so easy when querying though, as the result looks like this:
print_r($response->records); // print the response...

Array
(
    [0] => stdClass Object
        (
            [Id] => 
            [any] => <sf:Field_Name>Unique Value</sf:Field_Name>
        )

    [1] => stdClass Object
        (
            [Id] => 
            [any] => <sf:Field_Name>Unique Value 1</sf:Field_Name>
        )

    [2] => stdClass Object
        (
            [Id] => 
            [any] => <sf:Field_Name>Unique Value 2</sf:Field_Name>
        )

Okay… at least the response is unique.
Here’s a foreach to parse the results into a pretty array.
foreach($response->records as $record) {
     $results[] = strip_tags($record->any);
}

Now you have something to work with.
Array
(
    [0] => Unique Value
    [1] => Unique Value 1
    [2] => Unique Value 2
)

Creating a ContentDocumentLink to a Custom Object in Salesforce

It’s not possible.

At least not at the time of writing this.

After countless hours, we have determined that it is not possible. We get a pretty blatant error from Salesforce though.

FIELD_INTEGRITY_EXCEPTION, You cannot create a link for this type of entity.

Of course, that wasn’t enough. We tried to link Chatter files, we checked permissions, we did the whole shebang. If you come to this page in your search, and you get a similar error, do yourself a favor and stop. I would LOVE to be able to modify this article and say it’s possible, so if you don’t stop coding, please leave me a comment!

So I don’t leave you empty handed, here is the code that I used to, at the very least, create a file and add it to a Content Library, specified by the $contentLibraryId variable. I clearly use the PHP Toolkit with Salesforce.
$sObject = array();
$sObject[0] = new stdclass();
$sObject[0]->Title = $fileName;
$sObject[0]->PathOnClient = $_FILES["uploaded_file"]["name"];
$sObject[0]->VersionData = $encoded_file;
$sObject[0]->FirstPublishLocationId = $contentLibraryId;
$response = $mySforceConnection->create($sObject, 'ContentVersion');

And of course, the code that created the error…
$query = "SELECT Id FROM ContentDocument WHERE LatestPublishedVersionId = '" . $contentDocumentId . "'";
$response = $mySforceConnection->query($query);
$contentId = $doc_response->records[0]->Id; // note - this is used below!
$sObject = array();
$sObject[0] = new stdclass();
$sObject[0]->ContentDocumentId = $contentId;
$sObject[0]->ShareType = "C";
$sObject[0]->LinkedEntityId = $CustomObjectId;
$response = $mySforceConnection->create($sObject, 'ContentDocumentLink');

This, by the way, is what I’m struggling to achieve: adding files to this “Related Content” area.


Stack Overflow link reference