有没有办法通过 IF-Condition 更新 VisualForce 页面的内容类型?
Is there a way to update a VisualForce Page's Content Type through an IF-Condition?
一直在寻找更新 apex:page 内容类型的方法,但没有看到任何关于它的来源啊哈哈。
我有这个 ATM:
<apex:page standardController="sObject" extensions="<apexClass>"
</apex:page>
扩展中的顶点 class 有很多功能,我在页面中间有一个 href linked 到模板,点击后可以查看和保存作为 CSV 文件。
但我不想查看模板,而是想将功能升级为可下载的功能。所以我想找到一种方法来更新 header,当 link 被点击时,它会将 contenttype="application/vnd.ms-excel
添加到 apex:page 的 header。
你们知道VF里有没有这样的东西?
是的,您可以将表达式放在几乎任何 Visualforce 参数中,包括 apex:page
的 contentType
。像这样:
<apex:page lightningstylesheets="true" standardController="Contact" recordSetVar="contacts" extensions="SomeClass"
showHeader="{!showForm}" sidebar="{!showForm}" applyHtmlTag="{!showForm}" standardStylesheets="{!showForm}"
id="p" contentType="{!IF(showForm, 'text/html', 'application/vnd.ms-excel#Contactss.xls')}" readonly="true">
<apex:outputPanel layout="none" rendered="{!showForm}">
<apex:form >
<apex:pageBlock>
<apex:pageBlockButtons location="top">
<apex:actionStatus id="status">
<apex:facet name="stop">
<apex:outputPanel >
<apex:commandButton value="{!$Label.preview}" action="{!preview}" rerender="controls,preview" status="status"/>
<apex:commandButton value="{!$Label.export}" action="{!export}" status="status"/>
<apex:commandButton value="{!$Label.cancel}" action="{!cancel}" immediate="true" />
</apex:outputPanel>
</apex:facet>
<apex:facet name="start">
<apex:outputPanel >
<apex:commandButton value="{!$Label.preview}" disabled="true"/>
<apex:commandButton value="{!$Label.export}" disabled="true"/>
<apex:commandButton value="{!$Label.cancel}" action="{!cancel}" immediate="true" />
<img id="status" src="/img/loading.gif" alt="Loading..." title="Loading..."/>
</apex:outputPanel>
</apex:facet>
</apex:actionStatus>
</apex:pageBlockButtons>
<apex:pageBlockSection columns="1" id="controls">
put some form here, input fields...
</apex:pageBlockSection>
</apex:pageBlock>
<apex:pageBlock title="Preview" id="preview">
optionally display first 10 rows or something
</apex:pageBlock>
</apex:form>
</apex:outputPanel>
<apex:outputPanel id="o" layout="none" rendered="{!!showForm}">
{!csv} Payload here
</apex:outputPanel>
</apex:page>
但请务必检查它在 Lightning Experience 中的表现(如果您使用它)。上次我玩它时,在 LEX 中有一些额外的输出,最后我作弊了。我将 CSV 输出到 hiddent html 元素,用 JavaScript.
抓取它
<apex:commandButton value="{!$Label.export}" action="{!downloadCsv}" rerender="out" oncomplete="javascript:downloadComplete();return false;" status="status"/>
...
<apex:outputPanel id="out" style="display:none">
<span class="payload">{!csvBody}</span>
<script>
function downloadComplete(){
let payload = document.getElementsByClassName('payload')[0].innerText.replaceAll('<br/>', '\n');
let filename = 'Equipment Utilization Report.csv';
let link = document.createElement('a');
link.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(payload);
link.target = '_self';
link.download = filename;
link.click();
return false;
}
</script>
</apex:outputPanel>
一直在寻找更新 apex:page 内容类型的方法,但没有看到任何关于它的来源啊哈哈。 我有这个 ATM:
<apex:page standardController="sObject" extensions="<apexClass>"
</apex:page>
扩展中的顶点 class 有很多功能,我在页面中间有一个 href linked 到模板,点击后可以查看和保存作为 CSV 文件。
但我不想查看模板,而是想将功能升级为可下载的功能。所以我想找到一种方法来更新 header,当 link 被点击时,它会将 contenttype="application/vnd.ms-excel
添加到 apex:page 的 header。
你们知道VF里有没有这样的东西?
是的,您可以将表达式放在几乎任何 Visualforce 参数中,包括 apex:page
的 contentType
。像这样:
<apex:page lightningstylesheets="true" standardController="Contact" recordSetVar="contacts" extensions="SomeClass"
showHeader="{!showForm}" sidebar="{!showForm}" applyHtmlTag="{!showForm}" standardStylesheets="{!showForm}"
id="p" contentType="{!IF(showForm, 'text/html', 'application/vnd.ms-excel#Contactss.xls')}" readonly="true">
<apex:outputPanel layout="none" rendered="{!showForm}">
<apex:form >
<apex:pageBlock>
<apex:pageBlockButtons location="top">
<apex:actionStatus id="status">
<apex:facet name="stop">
<apex:outputPanel >
<apex:commandButton value="{!$Label.preview}" action="{!preview}" rerender="controls,preview" status="status"/>
<apex:commandButton value="{!$Label.export}" action="{!export}" status="status"/>
<apex:commandButton value="{!$Label.cancel}" action="{!cancel}" immediate="true" />
</apex:outputPanel>
</apex:facet>
<apex:facet name="start">
<apex:outputPanel >
<apex:commandButton value="{!$Label.preview}" disabled="true"/>
<apex:commandButton value="{!$Label.export}" disabled="true"/>
<apex:commandButton value="{!$Label.cancel}" action="{!cancel}" immediate="true" />
<img id="status" src="/img/loading.gif" alt="Loading..." title="Loading..."/>
</apex:outputPanel>
</apex:facet>
</apex:actionStatus>
</apex:pageBlockButtons>
<apex:pageBlockSection columns="1" id="controls">
put some form here, input fields...
</apex:pageBlockSection>
</apex:pageBlock>
<apex:pageBlock title="Preview" id="preview">
optionally display first 10 rows or something
</apex:pageBlock>
</apex:form>
</apex:outputPanel>
<apex:outputPanel id="o" layout="none" rendered="{!!showForm}">
{!csv} Payload here
</apex:outputPanel>
</apex:page>
但请务必检查它在 Lightning Experience 中的表现(如果您使用它)。上次我玩它时,在 LEX 中有一些额外的输出,最后我作弊了。我将 CSV 输出到 hiddent html 元素,用 JavaScript.
抓取它<apex:commandButton value="{!$Label.export}" action="{!downloadCsv}" rerender="out" oncomplete="javascript:downloadComplete();return false;" status="status"/>
...
<apex:outputPanel id="out" style="display:none">
<span class="payload">{!csvBody}</span>
<script>
function downloadComplete(){
let payload = document.getElementsByClassName('payload')[0].innerText.replaceAll('<br/>', '\n');
let filename = 'Equipment Utilization Report.csv';
let link = document.createElement('a');
link.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(payload);
link.target = '_self';
link.download = filename;
link.click();
return false;
}
</script>
</apex:outputPanel>