Javascript на странице VisualForce - форма успешно отправлена, активировать апекс? - PullRequest
1 голос
/ 18 августа 2011

Прямо сейчас, код ниже после отправки, сначала вставляет файл, ТО передает форму.Это проблематично - мне нужно убедиться, что форма была успешно размещена в Amazon S3, а затем вставить файл (токена), чтобы он мог на него ссылаться.я не уверен, как это сделать (если форма успешно отправлена, тогда запустите другую функцию javascript).Смотрите в самом низу для попытки ... Это возможно?

   <apex:pageMessages id="pageErrors"></apex:pageMessages>
<form name="s3Form" action="https://s3.amazonaws.com/mybucket" method="post" enctype="multipart/form-data">   
    <input type="hidden" name="key"/> 
    <input type="hidden" name="AWSAccessKeyId" value="{!key}"/> 
    <input type="hidden" name="policy" value="{!policy}"/>
    <input type="hidden" name="signature" value="{!signedPolicy}"/> 
    <input type="hidden" name="acl" value="private"/> 
    <input type="hidden" name="x-amz-meta-FileId" value="{!File__c.id}"/>
    <input type="hidden" name="x-amz-meta-OrderId" value="{!OrderId}"/>
    <input type="hidden" name="x-amz-meta-CustomerId" value="{!CustomerId}"/>     
    <input type="hidden" name="success_action_redirect" value="{!serverUrl}{!OrderId}"/>           

    <apex:pageBlock title="New File Upload" mode="maindetail" tabStyle="File__c"> <!--  rendered="{!open}"-->
        <apex:pageBlockSection title="File Information" columns="2" collapsible="false" showHeader="false">                               
            <apex:pageBlockSectionItem >
                <apex:outputLabel value="Select File" for="selectFile"/>            
                <input id="selectedFile" type="file" size="25" name="file" onChange="setFileName(this.value)"/>                
            </apex:pageBlockSectionItem>                                         
        </apex:pageBlockSection>
        <apex:pageBlockButtons location="bottom">
            <input class="btn" type="button" value="Upload File" onClick="checkFile();return false;"/>                
            <input class="btn" type="button" value="Cancel" onClick="cancelFile();return false;"/>
            <input class="btn" type="button" value="Complete Order" onClick="completeFile();return false;"/>
        </apex:pageBlockButtons>          
    </apex:pageBlock>
    <apex:outputText styleClass="footer" value="Please click Complete Order when all the required files are uploaded. Thank you." />
</form> 

 <apex:form id="sfForm"><!--  rendered="{!open}"-->

    <apex:inputHidden id="hiddenServerURL"  value="{!serverURL}"/>
    <apex:inputHidden id="fileName" value="{!fileName}"/>
    <apex:inputHidden id="contentType" value="{!contentType}"/>
    <apex:inputHidden id="fileType" value="{!fileType}"/>
    <apex:actionFunction name="insertFile" action="{!insertFile}" oncomplete="submitFile();return false;"/>
    <apex:actionFunction name="completeOrder" action="{!completeOrder}"/>


    <script type="text/javascript">
    var sendFile = false;
    document.getElementById('{!$Component.hiddenServerURL}').value = '{!$Api.Enterprise_Server_URL_140}';       
    function setFileName(file) {
        var f = file.replace(/\\/g, "");
        f = f.replace(/C\:fakepath/g, ""); <!--Required for IE8-->
        document.s3Form.key.value = "{!CustomerName}/{!OrderName}/" + f;
        document.getElementById('{!$Component.fileName}').value = f;
        suffix = f.lastIndexOf(".") + 1;
        contentType = f.slice(suffix);
        document.getElementById('{!$Component.contentType}').value = contentType;
    }
    function setFileType(type) {
        document.getElementById('{!$Component.fileType}').value = type;
    }
    function checkFile() {
        if (document.s3Form.file.value=="") {
            alert("Please, select a file.");
            return false;
        } 
        else if (document.s3Form.fType.value=="--None--") {
            alert("Please, select a file type.");
            return false;
        }
        else {     
            alert("Uploading...Please click OK and wait for page to refresh.");        
            insertFile();
            sendFile = true;
        }
    }
    function submitFile() {
        if(sendFile = false) {
        return false;
        }
        else {
        document.s3Form.submit();
        }
    } 
    function completeFile() {
        completeOrder();
    }   
    </script>

</apex:form>

В контроллере (расширение):

//SF File insert on an object (passed from page)
public PageReference insertFile() {
    this.file.Name = fileName;
    this.file.Type__c = fileType;
    this.file.Content__c = contentType;
    insert this.file;
    return null;
}

Вот раздел javascript, который я пытался изменить, но яне могу найти ничего после обширных поисков, если это работает ...

        function checkFile() {
        if (document.s3Form.file.value=="") {
            alert("Please, select a file.");
            return false;
        } 
        else if (document.s3Form.fType.value=="--None--") {
            alert("Please, select a file type.");
            return false;
        }
        else {     
            alert("Uploading...Please click OK and wait for page to refresh.");        
            document.s3Form.submit({
                success: function(){
                    alert("Testing!");
                    insertFile();
                },
            });
        }
    }

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

+ 1 при выполнении работы в Apex, в отличие от Javascript.

Но чтобы продолжить потенциально успешный взлом, попробуйте использовать apex: actionPoller для отправки формы. Когда он просыпается, он проверяет успешность вставки вашего файла. Если после нескольких опросов у вас все еще нет успеха, отметьте тайм-аут.

Новинки Javascript в Visualforce могут быть опасными, если только время не является для вас фактором. Лучшие и исчерпывающие варианты Visualforce / Apex сначала и только потом решаются на пользовательский JavaScript в особых случаях или для легких настроек пользовательского интерфейса, imo.

1 голос
/ 25 августа 2011

Поэтому, если я вас правильно понимаю, вы хотите:

  1. Проверить файл
  2. Загрузить файл в amazon s3
  3. Сохранить маркер файла в salesforce

Не бросайте рывок в свои планы, но вы можете попробовать завершить всю процедуру в вершине.Вот немного псевдокода.Salesforce также разработала инструментарий для работы с Amazon S3, поэтому вам не нужно разрабатывать все с нуля.

Страница Visualforce:

<apex:page controller="MyController">
  <apex:form>
    <apex:inputFile value="{!file.body}" filename="{!file.name}"/>
    <apex:commandButton value="Submit" action="{!submitFile}"/>
  </apex:form>
</apex:page>

Контроллер Apex:

public class MyController {
  public Document file { get; set; } { file = new Document(); } // dummy object for storing binary file data

  public void submitFile() {
    if(!validateFile())
      return;
    String s3Token = submitToS3();
    if(s3Token != null) {
      File__c newFile = new File__c(name = file.name, s3_token__c = s3Token);
      insert newFile;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...