Salesforce 通过列表按钮跳转到标准创建页面

谈一下业务场景:

(一)我在教师对象下,新建一个学生(学生有个字段查找教师),当我们点击标准的新建按钮时,“我的教师”字段它是保持空的,我们想要它默认为当前的教师,所以就需要我们将当前的教师Id携带到“新建页面”,这种场景我之前的解决方案是:通过新建“列表按钮”代替标准的新建按钮,列表按钮跳转到一个VF页面,VF页面需要做的就是重定向到“新建页面”并携带参数;

(二)如果我在新建数据之前,还想做一些操作,比如学生字段下有“个人信息”字段,我想从其他系统获取学生的个人信息,在新建学生之前先去搜索学生个人信息,那就需要在第一个场景中的VF页面去画一个搜索框,这样做的话,就是VF页面基本是一个H5,要自己去做UI。想到替代的方案:利用Aura或LWC组件代替VF。

注:这里并不是直接新建Aura或LWC,然后直接拖到布局,注意标题我提到的是“列表按钮”,因为在相关列表下新建数据,能显示的按钮只能是“列表按钮”类型

1. Aura实现

(1)在代码中创建Aura组件

MyStudentCreateCMP.cmp

<aura:component
    implements="
        flexipage:availableForAllPageTypes,
        force:appHostable,
        forceCommunity:availableForAllPageTypes,
        lightning:isUrlAddressable,
        force:lightningQuickAction">
        
    <aura:handler name="init" value="{! this }" action="{! c.initialize }"/>

    <aura:attribute name="tid" type="String" />
    <aura:attribute name="pageReference" type="Object" />
    <aura:attribute name="url" type="String" />

    <lightning:navigation aura:id="navService"/>
    <lightning:pageReferenceUtils aura:id="pageRefUtils"/>

    <section role="dialog" tabindex="-1" aria-modal="true" aria-labelledby="modal-heading-01" class="slds-modal slds-fade-in-open">
        <div class="slds-modal__container">
            <div class="slds-modal__header">
                <h1 id="modal-heading-01" class="slds-modal__title slds-hyphenate">跳转到标准新建弹窗</h1>
            </div>
            <div class="slds-modal__content slds-p-around_medium" id="modal-content-id-1">
            </div>
            <div class="slds-modal__footer">
                <lightning:button variant="neutral" label="取消" onclick="{! c.handleCancel }"/>
                <lightning:button variant="brand" label="保存" onclick="{! c.handleSave }"/>
            </div>
        </div>
    </section>
    <div class="slds-backdrop slds-backdrop_open" role="presentation"></div>

</aura:component>
复制代码

MyStudentCreateCMPController.js

({
    initialize: function (component) {
        // 获取父ID
        let tid = component.get("v.pageReference").state.c__sid;
        component.set('v.tid', tid);
    },

    handleSave: function (cmp) {
        let tid = cmp.get('v.tid');

        let navService = cmp.find("navService");
        let pageRef = {
            type: "standard__objectPage",
            attributes: {
                objectApiName: "MyStudent__c",
                actionName: "new"
            },
            state: {}
        }
        let defaultFieldValues = {
            teacherName__c: tid
        };
        pageRef.state.defaultFieldValues = cmp.find("pageRefUtils").encodeDefaultFieldValues(defaultFieldValues);
        navService.navigate(pageRef);
    },

    handleCancel: function (cmp, event) {
        let navEvt = $A.get("e.force:navigateToSObject");
        navEvt.setParams({
            "recordId": cmp.get('v.tid'),
            "slideDevName": "related"
        });
        navEvt.fire();
    }
})
复制代码

最后需要注意的是:有些组件的功能需要48.0以上的版本,所以在MyStudentCreate-meta.xml中最好改高点的版本:<apiVersion>52.0</apiVersion>

(2)部署代码,去Salesforce设置-对象管理器-学生-按钮、链接或操作-新建操作,把代码中新建的Aura创建出来,新建完后,可以看到自己的组件名称:MyStudentCreateCMP

image.png

(3)在返回“新建按钮或链接”,创建列表按钮,选择“列表按钮”,url的内容可参考官方文档(Lightning Component Type),它的Url格式是 /cmp/{componentName}?c__myAttr=attrValue,这里插入的参数是教师Id,可根据实际的业务需求改变

image.png

(4)将“列表按钮”显示到布局,在上图的左下角有一行是“列表试图按钮布局”,进入然后编辑(注:截图中的“新建学生”等于上图的“新建学生Aura”),将“新建学生Aura”添加到右边,保存

image.png

(5)进入任意教师-相关-新建学生Aura,点击跳转到Aura弹窗,弹窗中间空白可以填充自己的布局,和相应的逻辑处理,在这里我已经将教师ID保存,点击“保存”后,会将Id携带到标准的创建页面,并自动赋值

image.png

image.png

image.png

2. LWC实现

(1)在代码中,新建lwc组件(lwcTest是我创建的名字,这个名字乱取的)

lwcTest.html

<template>
    <section role="dialog" tabindex="-1" aria-modal="true" aria-labelledby="modal-heading-01" class="slds-modal slds-fade-in-open">
        <div class="slds-modal__container">
            <div class="slds-modal__header">
                <h1 id="modal-heading-01" class="slds-modal__title slds-hyphenate">跳转到标准新建弹窗</h1>
            </div>
            <div class="slds-modal__content slds-p-around_medium" id="modal-content-id-1">
            </div>
            <div class="slds-modal__footer">
                <lightning-button variant="neutral" label="取消" title="Looks like a link" onclick={handleCancel}></lightning-button>
                <lightning-button variant="brand" label="保存" class="slds-m-left_x-small" onclick={handleClick1} ></lightning-button>
            </div>
        </div>
    </section>
    <div class="slds-backdrop slds-backdrop_open" role="presentation"></div>
</template>
复制代码

lwcTest.js

import {LightningElement, wire} from 'lwc';
import {CurrentPageReference,NavigationMixin} from 'lightning/navigation';
import { encodeDefaultFieldValues } from 'lightning/pageReferenceUtils';

export default class LwcTest extends NavigationMixin(LightningElement) {

    tid = '';

    // 初始化获取url参数
    @wire(CurrentPageReference)
    getStateParameters(currentPageReference) {
        if (currentPageReference) {
            this.tid = currentPageReference.state.c__sid
        }
    }

    // 保存按钮
    handleClick1(event) {
        let defaultFieldValues = {
            teacherName__c: this.tid
        };
        this[NavigationMixin.Navigate]({
            type: 'standard__objectPage',
            attributes: {
                objectApiName: 'MyStudent__c',
                actionName: 'new'
            },
            state: {
                defaultFieldValues: encodeDefaultFieldValues(defaultFieldValues)
            }
        });
    }

    // 取消按钮
    handleCancel() {
        let tid = this.tid;
        this[NavigationMixin.Navigate]({
            type: 'standard__recordPage',
            attributes: {
                recordId: tid,
                objectApiName: 'MyTeacher__c',
                actionName: 'view'
            }
        });
    }
}
复制代码

同样需要注意API版本,还有在Aura中,我们需求去implements一些组件,在lwc也是同样的,但是它是在xml文件中配置,以下是lwcTest.js-meta.xml

<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>52.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__AppPage</target>
        <target>lightning__RecordPage</target>
        <target>lightning__HomePage</target>
        <target>lightning__UtilityBar</target>

        <target>lightning__Tab</target>

        <target>lightning__RecordAction</target>

        <target>lightningCommunity__Page</target>
    </targets>
    <targetConfigs>
        <targetConfig targets="lightning__RecordAction">
            <actionType>ScreenAction</actionType>
        </targetConfig>
    </targetConfigs>
</LightningComponentBundle>
复制代码

(2)部署以上文件后,不同于Aura在设置中新建操作,目前我发现跟Aura同样的操作后,然后跳转到/cmp/c__lwcTest,不能成功跳转,解决的方法是,在设置-选项卡-Lightning组件选项卡,注意名字是用于列表按钮的url跳转

image.png

(3)新建“列表按钮”,url也发生改变,还是参考官网文档(Navigation Item Page Type),url格式为:/n/{apiName}

image.png

(4)同样将列表按钮拖到布局,实现的效果是一样的(本来Aura已经实现了业务需求,但是感觉LWC会逐渐代替Aura,对于刚刚入门Salesforce干脆就用LWC吧)

image.png

参考文档:[1]. 跳转页面类别[2]. Aura跳转到标准创建页面[3]. LWC跳转跳转创建页面

猜你喜欢

转载自juejin.im/post/7110443082260152350