Plugin Directory

Changeset 3243323


Ignore:
Timestamp:
02/19/2025 02:30:18 PM (14 months ago)
Author:
voo2021
Message:

release 3.0.2

Location:
voo-shipping
Files:
35 added
6 edited

Legend:

Unmodified
Added
Removed
  • voo-shipping/trunk/includes/config.php

    r3242613 r3243323  
    11<?php
    22
    3 define('SIDEUP_API_URL', 'https://portal.beta.eg.sideup.co/api/');//prod
    4 //define('SIDEUP_API_URL', 'https://sa.dev.sideup.org/api/');//dev
     3//define('SIDEUP_API_URL', 'https://portal.beta.eg.sideup.co/api/');//prod
     4define('SIDEUP_API_URL', 'https://eg.dev.sideup.org/api/');//dev
    55
    66
  • voo-shipping/trunk/includes/orders_page.php

    r3242613 r3243323  
    7878        return;
    7979    }
    80 
    81     $orders = wc_get_orders(array('return' => 'ids'));
     80    $orders = wc_get_orders([
     81        'return' => 'ids',
     82        'limit'  => 15, // Change to desired per_page value
     83    ]);
    8284    if (empty($orders)) {
    8385        return;
    8486    }
     87    $page = isset($_GET['paged']) ? intval($_GET['paged']) : 1; // Get current page from URL
     88
     89    $orders = wc_get_orders([
     90        'return' => 'ids',
     91        'limit'  => 20, // Matches WooCommerce per-page setting
     92        'page'   => $page,
     93    ]);
    8594
    8695    // Prepare keys for the API request
  • voo-shipping/trunk/includes/resources/custom_sideup_areas.php

    r3242613 r3243323  
    55        'key' => "5th Settlement",
    66        'name' => "الحي الخامس", //
    7         'value' => "CAIRO / 5TH SETTLEMENT"
     7        'value' => "5TH SETTLEMENT"
    88    ],
    99    [
    1010        'key' => "Abbaseya",
    1111        'name' => "العباسية", //
    12         'value' => "CAIRO / ABBASEYA"
     12        'value' => "ABBASEYA"
    1313    ],
    1414    [
    1515        'key' => "Downtown",
    1616        'name' => "وسط البلد", //
    17         'value' => "CAIRO / DOWNTOWN"
     17        'value' => "DOWNTOWN"
    1818    ],
    1919    [
    2020        'key' => "El Manyal",
    2121        'name' => "المنيل", //
    22         'value' => "CAIRO / EL MANYAL"
     22        'value' => "EL MANYAL"
    2323    ],
    2424    [
    2525        'key' => "El Salam City",
    2626        'name' => "مدينة السلام", //
    27         'value' => "CAIRO / EL SALAM CITY"
     27        'value' => "EL SALAM CITY"
    2828    ],
    2929    [
    3030        'key' => "Heliopolis",
    3131        'name' => "هليوبوليس", //
    32         'value' => "CAIRO / HELIOPOLIS"
     32        'value' => "HELIOPOLIS"
    3333    ],
    3434    [
    3535        'key' => "Maadi",
    3636        'name' => "المعادي", //
    37         'value' => "CAIRO / MAADI"
     37        'value' => "MAADI"
    3838    ],
    3939    [
    4040        'key' => "Madinaty",
    4141        'name' => "مدينتي", //
    42         'value' => "CAIRO / MADINATY"
     42        'value' => "MADINATY"
    4343    ],
    4444    [
    4545        'key' => "Mohandeseen",
    4646        'name' => "المهندسين", //
    47         'value' => "CAIRO / MOHANDSEEN"
     47        'value' => "MOHANDSEEN"
    4848    ],
    4949    [
    5050        'key' => "Mokatam",
    5151        'name' => "المقطم", //
    52         'value' => "CAIRO / MOKATAM"
     52        'value' => " MOKATAM"
    5353    ],
    5454    [
    5555        'key' => "Nasr City",
    5656        'name' => "مدينة نصر", //
    57         'value' => "CAIRO / NASR CITY"
     57        'value' => "NASR CITY"
    5858    ],
    5959    [
    6060        'key' => "New Cairo",
    6161        'name' => "القاهرة الجديدة", //
    62         'value' => "CAIRO / NEW CAIRO"
     62        'value' => "NEW CAIRO"
    6363    ],
    6464    [
    6565        'key' => "Rehab",
    6666        'name' => "الرحاب", //
    67         'value' => "CAIRO / REHAB"
     67        'value' => "REHAB"
    6868    ],
    6969    [
    7070        'key' => "Shubra",
    7171        'name' => "شبرا", //
    72         'value' => "CAIRO / SHUBRA"
     72        'value' => "SHUBRA"
    7373    ],
    7474    [
    7575        'key' => "Shubra El Kheima",
    7676        'name' => "شبرا الخيمة", //
    77         'value' => "CAIRO / SHUBRA EL KHEIMA"
     77        'value' => "SHUBRA EL KHEIMA"
    7878    ],
    7979    [
    8080        'key' => "Zamalek",
    8181        'name' => "الزمالك", //
    82         'value' => "CAIRO / ZAMALEK"
     82        'value' => "ZAMALEK"
    8383    ],
    8484    [
    8585        'key' => "al badrashin",
    8686        'name' => "البدرشين", //
    87         'value' => "CAIRO / AL BADRASHIN"
     87        'value' => "AL BADRASHIN"
    8888    ],
    8989    [
    9090        'key' => "badr city",
    9191        'name' => "مدينة بدر", //
    92         'value' => "CAIRO / BADR CITY"
     92        'value' => "BADR CITY"
    9393    ],
    9494    [
    9595        'key' => "el obour city",
    9696        'name' => "مدينة العبور", //
    97         'value' => "CAIRO / EL OBOUR CITY"
     97        'value' => "EL OBOUR CITY"
    9898    ],
    9999    [
    100100        'key' => "sherouk city",
    101101        'name' => "مدينة الشروق", //
    102         'value' => "CAIRO / SHEROUK CITY"
     102        'value' => "SHEROUK CITY"
    103103    ],
    104104    [
    105105        'key' => "al matariyyah",
    106106        'name' => "المطرية", //
    107         'value' => "CAIRO / AL MATARIYYAH"
     107        'value' => "AL MATARIYYAH"
    108108    ],
    109109    [
    110110        'key' => "el-marg",
    111111        'name' => "المطرية", //
    112         'value' => "CAIRO / EL-MARG"
     112        'value' => "EL-MARG"
    113113    ],
    114114    [
    115115        'key' => "gesr al suez",
    116116        'name' => "جسر السويس", //
    117         'value' => "CAIRO / GESR AL SUEZ"
     117        'value' => "GESR AL SUEZ"
    118118    ],
    119119    [
    120120        'key' => "Helwan",
    121121        'name' => "حلوان", //
    122         'value' => "HELWAN / HELWAN"
     122        'value' => "HELWAN"
    123123    ],
    124124    [
    125125        'key' => "15 of may city",
    126126        'name' => "مدينة 15 مايو", //
    127         'value' => "HELWAN / 15 OF MAY CITY"
     127        'value' => "15 OF MAY CITY"
    128128    ],
    129129
     
    131131        'key' => "Mohandeseen",
    132132        'name' => "المهندسين", //
    133         'value' => "GIZA / MOHANDSEEN"
     133        'value' => "MOHANDSEEN"
    134134    ],
    135135    [
    136136        'key' => "Haram",
    137137        'name' => "الهرم", //
    138         'value' => "GIZA / HARAM"
     138        'value' => "HARAM"
    139139    ],
    140140    [
    141141        'key' => "Faisal",
    142142        'name' => "فيصل", //
    143         'value' => "GIZA / FAISAL"
     143        'value' => "FAISAL"
    144144    ],
    145145    [
    146146        'key' => "Imbaba",
    147147        'name' => "امبابة", //
    148         'value' => "GIZA / IMBABA"
     148        'value' => "IMBABA"
    149149    ],
    150150    [
    151151        'key' => "Dokki",
    152152        'name' => "الدقي", //
    153         'value' => "GIZA / DOKKI"
     153        'value' => "DOKKI"
    154154    ],
    155155    [
    156156        'key' => "Elwahat",
    157157        'name' => "الواحات", //
    158         'value' => "GIZA / ELWAHAT"
     158        'value' => "ELWAHAT"
    159159    ],
    160160    [
    161161        'key' => "al ayat",
    162162        'name' => "الوايات", //
    163         'value' => "GIZA / AL AYAT"
     163        'value' => "AL AYAT"
    164164    ],
    165165    [
    166166        'key' => "ausim (giza)",
    167167        'name' => "أوسيم (جيزة)", //
    168         'value' => "GIZA / AUSIM (GIZA)"
     168        'value' => "AUSIM (GIZA)"
    169169    ],
    170170    [
    171171        'key' => "el saff",
    172172        'name' => "الصف", //
    173         'value' => "GIZA / EL SAFF"
     173        'value' => "EL SAFF"
    174174    ],
    175175    [
    176176        'key' => "el-hawamdeyya",
    177177        'name' => "الهوامدية", //
    178         'value' => "GIZA / EL-HAWAMDEYYA"
     178        'value' => "L-HAWAMDEYYA"
    179179    ],
    180180    [
    181181        'key' => "hadayek el ahram",
    182182        'name' => "حدائق الأهرام", //
    183         'value' => "GIZA / HADAYEK EL AHRAM"
     183        'value' => "HADAYEK EL AHRAM"
    184184    ],
    185185    //
     
    187187        'key' => "6th of October City",
    188188        'name' => "مدينة 6 أكتوبر", //
    189         'value' => "6TH OF OCTOBER / 6TH OF OCTOBER CITY"
     189        'value' => "6TH OF OCTOBER CITY"
    190190    ],
    191191    [
    192192        'key' => "Sheikh Zayed",
    193193        'name' => "الشيخ زايد", //
    194         'value' => "6TH OF OCTOBER / SHEIKH ZAYED"
     194        'value' => "SHEIKH ZAYED"
    195195    ],
    196196
     
    198198        'key' => "Alexandria",
    199199        'name' => "الإسكندرية", //
    200         'value' => "ALEXANDRIA / ALEXANDRIA"
     200        'value' => "ALEXANDRIA"
    201201    ],
    202202    [
    203203        'key' => "North Coast",
    204204        'name' => "الساحل الشمالي", //
    205         'value' => "ALEXANDRIA / NORTH COAST"
     205        'value' => "NORTH COAST"
    206206    ],
    207207    //
     
    209209        'key' => "Tanta",
    210210        'name' => "طنطا", //
    211         'value' => "GHARBIA / TANTA"
     211        'value' => "TANTA"
    212212    ],
    213213    [
    214214        'key' => "Mahla",
    215215        'name' => "المحلة", //
    216         'value' => "GHARBIA / MAHLA"
     216        'value' => "MAHLA"
    217217    ],
    218218
     
    336336        'key' => "New Valley",
    337337        'name' => "الوادي الجديد", //
    338         'value' => "NEW VALLEY / EL WADI EL GEDID"
     338        'value' => "EL WADI EL GEDID"
    339339    ],
    340340    [
     
    351351        'key' => "Sokhna",
    352352        'name' => "السويس / العين السخنة", //
    353         'value' => "SOKHNA / EL AIN EL SOKHNA"
     353        'value' => "EL AIN EL SOKHNA"
    354354    ],
    355355    [
  • voo-shipping/trunk/public/js/areaMap.json

    r3242613 r3243323  
    2626  "suez": 44,
    2727  "Qalioub": 47,
     28  "Quliob": 47,
    2829  "Monofia": 48,
    2930  "Mansoura": 50,
  • voo-shipping/trunk/public/js/side-up-manger.js

    r3242746 r3243323  
    5151            }
    5252        })
    53         .done(function (response) {
    54             let orderData = Object.values(response.data)[0];
    55 
    56             if (orderData && orderData.prices) {
    57                 let carriersOptions = '';
    58 
    59                 Object.entries(orderData.prices).forEach(([courier, price]) => {
    60                     carriersOptions += `
    61                 <div style="display:inline-block; margin-right: 10px;">
    62                     <input type="radio" name="carrier_${orderId}" value="${courier}" class=".courierSelection" data-order-id="${orderId}" id="carrier_${orderId}">
    63                     <label for="carrier_${orderId}" class="carrier_prices_${orderId}" data-value="${price}">
    64                         ${courier} - ${price} ${currency}
    65                     </label>
    66                 </div>
    67             `;
    68                 });
    69 
    70                 couriersPricesContainer.html(carriersOptions);
    71             } else {
    72                 couriersPricesContainer.html('<span class="text-danger">No pricing data available.</span>');
    73             }
    74         })
    75         .fail(function (jqXHR) {
    76             couriersPricesContainer.html('<span class="text-danger">Failed to fetch courier prices.</span>');
    77             console.error("AJAX Error:", jqXHR.responseText);
    78         });
     53            .done(function (response) {
     54                let orderData = Object.values(response.data)[0];
     55
     56                if (orderData && orderData.prices) {
     57                    let carriersOptions = '';
     58
     59                    Object.entries(orderData.prices).forEach(([courier, price]) => {
     60                        carriersOptions += `
     61                    <div style="display:inline-block; margin-right: 10px;">
     62                        <input type="radio" name="carrier_${orderId}" value="${courier}" class=".courierSelection" data-order-id="${orderId}" id="carrier_${orderId}">
     63                        <label for="carrier_${orderId}" class="carrier_prices_${orderId}" data-value="${price}">
     64                            ${courier} - ${price} ${currency}
     65                        </label>
     66                    </div>
     67                `;
     68                    });
     69
     70                    couriersPricesContainer.html(carriersOptions);
     71                } else {
     72                    couriersPricesContainer.html('<span class="text-danger">No pricing data available.</span>');
     73                }
     74            })
     75            .fail(function (jqXHR) {
     76                couriersPricesContainer.html('<span class="text-danger">Failed to fetch courier prices.</span>');
     77                console.error("AJAX Error:", jqXHR.responseText);
     78            });
    7979    }
    8080
     
    9090        let totalPrice = $(this).data('total-price');
    9191        let dropArea = $(this).data('drop-area');
     92        let products = $(this).data('products');
    9293        let totalPriceContext = $(this).data('total-price-context');
    9394        let customerName = $(this).data('customer-name');
     
    9596        let customerShippingPhone = $(this).data('customer-phone');
    9697
    97                             // $('.phone_' + orderId).val(customerShippingPhone);
     98        // $('.phone_' + orderId).val(customerShippingPhone);
    9899        // let customerPhone = $('.phone_' + orderId).val();
    99100        let address = $(this).data('address');
     
    106107
    107108        let model = `
    108                             <div style="max-height: 400px; overflow-y: auto;">
    109                                 <table class="table table-borderless table-striped table-hover">
    110                                     <tr class="">
    111                                         <th style="width: 10%;">ID</th>
    112                                         <th style="width: 15%;">Customer Name</th>
    113                                         <th style="width: 10%;">Phone</th>
    114                                         <th style="width: 15%;">Payment Method</th>
    115                                         <th style="width: 10%;">Total Cost</th>
    116                                         <th style="width: 40%;">Couriers</th>
    117                                     </tr>
    118                                     <tr  data-order-id="${orderId}"
    119                                                 data-order-key="${order_key}"
    120                                                 data-address="${address}"
    121                                                 data-drop-area="${dropAreaName}"
    122                                                data-total-price="${totalPrice}"
    123                                                data-customer-name="${customerName}"
    124                                                data-customer-phone="${customerShippingPhone}">
    125                                      
    126                                         <td>${orderId}</td>
    127                                         <td>${customerName}</td>
    128                                         <td>
    129                                             <input type="text" class="phone_${orderId}" value="${customerShippingPhone}">
    130                                         </td>
    131                                         <td>
    132                                             <select class="form-control-lg paymentMethod_${orderId}" name="paymentMethod_${orderId}">
    133                                                 <option selected>Select Payment Method</option>
    134                                                 <option value="4" selected>Cash On Delivery</option>
    135                                                 <option value="1">Credit Card (Visa or Mastercard)</option>
    136                                                 <option value="3">Zero Cash Collection</option>
    137                                             </select>
    138                                         </td>
    139                                       <td class="total-price-context">
    140                                             <label class="d-flex align-items-center">
    141                                                 <input type="text" class="price_${orderId} form-control w-50" value="${totalPrice}">
    142                                                 <span class="ms-2">${currency}</span>
    143                                             </label>
    144                                         </td>
    145 
    146                                         <td class="couriers-prices_${orderId}">
    147                                          
    148                                         </td>
    149                                     </tr>
    150                                     <tr>
    151                                         <td colspan="6" class="text-end">
    152                                             <button type="button" class="btn btn-primary confirm_shipment">Ship</button>
    153                                         </td>
    154                                     </tr>
    155                                 </table>
    156                             </div>
    157                         `;
     109    <div style="max-height: 400px; overflow-y: auto;">
     110        <table class="table table-borderless table-striped table-hover" style="width: 100%; table-layout: fixed;">
     111            <tr>
     112                <th style="width: 8%;">ID</th>
     113                <th style="width: 18%;">Customer Name</th>
     114                <th style="width: 12%;">Phone</th>
     115                <th style="width: 12%;">Other Phone</th>
     116                <th style="width: 15%;">Payment Method</th>
     117                <th style="width: 10%;">Total Cost</th>
     118                <th style="width: 25%;">Couriers</th>
     119            </tr>
     120            <tr data-order-id="${orderId}"
     121                data-order-key="${order_key}"
     122                data-address="${address}"
     123                data-drop-area="${dropAreaName}"
     124                data-total-price="${totalPrice}"
     125                data-customer-name="${customerName}"
     126                data-customer-phone="${customerShippingPhone}"
     127                data-products="${products}">
     128               
     129                <td>${orderId}</td>
     130                <td>${customerName}</td>
     131                <td>
     132                    <input type="text" class="phone_${orderId} form-control" style="width: 100%;" value="${customerShippingPhone}" placeholder="01012345678, 01198765432, 01555555555">
     133                </td>
     134                <td>
     135                    <input type="text" class="receiver_extra_phone${orderId} form-control" style="width: 100%;" value="" placeholder="01012345678, 01198765432, 01555555555">
     136                </td>
     137                <td>
     138                    <select class="form-control paymentMethod_${orderId}" name="paymentMethod_${orderId}" style="width: 100%;">
     139                        <option selected>Select Payment Method</option>
     140                        <option value="4" selected>Cash On Delivery</option>
     141                        <option value="1">Credit Card (Visa or Mastercard)</option>
     142                        <option value="3">Zero Cash Collection</option>
     143                    </select>
     144                </td>
     145                <td class="total-price-context">
     146                    <label class="d-flex align-items-center">
     147                        <input type="text" class="price_${orderId} form-control w-50" value="${totalPrice}">
     148                        <span class="ms-2">${currency}</span>
     149                    </label>
     150                </td>
     151                <td class="couriers-prices_${orderId}"></td>
     152            </tr>
     153            <tr>
     154                <td colspan="7" class="text-end">
     155                    <button type="button" class="btn btn-primary confirm_shipment">Ship</button>
     156                </td>
     157            </tr>
     158        </table>
     159    </div>
     160`;
    158161
    159162        Swal.fire({
     
    235238                currency: currency
    236239            };
    237                 console.log("Updated Payment Method:", newPaymentMethod);
     240            console.log("Updated Payment Method:", newPaymentMethod);
    238241            fetchPricingSingleOrderOnClick(orderId, newPaymentMethod, orderData, dropAreaName);
    239242
     
    282285            let totalPrice = $(`.price_${orderId}`).val() || "0.00"; // Fix: Retrieve total price correctly
    283286            let customerPhone = $(`.phone_${orderId}`).val() || "0000000000";
     287            let customerOtherPhone = $(`.receiver_extra_phone${orderId}`).val() || "0000000000";
    284288
    285289
     
    287291            let courier = orderRow.find(`input[name="carrier_${orderId}"]:checked`).val();
    288292            if (!courier) {
    289                 console.warn(`No courier selected for Order ID ${orderId}`);
    290                 return;
    291             }
     293                alert(`Error: missing courier for Order ID ${orderId}.`);
     294            }
     295            if (!customerPhone || customerPhone.length  <  11 && isValidEgyptianPhone(customerPhone)) {
     296                alert(`Error: Invalid or missing phone number for Order ID ${orderId}.`);
     297            }
     298
     299
    292300
    293301            let foundArea = cities_and_zones.find(area => area.value === dropArea || area.key === dropArea);
     
    305313                zero_cash_collection: paymentMethod == "3" ? true :false,
    306314                total_cash_collection: paymentMethod == "3" ?  "0.00" : totalPrice.toString(),
    307                 backup_mobile: '',
    308315                name: customerName,
    309316                phone: customerPhone,
     317                backup_mobile: customerOtherPhone,
    310318                area_id: areaParsed[findDropAreaName] || null,
    311319                address: address,
     
    313321            };
    314322
    315 console.log(shipment);
    316 
    317             if (!shipments.some(s => s.woocommerce_id === orderKey)) {
    318                 shipments.push(shipment);
    319             } else {
    320                 console.warn(`Shipment for Order ID ${orderId} already exists.`);
    321             }
    322             submitOrder(shipment);
     323            if (
     324                courier &&
     325                areaParsed[findDropAreaName] != null &&
     326                customerPhone && customerPhone.trim() !== "" &&
     327                customerPhone.length >= 11 && isValidEgyptianPhone(customerPhone)
     328            ){
     329                submitOrder(shipment );
     330
     331                Swal.fire({
     332                    title: 'Processing Shipment...',
     333                    text: 'Please wait while we process your order.',
     334                    allowOutsideClick: false,
     335                    didOpen: () => {
     336                        Swal.showLoading(); // Show loading indicator
     337                    }
     338                });
     339            }
    323340
    324341        });
     342
    325343
    326344        let requestData = {
     
    331349
    332350
    333 function submitOrder(request) {
     351    function submitOrder(request) {
    334352        $.ajax({
    335353            url:  baseURL+'orders',
     
    423441
    424442
     443    function isValidEgyptianPhone(phone) {
     444        let egyptianRegex = /^(?:\+20|0020|0)?(10|11|12|15)[0-9]{8}$/;
     445        return egyptianRegex.test(phone);
     446    }
    425447
    426448    function overrideStates() {
    427          $('#_shipping_state').empty();
    428 
    429          let options = '';
    430 
    431          for (let city = 0; city < sideupSettings.cities_and_zones.length; city++) {
    432              let selected = (sideupSettings.selected_shipping_state === sideupSettings.cities_and_zones[city].key ||
    433                  sideupSettings.selected_shipping_state === sideupSettings.cities_and_zones[city].value)
    434                  ? 'selected' : '';
    435 
    436              options += '<option value="' + sideupSettings.cities_and_zones[city].key + '" ' + selected + '>' + sideupSettings.cities_and_zones[city].key + '</option>';
    437          }
    438          $('#_shipping_state').append(options);
    439          $('#_billing_state').empty();
    440 
    441          let billing_options = '';
    442          for (let city = 0; city < sideupSettings.cities_and_zones.length; city++) {
    443              let selected = (sideupSettings.selected_billing_state === sideupSettings.cities_and_zones[city].key ||
    444                  sideupSettings.selected_billing_state === sideupSettings.cities_and_zones[city].value)
    445                  ? 'selected' : '';
    446 
    447              billing_options += '<option value="' + sideupSettings.cities_and_zones[city].key + '" ' + selected + '>' + sideupSettings.cities_and_zones[city].key + '</option>';
    448          }
    449          $('#_billing_state').append(billing_options);
    450      }
     449        $('#_shipping_state').empty();
     450
     451        let options = '';
     452
     453        for (let city = 0; city < sideupSettings.cities_and_zones.length; city++) {
     454            let selected = (sideupSettings.selected_shipping_state === sideupSettings.cities_and_zones[city].key ||
     455                sideupSettings.selected_shipping_state === sideupSettings.cities_and_zones[city].value)
     456                ? 'selected' : '';
     457
     458            options += '<option value="' + sideupSettings.cities_and_zones[city].key + '" ' + selected + '>' + sideupSettings.cities_and_zones[city].key + '</option>';
     459        }
     460        $('#_shipping_state').append(options);
     461        $('#_billing_state').empty();
     462
     463        let billing_options = '';
     464        for (let city = 0; city < sideupSettings.cities_and_zones.length; city++) {
     465            let selected = (sideupSettings.selected_billing_state === sideupSettings.cities_and_zones[city].key ||
     466                sideupSettings.selected_billing_state === sideupSettings.cities_and_zones[city].value)
     467                ? 'selected' : '';
     468
     469            billing_options += '<option value="' + sideupSettings.cities_and_zones[city].key + '" ' + selected + '>' + sideupSettings.cities_and_zones[city].key + '</option>';
     470        }
     471        $('#_billing_state').append(billing_options);
     472    }
    451473
    452474});
  • voo-shipping/trunk/views/ship_model.php

    r3242613 r3243323  
    1111          data-order-key="<?php echo $order_key?>"
    1212          data-address="<?php echo $shipping_address?>"
     13         data-products="<?php echo $desc?>>"
    1314        >
    1415            Ship
Note: See TracChangeset for help on using the changeset viewer.