Η EMDI μπορεί να κατεβάζει παραγγελίες, πελάτες και είδη και να ενημερώνει διαθεσιμότητες σε πολλά e-shop ταυτόχρονα, μέσω μιας κοινής γέφυρας πολλαπλών καταστημάτων (multishop bridge). Στην πράξη η EMDI «βλέπει» μία γέφυρα· αυτή μοιράζει τα αιτήματα σε κάθε e-shop.
Άνοιξε τον κώδικα της γέφυρας εδώ: emdi_multishop_bridge.php (ανοιχτός κώδικας).
Βήματα
- Εγκατέστησε και δοκίμασε τη κανονική γέφυρα σε κάθε e-shop χωριστά (WooCommerce, OpenCart κ.λπ.) μέχρι να δουλεύει μόνη της με την EMDI.
- Ανέβασε το emdi_multishop_bridge.php σε έναν προσβάσιμο φάκελο (συνήθως στο κύριο e-shop ή σε κοινό hosting) και όρισε μέσα του:
$passkey— το ίδιο κλειδί που θα βάλεις στην EMDI- τα URL κάθε γέφυρας e-shop (με το δικό τους
key=) - μοναδικό
order_prefixγια κάθε επιπλέον κατάστημα (π.χ.EM)
- Στην EMDI, στις Ρυθμίσεις → σύνδεση Internet / γέφυρα, βάλε ως διεύθυνση το URL του multishop script και ως κλειδί το
$passkey— όπως σε μία κανονική γέφυρα. Εφάρμοσε τους συνδέσμους ώστε να γεμίσουν ταaction=orders,order,customers,products,updatestockκ.λπ. στοbridge.ini.
Προσοχή
- Ο κωδικός πελάτη να έχει διαφορετικό πρόθεμα ανά e-shop.
- Αν τα είδη είναι κοινά, οι κωδικοί ειδών να είναι ίδιοι σε όλα τα e-shop.
- Ο αριθμός παραγγελίας πρέπει να έχει διαφορετικό πρόθεμα ανά e-shop, ώστε η κοινό γέφυρα να ξέρει σε ποιο κατάστημα να στείλει
order/confirmorder/cancelorder.
Στη γέφυρα του δεύτερου (και κάθε επιπλέον) e-shop όρισε το πρόθεμα παραγγελίας, π.χ.:
|
1 |
$order_id_prefix='EM'; |
Λίγο πριν από τη γραμμή if ($action == 'deletetmp') αφαίρεσε το πρόθεμα από το $orderid που έρχεται από την EMDI:
|
1 2 |
$orderid=str_ireplace($order_id_prefix,'',$orderid); if ($action == 'deletetmp') { ... |
Στο action=orders, στο echo της γραμμής παραγγελίας, βάλε το πρόθεμα πριν τον αριθμό:
|
1 |
echo $order_id_prefix.$id.';' ... |
Η κοινή γέφυρα ενώνει τις λίστες (παραγγελίες / πελάτες / είδη), αφαιρεί τη διπλή γραμμή κεφαλίδας από το 2ο κατάστημα και μετά, όταν η EMDI ανοίγει ή επιβεβαιώνει παραγγελία, επιλέγει το σωστό e-shop από το πρόθεμα και του στέλνει το orderid χωρίς το πρόθεμα.
Πλήρες παράδειγμα (ρυθμιστικό αρχείο — άλλαξε URL, κλειδιά και προθέματα):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
<?php /*------------------------------------------------------------------------ # EMDI - multishop bridge by SBZ systems - Solon Zenetzis - version 2 # ------------------------------------------------------------------------ # Aggregates two (or more) shop bridges into one endpoint for EMDI. # EMDI Settings → Internet links: point domain/key at THIS script like a normal bridge. # ------------------------------------------------------------------------ # author SBZ systems - Solon Zenetzis # copyright Copyright (C) 2020-2026 sbzsystems.com. All Rights Reserved. # @license - https://www.gnu.org/licenses/gpl-2.0.html GNU/GPL # Websites: https://www.sbzsystems.com -------------------------------------------------------------------------*/ header('Cache-Control: no-cache, must-revalidate'); header('Content-Type: text/html; charset=UTF-8'); error_reporting(0); // --- configure --- $passkey = 'CHANGE_ME'; // must match the key=… EMDI sends // Each shop: full bridge URL including its own key= (without action) $eshops = array( array( 'url' => 'https://eshop1.gr/emdi_wp_woo_bridge.php?company=ike&key=12245325', 'order_prefix' => '', // main shop: no order-id prefix ), array( 'url' => 'https://eshop2.com/emdi_open2_bridge.php?key=235232354235', 'order_prefix' => 'EM', // unique prefix; also set in that shop bridge when echoing order ids ), ); // --- request --- $productid = isset($_REQUEST['productid']) ? $_REQUEST['productid'] : ''; if ($productid !== '' && function_exists('mb_check_encoding') && !mb_check_encoding($productid, 'UTF-8')) { $productid = @iconv('ISO-8859-7', 'UTF-8//IGNORE', $productid); } $stock = isset($_REQUEST['stock']) ? $_REQUEST['stock'] : ''; $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; $orderid = isset($_REQUEST['orderid']) ? $_REQUEST['orderid'] : ''; $key = isset($_REQUEST['key']) ? $_REQUEST['key'] : ''; $shipcomp = isset($_REQUEST['shipcomp']) ? $_REQUEST['shipcomp'] : ''; $voucherno = isset($_REQUEST['voucherno']) ? $_REQUEST['voucherno'] : ''; $docid = isset($_REQUEST['docid']) ? $_REQUEST['docid'] : ''; if ($key !== $passkey) { exit; } function emdi_ms_fetch($url) { $ctx = stream_context_create(array( 'http' => array('timeout' => 60, 'ignore_errors' => true), 'ssl' => array('verify_peer' => true, 'verify_peer_name' => true), )); $out = @file_get_contents($url, false, $ctx); return ($out === false) ? '' : $out; } function emdi_ms_shop_url($base, $query) { $sep = (strpos($base, '?') === false) ? '?' : '&'; return $base . $sep . 'rndval=' . rand(10000000, 90000000) . '&' . $query; } function emdi_ms_strip_header_row($csv) { return preg_replace('/^.+(\r\n|\n|\r)/', '', $csv, 1); } function emdi_ms_find_shop($eshops, $orderid) { // Longest matching prefix wins (empty prefix = fallback / main shop) $best = null; $bestLen = -1; foreach ($eshops as $shop) { $p = isset($shop['order_prefix']) ? (string)$shop['order_prefix'] : ''; if ($p === '') { if ($best === null) { $best = $shop; $bestLen = 0; } continue; } if (mb_stripos($orderid, $p) === 0 && mb_strlen($p) > $bestLen) { $best = $shop; $bestLen = mb_strlen($p); } } return $best; } function emdi_ms_orderid_for_shop($orderid, $shop) { $p = isset($shop['order_prefix']) ? (string)$shop['order_prefix'] : ''; if ($p === '') { return $orderid; } if (mb_stripos($orderid, $p) === 0) { return mb_substr($orderid, mb_strlen($p)); } return str_ireplace($p, '', $orderid); } if ($action === 'deletetmp' || $action === 'customersok' || $action === 'productsok' || $action === 'updatestock') { foreach ($eshops as $shop) { $q = 'action=' . rawurlencode($action); if ($action === 'updatestock') { $q .= '&productid=' . rawurlencode($productid) . '&stock=' . rawurlencode($stock); } echo emdi_ms_fetch(emdi_ms_shop_url($shop['url'], $q)); } exit; } if ($action === 'customers' || $action === 'products' || $action === 'orders') { $first = true; foreach ($eshops as $shop) { $raw = emdi_ms_fetch(emdi_ms_shop_url($shop['url'], 'action=' . rawurlencode($action))); if ($first) { echo $raw; $first = false; } else { echo emdi_ms_strip_header_row($raw); } } exit; } if ($action === 'order' || $action === 'confirmorder' || $action === 'cancelorder') { $shop = emdi_ms_find_shop($eshops, $orderid); if ($shop === null) { exit; } $oid = emdi_ms_orderid_for_shop($orderid, $shop); $q = 'action=' . rawurlencode($action) . '&orderid=' . rawurlencode($oid); if ($action === 'confirmorder') { $q .= '&docid=' . rawurlencode($docid) . '&shipcomp=' . rawurlencode($shipcomp) . '&voucherno=' . rawurlencode($voucherno); } echo emdi_ms_fetch(emdi_ms_shop_url($shop['url'], $q)); exit; } ?> |
Πηγή: https://github.com/sbzsystems/emdi-eshop-bridges-connectors/blob/gh-pages/emdi_multishop_bridge.php
