{"id":4040,"date":"2024-02-19T20:29:28","date_gmt":"2024-02-19T12:29:28","guid":{"rendered":"http:\/\/www.ponybai.com\/?p=4040"},"modified":"2023-12-05T15:55:22","modified_gmt":"2023-12-05T07:55:22","slug":"%e5%8a%a8%e6%80%81-visualforce-%e7%bb%91%e5%ae%9a","status":"publish","type":"post","link":"http:\/\/www.ponybai.com\/?p=4040","title":{"rendered":"\u52a8\u6001 Visualforce \u7ed1\u5b9a"},"content":{"rendered":"\n<p>\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>reference<\/em>&#91;<em>expression<\/em>]<\/code><\/pre>\n\n\n\n<p>\u54ea\u91cc<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><var>reference<\/var>\u8ba1\u7b97\u7ed3\u679c\u4e3a sObject\u3001Apex \u7c7b\u6216\u5168\u5c40 \u53d8\u91cf<\/li>\n\n\n\n<li><var>expression<\/var>\u8ba1\u7b97\u7ed3\u679c\u4e3a\u4f5c\u4e3a\u5b57\u6bb5\u540d\u79f0\u7684\u5b57\u7b26\u4e32\uff0c\u6216 \u76f8\u5173\u5bf9\u8c61\u3002\u5982\u679c\u8fd4\u56de\u76f8\u5173\u5bf9\u8c61\uff0c\u5219\u8be5\u5bf9\u8c61\u53ef\u7528\u4e8e\u9012\u5f52\u9009\u62e9\u5b57\u6bb5\u6216 \u5176\u4ed6\u76f8\u5173\u5bf9\u8c61\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u52a8\u6001\u7ed1\u5b9a\u53ef\u4ee5\u5728\u516c\u5f0f\u8868\u8fbe\u5f0f\u6709\u6548\u7684\u4efb\u4f55\u4f4d\u7f6e\u4f7f\u7528\u3002\u5728\u4ee5\u4e0b\u9875\u9762\u4e0a\u4f7f\u7528\u5b83\u4eec \u8fd9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{!<em>reference<\/em>&#91;<em>expression<\/em>]}<\/code><\/pre>\n\n\n\n<p>\u6216\u8005\uff0c\u60a8\u53ef\u4ee5\u5728\u6574\u4e2a\u52a8\u6001\u7684\u672b\u5c3e\u6dfb\u52a0 \u8868\u8fbe\u3002\u5982\u679c\u52a8\u6001\u8868\u8fbe\u5f0f\u89e3\u6790\u4e3a sObject\uff0c\u5219\u5f15\u7528\u8be5\u5bf9\u8c61\u4e0a\u7684\u7279\u5b9a\u5b57\u6bb5\u3002\u5982\u679c u \u662f Apex \u7c7b\uff0c\u5219\u8be5\u5b57\u6bb5\u5fc5\u987b\u4e3a or \u3002\u4e3a \u4f8b\uff1a<\/p>\n\n\n\n<p><var>fieldname<\/var><var>fieldname<\/var><samp>reference<\/samp><samp>public<\/samp><samp>global<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{!myContact&#91;'Account']&#91;<em>fieldname<\/em>]}<\/code><\/pre>\n\n\n\n<p>\u60a8\u7684\u52a8\u6001 Visualforce \u9875\u9762\u5e94\u8be5\u662f \u65e8\u5728\u4e3a\u9875\u9762\u4e0a\u7684\u5bf9\u8c61\u4f7f\u7528\u6807\u51c6\u63a7\u5236\u5668\uff0c\u5e76\u5b9e\u73b0\u4efb\u4f55\u8fdb\u4e00\u6b65\u7684 \u901a\u8fc7\u63a7\u5236\u5668\u8fdb\u884c\u5b9a\u5236\u00a0\u6269\u5c55\u3002<\/p>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528 Apex \u65b9\u6cd5\u83b7\u53d6 \u52a8\u6001\u5f15\u7528\u7684\u4fe1\u606f\uff0c\u7279\u522b\u662f\u8bbf\u95ee\u5bf9\u8c61\u5b57\u6bb5\u7684\u5f15\u7528\u3002 \u4f8b\u5982\uff0c\u4ee5 Apex \u63a7\u5236\u5668\u548c \u6269\u5c55\u53ef\u4ee5\u7406\u89e3\u3002<samp>Schema.SobjectType<\/samp><samp>Schema.SobjectType.Account.fields.getMap()<\/samp><\/p>\n\n\n\n<p>\u91cd\u8981<\/p>\n\n\n\n<p>\u4fdd\u5b58\u9875\u9762\u65f6\u4f1a\u68c0\u67e5\u9759\u6001\u5f15\u7528\u7684\u6709\u6548\u6027\uff0c\u5e76\u4e14 \u65e0\u6548\u7684\u5f15\u7528\u5c06\u963b\u6b62\u60a8\u4fdd\u5b58\u5b83\u3002\u5c31\u5176\u6027\u8d28\u800c\u8a00\uff0c\u52a8\u6001\u5f15\u7528\u53ea\u80fd \u5728\u8fd0\u884c\u65f6\u8fdb\u884c\u68c0\u67e5\uff0c\u5982\u679c\u60a8\u7684\u9875\u9762\u5305\u542b\u65e0\u6548\u7684\u52a8\u6001\u5f15\u7528\uff0c\u5219 \u9875\u9762\u88ab\u67e5\u770b\uff0c\u9875\u9762\u5931\u8d25\u3002\u53ef\u4ee5\u521b\u5efa\u5bf9\u81ea\u5b9a\u4e49\u5b57\u6bb5\u7684\u5f15\u7528\uff0c\u6216\u8005 \u5168\u5c40\u53d8\u91cf\uff0c\u4f46\u5982\u679c\u8be5\u5b57\u6bb5\u6216\u5168\u5c40\u503c\u7a0d\u540e\u88ab\u5220\u9664\uff0c\u5219\u9875\u9762 \u4e0b\u6b21\u67e5\u770b\u65f6\u5c06\u5931\u8d25\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9a\u4e49\u5173\u7cfb<\/h2>\n\n\n\n<p>\u548c \u90fd\u53ef\u4ee5\u662f\u590d\u6742\u7684\u8868\u8fbe\u5f0f\uff0c\u4f8b\u5982\u8ba1\u7b97\u7ed3\u679c\u4e3a\u5bf9\u8c61\u7684\u8868\u8fbe\u5f0f \u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u5047\u8bbe\u4e00\u4e2a\u540d\u4e3a Object1__c \u7684\u5bf9\u8c61\u4e0e \u53e6\u4e00\u4e2a\u540d\u4e3a Object2__c \u7684\u5bf9\u8c61\u3002\u8fd9\u4e24\u4e2a\u5bf9\u8c61\u4e4b\u95f4\u7684\u5173\u7cfb\u7684\u540d\u79f0\u662f \u79f0\u4e3aRelationship__r\u3002<samp>reference<\/samp><samp>expression<\/samp>\u5982\u679c Object2__c \u6709\u4e00\u4e2a\u540d\u4e3a \u7684\u5b57\u6bb5\uff0c\u5219 \u4ee5\u4e0b\u52a8\u6001\u8f6c\u6362\u67e5\u627e\u90fd\u8fd4\u56de\u5bf9\u540c\u4e00\u5b57\u6bb5\u7684\u5f15\u7528\uff1a<\/p>\n\n\n\n<p><samp>myField<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Object1__c.Object2__c[&#8216;myField&#8217;]<\/li>\n\n\n\n<li>Object1__c[&#8216;Object2__c.myField&#8217;]<\/li>\n\n\n\n<li>Object1__c[&#8216;Object2__c&#8217;][&#8216;\u6211\u7684\u5b57\u6bb5&#8217;]<\/li>\n\n\n\n<li>Object1__c.Relationship__r[myField]<\/li>\n\n\n\n<li>Object1__c[Relationship__r.myField]<\/li>\n\n\n\n<li>Object1__c[Relationship__r][myField]<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u5bf9\u6807\u51c6\u5bf9\u8c61\u4f7f\u7528\u52a8\u6001\u53c2\u7167<\/h1>\n\n\n\n<p>\u4f7f\u7528\u52a8\u6001 Visualforce \u7ed1\u5b9a \u4f7f\u7528\u8981\u8bbf\u95ee\u7684\u4e00\u7ec4\u5df2\u77e5\u5b57\u6bb5\u6784\u5efa\u7b80\u5355\u3001\u53ef\u91cd\u7528\u7684\u9875\u9762\u3002\u8fd9 \u8be5\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u53ef\u4ee5\u8f7b\u677e\u81ea\u5b9a\u4e49\u54ea\u4e9b\u5b57\u6bb5\u4e0e\u7528\u6237\u76f8\u5173 \u6765\u5de5\u4f5c\u3002<\/p>\n\n\n\n<p>\u63a5\u4e0b\u6765\u7684\u4e24\u4e2a\u793a\u4f8b\u51fa\u4e8e\u6559\u5b66\u76ee\u7684\u800c\u7279\u610f\u7b80\u5355\u3002\u8bf7\u53c2\u9605\u4f7f\u7528\u52a8\u6001\u5f15\u7528 \u7528\u6237\u53ef\u81ea\u5b9a\u4e49\u9875\u9762\uff0c\u4ee5\u83b7\u53d6\u66f4\u9ad8\u7ea7\u7684\u793a\u4f8b\uff0c\u4ee5\u5145\u5206\u5229\u7528\u52a8\u6001 Visualforce\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u7b80\u5355\u7684\u52a8\u6001\u8868\u5355<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u793a\u4f8b\u6f14\u793a\u4e86\u6784\u5efa Visualforce \u9875\u9762\u7684\u6700\u7b80\u5355\u65b9\u6cd5\uff0c\u8be5\u9875\u9762\u4f7f\u7528 \u52a8\u6001\u5f15\u7528\u3002\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u63a7\u5236\u5668\u6269\u5c55\uff0c\u8be5\u6269\u5c55\u63d0\u4f9b \u5b57\u6bb5\u8bbe\u7f6e\u4e3a \u663e\u793a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class DynamicAccountFieldsLister {\n\n    public DynamicAccountFieldsLister(ApexPages.StandardController controller) { \n        controller.addFields(editableFields);\n    }\n\n    public List&lt;String&gt; editableFields {\n        get {\n            if (editableFields == null) {\n                editableFields = new List&lt;String&gt;();\n                editableFields.add('Industry');\n                editableFields.add('AnnualRevenue');\n                editableFields.add('BillingCity');\n            }\n            return editableFields ;\n        }\n        private set;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u63a5\u4e0b\u6765\uff0c\u521b\u5efa\u4e00\u4e2a\u4f7f\u7528\u4e0a\u8ff0\u63a7\u5236\u5668\u7684\u9875\u9762 \u5916\u5ef6\uff1a<\/p>\n\n\n\n<p><samp>DynamicAccountEditor<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Account\" \n           extensions=\"DynamicAccountFieldsLister\"&gt; \n\n    &lt;apex:pageMessages \/&gt;&lt;br\/&gt;\n    \n    &lt;apex:form&gt;\n        &lt;apex:pageBlock title=\"Edit Account\" mode=\"edit\"&gt;\n            &lt;apex:pageBlockSection columns=\"1\"&gt;\n                &lt;apex:inputField value=\"{!Account.Name}\"\/&gt;\n                &lt;apex:repeat value=\"{!editableFields}\" var=\"f\"&gt;\n                    &lt;apex:inputField value=\"{!Account&#91;f]}\"\/&gt;\n                &lt;\/apex:repeat&gt;\n           &lt;\/apex:pageBlockSection&gt;\n        &lt;\/apex:pageBlock&gt;\n    &lt;\/apex:form&gt;\n    \n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u8bf7\u6ce8\u610f\u6b64\u793a\u4f8b\u4e2d\u53d1\u751f\u7684\u60c5\u51b5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u63a7\u5236\u5668\u6269\u5c55\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a \u7684\u5b57\u7b26\u4e32\u5217\u8868\u3002\u6bcf\u4e2a\u5b57\u7b26\u4e32\u6620\u5c04\u5230 Account \u5bf9\u8c61\u4e2d\u7684\u5b57\u6bb5\u540d\u79f0\u3002<samp>DynamicAccountFieldsLister<\/samp><samp>editableFields<\/samp><\/li>\n\n\n\n<li>\u5217\u8868\u662f \u786c\u7f16\u7801\uff0c\u4f46\u60a8\u53ef\u4ee5\u4ece\u67e5\u8be2\u6216\u8ba1\u7b97\u4e2d\u786e\u5b9a\u5b83\u4eec\uff0c\u8bf7\u9605\u8bfb \u5b83\u4eec\u6765\u81ea\u81ea\u5b9a\u4e49\u8bbe\u7f6e\uff0c\u6216\u4ee5\u5176\u4ed6\u65b9\u5f0f\u63d0\u4f9b\u66f4\u52a8\u6001\u7684 \u7ecf\u9a8c\u3002\u8fd9\u5c31\u662f\u52a8\u6001\u5f15\u7528\u7684\u5f3a\u5927\u4e4b\u5904\u3002<samp>editableFields<\/samp><\/li>\n\n\n\n<li><samp>DynamicAccountEditor<\/samp>\u6807\u8bb0\u4f7f\u7528\u6807\u8bb0\u8fdb\u884c\u5faa\u73af \u901a\u8fc7 \u8fd4\u56de\u7684\u5b57\u7b26\u4e32\u3002<samp>&lt;apex:repeat&gt;<\/samp><samp>editableFields<\/samp><\/li>\n\n\n\n<li>\u6807\u7b7e \u901a\u8fc7\u5f15\u7528 iteration \u5143\u7d20\u6765\u663e\u793a\u6bcf\u4e2a\u5b57\u6bb5\uff0c\u8be5\u5143\u7d20\u8868\u793a \u5e10\u6237\u4e0a\u7684\u5b57\u6bb5\u540d\u79f0\u3002\u52a8\u6001\u5f15\u7528\u5b9e\u9645\u4e0a\u663e\u793a \u503c\u3002<samp>&lt;apex:inputField&gt;<\/samp><samp>editableFields<\/samp><samp>f<\/samp><samp>{!Account[f]}<\/samp><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u786e\u4fdd\u52a8\u6001\u5f15\u7528\u4e2d\u7684\u5b57\u6bb5\u7531\u6807\u51c6\u52a0\u8f7d \u63a7\u5236\u5668<\/h2>\n\n\n\n<p>Visualforce \u81ea\u52a8 \u4f18\u5316\u4e86\u9875\u9762\uff08\u6216\uff09\u6267\u884c\u7684 SOQL \u67e5\u8be2\uff0c\u4ec5\u52a0\u8f7d\u5b9e\u9645 \u5728\u9875\u9762\u4e0a\u4f7f\u7528\u3002\u5f53\u60a8\u521b\u5efa\u5177\u6709\u9759\u6001 \u5bf9\u5bf9\u8c61\u548c\u5b57\u6bb5\u7684\u5f15\u7528\uff0c\u53ef\u4ee5\u4e8b\u5148\u77e5\u9053\u5b57\u6bb5\u548c\u5bf9\u8c61\u3002 \u4fdd\u5b58\u9875\u9762\u540e\uff0cVisualforce \u80fd\u591f \u786e\u5b9a\u5e76\u4fdd\u5b58\u9700\u8981\u5c06\u54ea\u4e9b\u5bf9\u8c61\u548c\u5b57\u6bb5\u6dfb\u52a0\u5230 SOQL \u67e5\u8be2\u4e2d \u7a0d\u540e\u5c06\u6267\u884c\uff0c \u8bf7\u6c42\u9875\u9762\u65f6\u3002<samp>StandardController<\/samp><samp>StandardSetController<\/samp><samp>StandardController<\/samp><\/p>\n\n\n\n<p>\u52a8\u6001\u5f15\u7528\u5728\u8fd0\u884c\u65f6<em>\u8ba1\u7b97\uff0c\u5728<\/em>&nbsp;SOQL \u67e5\u8be2\u7531 \u8fd9\u3002\u5982\u679c\u5b57\u6bb5\u4ec5 \u901a\u8fc7\u52a8\u6001\u5f15\u7528\u4f7f\u7528\uff0c\u5b83\u4e0d\u4f1a\u81ea\u52a8\u52a0\u8f7d\u3002\u5f53\u90a3 \u52a8\u6001\u5f15\u7528\u7a0d\u540e\u88ab\u8bc4\u4f30\uff0c\u5b83\u5c06\u89e3\u6790\u4e3a\u7f3a\u5931\u7684\u6570\u636e\uff0c \u5176\u7ed3\u679c\u662f SOQL \u9519\u8bef\u3002\u60a8\u5fc5\u987b\u5411 \u63a7\u5236\u5668\uff0c\u4ee5\u4fbf\u5b83\u77e5\u9053\u8981\u52a0\u8f7d\u54ea\u4e9b\u5b57\u6bb5\u548c\u76f8\u5173\u5bf9\u8c61\u3002<samp>StandardController<\/samp>\u53ef\u4ee5\u4f7f\u7528\u9875\u9762\u63a7\u5236\u5668\u4e0a\u7684\u65b9\u6cd5\u4f20\u5165 \u8981\u52a0\u8f7d\u7684\u5176\u4ed6\u5b57\u6bb5\u3002\u5728\u524d\u9762\u7684\u793a\u4f8b\u4e2d\uff0c\u8fd9\u662f\u5728\u63a7\u5236\u5668\u4e2d\u5b8c\u6210\u7684 \u6269\u5c55\u7684 \u6784\u9020 \u51fd\u6570\uff1a<\/p>\n\n\n\n<p><samp>StandardController<\/samp><samp>addFields()<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public DynamicAccountFieldsLister(ApexPages.StandardController controller) { \n        controller.addFields(editableFields);\n    }<\/code><\/pre>\n\n\n\n<p>\u8fd9 \u6784\u9020\u51fd\u6570\u4f7f\u7528\u4e0e\u9875\u9762\u6807\u8bb0\u76f8\u540c\u7684\u5c5e\u6027 \uff0c\u5c06\u66f4\u591a\u5b57\u6bb5\u6dfb\u52a0\u5230 \u63a7\u5236\u5668\u8981\u52a0\u8f7d\u7684\u5b57\u6bb5\u5217\u8868\u3002<\/p>\n\n\n\n<p><samp>editableFields<\/samp><\/p>\n\n\n\n<p>\u8fd9\u9002\u7528\u4e8e\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u77e5\u9053\u8981\u52a0\u8f7d\u7684\u5b57\u6bb5\u7684\u5b8c\u6574\u5217\u8868\u7684\u9875\u9762 \u63a7\u5236\u5668\u6269\u5c55\u88ab\u5b9e\u4f8b\u5316\u3002\u5982\u679c\u5b57\u6bb5\u5217\u8868\u4e0d\u80fd \u786e\u5b9a\u76f4\u5230\u7a0d\u540e\u5728\u8bf7\u6c42\u5904\u7406\u4e2d\uff0c\u60a8\u53ef\u4ee5\u8c03\u7528\u63a7\u5236\u5668\uff0c\u7136\u540e\u6dfb\u52a0 \u9886\u57df\u3002\u8fd9\u5c06\u5bfc\u81f4\u63a7\u5236\u5668\u53d1\u9001\u4fee\u6539\u540e\u7684\u67e5\u8be2\u3002\u5bf9 User-Customizable Page\u00a0\u63d0\u4f9b\u4e86\u6b64\u6280\u672f\u7684\u4e00\u4e2a\u793a\u4f8b\u3002<samp>reset()<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u4ec5\u5f53\u4f7f\u7528 \u5bf9 \u6216 \u7684\u7f3a\u7701\u67e5\u8be2\u3002\u5982\u679c\u4f60\u7684 \u63a7\u5236\u5668\u6216\u63a7\u5236\u5668\u6269\u5c55\u6267\u884c\u81ea\u5df1\u7684 SOQL \u67e5\u8be2\uff0c\u4f7f\u7528 \u662f\u4e0d\u5fc5\u8981\u7684\uff0c\u5e76\u4e14\u6ca1\u6709 \u5f71\u54cd\u3002<samp>StandardControllerStandardSetControlleraddFields()<\/samp>\u6709\u5173\u8fd9\u4e9b\u65b9\u6cd5\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u00a0StandardController\u00a0\u6587\u6863\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u5bf9\u76f8\u5173\u5185\u5bb9\u7684\u52a8\u6001\u5f15\u7528 \u5bf9\u8c61<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u4e3a\u6848\u4f8b\u521b\u5efa\u4e00\u4e2a Visualforce \u9875\u9762 \u8bb0\u5f55\uff0c\u5176\u4e2d\u5305\u542b\u67d0\u4e9b\u53ef\u7f16\u8f91\u7684\u5b57\u6bb5\u3002\u663e\u793a\u7684\u4e00\u4e9b\u5b57\u6bb5\u6765\u81ea \u4e00\u4e2a\u76f8\u5173\u5bf9\u8c61\uff0c\u663e\u793a\u5982\u4f55\u4f7f\u7528\u52a8\u6001\u5f15\u7528\u8fdb\u884c\u904d\u5386 \u5173\u7cfb\u3002\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a Apex \u63a7\u5236\u5668\u7684\u6269\u5c55\uff1a<\/p>\n\n\n\n<p><samp>DynamicCaseLoader<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class DynamicCaseLoader {\n\n    public final Case caseDetails { get; private set; }\n\n    \/\/ SOQL query loads the case, with Case fields and related Contact fields\n    public DynamicCaseLoader(ApexPages.StandardController controller) {\n        String qid = ApexPages.currentPage().getParameters().get('id');\n        String theQuery = 'SELECT Id, ' + joinList(caseFieldList, ', ') + \n                          ' FROM Case WHERE Id = :qid';\n        this.caseDetails = Database.query(theQuery);\n    }\n\n    \/\/ A list of fields to show on the Visualforce page\n    public List&lt;String&gt; caseFieldList { \n        get {\n            if (caseFieldList == null) {\n                caseFieldList = new List&lt;String&gt;();\n                caseFieldList.add('CaseNumber');\n                caseFieldList.add('Origin');\n                caseFieldList.add('Status');\n                caseFieldList.add('Contact.Name');  \/\/ related field\n                caseFieldList.add('Contact.Email'); \/\/ related field\n                caseFieldList.add('Contact.Phone'); \/\/ related field\n            }\n            return caseFieldList;\n        }\n        private set;\n    }\n    \n    \/\/ Join an Apex list of fields into a SELECT fields list string\n    private static String joinList(List&lt;String&gt; theList, String separator) {\n\n        if (theList == null) {\n            return null;\n        }\n        if (separator == null) {\n            separator = '';\n        }\n\n        String joined = '';\n        Boolean firstItem = true;\n        for (String item : theList) {\n            if(null != item) {\n                if(firstItem){\n                    firstItem = false;\n                }\n                else {\n                    joined += separator;               \n                }\n                joined += item;\n            }\n        }\n        return joined;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5bf9\u5e94\u7684\u9875\u9762\uff0c \uff0c \u4f7f\u7528\u6b64\u6269\u5c55\u68c0\u7d22\u6709\u5173\u7279\u5b9a\u6848\u4f8b\u53ca\u5176 \u76f8\u5173 \u8054\u7cfb\uff1a<\/p>\n\n\n\n<p><samp>DynamicCaseEditor<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Case\" extensions=\"DynamicCaseLoader\"&gt; \n    &lt;br\/&gt;\n    &lt;apex:form &gt;\n        &lt;apex:repeat value=\"{!caseFieldList}\" var=\"cf\"&gt;\n            &lt;h2&gt;{!cf}&lt;\/h2&gt;\n            &lt;br\/&gt;\n            &lt;!-- The only editable information should be contact information --&gt; \n            &lt;apex:inputText value=\"{!caseDetails&#91;cf]}\" \n                rendered=\"{!IF(contains(cf, \"Contact\"), true, false)}\"\/&gt;\n            &lt;apex:outputText value=\"{!caseDetails&#91;cf]}\" \n                rendered=\"{!IF(contains(cf, \"Contact\"), false, true)}\"\/&gt;\n            &lt;br\/&gt;&lt;br\/&gt;\n        &lt;\/apex:repeat&gt;\n    &lt;\/apex:form&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u8bbf\u95ee \u6b64\u9875\u9762\u5c06\u6709\u6548\u6848\u4f8b\u8bb0\u5f55\u7684 ID \u6307\u5b9a\u4e3a\u67e5\u8be2\u53c2\u6570\u3002\u4f8b\u5982\u3002 \u60a8\u7684\u9875\u9762\u5c06\u663e\u793a\u7c7b\u4f3c\u4e8e\u4ee5\u4e0b\u5185\u5bb9\u7684\u8868\u5355\uff1a<\/p>\n\n\n\n<p><samp>idhttps:\/\/Salesforce_instance\/apex\/DynamicCaseEditor?id=500D0000003ZtPy<\/samp><img decoding=\"async\" width=\"150\" height=\"235\" class=\"wp-image-4080\" style=\"width: 150px;\" src=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna1.png\" alt=\"\" srcset=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna1.png 193w, http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna1-191x300.png 191w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/>\u5173\u4e8e\u6b64\u793a\u4f8b\uff0c\u6709\u8bb8\u591a\u6ce8\u610f\u4e8b\u9879\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728\u63a7\u5236\u5668\u6269\u5c55\u4e2d\uff0c\u6784\u9020\u51fd\u6570\u5bf9 \u8981\u663e\u793a\u7684\u5bf9\u8c61\u3002\u8fd9\u662f\u56e0\u4e3a\u9875\u9762\u65e0\u6cd5\u52a0\u8f7d \u76f8\u5173\u5b57\u6bb5\uff0c\u4f46\u6709\u8bb8\u591a\u4e0d\u540c\u7684\u7528\u4f8b \u9700\u8981\u81ea\u5b9a\u4e49\u7684 SOQL \u67e5\u8be2\u3002\u67e5\u8be2\u7ed3\u679c\u53ef\u4f9b \u9875\u9762\u6d4f\u89c8\u5c5e\u6027\u3002\u65e0\u9700\u6267\u884c \u6784\u9020\u51fd\u6570\u4e2d\u7684\u67e5\u8be2 &#8211; \u5b83\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u4f4d\u4e8e \u5c5e\u6027\u7684\u65b9\u6cd5\u3002<samp>StandardController<\/samp><samp>caseFieldList<\/samp><samp>get<\/samp><\/li>\n\n\n\n<li>SOQL \u67e5\u8be2\u6307\u5b9a\u8981\u52a0\u8f7d\u7684\u5b57\u6bb5\uff0c\u56e0\u6b64\u6ca1\u6709\u5fc5\u8981 \u4f7f\u7528\u5728\u7b80\u5355\u52a8\u6001\u8868\u5355\u4e2d\u9700\u8981\u7684\u3002<samp>addFields()<\/samp><\/li>\n\n\n\n<li>SOQL \u67e5\u8be2\u662f\u5728\u8fd0\u884c\u65f6\u6784\u9020\u7684\u3002\u5b9e\u7528\u7a0b\u5e8f\u65b9\u6cd5\u5c06 \u5c06\u5b57\u6bb5\u540d\u79f0\u5217\u8868\u8f6c\u6362\u4e3a\u9002\u5408\u5728 SOQL \u8bed\u53e5\u4e2d\u4f7f\u7528\u7684\u5b57\u7b26\u4e32\u3002<samp>SELECT<\/samp><\/li>\n\n\n\n<li>\u5728\u6807\u8bb0\u4e2d\uff0c\u901a\u8fc7\u5faa\u73af\u8bbf\u95ee\u5b57\u6bb5\u6765\u663e\u793a\u8868\u5355\u5b57\u6bb5 \u4f7f\u7528 \u548c \u7684\u540d\u79f0 \u5728 \u52a8\u6001\u5f15\u7528\u4ee5\u83b7\u53d6\u5b57\u6bb5\u503c\u3002\u6bcf\u4e2a\u5b57\u6bb5\u90fd\u53ef\u80fd\u88ab\u5199\u5165 \u7531<em>\u4e24\u4e2a<\/em>\u7ec4\u4ef6\u7ec4\u6210\uff0c\u5e76\u4e14 .\u8fd9\u4e9b\u6807\u8bb0\u7684 render \u5c5e\u6027 \u63a7\u5236\u4e24\u8005\u4e2d\u7684\u54ea\u4e00\u4e2a\u5b9e\u9645\u663e\u793a\uff1a\u5982\u679c\u5b57\u6bb5\u540d\u79f0\u5305\u542b string \u201cContact\u201d\uff0c\u5219\u4fe1\u606f\u5c06\u5448\u73b0\u5728\u6807\u7b7e\u4e2d\uff0c\u5982\u679c \u5b83\u4e0d\u662f\uff0c\u5b83\u662f\u5728 .<samp>&lt;apex:repeat&gt;<\/samp><samp>cf<\/samp><samp>&lt;apex:outputText&gt;<\/samp><samp>&lt;apex:inputText&gt;<\/samp><samp>&lt;apex:inputText&gt;<\/samp><samp>&lt;apex:outputText&gt;<\/samp><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u5bf9 \u7528\u6237\u53ef\u81ea\u5b9a\u4e49\u7684\u9875\u9762<\/h2>\n\n\n\n<p>Visualforce \u52a8\u6001\u7ed1\u5b9a\u7684\u5168\u90e8\u6f5c\u529b \u5728\u6784\u5efa\u9875\u9762\u65f6\u4e0d\u77e5\u9053\u5bf9\u8c61\u4e0a\u54ea\u4e9b\u5b57\u6bb5\u53ef\u7528\u3002\u8fd9 \u4ee5\u4e0b\u793a\u4f8b\u6f14\u793a\u4e86\u6b64\u529f\u80fd\uff0c\u5176\u4e2d\u5305\u542b\u53ef\u4ee5 \u5728\u4e0d\u77e5\u9053 Account \u5bf9\u8c61\u4e0a<em>\u7684\u4efb\u4f55<\/em>\u5b57\u6bb5\u7684\u60c5\u51b5\u4e0b\u8fdb\u884c\u81ea\u5b9a\u4e49\uff0c\u4f46 \u5bf9\u4e8e\u6240\u6709\u5bf9\u8c61\u90fd\u9700\u8981\u7684\u201c\u540d\u79f0\u201d\u5b57\u6bb5\u3002\u8fd9\u662f\u5236\u4f5c\u7684 \u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528 \u6765\u68c0\u7d22 \u5bf9\u8c61\u4e0a\u5b58\u5728\u7684\u5b57\u6bb5\u548c Visualforce \u52a8\u6001 \u5f15\u7528\u3002<samp>Schema.SobjectType.Account.fields.getMap()<\/samp>\u6b64\u793a\u4f8b\u63d0\u4f9b\u7684\u529f\u80fd\u5f88\u7b80\u5355\u3002\u4e3b\u5217\u8868\u89c6\u56fe\u6700\u521d \u4ec5\u663e\u793a\u5e10\u6237\u540d\u79f0\uff0c\u4f46\u663e\u793a<strong>\u201c\u81ea\u5b9a\u4e49\u5217\u8868<\/strong>\u201d\u6309\u94ae \u5141\u8bb8\u7528\u6237\u9009\u62e9\u8981\u6dfb\u52a0\u5230\u5217\u8868\u4e2d\u7684\u5b57\u6bb5\u3002\u4ec0\u4e48\u65f6\u5019 \u4ed6\u4eec\u4fdd\u5b58\u4ed6\u4eec\u7684\u9996\u9009\u9879\uff0c\u4ed6\u4eec\u8fd4\u56de\u5217\u8868\u89c6\u56fe\uff0c\u5e76\u5c06\u52a8\u6001\u5730\u770b\u5230\u4e00\u4e2a \u751f\u6210\u7684 Visualforce \u9875\u9762 \u5728\u9644\u52a0\u5217\u4e2d\u663e\u793a\u8fd9\u4e9b\u5b57\u6bb5\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u60a8\u8fd8\u53ef\u4ee5\u6784\u5efa\u9875\u9762 \u4e0d\u77e5\u9053\u4f7f\u7528\u52a8\u6001\u7684\u5b57\u6bb5\u00a0\u5e26\u6709\u5b57\u6bb5\u96c6\u7684\u5f15\u7528\u3002\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a \uff1a<\/p>\n\n\n\n<p><samp>DynamicCustomizableListHandler<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class DynamicCustomizableListHandler {\n\n    \/\/ Resources we need to hold on to across requests\n    private ApexPages.StandardSetController controller;\n    private PageReference savePage;\n\n    \/\/ This is the state for the list \"app\"\n    private Set&lt;String&gt; unSelectedNames = new Set&lt;String&gt;();\n    private Set&lt;String&gt; selectedNames = new Set&lt;String&gt;();\n    private Set&lt;String&gt; inaccessibleNames = new Set&lt;String&gt;();\n\n    public DynamicCustomizableListHandler(ApexPages.StandardSetController controller) {\n        this.controller = controller;\n        loadFieldsWithVisibility();\n    }\n\n    \/\/ Initial load of the fields lists\n    private void loadFieldsWithVisibility() {\n        Map&lt;String, Schema.SobjectField&gt; fields = \n            Schema.SobjectType.Account.fields.getMap();\n        for (String s : fields.keySet()) {\n            if (s != 'Name') {  \/\/ name is always displayed \n                unSelectedNames.add(s);\n            }\n            if (!fields.get(s).getDescribe().isAccessible()) {\n                inaccessibleNames.add(s);\n            }\n        }\n    }\n\n    \/\/ The fields to show in the list\n    \/\/ This is what we generate the dynamic references from\n    public List&lt;String&gt; getDisplayFields() { \n        List&lt;String&gt; displayFields = new List&lt;String&gt;(selectedNames);\n        displayFields.sort();\n        return displayFields;\n    }\n    \n    \/\/ Nav: go to customize screen\n    public PageReference customize() {\n        savePage = ApexPages.currentPage();\n        return Page.CustomizeDynamicList;\n    }\n\n    \/\/ Nav: return to list view\n    public PageReference show() {\n        \/\/ This forces a re-query with the new fields list\n        controller.reset();\n        controller.addFields(getDisplayFields());\n        return savePage; \n    }\n\n    \/\/ Create the select options for the two select lists on the page\n    public List&lt;SelectOption&gt; getSelectedOptions() { \n        return selectOptionsFromSet(selectedNames);\n    }\n    public List&lt;SelectOption&gt; getUnSelectedOptions() { \n        return selectOptionsFromSet(unSelectedNames);\n    }\n    \n    private List&lt;SelectOption&gt; selectOptionsFromSet(Set&lt;String&gt; opts) {\n        List&lt;String&gt; optionsList = new List&lt;String&gt;(opts);\n        optionsList.sort();\n        List&lt;SelectOption&gt; options = new List&lt;SelectOption&gt;();\n        for (String s : optionsList) {\n            options.add(new \n                SelectOption(s, decorateName(s), inaccessibleNames.contains(s)));\n        }\n        return options;\n    }\n\n    private String decorateName(String s) {\n        return inaccessibleNames.contains(s) ? '*' + s : s;\n    }\n\n    \/\/ These properties receive the customization form postback data\n    \/\/ Each time the &#91;&lt;&lt;] or &#91;&gt;&gt;] button is clicked, these get the contents\n    \/\/ of the respective selection lists from the form\n    public transient List&lt;String&gt; selected   { get; set; }\n    public transient List&lt;String&gt; unselected { get; set; }\n\n    \/\/ Handle the actual button clicks. Page gets updated via a\n    \/\/ rerender on the form\n    public void doAdd() {\n        moveFields(selected, selectedNames, unSelectedNames);\n    }\n    public void doRemove() {\n        moveFields(unselected, unSelectedNames, selectedNames);\n    }\n    \n    private void moveFields(List&lt;String&gt; items, \n            Set&lt;String&gt; moveTo, Set&lt;String&gt; removeFrom) {\n        for (String s: items) {\n            if( ! inaccessibleNames.contains(s)) {\n                moveTo.add(s);\n                removeFrom.remove(s);\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u4ec0\u4e48\u65f6\u5019 \u4fdd\u5b58\u8bfe\u7a0b\u65f6\uff0c\u7cfb\u7edf\u53ef\u80fd\u4f1a\u63d0\u793a\u60a8\u7f3a\u5c11 Visualforce \u9875\u9762\u3002\u8fd9\u662f \u56e0\u4e3a\u65b9\u6cd5\u4e2d\u7684\u9875\u9762\u5f15\u7528\u3002\u5355\u51fb\u201c\u5feb\u901f\u4fee\u590d\u201d\u94fe\u63a5 \u521b\u5efa\u9875\u9762 &#8211; \u6765\u81ea \u7a0d\u540e\u7684\u4ee3\u7801\u5757\u5c06\u88ab\u7c98\u8d34\u5230\u5176\u4e2d\u3002<samp>customize()<\/samp>\u5173\u4e8e\u8fd9\u4e2a\u73ed\u7ea7\u7684\u4e00\u4e9b\u6ce8\u610f\u4e8b\u9879\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6807\u51c6\u63a7\u5236\u5668\u65b9\u6cd5 \u548c \u5728\u65b9\u6cd5\u4e2d\u4f7f\u7528\uff0c\u8be5\u65b9\u6cd5\u662f\u8fd4\u56de\u5230 \u5217\u8868\u89c6\u56fe\u3002\u5b83\u4eec\u662f\u5fc5\u9700\u7684\uff0c\u56e0\u4e3a\u8981\u663e\u793a\u7684\u5b57\u6bb5\u5217\u8868\u53ef\u80fd\u5177\u6709 \u5df2\u66f4\u6539\uff0c\u56e0\u6b64\u52a0\u8f7d\u6570\u636e\u4ee5\u4f9b\u663e\u793a\u7684\u67e5\u8be2\u9700\u8981 \u91cd\u65b0\u6267\u884c\u3002<samp>addFields()<\/samp><samp>reset()<\/samp><samp>show()<\/samp><\/li>\n\n\n\n<li>\u4e24\u79cd\u64cd\u4f5c\u65b9\u6cd5\uff0c\u4ee5\u53ca \uff0c\u4ece\u5217\u8868\u4e2d\u5bfc\u822a \u67e5\u770b\u81ea\u5b9a\u4e49\u8868\u5355\uff0c\u7136\u540e\u518d\u67e5\u770b\u56de\u6765\u3002<samp>customize()<\/samp><samp>show()<\/samp><\/li>\n\n\n\n<li>\u5bfc\u822a\u64cd\u4f5c\u65b9\u6cd5\u4e4b\u540e\u7684\u6240\u6709\u5185\u5bb9\u90fd\u4e0e\u81ea\u5b9a\u4e49\u6709\u5173 \u5f62\u5f0f\u3002\u8fd9\u4e9b\u65b9\u6cd5\u5927\u81f4\u5206\u4e3a\u4e24\u7ec4\uff0c\u5176\u4e2d\u6307\u51fa \u8bc4\u8bba\u3002\u7b2c\u4e00\u7ec4\u63d0\u4f9b\u81ea\u5b9a\u4e49\u8868\u5355\u4f7f\u7528\u7684\u5217\u8868\uff0c \u7b2c\u4e8c\u7ec4\u5904\u7406\u4ece\u4e00\u4e2a\u5217\u8868\u4e2d\u79fb\u52a8\u9879\u76ee\u7684\u4e24\u4e2a\u6309\u94ae \u5230\u53e6\u4e00\u4e2a\u3002<samp>List&lt;SelectOption&gt;<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u73b0\u5728\uff0c\u521b\u5efa\u4e00\u4e2a Visualforce \u9875\u9762 \u4f7f\u7528 \u4ee5\u540e \u6807\u8bb0\uff1a<\/p>\n\n\n\n<p><samp>DynamicCustomizableList<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Account\" recordSetVar=\"accountList\"\n           extensions=\"DynamicCustomizableListHandler\"&gt;\n    &lt;br\/&gt;\n    &lt;apex:form &gt;\n\n    &lt;!-- View selection widget, uses StandardController methods --&gt;\n    &lt;apex:pageBlock&gt;\n        &lt;apex:outputLabel value=\"Select Accounts View: \" for=\"viewsList\"\/&gt;\n        &lt;apex:selectList id=\"viewsList\" size=\"1\" value=\"{!filterId}\"&gt;\n            &lt;apex:actionSupport event=\"onchange\" rerender=\"theTable\"\/&gt;\n            &lt;apex:selectOptions value=\"{!listViewOptions}\"\/&gt;\n        &lt;\/apex:selectList&gt;\n    &lt;\/apex:pageblock&gt;\n\n    &lt;!-- This list of accounts has customizable columns --&gt;\n    &lt;apex:pageBlock title=\"Accounts\" mode=\"edit\"&gt;\n        &lt;apex:pageMessages \/&gt;\n        &lt;apex:panelGroup id=\"theTable\"&gt;\n            &lt;apex:pageBlockTable value=\"{!accountList}\" var=\"acct\"&gt;\n                &lt;apex:column value=\"{!acct.Name}\"\/&gt;\n                &lt;!-- This is the dynamic reference part --&gt;\n                &lt;apex:repeat value=\"{!displayFields}\" var=\"f\"&gt;\n                    &lt;apex:column value=\"{!acct&#91;f]}\"\/&gt;\n                &lt;\/apex:repeat&gt;\n            &lt;\/apex:pageBlockTable&gt;\n        &lt;\/apex:panelGroup&gt;\n    &lt;\/apex:pageBlock&gt;\n\n    &lt;br\/&gt;\n    &lt;apex:commandButton value=\"Customize List\" action=\"{!customize}\"\/&gt;\n\n    &lt;\/apex:form&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u8fd9 \u9875\u9762\u663e\u793a\u7ec4\u7ec7\u4e2d\u7684\u5e10\u6237\u5217\u8868\u3002\u9876\u90e8\u7684 \u63d0\u4f9b \u4e3a\u5e10\u6237\u5b9a\u4e49\u7684\u89c6\u56fe\u7684\u6807\u51c6\u4e0b\u62c9\u5217\u8868\uff0c\u4e0e\u7528\u6237\u770b\u5230\u7684\u89c6\u56fe\u76f8\u540c \u5728\u6807\u51c6 Salesforce \u4e0a \u5e10\u6237\u9875\u9762\u3002\u6b64\u89c6\u56fe\u5c0f\u7ec4\u4ef6\u4f7f\u7528 .<\/p>\n\n\n\n<p><samp>&lt;apex:pageBlock&gt;<\/samp><samp>StandardSetController<\/samp><\/p>\n\n\n\n<p>\u7b2c\u4e8c\u4e2a\u6301\u6709\u4e00\u4e2a\u5177\u6709 \u5728 .\u90fd \u91cd\u590d\u7ec4\u4ef6\u4e2d\u7684\u5217\u4f7f\u7528\u5bf9\u5e10\u6237\u5b57\u6bb5\u7684\u52a8\u6001\u5f15\u7528\uff0c\u4ee5\u663e\u793a\u7528\u6237\u7684 \u81ea\u5b9a\u4e49\u9009\u62e9\u7684\u5b57\u6bb5\u3002<samp>&lt;apex:pageBlock&gt;<\/samp><samp>&lt;apex:pageBlockTable&gt;<\/samp><samp>&lt;apex:repeat&gt;<\/samp><samp>{!acct[f]}<\/samp>\u8fd9\u4e2a\u8ff7\u4f60\u5e94\u7528\u7a0b\u5e8f\u7684\u6700\u540e\u4e00\u90e8\u5206\u662f\u81ea\u5b9a\u4e49\u8868\u5355\u3002\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a \u7684\u9875\u9762\u3002\u60a8\u53ef\u80fd\u6709 \u5728\u521b\u5efa\u63a7\u5236\u5668\u6269\u5c55\u65f6\uff0c\u5df2\u521b\u5efa\u6b64\u9875\u9762\u3002\u7c98\u8d34\u5230 \u4ee5\u540e\uff1a<\/p>\n\n\n\n<p><samp>CustomizeDynamicList<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Account\" recordSetVar=\"ignored\"\n           extensions=\"DynamicCustomizableListHandler\"&gt;\n    &lt;br\/&gt;\n    &lt;apex:form &gt;\n\n    &lt;apex:pageBlock title=\"Select Fields to Display\" id=\"selectionBlock\"&gt;\n        &lt;apex:pageMessages \/&gt;\n        &lt;apex:panelGrid columns=\"3\"&gt;\n            &lt;apex:selectList id=\"unselected_list\" required=\"false\" \n                value=\"{!selected}\" multiselect=\"true\" size=\"20\" style=\"width:250px\"&gt;\n                &lt;apex:selectOptions value=\"{!unSelectedOptions}\"\/&gt;\n            &lt;\/apex:selectList&gt;\n            &lt;apex:panelGroup &gt;\n                &lt;apex:commandButton value=\"&gt;&gt;\" \n                    action=\"{!doAdd}\" rerender=\"selectionBlock\"\/&gt;\n                &lt;br\/&gt;\n                &lt;apex:commandButton value=\"&lt;&lt;\" \n                    action=\"{!doRemove}\" rerender=\"selectionBlock\"\/&gt;\n            &lt;\/apex:panelGroup&gt;\n            &lt;apex:selectList id=\"selected_list\" required=\"false\" \n                value=\"{!unselected}\" multiselect=\"true\" size=\"20\" style=\"width:250px\"&gt;\n                &lt;apex:selectOptions value=\"{!selectedOptions}\"\/&gt;\n            &lt;\/apex:selectList&gt;\n        &lt;\/apex:panelGrid&gt;\n        &lt;em&gt;Note: Fields marked &lt;strong&gt;*&lt;\/strong&gt; are inaccessible to your account&lt;\/em&gt;\n    &lt;\/apex:pageBlock&gt;\n    \n    &lt;br\/&gt;\n    &lt;apex:commandButton value=\"Show These Fields\" action=\"{!show}\"\/&gt;\n\n    &lt;\/apex:form&gt;\n\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u8fd9 \u201c\u7b80\u5355\u9996\u9009\u9879\u201d\u9875\u9762\u663e\u793a\u4e24\u4e2a\u5217\u8868\uff0c\u7528\u6237\u4ece\u5217\u8868\u4e2d\u79fb\u52a8\u5b57\u6bb5 \u5de6\u4fa7\u7684\u53ef\u7528\u5b57\u6bb5\u5230\u8981\u663e\u793a\u5728\u53f3\u4fa7\u7684\u5b57\u6bb5\u5217\u8868\u3002 \u5355\u51fb<strong>\u201c\u663e\u793a\u8fd9\u4e9b\u5b57\u6bb5<\/strong>\u201d\u5c06\u8fd4\u56de\u5230\u5217\u8868\u672c\u8eab\u3002\u4ee5\u4e0b\u662f\u6709\u5173\u6b64\u6807\u8bb0\u7684\u4e00\u4e9b\u6ce8\u610f\u4e8b\u9879\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6b64\u9875\u9762\u4f7f\u7528\u4e0e\u5217\u8868\u89c6\u56fe\u76f8\u540c\u7684\u6807\u51c6\u63a7\u5236\u5668\uff0c\u5373\u4f7f\u6ca1\u6709 \u6b63\u5728\u663e\u793a\u5e10\u6237\u3002\u8fd9\u662f\u7ef4\u62a4\u89c6\u56fe\u72b6\u6001\u6240\u5fc5\u9700\u7684\u3002 \u5176\u4e2d\u5305\u542b\u8981\u663e\u793a\u7684\u5b57\u6bb5\u5217\u8868\u3002\u5982\u679c\u6b64\u8868\u5355\u4fdd\u5b58\u4e86 \u7528\u6237\u5bf9\u6c38\u4e45\u5185\u5bb9\uff08\u5982\u81ea\u5b9a\u4e49\u8bbe\u7f6e\uff09\u7684\u504f\u597d\uff0c \u8fd9\u6ca1\u6709\u5fc5\u8981\u3002<\/li>\n\n\n\n<li>\u7b2c\u4e00\u4e2a\u5217\u8868\u7531\u5bf9\u65b9\u6cd5\u7684\u8c03\u7528\u586b\u5145\uff0c\u5e76\u5728\u63d0\u4ea4\u8868\u5355\u65f6\u586b\u5145 \uff08\u901a\u8fc7\u4e24\u4e2a\u7ec4\u4ef6\u4e2d\u7684\u4efb\u4f55\u4e00\u4e2a\uff09\uff0c\u5728<em>\u63d0\u4ea4\u8868\u5355\u65f6\u9009\u62e9<\/em>\u7684\u5217\u8868\u4e2d\u7684\u503c\u5c06\u4fdd\u5b58\u5230\u5c5e\u6027\u4e2d\u3002\u76f8\u5e94 \u4ee3\u7801\u5904\u7406\u5176\u4ed6\u5217\u8868\u3002<samp>getUnSelectedOptions()<\/samp><samp>&lt;apex:commandButton&gt;<\/samp><samp>selected<\/samp><\/li>\n\n\n\n<li>\u8fd9\u4e9b\u8981\u79fb\u52a8\u7684\u5b57\u6bb5\u7684\u201c\u589e\u91cf\u201d\u5217\u8868\u7531 or \u65b9\u6cd5\u5904\u7406\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u54ea\u4e2a \u6309\u94ae\u3002<samp>doAdd()<\/samp><samp>doRemove()<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u5f53\u60a8\u7ec4\u88c5\u63a7\u5236\u5668\u6269\u5c55\u548c\u8fd9\u4e9b\u9875\u9762\uff0c\u5e76\u5bfc\u822a\u5230\u7ec4\u7ec7\u4e2d\u7684 \/apex\/DynamicCustomizableList&nbsp;\u65f6\uff0c \u60a8\u5c06\u770b\u5230\u7c7b\u4f3c\u4e8e\u4ee5\u4e0b\u5185\u5bb9\u7684\u5e8f\u5217\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u9ed8\u8ba4\u72b6\u6001\u4e0b\u67e5\u770b\u53ef\u81ea\u5b9a\u4e49\u5217\u8868\uff0c\u4ec5\u5305\u542b\u5e10\u6237\u540d\u79f0 \u663e\u793a\u5b57\u6bb5\u3002<img fetchpriority=\"high\" decoding=\"async\" width=\"668\" height=\"267\" class=\"wp-image-4081\" style=\"\" src=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna2.png\" alt=\"\" srcset=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna2.png 668w, http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna2-300x120.png 300w\" sizes=\"(max-width: 668px) 100vw, 668px\" \/>\u5355\u51fb<strong>\u81ea\u5b9a\u4e49\u5217\u8868<\/strong>\u3002<\/li>\n\n\n\n<li>\u663e\u793a\u663e\u793a\u9996\u9009\u9879\u5c4f\u5e55\u3002<img decoding=\"async\" width=\"593\" height=\"517\" class=\"wp-image-4082\" style=\"\" src=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna3.png\" alt=\"\" srcset=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna3.png 593w, http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna3-300x262.png 300w\" sizes=\"(max-width: 593px) 100vw, 593px\" \/>\u79fb\u52a8 \u67d0\u4e9b\u5b57\u6bb5\u6dfb\u52a0\u5230\u53f3\u4fa7\u7684\u5217\u8868\u4e2d\uff0c\u7136\u540e\u5355\u51fb<strong>\u201c\u663e\u793a\u8fd9\u4e9b\u5b57\u6bb5\u201d \u5b57\u6bb5<\/strong>\u3002<\/li>\n\n\n\n<li>\u5c06\u663e\u793a\u81ea\u5b9a\u4e49\u5217\u8868\u89c6\u56fe\u3002<img loading=\"lazy\" decoding=\"async\" width=\"666\" height=\"264\" class=\"wp-image-4083\" style=\"\" src=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna4.png\" alt=\"\" srcset=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna4.png 666w, http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna4-300x119.png 300w\" sizes=\"(max-width: 666px) 100vw, 666px\" \/><\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">\u5c06\u52a8\u6001\u5f15\u7528\u4e0e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u4e00\u8d77\u4f7f\u7528\uff0c\u4ee5\u53ca \u5305<\/h1>\n\n\n\n<p>\u5305\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001 Visualforce \u7ed1\u5b9a\u4ec5\u5217\u51fa \u7528\u6237\u53ef\u4ee5\u8bbf\u95ee\u7684\u5b57\u6bb5\u3002\u5728\u5f00\u53d1\u6258\u7ba1 \u8f6f\u4ef6\u5305\u4e2d\u5305\u542b Visualforce \u9875\u9762\uff0c\u8be5\u9875\u9762\u5177\u6709 \u663e\u793a\u5bf9\u8c61\u4e0a\u7684\u5b57\u6bb5\u3002\u7531\u4e8e\u5305\u5f00\u53d1\u4eba\u5458\u4e0d\u77e5\u9053\u54ea\u4e9b\u5b57\u6bb5 \u8ba2\u9605\u8005\u53ef\u4ee5\u8bbf\u95ee\uff0c\u4ed6\u4eec\u53ef\u4ee5\u5b9a\u4e49\u4e00\u4e2a\u52a8\u6001\u9875\u9762\uff0c\u8be5\u9875\u9762\u4e3a\u6bcf\u4e2a\u9875\u9762\u5448\u73b0\u4e0d\u540c\u7684\u5185\u5bb9 \u8ba2\u6237\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u793a\u4f8b\u4f7f\u7528\u4e00\u4e2a\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u4e0e\u4f7f\u7528 Visualforce \u9875\u9762\u7684\u9875\u9762\u5e03\u5c40\u6253\u5305\u5728\u4e00\u8d77\uff0c\u4ee5\u6f14\u793a \u4e0d\u540c\u7684\u8ba2\u9605\u7528\u6237\u5982\u4f55\u67e5\u770b\u540c\u4e00\u9875\u9762\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f7f\u7528\u4ee5\u4e0b\u5b57\u6bb5\u548c\u6570\u636e\u7c7b\u578b\u521b\u5efa\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff08API \u540d\u79f0\uff09\uff1a<kbd>Book<\/kbd><samp>Book__c<\/samp>\n<ul class=\"wp-block-list\">\n<li>\u6807\u9898\uff1a Text\uff08255\uff09<\/li>\n\n\n\n<li>\u4f5c\u8005\uff1a \u6587\u672c\uff08255\uff09<\/li>\n\n\n\n<li>ISBN\uff1a&nbsp;\u6587\u672c\uff0820\uff09<\/li>\n\n\n\n<li>\u4ef7\u683c\uff1a \u8d27\u5e01\uff085\uff0c 2\uff09<\/li>\n\n\n\n<li>\u51fa\u7248\u5546\uff1a Text\uff08255\uff09<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u7f16\u8f91\u201c\u4e66\u7c4d\u201d\u9875\u9762\u5e03\u5c40\uff0c\u4f7f\u5176\u9996\u5148\u663e\u793a\u81ea\u5b9a\u4e49\u5b57\u6bb5\uff0c\u5e76\u5220\u9664\u4e00\u4e9b\u81ea\u5b9a\u4e49\u5b57\u6bb5 \u6807\u51c6\u5b57\u6bb5\uff0c\u4f8b\u5982\u201c\u521b\u5efa\u8005\u201d\u3001\u201c\u4e0a\u6b21\u4fee\u6539\u8005\u201d\u3001\u201c\u6240\u6709\u8005\u201d\u548c\u201c\u540d\u79f0\u201d\u3002<\/li>\n\n\n\n<li>\u521b\u5efa\u65b0\u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\u9009\u9879\u5361\u3002\u5c06\u5bf9\u8c61\u8bbe\u7f6e\u4e3a\u201cBook\u201d\uff0c\u5c06\u9009\u9879\u5361\u6837\u5f0f\u8bbe\u7f6e\u4e3a \u4e66\u3002<\/li>\n\n\n\n<li>\u5207\u6362\u5230 Book \u9009\u9879\u5361\u5e76\u521b\u5efa\u51e0\u4e2a Book \u5bf9\u8c61\u3002\u503c\u65e0\u5173\u7d27\u8981\uff0c\u4f46 \u60a8\u786e\u5b9e\u9700\u8981\u4e00\u4e9b\u8bb0\u5f55\u624d\u80fd\u5b9e\u9645\u5b58\u5728\u3002<\/li>\n\n\n\n<li>\u521b\u5efa\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8c03\u7528\u7684\u63a7\u5236\u5668\u6269\u5c55 \u6cd5\u5178\uff1a<kbd>BookExtension<\/kbd><code>public with sharing class BookExtension { private ApexPages.StandardController stdController; public BookExtension (ApexPages.StandardController ct) { this.stdController = ct; if( ! Test.isRunningTest()) { \/\/ You can't call addFields() in a test context, it's a bug stdController.addFields(accessibleFields); } } public List&lt;String&gt; accessibleFields { get { if (accessibleFields == null) { \/\/ Get a list (map) of all fields on the object Map&lt;String, Schema.SobjectField&gt; fields = Schema.SobjectType.Book__c.fields.getMap(); \/\/ Save only the fields accessible by the current user Set&lt;String&gt; availableFieldsSet = new Set&lt;String&gt;(); for (String s : fields.keySet()) { if (fields.get(s).getDescribe().isAccessible() \/\/ Comment out next line to show standard\/system fields &amp;&amp; fields.get(s).getDescribe().isCustom() ){ availableFieldsSet.add(s.toLowerCase()); if(Test.isRunningTest()) System.debug('Field: ' + s); } } \/\/ Convert set to list, save to property accessibleFields = new List&lt;String&gt;(availableFieldsSet); } return accessibleFields; } private set; } }<\/code><\/li>\n\n\n\n<li>\u521b\u5efa Visualforce \u9875\u9762 \u4f7f\u7528\u63a7\u5236\u5668\u7684\u8c03\u7528 \u6269\u5c55\u4ee5\u663e\u793a Book \u7684\u503c \u5bf9\u8c61\uff1a<kbd>booksView<\/kbd><code>&lt;apex:page standardController=\"Book__c\" extensions=\"BookExtension\" &gt; &lt;apex:pageBlock title=\"{!Book__c.Name}\"&gt; &lt;apex:pageBlockSection &gt; &lt;apex:repeat value=\"{!accessibleFields}\" var=\"f\"&gt; &lt;apex:pageBlockSectionItem &gt; &lt;apex:outputLabel value=\"{!$ObjectType['Book__c'].Fields[f].Label}\"\/&gt; &lt;apex:outputText value=\"{!Book__c[f]}\"\/&gt; &lt;\/apex:pageBlockSectionItem&gt; &lt;\/apex:repeat&gt; &lt;\/apex:pageBlockSection&gt; &lt;\/apex:pageBlock&gt; &lt;\/apex:page&gt;<\/code><\/li>\n\n\n\n<li>\u7531\u4e8e\u63a7\u5236\u5668\u6269\u5c55\u5c06\u88ab\u6253\u5305\uff0c\u56e0\u6b64\u9700\u8981\u4e3a Apex \u7c7b\u521b\u5efa\u6d4b\u8bd5\u3002 \u521b\u5efa\u4e00\u4e2a\u4f7f\u7528\u6b64\u57fa\u672c\u4ee3\u7801\u8c03\u7528\u7684 Apex \u7c7b\uff0c\u4ee5\u83b7\u53d6 \u5f00\u59cb\uff1a<kbd>BookExtensionTest<\/kbd><code>@isTest public class BookExtensionTest { public static testMethod void testBookExtension() { \/\/ Create a book to test with Book__c book = new Book__c(); book.Author__c = 'Harry Lime'; insert book; Test.startTest(); \/\/ Add the page to the test context PageReference testPage = Page.booksView; testPage.getParameters().put('id', String.valueOf(book.Id)); Test.setCurrentPage(testPage); \/\/ Create a controller for the book ApexPages.StandardController sc = new ApexPages.StandardController(book); \/\/ Real start of testing BookExtension \/\/ BookExtension has only two methods; to get 100% code coverage, we need \/\/ to call the constructor and get the accessibleFields property \/\/ Create an extension with the controller BookExtension bookExt = new BookExtension(sc); \/\/ Get the list of accessible fields from the extension Set&lt;String> fields = new Set&lt;String>(bookExt.accessibleFields); \/\/ Test that accessibleFields is not empty System.assert( ! fields.isEmpty()); \/\/ Test that accessibleFields includes Author__c \/\/ This is a bad test; you can't know that subscriber won't disable System.assert(fields.contains('Author__c'.toLowerCase()), 'Expected accessibleFields to include Author__c'); Test.stopTest(); } }<\/code>\u6ce8\u610f\u6b64 Apex \u6d4b\u8bd5\u53ea\u662f\u4e00\u4e2a\u793a\u4f8b\u3002\u4ec0\u4e48\u65f6\u5019 \u521b\u5efa\u5305\u542b\u5728\u5305\u4e2d\u7684\u6d4b\u8bd5\uff0c\u9a8c\u8bc1\u6240\u6709\u884c\u4e3a\uff0c\u5305\u62ec \u9633\u6027\u548c\u9634\u6027\u7ed3\u679c\u3002<\/li>\n\n\n\n<li>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a \u7684\u5305\uff0c\u5e76\u6dfb\u52a0\u81ea\u5b9a\u4e49 \u5bf9\u8c61\uff0c\u5373 Visualforce \u9875\u9762\uff0c \u548c Apex \u7c7b\u3002\u5176\u4ed6 \u5f15\u7528\u7684\u5143\u7d20\uff08\u4f8b\u5982\u9875\u9762\u7684\u63a7\u5236\u5668\u6269\u5c55 Apex \u7c7b\uff09\u662f \u81ea\u52a8\u5305\u542b\u3002<kbd>bookBundle<\/kbd><samp>bookExtensionTest<\/samp><\/li>\n\n\n\n<li>\u5c06\u8f6f\u4ef6\u5305\u5b89\u88c5\u5230 \u8ba2\u9605\u8005\u7ec4\u7ec7\u3002<samp>bookBundle<\/samp><\/li>\n\n\n\n<li>\u5b89\u88c5\u8f6f\u4ef6\u5305\u540e\uff0c\u4ece\u4e66\u7c4d\u7684\u5bf9\u8c61\u7ba1\u7406\u8bbe\u7f6e\u4e2d\uff0c\u6dfb\u52a0 \u540d\u4e3a&nbsp;Rating&nbsp;\u7684\u65b0\u5b57\u6bb5\u3002<\/li>\n\n\n\n<li>\u521b\u5efa\u65b0\u7684 Book \u5bf9\u8c61\u3002\u540c\u6837\uff0c\u8bb0\u5f55\u7684\u503c\u5b9e\u9645\u4e0a\u5e76\u4e0d \u4e8b\u3002<\/li>\n\n\n\n<li>\u5bfc\u822a\u5230\u5e26\u6709 \u9644\u52a0\u5230 URL \u7684\u5305\u547d\u540d\u7a7a\u95f4\u548c\u4e66\u7c4d ID\u3002\u4f8b\u5982\uff0cif \u662f\u547d\u540d\u7a7a\u95f4\uff0ca00D0000008e7t4 \u662f\u4e66\u7c4d ID\uff0c \u751f\u6210\u7684 URL \u5e94\u4e3a .<samp>booksView<\/samp><var>GBOOK<\/var><samp>https:\/\/Salesforce_instance\/apex\/<var>GBOOK<\/var>__booksView?id=a00D0000008e7t4<\/samp><\/li>\n<\/ol>\n\n\n\n<p>\u4ece\u8ba2\u9605\u7ec4\u7ec7\u67e5\u770b\u9875\u9762\u65f6\uff0c\u5b83\u5e94\u5305\u542b\u6240\u6709 \u6253\u5305\u7684\u201c\u56fe\u4e66\u201d\u5b57\u6bb5\uff0c\u4ee5\u53ca\u65b0\u521b\u5efa\u7684\u201c\u8bc4\u7ea7\u201d\u5b57\u6bb5\u3002\u4e0d\u540c\u7684\u7528\u6237\u548c \u7ec4\u7ec7\u53ef\u4ee5\u7ee7\u7eed\u6dfb\u52a0\u4ed6\u4eec\u60f3\u8981\u7684\u4efb\u4f55\u5b57\u6bb5\uff0c\u52a8\u6001 Visualforce \u9875\u9762\u5c06\u8fdb\u884c\u8c03\u6574\u548c \u6839\u636e\u9700\u8981\u663e\u793a\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u5f15\u7528 Apex \u5730\u56fe\u548c\u5217\u8868<\/h1>\n\n\n\n<p>\u4f7f\u7528\u52a8\u6001\u7684 Visualforce \u9875\u9762 \u7ed1\u5b9a\u53ef\u4ee5\u5728\u5176\u6807\u8bb0\u4e2d\u5f15\u7528 Apex \u548c\u6570\u636e\u7c7b\u578b\u3002<samp>Map<\/samp><samp>List<\/samp>\u4f8b\u5982\uff0c\u5982\u679c Apex \u5b9a\u4e49\u4e3a \u9075\u5faa\uff1a<\/p>\n\n\n\n<p><samp>List<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;String&gt; people {\n    get { \n        return new List&lt;String&gt;{'Winston', 'Julia', 'Brien'};\n    }\n    set;\n}\n\npublic List&lt;Integer&gt; iter {\n    get { \n        return new List&lt;Integer&gt;{0, 1, 2};\n    }\n    set;\n}<\/code><\/pre>\n\n\n\n<p>\u5b83 \u53ef\u4ee5\u5728 Visualforce \u4e2d\u8bbf\u95ee \u9875\u9762\u559c\u6b22 \u8fd9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:repeat value=\"{!iter}\" var=\"pos\"&gt;\n    &lt;apex:outputText value=\"{!people&#91;pos]}\" \/&gt;&lt;br\/&gt;\n&lt;\/apex:repeat&gt;<\/code><\/pre>\n\n\n\n<p>\u540c\u6837\uff0c\u5982\u679c\u60a8\u6709\u4ee5\u4e0b Apex \uff1a<\/p>\n\n\n\n<p><samp>Map<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public Map&lt;String,String&gt; directors {\n    get {\n        return new Map&lt;String, String&gt; {\n            'Kieslowski' =&gt; 'Poland', \n            'del Toro' =&gt; 'Mexico', \n            'Gondry' =&gt; 'France'\n        };\n    }\n    set;\n}<\/code><\/pre>\n\n\n\n<p>\u4f60 Visualforce \u9875\u9762\u53ef\u4ee5\u663e\u793a \u50cf\u8fd9\u6837\u7684\u503c \u8fd9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:repeat value=\"{!directors}\" var=\"dirKey\"&gt;\n        &lt;apex:outputText value=\"{!dirKey}\" \/&gt; -- \n        &lt;apex:outputText value=\"{!directors&#91;dirKey]}\" \/&gt;&lt;br\/&gt;\n&lt;\/apex:repeat&gt;<\/code><\/pre>\n\n\n\n<p id=\"VFDynamicMapReferenceWithInputText\"><a><\/a>\u4f7f\u7528\u5bf9\u6807\u8bb0\u4e2d\u7684\u5217\u8868\u548c\u6620\u5c04\u7684\u52a8\u6001\u5f15\u7528\u6765\u521b\u5efa\u8868\u5355 \u4f7f\u7528\u4e0d\u5728\u7ec4\u7ec7\u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\u4e2d\u7684\u6570\u636e\u3002\u4f7f\u7528 \u5355\u4e2a\u6620\u5c04\u53ef\u80fd\u6bd4\u5728 Apex \u4e2d\u521b\u5efa\u4e00\u7cfb\u5217\u5b9e\u4f8b\u53d8\u91cf\u8981\u7b80\u5355\u5f97\u591a \u63a7\u5236\u5668\u6216\u4ec5\u4e3a\u8868\u5355\u6570\u636e\u521b\u5efa\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<samp>&lt;apex:inputText&gt;<\/samp>\u4e0b\u9762\u662f\u4e00\u4e2a\u4f7f\u7528\u5730\u56fe\u7684 Visualforce \u9875\u9762 \u4fdd\u5b58\u8868\u5355\u6570\u636e\u4ee5\u4f9b\u81ea\u5b9a\u4e49\u5904\u7406 \u63a7\u5236\u5668\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page controller=\"ListsMapsController\"&gt;\n    &lt;apex:outputPanel id=\"box\" layout=\"block\"&gt;\n        &lt;apex:pageMessages\/&gt;\n        &lt;apex:form &gt;\n\n            &lt;apex:repeat value=\"{!inputFields}\" var=\"fieldKey\"&gt;\n                &lt;apex:outputText value=\"{!fieldKey}\"\/&gt;: \n                &lt;apex:inputText value=\"{!inputFields&#91;fieldKey]}\"\/&gt;&lt;br\/&gt;\n            &lt;\/apex:repeat&gt;\n\n            &lt;apex:commandButton action=\"{!submitFieldData}\" \n                value=\"Submit\" id=\"button\" rerender=\"box\"\/&gt;\n\n        &lt;\/apex:form&gt;\n    &lt;\/apex:outputPanel&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6709\u4e00\u4e2a\u7b80\u5355\u7684\u63a7\u5236\u5668\uff0c \u9002\u7528\u4e8e\u4ee5\u4e0b\u5f62\u5f0f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ListsMapsController {\n\n    public Map&lt;String, String&gt; inputFields { get; set; }\n\n    public ListsMapsController() {\n        inputFields = new Map&lt;String, String&gt; { \n            'firstName' =&gt; 'Jonny', 'lastName' =&gt; 'Appleseed', 'age' =&gt; '42' };\n    }\n\n    public PageReference submitFieldData() {\n        doSomethingInterestingWithInput();\n        return null;\n    }\n    \n    public void doSomethingInterestingWithInput() {\n        inputFields.put('age', (Integer.valueOf(inputFields.get('age')) + 10).format());\n    }\n}<\/code><\/pre>\n\n\n\n<p>A \u53ef\u4ee5\u5305\u542b\u5bf9 sObjects \u6216 sObject \u5b57\u6bb5\u3002\u8981\u66f4\u65b0\u8fd9\u4e9b\u9879\u76ee\uff0c\u8bf7\u5728\u8f93\u5165\u5b57\u6bb5\u4e2d\u5f15\u7528\u5b57\u6bb5\u540d\u79f0\uff1a<\/p>\n\n\n\n<p><samp>Map<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public with sharing class MapAccCont {\n\n    Map&lt;Integer, Account&gt; mapToAccount = new Map&lt;Integer, Account&gt;();\n\n    public MapAccCont() {\n        Integer i = 0;\n        for (Account a : &#91;SELECT Id, Name FROM Account LIMIT 10]) {\n            mapToAccount.put(i, a);\n            i++;\n        }\n    }\n\n    public Map&lt;Integer, Account&gt; getMapToAccount() {\n        return mapToAccount;\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page controller=\"MapAccCont\"&gt;\n    &lt;apex:form&gt;\n        &lt;apex:repeat value=\"{!mapToAccount}\" var=\"accNum\"&gt;\n            &lt;apex:inputField value=\"{!mapToAccount&#91;accNum].Name}\" \/&gt;\n        &lt;\/apex:repeat&gt;\n    &lt;\/apex:form&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u672a\u89e3\u6790\u7684\u52a8\u6001\u5f15\u7528<\/h2>\n\n\n\n<p>\u8bf7\u8bb0\u4f4f\uff0c\u5982\u679c\u52a8\u6001\u5f15\u7528\uff0c\u5219\u5728\u8fd0\u884c\u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u4ee5\u4e0b\u95ee\u9898 \u65e0\u6cd5\u89e3\u51b3\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u6ca1\u6709\u6620\u5c04\u5230\u7279\u5b9a\u952e\u7684\u503c\uff0c\u5219 Visualforce \u9875\u9762 \u8fd4\u56de\u9519\u8bef\u6d88\u606f\u3002\u4f8b\u5982\uff0c\u6709\u4e86\u8fd9\u4e2a \u63a7\u5236\u5668\uff1a<code>public class ToolController { public Map&lt;String, String&gt; toolMap { get; set; } public String myKey { get; set; } public ToolController() { Map&lt;String, String&gt; toolsMap = new Map&lt;String, String&gt;(); toolsMap.put('Stapler', 'Keeps things organized'); } }<\/code>\u8fd9 \u9875\u9762\u5728\u8fd0\u884c\u65f6\u5bfc\u81f4\u9519\u8bef \u65f6\u95f4\uff1a<code>&lt;apex:page controller=\"ToolController\"&gt; &lt;!-- This renders an error on the page --&gt; &lt;apex:outputText value=\"{!toolMap['Paperclip']}\" \/&gt; &lt;\/apex:page&gt;<\/code><\/li>\n\n\n\n<li>\u5982\u679c\u952e\u4e3a \uff0c\u5219 Visualforce \u9875\u9762 \u5448\u73b0\u4e00\u4e2a\u7a7a\u5b57\u7b26\u4e32\u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u4e0e\u4e0a\u8ff0\u76f8\u540c\u7684\u63a7\u5236\u5668\uff0c \u6b64\u9875\u9762\u663e\u793a\u4e00\u4e2a\u7a7a\u7684 \u7a7a\u95f4\uff1a<samp>null<\/samp><code>&lt;apex:page controller=\"ToolController\"&gt; &lt;!-- This renders a blank space --&gt; &lt;apex:outputText value=\"{!toolMap[null]}\" \/&gt; &lt;\/apex:page&gt;<\/code><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528\u5b57\u6bb5\u96c6<\/h1>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u7ed1\u5b9a\u5728 Visualforce \u4e0a\u663e\u793a<dfn>\u5b57\u6bb5\u96c6<\/dfn>&nbsp;\u9875\u9762\u3002\u5b57\u6bb5\u96c6\u662f\u4e00\u7ec4\u5b57\u6bb5\u3002\u4f8b\u5982\uff0c\u60a8\u53ef\u4ee5\u8bbe\u7f6e\u4e00\u4e2a\u5b57\u6bb5 \u5305\u542b\u63cf\u8ff0\u7528\u6237\u540d\u5b57\u3001\u4e2d\u95f4\u540d\u3001\u59d3\u6c0f\u548c\u4e1a\u52a1\u7684\u5b57\u6bb5 \u6807\u9898\u3002\u5982\u679c\u5c06\u9875\u9762\u6dfb\u52a0\u5230\u6258\u7ba1\u5305\u4e2d\uff0c\u7ba1\u7406\u5458\u53ef\u4ee5\u6dfb\u52a0\u3001\u5220\u9664\u6216 \u5bf9\u5b57\u6bb5\u96c6\u4e2d\u7684\u5b57\u6bb5\u91cd\u65b0\u6392\u5e8f\uff0c\u4ee5\u4fee\u6539 Visualforce \u9875\u9762\u4e0a\u663e\u793a\u7684\u5b57\u6bb5 \u65e0\u9700\u4fee\u6539\u4efb\u4f55\u4ee3\u7801\u3002\u5b57\u6bb5\u96c6\u53ef\u7528\u4e8e API \u4e0a\u7684 Visualforce \u9875\u9762 \u7248\u672c 21.0 \u6216\u66f4\u9ad8\u7248\u672c\u3002\u60a8\u6700\u591a\u53ef\u4ee5\u62e5\u6709<a><\/a>50\u7530 \u5728\u5355\u4e2a\u9875\u9762\u4e0a\u5f15\u7528\u7684\u96c6\u3002\u4e00\u4e2a sObject \u6700\u591a\u53ef\u4ee5\u6709<a><\/a>2,000\u5b57\u6bb5\u96c6\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6bcf\u4e2a\u5b57\u6bb5\u96c6\u6700\u591a\u53ef\u4ee5\u6709<a><\/a>25\u5b57\u6bb5\u901a\u8fc7 \u67e5\u627e\u5173\u7cfb\u3002\u5b57\u6bb5\u53ea\u80fd\u8de8\u8d8a\u8ddd\u79bb\u5b9e\u4f53\u4e00\u4e2a\u7ea7\u522b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528 Visualforce \u5904\u7406\u5b57\u6bb5\u96c6<\/h2>\n\n\n\n<p>\u5b57\u6bb5\u96c6\u53ef\u4ee5\u901a\u8fc7\u7ec4\u5408\u5728 Visualforce \u4e2d\u76f4\u63a5\u5f15\u7528 \u5168\u5c40\u53d8\u91cf\uff0c\u5176\u4e2d \u5173\u952e\u8bcd\u3002\u4f8b\u5982\uff0c\u5982\u679c\u60a8\u7684 Contact \u5bf9\u8c61\u5177\u6709\u4e00\u4e2a\u540d\u4e3a&nbsp;properNames&nbsp;\u7684\u5b57\u6bb5\u96c6\uff0c\u8be5\u5b57\u6bb5\u96c6\u663e\u793a \u4e09\u4e2a\u5b57\u6bb5\uff0c\u60a8\u7684 Visualforce \u9875\u9762\u53ef\u4ee5\u901a\u8fc7 \u4ee5\u540e \u8fed \u4ee3\uff1a<\/p>\n\n\n\n<p><samp>$ObjectType<\/samp><samp>FieldSets<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Contact\"&gt;\n    &lt;apex:repeat value=\"{!$ObjectType.Contact.FieldSets.properNames}\" var=\"f\"&gt; \n        &lt;apex:outputText value=\"{!Contact&#91;f]}\" \/&gt;&lt;br\/&gt;\n    &lt;\/apex:repeat&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u60a8\u8fd8\u53ef\u4ee5\u9009\u62e9\u5448\u73b0\u5176\u4ed6\u4fe1\u606f\uff0c\u4f8b\u5982\u5b57\u6bb5\u6807\u7b7e\u548c\u6570\u636e \u7c7b\u578b\uff0c\u901a\u8fc7\u5b57\u6bb5\u4e2d\u5b57\u6bb5\u7684\u4ee5\u4e0b\u7279\u6b8a\u5c5e\u6027 \u8bbe\u7f6e\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5c5e\u6027\u540d\u79f0<\/th><th>\u63cf\u8ff0<\/th><\/tr><\/thead><tbody><tr><td><samp>DBRequired<\/samp><\/td><td>\u6307\u793a\u8be5\u5b57\u6bb5\u662f\u5426\u4e3a \u5bf9\u8c61<\/td><\/tr><tr><td><samp>FieldPath<\/samp><\/td><td>\u5217\u51fa\u5b57\u6bb5\u7684\u8de8\u533a\u4fe1\u606f<\/td><\/tr><tr><td><samp>Label<\/samp><\/td><td>\u5b57\u6bb5\u7684 UI \u6807\u7b7e<\/td><\/tr><tr><td><samp>Required<\/samp><\/td><td>\u6307\u793a\u5b57\u6bb5\u4e2d\u662f\u5426\u4e3a\u5fc5\u586b\u5b57\u6bb5 \u8bbe\u7f6e<\/td><\/tr><tr><td><samp>Type<\/samp><\/td><td>\u5b57\u6bb5\u7684\u6570\u636e\u7c7b\u578b<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u4f8b\u5982\uff0c\u60a8\u53ef\u4ee5\u8bbf\u95ee&nbsp;properNames&nbsp;\u4e2d\u5b57\u6bb5\u7684\u6807\u7b7e\u548c\u6570\u636e\u7c7b\u578b\uff0c\u4f8b\u5982 \u8fd9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Contact\"&gt;\n    &lt;apex:pageBlock title=\"Fields in Proper Names\"&gt;\n        &lt;apex:pageBlockTable value=\"{!$ObjectType.Contact.FieldSets.properNames}\" var=\"f\"&gt;\n            &lt;apex:column value=\"{!f}\"&gt;\n                &lt;apex:facet name=\"header\"&gt;Name&lt;\/apex:facet&gt;\n            &lt;\/apex:column&gt; \n            &lt;apex:column value=\"{!f.Label}\"&gt;\n                &lt;apex:facet name=\"header\"&gt;Label&lt;\/apex:facet&gt;\n            &lt;\/apex:column&gt; \n            &lt;apex:column value=\"{!f.Type}\" &gt;\n                &lt;apex:facet name=\"header\"&gt;Data Type&lt;\/apex:facet&gt;\n            &lt;\/apex:column&gt; \n        &lt;\/apex:pageBlockTable&gt; \n    &lt;\/apex:pageBlock&gt; \n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u5982\u679c\u5c06\u6b64 Visualforce \u9875\u9762\u6dfb\u52a0\u5230\u6258\u7ba1\u8f6f\u4ef6\u5305\u5e76\u5206\u53d1\uff0c\u5219\u8ba2\u9605\u8005 \u53ef\u4ee5\u7f16\u8f91&nbsp;properNames&nbsp;\u5b57\u6bb5\u96c6\u3002\u751f\u6210\u903b\u8f91 Visualforce \u9875\u9762\u4fdd\u6301\u4e0d\u53d8\uff0c\u4f46\u6f14\u793a\u6587\u7a3f\u56e0\u6bcf\u4e2a\u9875\u9762\u800c\u5f02 \u8ba2\u9605\u8005\u7684\u5b9e\u73b0\u3002\u82e5\u8981\u5f15\u7528\u6258\u7ba1\u5305\u4e2d\u7684\u5b57\u6bb5\u96c6\uff0c \u60a8\u5fc5\u987b\u5728\u5b57\u6bb5\u96c6\u524d\u9762\u52a0\u4e0a\u7ec4\u7ec7\u7684\u547d\u540d\u7a7a\u95f4\u3002\u4f7f\u7528 \u6807\u8bb0\uff0c\u5982\u679c&nbsp;properNames&nbsp;\u6765\u81ea\u4e00\u4e2a\u540d\u4e3a Spectre\uff0c\u5b57\u6bb5\u96c6\u7684\u5f15\u7528\u65b9\u5f0f\u5982\u4e0b \u8fd9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{!$ObjectType.Contact.FieldSets.Spectre__properNames}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528 Apex \u5904\u7406\u5b57\u6bb5\u96c6<\/h2>\n\n\n\n<p>\u5f53\u60a8\u7684 Visualforce \u9875\u9762\u4f7f\u7528 \u6807\u51c6\u63a7\u5236\u5668\u3002\u4f7f\u7528\u81ea\u5b9a\u4e49\u63a7\u5236\u5668\u65f6\uff0c\u9700\u8981\u6dfb\u52a0\u6240\u9700\u7684 \u5b57\u6bb5\u6dfb\u52a0\u5230\u9875\u9762\u7684 SOQL \u67e5\u8be2\u4e2d\u3002Apex \u63d0\u4f9b\u4e86\u4e24\u4e2a Schema \u5bf9\u8c61\uff0c\u5141\u8bb8 \u60a8\u53ef\u4ee5\u53d1\u73b0\u5b57\u6bb5\u96c6\u53ca\u5176\u5305\u542b\u7684\u5b57\u6bb5\uff0c\u4ee5\u53ca .\u6709\u5173\u7684\u4fe1\u606f \u8fd9\u4e24\u4e2a\u7cfb\u7edf\u7c7b\uff0c\u8bf7\u53c2\u9605\u00a0Lightning \u5e73\u53f0 Apex \u4ee3\u7801\u4e2d\u7684\u201cFieldSet \u7c7b\u201d \u5f00\u53d1\u4eba\u5458\u6307\u5357\u3002<samp>Schema.FieldSetSchema.FieldSetMember<\/samp><\/p>\n\n\n\n<p><strong>\u793a\u4f8b\uff1a\u5728 Visualforce \u4e0a\u663e\u793a\u5b57\u6bb5\u96c6 \u9875<\/strong>\u6b64\u793a\u4f8b\u4f7f\u7528\u548c\u65b9\u6cd5\u52a8\u6001\u83b7\u53d6 \u4e3a Merchandise \u81ea\u5b9a\u4e49\u5bf9\u8c61\u8bbe\u7f6e\u7684 Dimensions \u5b57\u6bb5\u4e2d\u7684\u6240\u6709\u5b57\u6bb5\u3002\u8fd9 \u7136\u540e\uff0c\u4f7f\u7528\u5b57\u6bb5\u5217\u8868\u6765\u6784\u9020 SOQL \u67e5\u8be2\uff0c\u4ee5\u786e\u4fdd\u8fd9\u4e9b\u5b57\u6bb5 \u53ef\u4f9b\u5c55\u793a\u3002Visualforce \u9875\u9762\u4f7f\u7528 \u4f5c\u4e3a\u5176\u7684\u7c7b \u63a7\u5236\u5668\u3002<\/p>\n\n\n\n<p><samp>Schema.FieldSet<\/samp><samp>Schema.FieldSetMember<\/samp><samp>MerchandiseDetails<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class MerchandiseDetails {\n\n    public Merchandise__c merch { get; set; }\n    \n    public MerchandiseDetails() {\n        this.merch = getMerchandise();\n    }\n\n    public List&lt;Schema.FieldSetMember&gt; getFields() {\n        return SObjectType.Merchandise__c.FieldSets.Dimensions.getFields();\n    }\n\n    private Merchandise__c getMerchandise() {\n        String query = 'SELECT ';\n        for(Schema.FieldSetMember f : this.getFields()) {\n            query += f.getFieldPath() + ', ';\n        }\n        query += 'Id, Name FROM Merchandise__c LIMIT 1';\n        return Database.query(query);\n    }\n}<\/code><\/pre>\n\n\n\n<p>Visualforce \u9875\u9762\u4f7f\u7528 \u4e0a\u8ff0\u63a7\u5236\u5668\u662f \u7b80\u5355\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page controller=\"MerchandiseDetails\"&gt;\n    &lt;apex:form &gt;\n\n      &lt;apex:pageBlock title=\"Product Details\"&gt;\n          &lt;apex:pageBlockSection title=\"Product\"&gt;\n              &lt;apex:inputField value=\"{!merch.Name}\"\/&gt;\n          &lt;\/apex:pageBlockSection&gt;\n      \n          &lt;apex:pageBlockSection title=\"Dimensions\"&gt;\n              &lt;apex:repeat value=\"{!fields}\" var=\"f\"&gt;\n                  &lt;apex:inputField value=\"{!merch&#91;f.fieldPath]}\" \n                      required=\"{!OR(f.required, f.dbrequired)}\"\/&gt;\n              &lt;\/apex:repeat&gt;\n          &lt;\/apex:pageBlockSection&gt;\n  \n        &lt;\/apex:pageBlock&gt;\n\n    &lt;\/apex:form&gt;  \n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u4e00 \u5173\u4e8e\u4e0a\u8ff0\u6807\u8bb0\u9700\u8981\u6ce8\u610f\u7684\u662f\u7528\u4e8e\u786e\u5b9a\u5b57\u6bb5\u662f\u5426\u7684\u8868\u8fbe\u5f0f \u5728\u8868\u683c\u4e0a\u5e94\u6ce8\u660e\u4e3a\u5fc5\u586b\u5b57\u6bb5\u3002\u5b57\u6bb5\u96c6\u4e2d\u7684\u5b57\u6bb5 \u5b57\u6bb5\u96c6\u5b9a\u4e49\u6216\u5b57\u6bb5\u81ea\u5df1\u7684\u5b9a\u4e49\u53ef\u4ee5\u662f\u5fc5\u9700\u7684 \u5b9a\u4e49\u3002\u8868\u8fbe\u5f0f\u5904\u7406\u8fd9\u4e24\u79cd\u60c5\u51b5\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b57\u6bb5\u96c6\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n\n\n<p>\u6dfb\u52a0\u5230\u5b57\u6bb5\u96c6\u7684\u5b57\u6bb5\u53ef\u4ee5\u5c5e\u4e8e\u4ee5\u4e0b\u4e24\u4e2a\u7c7b\u522b\u4e4b\u4e00\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u67d0\u4e2a\u5b57\u6bb5\u88ab\u6807\u8bb0\u4e3a\u201c\u53ef\u7528\u4e8e\u5b57\u6bb5\u96c6\u201d\uff0c\u5219\u8be5\u5b57\u6bb5\u5b58\u5728\u4e8e \u5b57\u6bb5\u96c6\uff0c\u4f46\u5f00\u53d1\u4eba\u5458\u5c1a\u672a\u5728\u6253\u5305\u7684 Visualforce \u9875\u9762\u4e0a\u663e\u793a\u5b83\u3002 \u7ba1\u7406\u5458\u53ef\u4ee5\u5728\u90e8\u7f72\u5b57\u6bb5\u96c6\u540e\u663e\u793a\u5b57\u6bb5\uff0c\u65b9\u6cd5\u662f\u5c06\u5b57\u6bb5\u4ece\u201c\u53ef\u7528\u201d\u5217\u79fb\u52a8\u5230\u201c\u5728\u5b57\u6bb5\u96c6\u4e2d\u201d\u5217\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u5b57\u6bb5\u6807\u8bb0\u4e3a\u201c\u5728\u5b57\u6bb5\u96c6\u4e2d\u201d\uff0c\u5219\u5f00\u53d1\u4eba\u5458\u5df2\u5448\u73b0 \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6253\u5305\u7684 Visualforce \u9875\u9762\u4e0a\u7684\u5b57\u6bb5\u3002\u7ba1\u7406\u5458\u53ef\u4ee5\u4ece\u4e2d\u5220\u9664\u8be5\u5b57\u6bb5 \u901a\u8fc7\u4ece\u5b57\u6bb5\u4e2d\u5220\u9664\u5b57\u6bb5\u96c6\u540e\u90e8\u7f72\u8be5\u9875\u9762&nbsp;\u8bbe\u7f6e\u5217\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u5f00\u53d1\u4eba\u5458\u5217\u51fa\u663e\u793a\u5b57\u6bb5\u7684\u987a\u5e8f\u51b3\u5b9a\u4e86\u5b83\u4eec\u7684\u987a\u5e8f \u51fa\u73b0\u5728 Visualforce \u9875\u9762\u4e0a\u3002\u4f5c\u4e3a\u5305\u5f00\u53d1\u4eba\u5458\uff0c\u8bf7\u7262\u8bb0\u4ee5\u4e0b\u6700\u4f73\u5b9e\u8df5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b89\u88c5\u4e86\u5b57\u6bb5\u96c6\u7684\u8ba2\u9605\u8005\u53ef\u4ee5\u6dfb\u52a0\u60a8\u7684\u9875\u9762\u7684\u5b57\u6bb5 \u6ca1\u6709\u8003\u8651\u3002\u6ca1\u6709\u529e\u6cd5\u6709\u6761\u4ef6\u5730\u7701\u7565\u67d0\u4e9b\u5b57\u6bb5 \u4ece\u5b57\u6bb5\u96c6\u8fed\u4ee3\uff0c\u56e0\u6b64\u8bf7\u786e\u4fdd\u4efb\u4f55\u5b57\u6bb5\u90fd\u901a\u8fc7 \u5b57\u6bb5\u96c6\u9002\u7528\u4e8e\u6240\u6709\u5b57\u6bb5\u7c7b\u578b\u3002<\/li>\n\n\n\n<li>\u6211\u4eec\u5efa\u8bae\u60a8\u4ec5\u5c06\u975e\u5fc5\u8981\u5b57\u6bb5\u6dfb\u52a0\u5230\u5b57\u6bb5\u96c6\u4e2d\u3002\u8fd9 \u786e\u4fdd\u5373\u4f7f\u8ba2\u9605\u8005\u5220\u9664\u4e86\u5b57\u6bb5\u96c6\u4e2d\u7684\u6240\u6709\u5b57\u6bb5\uff0c \u4f7f\u7528\u8be5\u5b57\u6bb5\u96c6\u7684 Visualforce \u9875\u9762\u4ecd\u7136\u6709\u6548\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u5b57\u6bb5\u96c6\u53ef\u7528\u4e8e API \u7248\u672c 21.0 \u6216 \u4ee5\u4e0a\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u5bf9\u5168\u5c40\u53d8\u91cf\u7684\u52a8\u6001\u5f15\u7528<\/h1>\n\n\n\n<p>Visualforce \u9875\u9762\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001 \u7ed1\u5b9a\u4ee5\u5728\u5176\u6807\u8bb0\u4e2d\u5f15\u7528\u5168\u5c40\u53d8\u91cf\u3002\u5168\u5c40\u53d8\u91cf\u5141\u8bb8\u60a8\u8bbf\u95ee \u6709\u5173\u5f53\u524d\u7528\u6237\u3001\u7ec4\u7ec7\u7684\u4fe1\u606f\u4ee5\u53ca\u6709\u5173\u6570\u636e\u7684\u67b6\u6784\u8be6\u7ec6\u4fe1\u606f\u3002\u8fd9 \u5168\u5c40\u53d8\u91cf\u5217\u8868\u53ef\u5728\u5168\u5c40\u53d8\u91cf\u3001\u51fd\u6570\u548c\u8868\u8fbe\u5f0f\u4e2d\u627e\u5230 \u8fd0\u7b97\u7b26\u9644\u5f55\u3002\u5f15\u7528\u5168\u5c40\u53d8\u91cf\u4e0e\u5f15\u7528 sObjects \u548c Apex \u7c7b\u76f8\u540c\uff0c\u5373 \u4f7f\u7528\u76f8\u540c\u7684\u57fa\u672c\u6a21\u5f0f\uff0c\u5176\u4e2d \u662f\u5168\u5c40 \u53d8\u91cf\uff1a<\/p>\n\n\n\n<p><var>reference<\/var><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em>reference<\/em>&#91;<em>expression<\/em>]<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u5bf9\u9759\u6001\u8d44\u6e90\u7684\u52a8\u6001\u5f15\u7528 \u4f7f\u7528&nbsp;$Resource<\/h1>\n\n\n\n<p>\u5bf9\u9759\u6001\u8d44\u6e90\u7684\u52a8\u6001\u5f15\u7528\u53ef\u80fd\u975e\u5e38\u6709\u7528 \u7528\u4e8e\u4e3a\u4e3b\u9898\u6216\u5176\u4ed6\u89c6\u89c9\u9996\u9009\u9879\u63d0\u4f9b\u652f\u6301\u3002<\/p>\n\n\n\n<p>\u8981\u4f7f\u7528\u5168\u5c40\u53d8\u91cf\u5f15\u7528\u9759\u6001\u8d44\u6e90\uff0c\u8bf7\u63d0\u4f9b \u8868\u8fbe\u5f0f\u4e2d\u9759\u6001\u8d44\u6e90\u7684\u540d\u79f0\uff1a\u3002\u4f8b\u5982\uff0c\u5982\u679c\u60a8\u6709\u4e00\u4e2a\u8fd4\u56de \u4f5c\u4e3a\u9759\u6001\u8d44\u6e90\u4e0a\u4f20\u7684\u56fe\u50cf\u7684\u540d\u79f0\uff0c\u5f15\u7528\u5b83 \u8fd9\uff1a\u3002<samp>$Resource<\/samp><samp>{! $Resource[StaticResourceName] }<\/samp><samp>&lt;apex:image&nbsp;value=&#8221;{!$Resource[customLogo]}&#8221;\/&gt;<\/samp>\u6b64\u793a\u4f8b\u6f14\u793a\u5982\u4f55\u5728\u4e24\u4e2a\u4e0d\u540c\u7684\u89c6\u89c9\u5bf9\u8c61\u4e4b\u95f4\u5207\u6362 \u4e3b\u9898\u3002\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u4f7f\u7528\u4ee5\u4e0b\u4ee3\u7801\u547d\u540d\u7684\u63a7\u5236\u5668\u6269\u5c55\uff1a<\/p>\n\n\n\n<p><samp>ThemeHandler<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ThemeHandler {\n\n    public ThemeHandler(ApexPages.StandardController controller) { }\n    \n    public static Set&lt;String&gt; getAvailableThemes() {\n        \/\/ You must have at least one uploaded static resource\n        \/\/ or this code will fail. List their names here.\n        return(new Set&lt;String&gt; {'Theme_Color', 'Theme_BW'});\n    }\n    \n    public static List&lt;SelectOption&gt; getThemeOptions() {\n        List&lt;SelectOption&gt; themeOptions = new List&lt;SelectOption&gt;();\n        for(String themeName : getAvailableThemes()) {\n            themeOptions.add(new SelectOption(themeName, themeName));\n        }\n        return themeOptions;\n    }\n    \n    public String selectedTheme {\n        get {\n            if(null == selectedTheme) {\n                \/\/ Ensure we always have a theme\n                List&lt;String&gt; themeList = new List&lt;String&gt;();\n                themeList.addAll(getAvailableThemes());\n                selectedTheme = themeList&#91;0];               \n            }\n            return selectedTheme;\n        }\n        set {\n            if(getAvailableThemes().contains(value)) {\n                selectedTheme = value;\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5173\u4e8e\u8fd9\u4e2a\u73ed\u7ea7\u7684\u6ce8\u610f\u4e8b\u9879\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b83\u6709\u4e00\u4e2a\u7a7a\u7684\u6784\u9020\u51fd\u6570\uff0c\u56e0\u4e3a\u6ca1\u6709\u9ed8\u8ba4\u503c \u63a7\u5236\u5668\u6269\u5c55\u7684\u6784\u9020\u51fd\u6570\u3002<\/li>\n\n\n\n<li>\u5c06\u4e0a\u4f20\u7684\u9759\u6001\u8d44\u6e90\u6587\u4ef6\u4e3b\u9898\u7684\u540d\u79f0\u6dfb\u52a0\u5230\u65b9\u6cd5\u4e2d\u3002\u4f7f\u7528\u9759\u6001\u8d44\u6e90\u63d0\u4f9b\u4e86\u6709\u5173\u5982\u4f55\u521b\u5efa\u548c\u4e0a\u4f20\u9759\u6001\u8d44\u6e90\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u7279\u522b\u662f\uff1a \u5305\u542b\u591a\u4e2a\u6587\u4ef6\u7684\u538b\u7f29\u5b58\u6863\u3002<samp>getAvailableThemes<\/samp><\/li>\n\n\n\n<li>\u6700\u540e\u4e24\u79cd\u65b9\u6cd5\u63d0\u4f9b\u4e3b\u9898\u5217\u8868\u548c\u9009\u5b9a\u7684 \u4e3b\u9898\uff0c\u7528\u4e8e Visualforce \u8868\u5355\u7ec4\u4ef6\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u73b0\u5728\u521b\u5efa\u4e00\u4e2a\u4f7f\u7528\u6b64\u63a7\u5236\u5668\u6269\u5c55\u7684 Visualforce \u9875\u9762\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Account\" \n           extensions=\"ThemeHandler\" showHeader=\"false\"&gt;\n\n    &lt;apex:form &gt;\n    &lt;apex:pageBlock id=\"ThemePreview\" &gt;\n      &lt;apex:stylesheet \n          value=\"{!URLFOR($Resource&#91;selectedTheme], 'styles\/styles.css')}\"\/&gt;\n\n      &lt;h1&gt;Theme Viewer&lt;\/h1&gt;\n      &lt;p&gt;You can select a theme to use while browsing this site.&lt;\/p&gt;\n      \n      &lt;apex:pageBlockSection &gt;\n          &lt;apex:outputLabel value=\"Select Theme: \" for=\"themesList\"\/&gt;\n          &lt;apex:selectList id=\"themesList\" size=\"1\" value=\"{!selectedTheme}\"&gt;\n              &lt;apex:actionSupport event=\"onchange\" rerender=\"ThemePreview\"\/&gt;\n              &lt;apex:selectOptions value=\"{!themeOptions}\"\/&gt;\n          &lt;\/apex:selectList&gt;\n      &lt;\/apex:pageBlockSection&gt;\n      \n      &lt;apex:pageBlockSection &gt;\n      &lt;div class=\"custom\" style=\"padding: 1em;\"&gt;&lt;!-- Theme CSS hook --&gt;\n\n          &lt;h2&gt;This is a Sub-Heading&lt;\/h2&gt;\n          \n          &lt;p&gt;This is standard body copy. Lorem ipsum dolor sit amet, consectetur \n          adipiscing elit. Quisque neque arcu, pellentesque in vehicula vitae, dictum \n          id dolor. Cras viverra consequat neque eu gravida. Morbi hendrerit lobortis \n          mauris, id sollicitudin dui rhoncus nec.&lt;\/p&gt;\n          \n          &lt;p&gt;&lt;apex:image \n              value=\"{!URLFOR($Resource&#91;selectedTheme], 'images\/logo.png')}\"\/&gt;&lt;\/p&gt;\n\n      &lt;\/div&gt;&lt;!-- End of theme CSS hook --&gt;  \n      &lt;\/apex:pageBlockSection&gt;\n    \n    &lt;\/apex:pageBlock&gt;\n    &lt;\/apex:form&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u8bf7\u6ce8\u610f\u6709\u5173\u6b64\u6807\u8bb0\u7684\u4ee5\u4e0b\u4e8b\u9879\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8be5\u9875\u9762\u4f7f\u7528\u5e10\u6237\u6807\u51c6\u63a7\u5236\u5668\uff0c\u4f46\u6ca1\u6709\u4efb\u4f55\u5185\u5bb9 \u4e0e\u5e10\u6237\u6709\u5173\u3002\u60a8\u5fc5\u987b\u6307\u5b9a\u63a7\u5236\u5668\u624d\u80fd\u4f7f\u7528\u63a7\u5236\u5668 \u5916\u5ef6\u3002<\/li>\n\n\n\n<li>\u7b2c\u4e00\u4e2a\u5305\u542b\u4e3b\u9898\u9009\u62e9\u5c0f\u90e8\u4ef6\u3002\u4f7f\u7528 \uff0c\u66f4\u6539\u4e3a \u201c\u9009\u62e9\u201d\u83dc\u5355\u5c06\u91cd\u65b0\u6e32\u67d3\u6574\u4e2a .\u8fd9\u6837\u6807\u7b7e\u5c31\u4f1a\u5f97\u5230 \u66f4\u65b0\u4e86 \u5b83\u7684\u52a8\u6001\u53c2\u8003\u3002<samp>&lt;apex:pageBlockSection&gt;<\/samp><samp>&lt;apex:actionSupport&gt;<\/samp><samp>&lt;apex:pageBlock&gt;<\/samp><samp>&lt;apex:stylesheet&gt;<\/samp><samp>selectedTheme<\/samp><\/li>\n\n\n\n<li>\u6b64\u5904\u9009\u62e9\u7684\u4e3b\u9898\u9996\u9009\u9879\u4ec5\u4fdd\u7559\u5728\u89c6\u56fe\u4e2d \u72b6\u6001\uff0c\u4f46\u60a8\u53ef\u4ee5\u8f7b\u677e\u5730\u5c06\u5176\u4fdd\u5b58\u5230\u81ea\u5b9a\u4e49\u72b6\u6001 \u8bbe\u7f6e\uff0c\u5e76\u4f7f\u5176\u6c38\u4e45\u5316\u3002<\/li>\n\n\n\n<li>\u5305\u542b\u6bcf\u4e2a\u56fe\u5f62\u548c\u6837\u5f0f\u8d44\u6e90\u7684 zip \u6587\u4ef6 \u4e3b\u9898\u9700\u8981\u5177\u6709\u4e00\u81f4\u7684\u7ed3\u6784\u548c\u5185\u5bb9\u3002\u90a3\u662f\u3002\u90a3\u91cc \u9700\u8981\u662f\u6bcf\u4e2a\u4e3b\u9898\u4e2d\u7684\u56fe\u50cf\/\u5fbd\u6807.png&nbsp;zip \u6587\u4ef6\u7b49\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u6b64\u5168\u5c40\u53d8\u91cf\u53ea\u6709\u4e24\u4e2a\u52a8\u6001\u5f15\u7528 \u9875\u9762\uff0c\u4f46\u5b83\u4eec\u663e\u793a\u4e86\u5982\u4f55\u8bbf\u95ee\u6837\u5f0f\u8868\u548c\u56fe\u5f62\u8d44\u6e90\u3002 \u60a8\u53ef\u4ee5\u5728\u9875\u9762\u4e0a\u7684\u6bcf\u4e2a\u6807\u8bb0\u4e2d\u4f7f\u7528\u52a8\u6001\u5f15\u7528\uff0c\u5e76\u4e14 \u5b8c\u5168\u6539\u53d8\u5916\u89c2\u548c\u611f\u89c9\u3002<samp>$Resource<\/samp><samp>&lt;apex:image&gt;<\/samp><\/p>\n\n\n\n<p><samp>$Label<\/samp>\u5e76\u4e14\u7c7b\u4f3c\u4e8e \uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u60a8 \u8bbf\u95ee\u7ec4\u7ec7\u7ba1\u7406\u5458\u7684\u6587\u672c\u503c\u6216\u4fdd\u5b58\u7684\u8bbe\u7f6e \u6216\u8005\u7528\u6237\u81ea\u5df1\u53ef\u4ee5\u5728 Salesforce \u4e2d\u8bbe\u7f6e\uff1a<\/p>\n\n\n\n<p><samp>$Setup<\/samp><samp>$Resource<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u81ea\u5b9a\u4e49\u6807\u7b7e\u5141\u8bb8\u60a8\u521b\u5efa\u53ef\u4ee5\u5728\u6574\u4e2a\u8fc7\u7a0b\u4e2d\u4e00\u81f4\u4f7f\u7528\u7684\u6587\u672c\u6d88\u606f \u5e94\u7528\u3002\u6807\u7b7e\u6587\u672c\u4e5f\u53ef\u4ee5\u7ffb\u8bd1\u5e76\u81ea\u52a8\u663e\u793a\u5728 \u7528\u6237\u7684\u9ed8\u8ba4\u8bed\u8a00\u3002<\/li>\n\n\n\n<li>\u81ea\u5b9a\u4e49\u8bbe\u7f6e\u5141\u8bb8\u60a8\u4e3a\u5e94\u7528\u7a0b\u5e8f\u521b\u5efa\u8bbe\u7f6e\uff0c\u8fd9\u4e9b\u8bbe\u7f6e\u53ef\u4ee5\u901a\u8fc7 \u7ba1\u7406\u5458\u6216\u7528\u6237\u81ea\u5df1\u3002\u5b83\u4eec\u4e5f\u53ef\u4ee5\u662f\u5206\u5c42\u7684\uff0c\u56e0\u6b64 \u7528\u6237\u7ea7\u8bbe\u7f6e\u5c06\u8986\u76d6\u89d2\u8272\u7ea7\u6216\u7ec4\u7ec7\u7ea7\u8bbe\u7f6e\u3002<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528&nbsp;$Action&nbsp;\u5bf9\u64cd\u4f5c\u65b9\u6cd5\u7684\u52a8\u6001\u5f15\u7528<\/h1>\n\n\n\n<p>\u5168\u5c40\u53d8\u91cf\u5141\u8bb8\u60a8 \u52a8\u6001\u5f15\u7528\u5bf9\u8c61\u7c7b\u578b\u6216\u7279\u5b9a\u8bb0\u5f55\u4e0a\u7684\u6709\u6548\u64cd\u4f5c\u3002\u6700 \u5229\u7528\u6b64\u529f\u80fd\u7684\u53ef\u80fd\u65b9\u6cd5\u662f\u521b\u5efa\u4e00\u4e2a URL \u6765\u6267\u884c\u8be5\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p><samp>$Action<\/samp><\/p>\n\n\n\n<p>\u4f8b\u5982\uff0c\u53ef\u4ee5\u5c06\u8868\u8fbe\u5f0f\u4e0e\u63d0\u4f9b s\u5bf9\u8c61\u3002<samp>{!URLFOR($Action[objectName].New)}<\/samp><samp>&lt;apex:outputLink&gt;<\/samp><samp>getObjectName()<\/samp>\u4e0b\u9762\u662f\u4e00\u4e2a\u5b8c\u5168\u505a\u5230\u8fd9\u4e00\u70b9\u7684\u793a\u4f8b\u3002\u63a7\u5236\u5668\u6269\u5c55\u67e5\u8be2 \u7cfb\u7edf\u6765\u5b66\u4e60\u7528\u6237\u53ef\u8bbf\u95ee\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u540d\u79f0\uff0c\u5e76\u5448\u73b0 \u5b83\u4eec\u7684\u5217\u8868\uff0c\u4ee5\u53ca\u7528\u4e8e\u521b\u5efa\u65b0\u8bb0\u5f55\u7684\u94fe\u63a5\u3002\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u63a7\u5236\u5668 \u540d\u4e3a \uff1a<\/p>\n\n\n\n<p><samp>DynamicActionsHandler<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public with sharing class DynamicActionsHandler {\n\n    public List&lt;CustomObjectDetails&gt; customObjectDetails { get; private set; }\n    \n    public DynamicActionsHandler(ApexPages.StandardController cont) {\n        this.loadCustomObjects();\n    }\n    \n    public void loadCustomObjects() {\n        List&lt;CustomObjectDetails&gt; cObjects = new List&lt;CustomObjectDetails&gt;();\n        \/\/ Schema.getGlobalDescribe() returns lightweight tokens with minimal metadata\n        Map&lt;String, Schema.SObjectType&gt; gd = Schema.getGlobalDescribe();\n        for(String obj : gd.keySet()) {\n            if(obj.endsWith('__c')) {\n                \/\/ Get the full metadata details only for custom items\n                Schema.DescribeSObjectResult objD = gd.get(obj).getDescribe();\n                if( ! objD.isCustomSetting()) {\n                    \/\/ Save details for custom objects, not custom settings\n                    CustomObjectDetails objDetails = new CustomObjectDetails(\n                        obj, objD.getLabel(), objD.isCreateable());\n                    cObjects.add(objDetails);\n                }\n            }\n        }\n        cObjects.sort();\n        this.customObjectDetails = cObjects;\n    }\n    \n    public class CustomObjectDetails implements Comparable {\n        public String  nameStr   { get; set; }\n        public String  labelStr  { get; set; }\n        public Boolean creatable { get; set; }\n        \n        public CustomObjectDetails(String aName, String aLabel, Boolean isCreatable) {\n            this.nameStr = aName;\n            this.labelStr = aLabel;\n            this.creatable = isCreatable;\n        }\n        \n        public Integer compareTo(Object objToCompare) {\n            CustomObjectDetails cod = (CustomObjectDetails)objToCompare;\n            return(this.nameStr.compareTo(cod.nameStr));\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u90a3\u91cc \u662f\u6b64\u6269\u5c55\u4e2d\u611f\u5174\u8da3\u7684\u4e00\u4e9b\u5185\u5bb9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8be5\u65b9\u6cd5\u4f7f\u7528 Apex \u7528\u4e8e\u83b7\u53d6\u6709\u5173\u53ef\u7528\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u5143\u6570\u636e\u4fe1\u606f\u7684\u67b6\u6784\u65b9\u6cd5\u3002\u8be5\u65b9\u6cd5\u662f \u8f7b\u91cf\u7ea7\u64cd\u4f5c\uff0c\u7528\u4e8e\u83b7\u53d6\u6709\u5173\u53ef\u7528\u5bf9\u8c61\u7684\u4e00\u5c0f\u7ec4\u5143\u6570\u636e\uff0c\u4ee5\u53ca \u81ea\u5b9a\u4e49\u8bbe\u7f6e\u3002\u8be5\u65b9\u6cd5\u626b\u63cf\u96c6\u5408\u4ee5\u67e5\u627e\u5177\u6709\u540d\u79f0\u7684\u9879 \u4ee5\u201c__c\u201d\u7ed3\u5c3e\uff0c\u8868\u793a\u5b83\u4eec\u662f\u81ea\u5b9a\u4e49\u5bf9\u8c61\u6216 \u8bbe\u7f6e\u3002\u4f7f\u7528 \u66f4\u6df1\u5165\u5730\u68c0\u67e5\u8fd9\u4e9b\u9879\u76ee\uff0c\u5e76\u4fdd\u5b58\u9009\u5b9a\u7684\u5143\u6570\u636e \u7528\u4e8e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<samp>loadCustomObjects<\/samp><samp>Schema.getGlobalDescribe<\/samp><samp>getDescribe<\/samp><\/li>\n\n\n\n<li>\u7528\u4e8e\u6d4b\u8bd5 \u65e0\u8bba\u4e00\u4e2a\u9879\u76ee\u662f\u5426\u662f\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff0c\u90fd\u53ef\u80fd\u611f\u89c9\u50cf\u662f\u201c\u9ed1\u5ba2\u201d\uff0c \u4f46\u53e6\u4e00\u79cd\u9009\u62e9\u662f\u6253\u7535\u8bdd\uff0c\u8fd9\u5f88\u8d35\uff0c\u800c\u4e14\u6709\u4e00\u4e2a \u8c03\u63a7\u5668\u5bf9 \u7684\u8c03\u7528\u6b21\u6570\u7684\u9650\u5236\u3002\u626b\u63cf\u201c__c\u201d\u5b57\u7b26\u4e32\u4f5c\u4e3a \u9996\u5148\u4f20\u9012\u53ef\u80fd\u5f88\u957f\u7684\u5bf9\u8c61\u5217\u8868\u4f1a\u66f4\u6709\u6548\u7387\u3002<samp>if(obj.endsWith(&#8216;__c&#8217;))<\/samp><samp>obj.getDescribe().isCustom()<\/samp><samp>getDescribe<\/samp><\/li>\n\n\n\n<li>\u6b64\u5143\u6570\u636e\u4fdd\u5b58\u5728\u5185\u90e8\u7c7b\u4e2d\uff0c\u8be5\u7c7b\u5145\u5f53\u7b80\u5355\u7684\u7ed3\u6784\u5316 \u8981\u4fdd\u5b58\u7684\u5b57\u6bb5\u7684\u5bb9\u5668\u3002<samp>CustomObjectDetails<\/samp><\/li>\n\n\n\n<li><samp>CustomObjectDetails<\/samp>\u5b9e\u73b0 \u53ef\u6bd4\u8f83\u7684\u754c\u9762\uff0c\u53ef\u4ee5\u5bf9\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5217\u8868\u8fdb\u884c\u6392\u5e8f \u6bcf\u4e2a\u5bf9\u8c61\u7684\u5c5e\u6027\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u5728\u672c\u4f8b\u4e2d\uff0c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684 \u540d\u5b57\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u73b0\u5728\u521b\u5efa\u4e00\u4e2a Visualforce \u9875\u9762 \u4ee5\u4e0b \u6807\u8bb0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Account\" \n           extensions=\"DynamicActionsHandler\"&gt;\n    &lt;br\/&gt;\n\n    &lt;apex:dataTable value=\"{!customObjectDetails}\" var=\"coDetails\"&gt;\n        &lt;apex:column &gt;\n            &lt;apex:facet name=\"header\"&gt;Custom Object&lt;\/apex:facet&gt;\n            &lt;apex:outputText value=\"{!coDetails.labelStr}\"\/&gt; \n        &lt;\/apex:column&gt;\n        &lt;apex:column &gt;\n            &lt;apex:facet name=\"header\"&gt;Actions&lt;\/apex:facet&gt;\n            &lt;apex:outputLink value=\"{!URLFOR($Action&#91;coDetails.nameStr].New)}\" \n                rendered=\"{!coDetails.creatable}\"&gt;&#91;Create]&lt;\/apex:outputLink&gt;&lt;br\/&gt;\n            &lt;apex:outputLink value=\"{!URLFOR($Action&#91;coDetails.nameStr].List, \n                $ObjectType&#91;coDetails.nameStr].keyPrefix)}\"&gt;&#91;List]&lt;\/apex:outputLink&gt;\n        &lt;\/apex:column&gt;\n    &lt;\/apex:dataTable&gt;\n\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<p>\u4e0a \u5c1a\u672a\u5206\u914d\u7279\u5b9a\u8bb0\u5f55\u7684\u9875\u9762\uff0c\u4ec5\u6709\u7684\u4e24\u4e2a\u6709\u7528\u64cd\u4f5c \u53ef\u7528\u7684\u662f&nbsp;New&nbsp;\u548c&nbsp;List\u3002\u5728\u9875\u9762\u4e0a \u67e5\u8be2\u8bb0\u5f55\uff0c\u5168\u5c40 \u53d8\u91cf\u63d0\u4f9b&nbsp;View\u3001Clone\u3001Edit&nbsp;\u548c&nbsp;Delete&nbsp;\u7b49\u65b9\u6cd5\u3002\u67d0\u4e9b\u6807\u51c6\u5bf9\u8c61 \u5177\u6709\u5bf9\u5176\u6570\u636e\u7c7b\u578b\u6709\u610f\u4e49\u7684\u5176\u4ed6\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p><samp>$Action<\/samp><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528&nbsp;$ObjectType&nbsp;\u52a8\u6001\u5f15\u7528\u67b6\u6784\u8be6\u7ec6\u4fe1\u606f<\/h1>\n\n\n\n<p>\u5168\u5c40\u53d8\u91cf\u63d0\u4f9b\u5bf9\u5404\u79cd\u67b6\u6784\u4fe1\u606f\u7684\u8bbf\u95ee \u5173\u4e8e\u7ec4\u7ec7\u4e2d\u7684\u5bf9\u8c61\u3002\u7528\u5b83\u6765\u5f15\u7528\u540d\u79f0\uff0c \u4f8b\u5982\uff0c\u5bf9\u8c61\u4e0a\u7684\u6807\u7b7e\u548c\u5b57\u6bb5\u7684\u6570\u636e\u7c7b\u578b\u3002<\/p>\n\n\n\n<p><samp>$ObjectType<\/samp><\/p>\n\n\n\n<p><samp>$ObjectType<\/samp>\u662f\u4e00\u4e2a\u201c\u6df1\u201d \u5168\u5c40\u53d8\u91cf\uff0c\u5e76\u63d0\u4f9b\u5728\u201c\u53cc \u52a8\u6001\u201c\u53c2\u8003\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ObjectType&#91;sObjectName].fields&#91;fieldName].Type<\/code><\/pre>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u793a\u4f8b\uff0c\u5b83\u4f7f\u7528\u52a8\u6001\u5168\u5c40\u53d8\u91cf\u6765\u63d0\u4f9b \u5e38\u89c4\u5bf9\u8c61\u67e5\u770b\u5668\u3002\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u63a7\u5236\u5668\uff08\u4e0d\u662f\u6269\u5c55\uff09 \u53eb\uff1a<\/p>\n\n\n\n<p><samp>DynamicObjectHandler<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class DynamicObjectHandler {\n\n    \/\/ This class acts as a controller for the DynamicObjectViewer component\n    \n    private String objType;\n    private List&lt;String&gt; accessibleFields;\n\n    public sObject obj { \n        get; \n        set {\n\t          setObjectType(value);\n\t          discoverAccessibleFields(value);\n\t          obj = reloadObjectWithAllFieldData();\n        } \n    }\n    \n    \/\/ The sObject type as a string\n    public String getObjectType() {\n    \t  return(this.objType);\n    }\n    public String setObjectType(sObject newObj) {\n        this.objType = newObj.getSObjectType().getDescribe().getName();\n        return(this.objType);\n    }\n    \n    \/\/ List of accessible fields on the sObject\n    public List&lt;String&gt; getAccessibleFields() {\n     \treturn(this.accessibleFields);\n    }\n    \n    private void discoverAccessibleFields(sObject newObj) {\n        this.accessibleFields = new List&lt;String&gt;();\n        Map&lt;String, Schema.SobjectField&gt; fields = \n            newObj.getSObjectType().getDescribe().fields.getMap();\n        for (String s : fields.keySet()) {\n            if ((s != 'Name') &amp;&amp; (fields.get(s).getDescribe().isAccessible())) {\n                this.accessibleFields.add(s);\n            }\n        }\n    }\n    \n    private sObject reloadObjectWithAllFieldData() {\n        String qid = ApexPages.currentPage().getParameters().get('id');\n        String theQuery = 'SELECT ' + joinList(getAccessibleFields(), ', ') + \n                          ' FROM ' + getObjectType() + \n                          ' WHERE Id = :qid';\n        return(Database.query(theQuery));    \t\n    }\n    \n    \/\/ Join an Apex List of fields into a SELECT fields list string\n    private static String joinList(List&lt;String&gt; theList, String separator) {\n\n        if (theList == null)   { return null; }\n        if (separator == null) { separator = ''; }\n\n        String joined = '';\n        Boolean firstItem = true;\n        for (String item : theList) {\n            if(null != item) {\n                if(firstItem){ firstItem = false; }\n                else { joined += separator; }\n                joined += item;\n            }\n        }\n        return joined;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6709\u8bb8\u591a\u503c\u5f97\u6ce8\u610f\u7684\u4e8b\u60c5 \u5728\u6b64\u63a7\u5236\u5668\u4e2d\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visualforce \u7ec4\u4ef6\u4e0d\u80fd\u4f7f\u7528\u63a7\u5236\u5668\u6269\u5c55\uff0c\u56e0\u6b64\u8fd9 \u7c7b\u88ab\u5199\u6210\u63a7\u5236\u5668\u3002\u6ca1\u6709\u6784\u9020\u51fd\u6570 \u5b9a\u4e49\uff0c\u56e0\u6b64\u8be5\u7c7b\u4f7f\u7528\u9ed8\u8ba4\u6784\u9020\u51fd\u6570\u3002<\/li>\n\n\n\n<li>\u8981\u6536\u96c6\u5bf9\u8c61\u7684\u5143\u6570\u636e\uff0c\u63a7\u5236\u5668\u5fc5\u987b\u77e5\u9053 \u5bf9\u8c61\u3002Visualforce \u6784\u9020\u51fd\u6570\u4e0d\u80fd\u63a5\u53d7\u53c2\u6570\uff0c\u56e0\u6b64\u65e0\u6cd5\u77e5\u9053 \u5b9e\u4f8b\u5316\u65f6\u611f\u5174\u8da3\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3002\u76f8\u53cd \u5143\u6570\u636e\u53d1\u73b0\u662f\u7531 public \u5c5e\u6027\u7684\u8bbe\u7f6e\u89e6\u53d1\u7684\u3002<samp>obj<\/samp><\/li>\n\n\n\n<li>\u6b64\u7c7b\u4e2d\u7684\u591a\u4e2a\u65b9\u6cd5\u4f7f\u7528\u7cfb\u7edf\u67b6\u6784\u53d1\u73b0 \u65b9\u6cd5\uff0c\u4e0e\u524d\u9762\u7684\u4f8b\u5b50\u7565\u6709\u4e0d\u540c\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u4e0b\u4e00\u90e8\u5206\u662f Visualforce \u7ec4\u4ef6\uff0c\u5b83\u4e5f\u663e\u793a\u6709\u5173\u5bf9\u8c61\u7684\u67b6\u6784\u4fe1\u606f \u4f5c\u4e3a\u67e5\u8be2\u8bb0\u5f55\u7684\u7279\u5b9a\u503c\u3002\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 Visualforce \u7ec4\u4ef6\uff0c\u8be5\u7ec4\u4ef6\u4f7f\u7528\u4ee5\u4e0b\u4ee3\u7801\u547d\u540d\uff1a<\/p>\n\n\n\n<p><samp>DynamicObjectViewer<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:component controller=\"DynamicObjectHandler\"&gt;\n    &lt;apex:attribute name=\"rec\" type=\"sObject\" required=\"true\"\n        description=\"The object to be displayed.\" assignTo=\"{!obj}\"\/&gt;\n\n    &lt;apex:form &gt;\n    &lt;apex:pageBlock title=\"{!objectType}\"&gt;\n        &lt;apex:pageBlockSection title=\"Fields\" columns=\"1\"&gt;\n            &lt;apex:dataTable value=\"{!accessibleFields}\" var=\"f\"&gt;\n                &lt;apex:column &gt;\n                    &lt;apex:facet name=\"header\"&gt;Label&lt;\/apex:facet&gt;\n                    &lt;apex:outputText value=\"{!$ObjectType&#91;objectType].fields&#91;f].Label}\"\/&gt;\n                &lt;\/apex:column&gt;\n                &lt;apex:column &gt;\n                    &lt;apex:facet name=\"header\"&gt;API Name&lt;\/apex:facet&gt;\n                    &lt;apex:outputText value=\"{!$ObjectType&#91;objectType].fields&#91;f].Name}\"\/&gt;\n                &lt;\/apex:column&gt;\n                &lt;apex:column &gt;\n                    &lt;apex:facet name=\"header\"&gt;Type&lt;\/apex:facet&gt;\n                    &lt;apex:outputText value=\"{!$ObjectType&#91;objectType].fields&#91;f].Type}\"\/&gt;\n                &lt;\/apex:column&gt;\n                &lt;apex:column &gt;\n                    &lt;apex:facet name=\"header\"&gt;Value&lt;\/apex:facet&gt;\n                    &lt;apex:outputText value=\"{!obj&#91;f]}\"\/&gt;\n                &lt;\/apex:column&gt;\n            &lt;\/apex:dataTable&gt;\n        &lt;\/apex:pageBlockSection&gt;\n        \n        &lt;apex:pageBlockSection columns=\"4\"&gt;\n            &lt;apex:commandButton value=\"View\"\n                action=\"{!URLFOR($Action&#91;objectType].View, obj.Id)}\"\/&gt;\n            &lt;apex:commandButton value=\"Edit\"\n                action=\"{!URLFOR($Action&#91;objectType].Edit, obj.Id)}\"\/&gt;\n            &lt;apex:commandButton value=\"Clone\"\n                action=\"{!URLFOR($Action&#91;objectType].Clone, obj.Id)}\"\/&gt;\n            &lt;apex:commandButton value=\"Delete\"\n                action=\"{!URLFOR($Action&#91;objectType].Delete, obj.Id)}\"\/&gt;\n        &lt;\/apex:pageBlockSection&gt;\n    &lt;\/apex:pageBlock&gt;\n    &lt;\/apex:form&gt;\n    \n&lt;\/apex:component&gt;<\/code><\/pre>\n\n\n\n<p>\u8bf7\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u6b64\u7ec4\u4ef6\u7684\u4efb\u4f55\u9875\u9762\u90fd\u5fc5\u987b\u67e5\u627e\u8bb0\u5f55\u3002\u53bb\u505a \u56e0\u6b64\uff0c\u8bf7\u5bf9\u8be5\u5bf9\u8c61\u4f7f\u7528\u6807\u51c6\u63a7\u5236\u5668\uff0c\u5e76\u5728 URL \u4e2d\u6307\u5b9a\u8bb0\u5f55\u7684&nbsp;ID\u3002\u4f8b\u5982\uff0chttps:\/\/&lt;Salesforce_instance&gt;\/apex\/DynamicContactPage\uff1fid=003D000000Q5GHE\u3002<\/li>\n\n\n\n<li>\u6240\u9009\u8bb0\u5f55\u5c06\u7acb\u5373\u4f20\u9012\u5230\u7ec4\u4ef6\u7684&nbsp;obj&nbsp;\u5c5e\u6027\u4e2d\u3002\u6b64\u53c2\u6570\u7528\u4e8e\u6240\u6709\u5bf9\u8c61 \u5143\u6570\u636e\u53d1\u73b0\u3002<\/li>\n\n\n\n<li>\u4e09\u4e2a\u53cc\u52a8\u6001\u5f15\u7528\uff0c\u4ee5 \u5f00\u5934\uff0c \u663e\u793a\u6bcf\u4e2a\u5b57\u6bb5\u7684\u5143\u6570\u636e\uff0c\u800c\u6b63\u5e38\u52a8\u6001\u5f15\u7528 \u663e\u793a\u5b57\u6bb5\u7684\u5b9e\u9645\u503c\u3002<samp>$ObjectType[objectType].fields[f]<\/samp><\/li>\n\n\n\n<li>\u5bf9\u4e8e\u6570\u636e\u503c\uff0c\u8be5\u503c\u662f \uff0c\u4f7f\u7528\u63a7\u5236\u5668\u4e2d\u7684 getter \u65b9\u6cd5\uff0c\u800c\u4e0d\u662f \u4e5f\u8bb8\u66f4\u81ea\u7136\uff0c\u8fd9\u662f\u7ec4\u4ef6\u7684\u53c2\u6570\u3002\u539f\u56e0\u5f88\u7b80\u5355\uff0c&nbsp;obj&nbsp;\u5c5e\u6027\u5df2\u66f4\u65b0\u4e3a\u52a0\u8f7d\u6570\u636e \u5bf9\u4e8e\u6240\u6709\u5b57\u6bb5\uff0c\u800c&nbsp;REC&nbsp;\u4ecd\u7136\u5b58\u5728 \u4e0e\u6807\u51c6\u63a7\u5236\u5668\u52a0\u8f7d\u7684\u5185\u5bb9\u76f8\u540c\uff0c\u56e0\u6b64 \u4ec5\u52a0\u8f7d\u4e86&nbsp;Id&nbsp;\u5b57\u6bb5\u3002<samp>{!obj[f]}<\/samp><samp>{!rec[f]}<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u6700\u540e\uff0c\u65b0\u7ec4\u4ef6\u53ef\u7528\u4e8e\u521b\u5efa\u4efb\u610f\u6570\u91cf\u7684 \u4f7f\u7528\u8be5\u7ec4\u4ef6\u663e\u793a\u8bb0\u5f55\u8be6\u7ec6\u4fe1\u606f\u7684\u7b80\u5355 Visualforce \u9875\u9762\uff0c\u4ee5\u53ca \u67b6\u6784\u4fe1\u606f\u9875\u9762\uff0c\u4f8b\u5982\u4ee5\u4e0b\u4e24\u4e2a\u9875\u9762\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Account\"&gt; \n    &lt;c:DynamicObjectViewer rec=\"{!account}\"\/&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;apex:page standardController=\"Contact\"&gt;\n    &lt;c:DynamicObjectViewer rec=\"{!contact}\"\/&gt;\n&lt;\/apex:page&gt;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[271],"tags":[285],"class_list":["post-4040","post","type-post","status-publish","format-standard","hentry","category-visualforce-","tag--visualforce-"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u52a8\u6001 Visualforce \u7ed1\u5b9a - \u767d\u767d\u968f\u7b14<\/title>\n<meta name=\"description\" content=\"\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.ponybai.com\/?p=4040\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u52a8\u6001 Visualforce \u7ed1\u5b9a - \u767d\u767d\u968f\u7b14\" \/>\n<meta property=\"og:description\" content=\"\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.ponybai.com\/?p=4040\" \/>\n<meta property=\"og:site_name\" content=\"\u767d\u767d\u968f\u7b14\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-19T12:29:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-05T07:55:22+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna1.png\" \/>\n<meta name=\"author\" content=\"ponybai\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"ponybai\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\/\/www.ponybai.com\/?p=4040#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=4040\"},\"author\":{\"name\":\"ponybai\",\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"headline\":\"\u52a8\u6001 Visualforce \u7ed1\u5b9a\",\"datePublished\":\"2024-02-19T12:29:28+00:00\",\"dateModified\":\"2023-12-05T07:55:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=4040\"},\"wordCount\":505,\"publisher\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"keywords\":[\"\u52a8\u6001 Visualforce \u7ed1\u5b9a\"],\"articleSection\":[\"Visualforce \u5f00\u53d1\u4eba\u5458\u6307\u5357\"],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.ponybai.com\/?p=4040\",\"url\":\"http:\/\/www.ponybai.com\/?p=4040\",\"name\":\"\u52a8\u6001 Visualforce \u7ed1\u5b9a - \u767d\u767d\u968f\u7b14\",\"isPartOf\":{\"@id\":\"http:\/\/www.ponybai.com\/#website\"},\"datePublished\":\"2024-02-19T12:29:28+00:00\",\"dateModified\":\"2023-12-05T07:55:22+00:00\",\"description\":\"\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a\",\"breadcrumb\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=4040#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.ponybai.com\/?p=4040\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.ponybai.com\/?p=4040#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"http:\/\/www.ponybai.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u52a8\u6001 Visualforce \u7ed1\u5b9a\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.ponybai.com\/#website\",\"url\":\"http:\/\/www.ponybai.com\/\",\"name\":\"\u767d\u767d\u968f\u7b14\",\"description\":\"Salesforce\u5b98\u65b9\u8bb2\u5e08\",\"publisher\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.ponybai.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\",\"name\":\"ponybai\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg\",\"contentUrl\":\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg\",\"width\":248,\"height\":248,\"caption\":\"ponybai\"},\"logo\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"http:\/\/121.37.188.161\"],\"url\":\"http:\/\/www.ponybai.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u52a8\u6001 Visualforce \u7ed1\u5b9a - \u767d\u767d\u968f\u7b14","description":"\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.ponybai.com\/?p=4040","og_locale":"zh_CN","og_type":"article","og_title":"\u52a8\u6001 Visualforce \u7ed1\u5b9a - \u767d\u767d\u968f\u7b14","og_description":"\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a","og_url":"http:\/\/www.ponybai.com\/?p=4040","og_site_name":"\u767d\u767d\u968f\u7b14","article_published_time":"2024-02-19T12:29:28+00:00","article_modified_time":"2023-12-05T07:55:22+00:00","og_image":[{"url":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2024\/02\/dyna1.png"}],"author":"ponybai","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"ponybai","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/www.ponybai.com\/?p=4040#article","isPartOf":{"@id":"http:\/\/www.ponybai.com\/?p=4040"},"author":{"name":"ponybai","@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"headline":"\u52a8\u6001 Visualforce \u7ed1\u5b9a","datePublished":"2024-02-19T12:29:28+00:00","dateModified":"2023-12-05T07:55:22+00:00","mainEntityOfPage":{"@id":"http:\/\/www.ponybai.com\/?p=4040"},"wordCount":505,"publisher":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"keywords":["\u52a8\u6001 Visualforce \u7ed1\u5b9a"],"articleSection":["Visualforce \u5f00\u53d1\u4eba\u5458\u6307\u5357"],"inLanguage":"zh-Hans"},{"@type":"WebPage","@id":"http:\/\/www.ponybai.com\/?p=4040","url":"http:\/\/www.ponybai.com\/?p=4040","name":"\u52a8\u6001 Visualforce \u7ed1\u5b9a - \u767d\u767d\u968f\u7b14","isPartOf":{"@id":"http:\/\/www.ponybai.com\/#website"},"datePublished":"2024-02-19T12:29:28+00:00","dateModified":"2023-12-05T07:55:22+00:00","description":"\u52a8\u6001\u89c6\u89c9\u529b \u7ed1\u5b9a\u662f\u7f16\u5199\u663e\u793a\u4fe1\u606f\u7684\u901a\u7528 Visualforce \u9875\u9762\u7684\u4e00\u79cd\u65b9\u5f0f \u5173\u4e8e\u8bb0\u5f55\uff0c\u800c\u4e0d\u4e00\u5b9a\u77e5\u9053\u8981\u663e\u793a\u54ea\u4e9b\u5b57\u6bb5\u3002\u6362\u8a00\u4e4b\uff0c\u5b57\u6bb5 \u9875\u9762\u662f\u5728\u8fd0\u884c\u65f6\u786e\u5b9a\u7684\uff0c\u800c\u4e0d\u662f\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\u7684\u3002\u8fd9\u5141\u8bb8\u5f00\u53d1\u4eba\u5458\u8bbe\u8ba1\u4e00\u4e2a \u6839\u636e\u6743\u9650\u4e3a\u4e0d\u540c\u53d7\u4f17\u5448\u73b0\u4e0d\u540c\u53d7\u4f17\u7684\u5355\u4e2a\u9875\u9762\uff0c\u6216\u8005 \u504f\u597d\u3002\u52a8\u6001\u7ed1\u5b9a\u5bf9\u4e8e\u6258\u7ba1\u7684 Visualforce \u9875\u9762\u975e\u5e38\u6709\u7528 \u8f6f\u4ef6\u5305\uff0c\u56e0\u4e3a\u5b83\u4eec\u5141\u8bb8\u4ee5\u975e\u5e38 \u5f88\u5c11\u7f16\u7801\u3002\u652f\u6301\u52a8\u6001 Visualforce \u7ed1\u5b9a \u9002\u7528\u4e8e\u6807\u51c6\u548c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u52a8\u6001\u7ed1\u5b9a\u91c7\u7528\u4ee5\u4e0b\u4e00\u822c\u5f62\u5f0f\uff1a","breadcrumb":{"@id":"http:\/\/www.ponybai.com\/?p=4040#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.ponybai.com\/?p=4040"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.ponybai.com\/?p=4040#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"http:\/\/www.ponybai.com\/"},{"@type":"ListItem","position":2,"name":"\u52a8\u6001 Visualforce \u7ed1\u5b9a"}]},{"@type":"WebSite","@id":"http:\/\/www.ponybai.com\/#website","url":"http:\/\/www.ponybai.com\/","name":"\u767d\u767d\u968f\u7b14","description":"Salesforce\u5b98\u65b9\u8bb2\u5e08","publisher":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.ponybai.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":["Person","Organization"],"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883","name":"ponybai","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/","url":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg","contentUrl":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg","width":248,"height":248,"caption":"ponybai"},"logo":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/"},"sameAs":["http:\/\/121.37.188.161"],"url":"http:\/\/www.ponybai.com\/?author=1"}]}},"_links":{"self":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/4040","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4040"}],"version-history":[{"count":2,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/4040\/revisions"}],"predecessor-version":[{"id":4084,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/4040\/revisions\/4084"}],"wp:attachment":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4040"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4040"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4040"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}