Tengo una duda bastante técnica sobre las posibilidades de ampliación de los servicios existentes:
En particular, necesito cambiar la funcionalidad de un método en el servicio cart-store-api.api.service.js . La llamada a la API también debe transmitir el campo item.payload para permitir pasar la carga útil personalizada al crear elementos de línea en el administrador:
getPayloadForItem(item, salesChannelId, isNewProductItem, id) { let dummyPrice = null; if (this.shouldPriceUpdated(item, isNewProductItem)) { dummyPrice = deepCopyObject(item.priceDefinition); dummyPrice.taxRules = item.priceDefinition.taxRules; dummyPrice.quantity = item.quantity; dummyPrice.type = this.mapLineItemTypeToPriceType(item.type); } return { items: [ { id: id, referencedId: id, label: item.label, quantity: item.quantity, type: item.type, description: item.description, priceDefinition: dummyPrice, stackable: true, removable: true, salesChannelId, // this is what I want to add payload: item.payload }, ], }; }Encontré esta guía que explica cómo se pueden decorar los servicios, SIN EMBARGO, no logré extender el servicio cartStoreApi porque no parece tener un 'nombre técnico' (encontré estos globales.types.ts donde a muchos servicios se les asigna una clave - como 'acl' para aclService). Entonces mi problema es que no puedo decorar cartStoreService porque no conozco su identificador de referencia.
De aquí surgen dos preguntas:
¡muchas gracias!
Hay bastante diferencia entre ampliar y decorar un servicio. Si se adapta a sus necesidades, puede usar el servicio simplemente extendiéndolo, como CartStoreService extiende ApiService . Luego puede usarlo como su servicio personalizado en su complemento. Si realmente desea decorarlo, lo que significa que modificará cada llamada al servicio desde cualquier lugar, tal vez solo intente acceder a él en el contenedor de servicios como se indica en los documentos, no estoy seguro de que globals.types.ts esté completo .
Ok, logré resolver mi problema. Así es como se ve la solución:
Shopware.Application.addServiceProviderDecorator( "cartStoreService", (service) => { const decoratedMethod = service.getPayloadForItem; service.getPayloadForItem = function (item, salesChannelId, isNewProductItem, id) { const returnValue = decoratedMethod.call(service, item, salesChannelId, isNewProductItem, id) returnValue.items[0]['payload'] = item.payload // <-- reason for this whole decoration: pass custom payload to API return returnValue }; return service; } );