{"id":2534,"date":"2017-08-21T15:42:21","date_gmt":"2017-08-21T15:42:21","guid":{"rendered":"https:\/\/answers.gurussolutions.com\/answers\/how-to-generate-dynamic-content-links-and-pages-in-netsuite-suitelets-2\/"},"modified":"2026-07-28T18:25:00","modified_gmt":"2026-07-28T18:25:00","slug":"comment-generer-des-liens-et-des-pages-de-contenu-dynamique-dans-les-suitelets-netsuite","status":"publish","type":"qa_entry","link":"https:\/\/answers.gurussolutions.com\/fr\/answers\/comment-generer-des-liens-et-des-pages-de-contenu-dynamique-dans-les-suitelets-netsuite\/","title":{"rendered":"Comment g\u00e9n\u00e9rer des liens et des pages de contenu dynamique dans les Suitelets NetSuite ?"},"content":{"rendered":"","protected":false},"template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","ga_subtitle":"Utilisez les URI de donn\u00e9es au sein des Suitelets NetSuite pour cr\u00e9er de mani\u00e8re dynamique des fichiers t\u00e9l\u00e9chargeables ou des pages Web temporaires sans avoir besoin de stocker physiquement les fichiers.","ga_short_answer":"Pour g\u00e9n\u00e9rer du contenu dynamique sans URI physique dans NetSuite, encodez vos donn\u00e9es (par exemple, au format CSV ou HTML) en BASE64. Int\u00e9grez ces donn\u00e9es encod\u00e9es directement dans l\u2019attribut href d\u2019une balise d\u2019ancrage en utilisant un sch\u00e9ma d\u2019URI \u00ab data: \u00bb pour les t\u00e9l\u00e9chargements, ou ouvrez-les dans une nouvelle fen\u00eatre \u00e0 l\u2019aide de window.open pour les pages Web dynamiques dans SuiteScript 2.1.","ga_scenario":"Les utilisateurs de NetSuite peuvent avoir besoin de g\u00e9n\u00e9rer du contenu dynamique, tel que des fichiers CSV t\u00e9l\u00e9chargeables ou des pages HTML temporaires, sans avoir \u00e0 cr\u00e9er ni \u00e0 stocker de fichiers physiques ou d\u2019URI d\u00e9di\u00e9s. Cela s\u2019av\u00e8re particuli\u00e8rement utile pour les exportations de donn\u00e9es \u00e0 la vol\u00e9e ou pour regrouper plusieurs pages d\u2019impression de transactions en une seule vue c\u00f4t\u00e9 client.","ga_solution":"Pour g\u00e9n\u00e9rer du contenu dynamique sans URI physique dans NetSuite, le processus consiste \u00e0 encoder les donn\u00e9es au format BASE64, puis \u00e0 les int\u00e9grer dans une URI de type \u00ab data: \u00bb. Cette approche prend en charge \u00e0 la fois les t\u00e9l\u00e9chargements directs de fichiers et la cr\u00e9ation de pages Web temporaires c\u00f4t\u00e9 client. 1.  **G\u00e9n\u00e9ration et encodage des donn\u00e9es :** Commencez par pr\u00e9parer le contenu souhait\u00e9 (par exemple, une cha\u00eene CSV ou une cha\u00eene HTML). Ce contenu doit ensuite \u00eatre encod\u00e9 au format BASE64 afin de r\u00e9duire sa taille et de garantir un traitement correct au sein de l\u2019URI. Dans SuiteScript 2.1, le module N\/encode est utilis\u00e9 pour l\u2019encodage BASE64.2.  **Mise en \u0153uvre pour le t\u00e9l\u00e9chargement d\u2019un fichier CSV (exemple de Suitelet) :** Un Suitelet peut \u00eatre utilis\u00e9 pour afficher un lien qui, lorsqu\u2019on clique dessus, permet de t\u00e9l\u00e9charger un fichier CSV g\u00e9n\u00e9r\u00e9 dynamiquement. Le sch\u00e9ma d\u2019URI \u00ab data: \u00bb est directement int\u00e9gr\u00e9 dans l\u2019attribut href d\u2019une balise d\u2019ancrage.\n\n```\njavascript\/** * @NApiVersion 2.1 * @NScriptType Suitelet *\/define(['N\/ui\/serverWidget', 'N\/encode'], function(serverWidget, encode) {    function onRequest(context) {        if (context.request.method === 'GET') {            var form = serverWidget.createForm({                title: 'My New Form',                hideNavBar: false            });            \/\/ Placeholder for dynamic CSV content generation            var myContent = 'Header1,Header2nValue1,Value2nValue3,Value4';            var encodedContent = encode.convert({                string: myContent,                inputEncoding: encode.Encoding.UTF_8,                outputEncoding: encode.Encoding.BASE_64            });            var field = form.addField({                id: 'custpage_download',                type: serverWidget.FieldType.INLINEHTML,                label: 'Download CSV'            });            field.defaultValue = '<a href=\"data:text\/csv;base64,' + encodedContent + '\" download=\"myFile.csv\">myFile.csv<\/a>';            context.response.writePage(form);        }    }    return {        onRequest: onRequest    };});\n```\n\nCe Suitelet affichera une page comportant un lien intitul\u00e9 \u00ab myFile.csv \u00bb. Lorsqu\u2019un utilisateur clique sur ce lien ou effectue un clic droit puis s\u00e9lectionne \u00ab Enregistrer sous\u2026 \u00bb, un fichier CSV physique nomm\u00e9 \u00ab myFile.csv \u00bb sera t\u00e9l\u00e9charg\u00e9, contenant les donn\u00e9es g\u00e9n\u00e9r\u00e9es dynamiquement.3.  **Mise en \u0153uvre pour une page HTML dynamique (ouverture c\u00f4t\u00e9 client) :** Pour g\u00e9n\u00e9rer dynamiquement et ouvrir une page HTML dans un nouvel onglet ou une nouvelle fen\u00eatre du navigateur, le contenu HTML est d\u2019abord encod\u00e9 en BASE64. L\u2019URI de donn\u00e9es qui en r\u00e9sulte peut ensuite \u00eatre utilis\u00e9 avec la m\u00e9thode window.open(). Cela s\u2019av\u00e8re utile pour regrouper plusieurs pages d\u2019impression de transactions ou pour afficher du contenu temporaire g\u00e9n\u00e9r\u00e9 c\u00f4t\u00e9 client.\n\n```\njavascript\/\/ This example demonstrates generating HTML content and opening it in a new browser tab.\/\/ Note: The N\/encode module is a server-side module. For purely client-side encoding\/\/ within a browser, the native btoa() function would typically be used.\/\/ This snippet assumes 'encode' is available in the current scope, for instance,\/\/ if the 'uriContent' is prepared server-side and then passed to a client script.var html = '<html><head><title>This is a fake web page<\/title><\/head><body><p>blablablablabla.. here there could be links, images, links, whatever we can do in html<\/p><\/body><\/html>';var uriContent = 'data:text\/html;base64,' + encode.convert({    string: html,    inputEncoding: encode.Encoding.UTF_8,    outputEncoding: encode.Encoding.BASE_64});window.open(uriContent);\n```\n\nL\u2019ex\u00e9cution de ce code ouvrira un nouvel onglet ou une nouvelle fen\u00eatre de navigateur affichant le contenu HTML g\u00e9n\u00e9r\u00e9 dynamiquement.Consid\u00e9rations relatives aux performances : il est important de noter que l\u2019utilisation d\u2019URI \u00ab data: \u00bb implique que l\u2019ensemble du contenu est charg\u00e9 en m\u00e9moire c\u00f4t\u00e9 client. Pour les fichiers tr\u00e8s volumineux ou les structures HTML complexes, cela peut avoir un impact notable sur les performances du navigateur de l\u2019utilisateur.","ga_source_author":"","ga_source_author_email":"","ga_date_original":"2017-08-21T11:42:21-04:00","ga_date_verified":"2026-07-05","ga_source_subject":"How to generate a page or a link without having an actual URI","ga_ans_id":"ANS-0795","ga_publish_decision":"publish_with_edits","ga_staleness_risk":"high","ga_review_priority":"spot_check","ga_tier2_verdict":"partially_outdated","ga_tier2_concerns":"The `nlapiEncrypt` function is outdated; `N\/encode` module should be used for BASE64 encoding in SuiteScript 2.1.; The `nlapiCreateForm` function is outdated; `N\/ui\/serverWidget.createForm` is the SuiteScript 2.1 equivalent.; The `form.addField` method signature with positional arguments is outdated; in SuiteScript 2.1, it expects an options object.; The `response.writePage` method is still valid, but in SuiteScript 2.1, it's typically accessed via `context.response.writePage`.","ga_final_category":"SuiteScript Development","footnotes":""},"ga_category":[108,23,108],"ga_audience":[10],"ga_difficulty":[92],"class_list":["post-2534","qa_entry","type-qa_entry","status-publish","hentry","ga_category-developpement-suitescript","ga_category-suitescript-development","ga_audience-developer-suitescript","ga_difficulty-niveau-intermediaire"],"taxonomy_info":{"ga_category":[{"value":108,"label":"D\u00e9veloppement SuiteScript"},{"value":23,"label":"SuiteScript Development"},{"value":108,"label":"D\u00e9veloppement SuiteScript"}],"ga_audience":[{"value":10,"label":"Developer\/SuiteScript"}],"ga_difficulty":[{"value":92,"label":"Niveau interm\u00e9diaire"}]},"featured_image_src_large":[],"author_info":[],"comment_info":"","_links":{"self":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/2534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry"}],"about":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/types\/qa_entry"}],"version-history":[{"count":1,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/2534\/revisions"}],"predecessor-version":[{"id":4454,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/2534\/revisions\/4454"}],"wp:attachment":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=2534"}],"wp:term":[{"taxonomy":"ga_category","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_category?post=2534"},{"taxonomy":"ga_audience","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_audience?post=2534"},{"taxonomy":"ga_difficulty","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_difficulty?post=2534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}