[SalesForce] calling an actionfunction reloads the page despite giving rerender attribute and says insufficient privileges in sites

Calling an actionfunction reloads the page despite:

  1. return false from the place where we call

  2. setting rerender="emptydiv"

It says insufficient privileges in Sites (authenticated using partner portal)..
but if we refresh the page again or reload by pressing enter in the url again, its not throwing that insufficient privileges error..

any ideas or suggestions to solve this problem would be much appreciated…

updated :-
I have given access to all the objects and classes.
when I try to preview as admin, I got this error.
"Access to entity 'StaticResource' denied"

Am accessing this in my code.
Not sure how to give access to this StaticResource Object for my Partner Portal User Profile.I dont find this object in the profile. Can you please help?

List<StaticResource> resourceList = [SELECT Name, NamespacePrefix, SystemModStamp 
        FROM StaticResource WHERE Name = 'MyStyles'];

This is my scenario :-
I have a JQGrid. inside that I have a column in which I have a link (a tag).
Am populating data for the JQGrid from from the controller.
The method is hit as I have specified the URL parameter of JQGrid.

So whenever the pageload or any operation in the grid happens and tries to reload the grid, it hits the url and based on the JSON returned, the grid is populated.

Inside the grid, I have to show some images. for doing that am getting the images through the above code
and assigning it to a property for displaying in the grid. The GetresourceURL function in the below code pulls the data from the list fetched
in above code and checks what type of image is needed and does some manipulations and gives the actual resource url for the image.

I have just pasted the smaller version of the GetResourceURL code for your easy understanding.

Actually the thing here is, when i click on the application link it should log an entry in a tracking object (just to note that the user has clicked the link and its used for reporting purposes later). for this reason am doing an onclick javascript
and from this am calling an actionfunction which does the job of logging in to necessary object and opens the target link in a new tab.

actually it logs the data and it tries to reload the page. not sure why it does that.. the same page is not reloaded.

if i run the visualforce page as a system administrator, but when viewing from sites url as an external customer this
"Insufficient privileges" error is thrown.


So, first time the page is getting loaded.
When i click on this link the page is performing actionfunction when viewed from sites, and reloading the page (which shouldnt actually reload).
If it is an insufficient access for static resource how is it able to access for the first time load?

asset.ApplicationNumber = (currentAsset.Country__c == 'US' 
        && currentAsset.URL__c != null
        && !currentAsset.URL__c.contains('patentnumber'))
    ? string.format(
        '<a style="color:#0073A3;text-decoration: none; !important; cursor:pointer;" onclick="FetchDataForPatent({2},{3},{4},{5});">{1}</a>',
        new String[] {
            currentAsset.URL__c,
            currentAsset.ApplicationNumber__c,
            '\'' + currentAsset.ApplicationNumber__c + '\'',
            '\'' + currentAsset.URL__c + '\'',
            '\'' + currentAsset.Id + '\'',
            '\'' + CompanyID + '\''
        })
    : currentAsset.ApplicationNumber__c;

currentDoc.DocumentTitle__c= string.format(
    '<a style="color:#0073A3; cursor:pointer"  onclick="return FetchDataForDoc({0},{1},{2},{4},{5},{6},{7})">{3}</a>',
    new String[] {
        '\'' + currentDoc.Id + '\'',
        '\'View\'',
        '\'' + UserType + '\'',
        (GetResourceURL(resourceList, currentDoc.FileType)!='')
            ? ('<img src='+GetResourceURL(resourceList, currentDoc.FileType)
               + '> '+ currentDoc.DocumentTitle__c)
            : currentDoc.DocumentTitle__c,
        '\'' + docInfo.DocTitleWithoutImage + '\'',
        '\'' + CompanyID + '\'',
        '\'' + currentDoc.FileName__c + '\'',
        '\'' + BaseURL + '\''
    });

GetResourceURL()
{
    return ((Site.getPrefix() != null) ? Site.getCurrentSiteUrl() : '') 
        + '/resource/'
        + resourceLst[0].SystemModStamp.getTime() 
        + '/' 
        + (namespace != null && namespace != '' ? namespace + '__' : '') 
        + 'MyStyles' + '/CSS/Images/' + imageName;
}

When I use chrome developer tools to see whats happening. I am seeing an internal server error 500 :-

This error is thrown :-

this._request.send(this._query.getQueryString());
if(this._timeout>0){
    this._timeoutID=window.setTimeout(function(){
        LOG.warn("request stopped due to timeout");
        if(!_this._aborted){
            if(typeof(A4J.AJAX.onAbort)=="function"){
                A4J.AJAX.onAbort(_this);
            }
        }
    }
}

Images below:

image 1

image 2

Best Answer

Following existing advice here, making sure that an error is not to blame, see that the Apex controller class has been included in your site's approved components:

Public Access Settings | Apex Classes | Edit

Regardless of whether your actionFunction is calling a method that does nothing but return a value, that's when your controller is invoked. To prove this, simply remove the action portion of your actionFunction, like this:

<apex:actionFunction name="test" reRender="emptydiv">

Additionally, remember that you can't re-render a non-Visualforce component, such as a div. If you're trying to re-render a div, wrap the section in an outputPanel instead:

<apex:outputPanel id="emptyoutpan">
   ...
</apex:outputPanel>

Finally, a good practice to avoid hitting your head against the wall with sites is to create a custom tab and verify your work from there as well. Then when you hit errors you will see what errors are actually being thrown, rather than simply seeing an authentication page.

Related Topic