/ / Vytvorte nový košík Prestashop vo vlastnom php - php, prestashop, košík

Vytvorte nový prehliadač Prestashop v vlastnom php - php, prestashop, cart

V Prestashope som vytvoril vlastný formulár, kde somzobraziť zoznam všetkých výrobkov a používateľ môže naplniť príslušné množstvá. Odoslaním formulára vyčistím košík, vyplním ho novými hodnotami a nakoniec presmerujem na stránku pokladne.

Všetko funguje dobre, ale iba keď je vozíkuž existuje. V prípade prázdneho košíka (cart_id == null) nemôžem pridať produkty. Pokúsil som sa niekoľkými spôsobmi vytvoriť košík $, ale nepodarilo sa mi to.

Nezískam žiadne výnimky, kód sa vykonábez chýb, je to len tak, že na konci stránky s platbami zostane košík prázdny; opakujem, iba keď už bol košík prázdny. V prípade košíka s produktmi je proces dokonalý !

Ocenil by som v tejto veci pomoc.

Tu je môj malý kontrolór, ktorý získava výrobky a množstvá z formulára a pridáva ich do košíka:

include("../../config/config.inc.php");
include("../../header.php");

// Filling the array of products
$products = array();
foreach ($_POST as $key => $value)
if (substr($key, 0, 9) === "quantity_")
$products[substr($key, 9)] = $value;

// First of all, we remove all products
$prods = $cart->getProducts();
foreach ($prods as $prod)
$cart->deleteProduct($prod["id_product"]);

// Adding the new products
foreach ($products as $product_id => $quantity)
if ($quantity > 0)
$cart->updateQty($quantity, $product_id);

// Redirecting to the checkout page.
header("Location: " . $_POST["redirect"]);
exit();`

Vopred ďakujem!

odpovede:

7 pre odpoveď č. 1

Mal som rovnaký problém s tým, že Prestashop správne nevytvoril nový košík pri volaní do CartCore mnohými rôznymi spôsobmi - nefungovali ani kontextové ani priame volania.

Našiel tento klenot od niekoho iného priamo tu:

// get cart id if exists
if ($this->context->cookie->id_cart)
{
$cart = new Cart($this->context->cookie->id_cart);
}

// create new cart if needed
if (!isset($cart) OR !$cart->id)
{
$cart = new Cart();
$cart->id_customer = (int)($this->context->cookie->id_customer);
$cart->id_address_delivery = (int)  (Address::getFirstCustomerAddressId($cart->id_customer));
$cart->id_address_invoice = $cart->id_address_delivery;
$cart->id_lang = (int)($this->context->cookie->id_lang);
$cart->id_currency = (int)($this->context->cookie->id_currency);
$cart->id_carrier = 1;
$cart->recyclable = 0;
$cart->gift = 0;
$cart->add();
$this->context->cookie->id_cart = (int)($cart->id);
$cart->update();
}

Teraz to funguje pre mňa. Ako vidíte, ide to trochu viac do hĺbky, ako len požiadať kontext, aby získal alebo vytvoril nový košík. hth.


4 pre odpoveď č. 2

Pravdepodobne budete musieť zahrnúť tento riadok, keď ste mimo triedy

$context = Context::getContext();

A potom pridajte premennú košíka, ktorá definuje atribúty košíka (v prípade, že priradíte ID)

$cart = $context->cart; // gets the cart id or creates a new one

Teraz by to malo fungovať

BR (nezabudnite prijať odpoveď, ak vám pomôže :))


1 pre odpoveď č. 3

Ako doplnok k predchádzajúcim príspevkom.

Ak nastavíte túto konfiguráciu: Configuration::updateValue("PS_CART_FOLLOWING", 1) (namiesto vytvárania nového vždy zobrazte posledný košík zákazníka).

ID košíka dostanete vždy $this->context->cart->id na NULL pri pokuse o vytvorenie nového košíka pri prvom prihlásení zákazníka (po vytvorení nového účtu) pomocou nasledujúceho kódu:

if (is_null($this->context->cart)) {

$this->context->cart =
new Cart($this->context->cookie->id_cart);
}

Podarí sa mi vyriešiť problém pridaním kódu po vytvorení neplatného košíka.

/**
* Manage the possible errors when trying to create
*    a new cart for a customer.
*
* The new cart is saved in the current context ($this->context->cart).
*/
private function createCart()
{
if (is_null($this->context->cart)) {

$this->context->cart =
new Cart($this->context->cookie->id_cart);
}

if (is_null($this->context->cart->id_lang)) {
$this->context->cart->id_lang = $this->context->cookie->id_lang;
}

if (is_null($this->context->cart->id_currency)) {
$this->context->cart->id_currency = $this->context->cookie->id_currency;
}

if (is_null($this->context->cart->id_customer)) {
$this->context->cart->id_customer = $this->context->cookie->id_customer;
}

if (is_null($this->context->cart->id_guest)) {

if (empty($this->context->cookie->id_guest)){
$this->context->cookie->__set(
"id_guest",
Guest::getFromCustomer($this->context->cookie->id_customer)
);
}
$this->context->cart->id_guest = $this->context->cookie->id_guest;
}

if (is_null($this->context->cart->id)) {

$this->context->cart->add();

$this->context->cookie->__set("id_cart", $this->context->cart->id);
}
}

Po inicializácii košíka týmto spôsobom teraz môžem bez problémov pridávať produkty do košíka.

Dobrý úspech všetkým