1

http://thesitedoctor.co.uk/portfolio/avenue-clothingcom/で利用可能なデモ カミソリ ストアの上に基づいて uCommerce サイトを構築する際に問題が発生しました。

デモでは、バスケット機能に servicestack と ucommerceapi を使用します。

ユーザーが [購入] をクリックした時点で (注文明細行の) バスケットに動的プロパティを追加しようとしています。productpage.js ファイルをトレースし、コードを修正して新しいプロパティ (「メッセージ」) を追加しました。

function (data) {
var variant = data.Variant;
$.uCommerce.addToBasket(
{
    sku: variant.Sku,
    variantSku: variant.VariantSku,
    quantity: qty,
    message: $('#personalisedMessage').val()
},
function () {
    updateCartTotals(addToCartButton);
}
);
});

firebugを使用して、投稿されているデータを確認しました

addToExistingLine: true
message: "this is a message"
quantity:"1" 
sku: "Product (options: none)"
variantSku:""

これを投稿してもエラーは発生しませんが、それが機能したかどうかはわかりません.OrderPropertyテーブルに保存されると仮定すると、データベースで見つけることができません. このシナリオでは、バリエーションのない製品を「購入」しています。

これでどんな助けでも大歓迎です。

4

1 に答える 1

0

そのままでは、そのような API を介して注文/品目のプロパティを追加することはできません。追加した API ペイロードは指定されていますが、有効な JSON は API によって解釈/使用されません。

代わりに、独自のメソッドを API に追加する必要があります。これを行うには、IUCommerceApiService からサービスを実装する必要があります。その後、必要なことを行うことができます。以下に例 (テストされていません) を作成しました。これは便利な機能だと思うので、デモ ストアに追加します。

public class AddOrderLineProperty
{
    public int? OrderLineId { get; set; }

    public string Sku { get; set; }

    public string VariantSku { get; set; }

    public string Key { get; set; }

    public string Value { get; set; }
}
public class AddOrderLinePropertyResponse : IHasResponseStatus
{
    public AddOrderLinePropertyResponse() { }

    public AddOrderLinePropertyResponse(UCommerce.EntitiesV2.OrderLine line)
    {
        if (line == null)
        {
            UpdatedLine = new LineItem();
            return;
        }

        var currency = SiteContext.Current.CatalogContext.CurrentCatalog.PriceGroup.Currency;
        var lineTotal = new Money(line.Total.Value, currency);

        UpdatedLine = new LineItem()
        {
            OrderLineId = line.OrderLineId,
            Quantity = line.Quantity,
            Sku = line.Sku,
            VariantSku = line.VariantSku,
            Price = line.Price,
            ProductName = line.ProductName,
            Total = line.Total,
            FormattedTotal = lineTotal.ToString(),
            UnitDiscount = line.UnitDiscount,
            VAT = line.VAT,
            VATRate = line.VATRate
        };
    }

    public ResponseStatus ResponseStatus { get; set; }

    public LineItem UpdatedLine { get; set; }
}
public class AddOrderLinePropertyService : ServiceBase<AddOrderLineProperty>, IUCommerceApiService
{
    protected override object Run(AddOrderLineProperty request)
    {
        var orderLineId = request.OrderLineId;
        var sku = request.Sku;
        var variantSku = request.VariantSku;

        var orderLine = findOrderLine(orderLineId, sku, variantSku);
        addPropertyToOrderLine(orderLine, request.Key, request.Value);

        TransactionLibrary.ExecuteBasketPipeline();
        var newLine = findOrderLine(orderLineId, sku, variantSku);
        return new AddOrderLinePropertyResponse(newLine);
    }

    private void addPropertyToOrderLine(OrderLine orderLine, string key, string value)
    {
        if (orderLine == null)
            return;

        orderLine[key] = value;

        orderLine.Save();
    }

    private static OrderLine findOrderLine(int? orderLineId, string sku, string variantSku)
    {
        return orderLineId.HasValue
                            ? getOrderLineByOrderLineId(orderLineId)
                            : getOrderLineBySku(sku, variantSku);
    }

    private static OrderLine getOrderLineBySku(string sku, string variantSku)
    {
        return String.IsNullOrWhiteSpace(variantSku)
                            ? getOrderLines().FirstOrDefault(l => (l.Sku == sku))
                            : getOrderLines().FirstOrDefault(l => (l.Sku == sku && l.VariantSku == variantSku));
    }

    private static OrderLine getOrderLineByOrderLineId(int? orderLineId)
    {
        return getOrderLines().FirstOrDefault(l => l.OrderLineId == orderLineId);
    }

    private static ICollection<OrderLine> getOrderLines()
    {
        return TransactionLibrary.GetBasket().PurchaseOrder.OrderLines;
    }
}

次のように、新しいメソッドを uCommerce.jQuery.js に追加する必要があります。

addOrderLineProperty: function (options, onSuccess, onError) {
    var defaults = {
        orderLineId: 0
    };
    var extendedOptions = $.extend(defaults, options);
    callServiceStack({ AddOrderLineProperty: extendedOptions }, onSuccess, onError);
}

使用上の問題があればお知らせください。

ティム

于 2013-07-09T06:59:46.377 に答える