Page 1 of 2

[solved]Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products

Posted: Sat Sep 11, 2010 3:04 pm
by lapak
Pořád si hraju s poměrně specifickým e-shopem, a ted jsem se zase zasekl na vytváření možností doručení atd. (bude stránka, kde si zákazník vybere poručení českou poštou, PPL, osobně atd.) Jelikož jsem nenašel shipping modul, který by podporoval výběr různých metod doručení a k tomu třeba ještě umožňoval poštovné zdarma při určité částce, tak jsem se to rozhodl řešit jednoduše pomocí produktů - tj. budu mít produkt "česká pošta", "PPL", atd. a stránku, kde si uživatel vybírá způsob doručení, tak jednoduše udělám template tak, aby si tím vpodstatě vložil adekvátní produkt do košíku... No ale tady navstává problém, že kdyby toto uživatel udělal, pak se vrátil jinam na stránky a znovu projel tou procedurou výběru, tak mu to tam ten produkt dá podruhé (prostě druhé poštovné). Proto chci na začátek stránky pro ten výber poštovného dát samrty nebo UDT, který zkontroluje jestli už poštovné (tj. produkt s určitým id) v košíku není a pokud je, tak ho smaže (a uživatel pak pokračuje a vybere si ho znovu...).

Zatím jsem se dostal k tomuto, na stránce, která bude sloužit pro výber poštovného:

{Cart product=7} // pod tímto id je produkt - poštovné
{Cart action='viewcart' viewcarttemplate='viewcart_init'} // zde volaná šablona je úplně prázdna, pouze potřebuji naplnit proměnné, které používá Cart

a nyní, když si nechám vypsat {$cartitems|print_r}
tak tam mám, jestli to dobře chápu array a v ní Objekty, které představují jednotlivé produkty. Pro jistotu vám to sem dám, pořád těm objektům moc nerozumím: (v tomto případě jsou v košíku dva produkty)

Code: Select all

stdClass Object ( [product_id] => 2 [sku] => 00301 [quantity] => 1 [base_price] => 0 [type] => 1 [pending] => [unit_weight] => 0 [unit_price] => 123 [summary] => Makové snění Platno - 20x30 (123.00)  [item_total] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/product_2 [flds] => Array ( [image] => stdClass Object *RECURSION* [pomer_stran] => stdClass Object *RECURSION* ) [categories] => Array ( [0] => stdClass Object ( [id] => 1 [name] => Bokeh [value] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/categories/1 ) [1] => stdClass Object ( [id] => 2 [name] => Detail a zátiší [value] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/categories/2 ) [2] => stdClass Object ( [id] => 3 [name] => Anything else [value] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/categories/3 ) ) [quantity_box] =>  [remove_box] =>  ) stdClass Object ( [product_id] => 7 [sku] => [quantity] => 1 [base_price] => 100 [type] => 1 [pending] => [unit_weight] => 0 [unit_price] => 100 [summary] => Poštovné - Česká Pošta  [item_total] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/product_7 [flds] => Array ( [image] => stdClass Object *RECURSION* [pomer_stran] => stdClass Object *RECURSION* ) [categories] => Array ( [0] => stdClass Object ( [id] => 1 [name] => Bokeh [value] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/categories/1 ) [1] => stdClass Object ( [id] => 2 [name] => Detail a zátiší [value] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/categories/2 ) [2] => stdClass Object ( [id] => 3 [name] => Anything else [value] => [file_location] => http://localhost/linnette-obrazy/uploads/Products/categories/3 ) ) [quantity_box] =>  [remove_box] =>  ) Array Array

Takže teď potřebuji smarty nebo udt, které přijde na začátek té stránky, ve smyslu:
{foreach from objekty v $cartitems}
{if id produktu = x}
 smaž z $cartitems objekt s tímto produktem
{/if}
{/foreach}

Doufám že mě chápete a díky za všechny odpovědi a nápady :)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 5:06 am
by osxfil
když vydržíš pár dní, tak bych se na to mohl podívat. Teď mám zrovna na localhostu rozdělaný projekt se Shop/CartMadeSImple, který musím přesunout na hosting (až to schválí klient) a pak bych si tam mohl nainstalovat Calguyovo moduly (bohužel nelze mít nainstalované obě verze současně)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 10:21 am
by lapak
osxfil wrote: když vydržíš pár dní, tak bych se na to mohl podívat. Teď mám zrovna na localhostu rozdělaný projekt se Shop/CartMadeSImple, který musím přesunout na hosting (až to schválí klient) a pak bych si tam mohl nainstalovat Calguyovo moduly (bohužel nelze mít nainstalované obě verze současně)
To bych ti byl zavázán, nemusíš spěchat, budu rád za každou radu, smarty dokumentace je opravdu bídná a metodu pokus-omyl už jsem asi taky vyčerpal :)

Btw jak ty řešíš tyhle možnosti doručení? Ma to shop made simple nějak líp vyřešený? Teda na tenhle projekt ho použít nemůžu, protože tam docela nutně potřebuju trošku advanced podporu atribut u produktů, ale třeba pro příště...

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 2:11 pm
by osxfil
V CartMadeSimple se dá nastavit více způsobů dopravy, u kterých se dá nastavit paušální cena za dopravu nebo cena na základě hmotnosti + počet dní na doručení zásilky. Taky se dá nastavit, že zákazník musí souhlasit před odesláním objednávky s obchodními podmínkami (ty mohou být buď ve formě krátké zprávy nebo extra stránky) a počet dní na doručení. Kombinaci ceny za dopravy s možností dopravy zdarma při dosažení určité hodnoty objednávky jsem ještě neřešil, takže to bude premiéra, ale myslím, že to půjde :)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 5:38 pm
by kuzmany
Ahoj,

aj ked je to divne, naozaj e-commerce (Products, Cart, Orders) nastrojoch nie je mozne vyberat z viacerych moznosti dorucenia. Vzdy je mozne mat zapnuty len jede shippigng modul a tie teraz vedia robit cenu len podla hmotnosti, krajiny nakupujuceho alebo vysky ceny objednaneho tovaru.

Myslim ze podobny pripad je az s platobnymi branami, vzdy je mozne mat na iba jednu platobnu branu, ci uz Paypal alebo platba kartou, ale nie je mozne aby si klient vybral jednu z moznosti.

To su asi najhlavnejsie dovody, preco e-coomerce v CMS nevyuzivaju, aj ked to je robustny system a je na to kopec sikovnych addonov (ManyBasket, Promotions atd)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 5:41 pm
by kuzmany
Inac na to tvoje riesenie zabudni, to co si pisal neverim ze moze realne fungovat :) Bez zasahu do PHP to nevyries (lepsie bude asi pouzit Shop Made Simple atd, aj ked tieto moduly nepoznam vobec)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 5:56 pm
by lapak
Shop made simple nemůžu použít protože nepodporuje atributy u produktů a zrovna u tohodle shopu je to docela klíčová vlastnost... Ale řešení přes zvlášť produkty pro ty způsoby doručení není zas takovej problém, přece když mám nějakou array, tak nemůže být takovej problém z ni jeden záznam smazat, já jen neznám tu syntaxi... Zbytek už pomocí pár cyklů a podmínek nebude problém, opravdu jediné co potřebuji tak kód, kterej smaže jeden záznam v array... Pokud víte jak na tohle, tak mě třeba alespoň pošťouchněte :) správný názvy proměnných atd. už si tam doplním...

Každopádně díky za odpovědi

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Tue Sep 14, 2010 9:59 pm
by kuzmany
Cez Smarty priamo to asi nepojde, mozno od verzie 3, ktora je este v RC

Ale da sa to smelo napr cez UDT. Staci si ho vytvorit, ako parameter mu predat ten object a s tym objectom potom pracovat v PHP cez $params["mojobject"] . A uz si treb urobit len foreach, urobit unset a vratit cez $smarty->assign('cartitems',$novyobject). Mozno bude fungovat:)

Ale je to salamunske riesenie

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Wed Sep 15, 2010 5:08 am
by osxfil
přesně něco takové mám na mysli, ale musím se k tomu dostat, abych to vyzkoušel.

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Thu Sep 16, 2010 11:58 am
by lapak
Tak sem se pustil do studia PHP a nakonec smazání jedné položky v té array vůbec nebylo složitý :) Zatím můj UDT vypadá takhle:

Code: Select all

$cartitems = $params['cartitems'];

$i = 0;
while ($i <= (count($cartitems)-1)) {
 if($cartitems[$i]->product_id == 7) {
  unset($cartitems[$i]);
 };
$i++;
};

$cartitems = array_values($cartitems);
$smarty->assign('cartitems', $cartitems);
Takže docílím toho, že mám na konci v smarty proměnné {$cartitems} opravdu jenom produkty bez poštovného. No ale narazil jsem na to, že teď to musím nějak uložit tam, kde modul Cart tyhle údaje uchovává, protože teď, když se vrátím do košíku, tak tam to poštovné pořád je, protže si Cart ty údaje bere samozřejmě odněkud jinud, než z mojí zbrusunové proměnné a já nevím odkud :)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Thu Sep 16, 2010 5:48 pm
by kuzmany
protže si Cart ty údaje bere samozřejmě odněkud jinud, než z mojí zbrusunové proměnné a já nevím odkud :)
[/quote]

bingo! :) smarty je sablonovaci system, stara sa len o vystup dat. spracovvanie dat robi samotny modul a je nutna modifikacie PHP suborov. K tvojmu rieseniu som skepticky :) a ani som ho nepochopil ;)

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Thu Sep 16, 2010 6:43 pm
by lapak
kuzmany wrote: protže si Cart ty údaje bere samozřejmě odněkud jinud, než z mojí zbrusunové proměnné a já nevím odkud :)
bingo! :) smarty je sablonovaci system, stara sa len o vystup dat. spracovvanie dat robi samotny modul a je nutna modifikacie PHP suborov. K tvojmu rieseniu som skepticky :) a ani som ho nepochopil ;)
[/quote]

Tak někam se ty data ukládat musí a php soubory to nebudou :) Může to být databáze, můžou to být cookies, může to být session, všechno je přeci editovatelný i mým php souborem, aniž bych editoval core toho modulu. Já jenom právě nechápu systém, jakým to Cart ukládá, abych ho pak mohl alterovat, proto sem píšu, protože někdo ten systém chápat musí :)

Moje řešení okleštilo aktuální seznam produktů o ty co tam nechci, tudíž pokud ho použiju třeba před výpisem košíku, tak tam opravdu nebudou, ale v tom úložišti Cartu pořád jsou, takže jakmile si pro ně sáhne jinej modul, např. Orders, tak ten je tam opět vidí...

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Thu Sep 16, 2010 7:30 pm
by lapak
A taky že ukládá, je to v session cgcart a je to base64 encodovany, takže když jsem si udělal UDT:

Code: Select all

echo base64_decode($_SESSION[cgcart]);
tak dostanu (v tomto příkladě jsou v košíku dva produkty:)

Code: Select all

a:2:{i:0;O:17:"cg_ecomm_cartitem":15:{s:26:"cg_ecomm_cartitem_source";s:8:"Products";s:30:"cg_ecomm_cartitem_product_id";i:2;s:23:"cg_ecomm_cartitem_sku";s:5:"00301";s:28:"cg_ecomm_cartitem_quantity";i:1;s:30:"cg_ecomm_cartitem_base_price";d:0;s:30:"cg_ecomm_cartitem_attributes";a:1:{i:0;O:8:"stdClass":5:{s:9:"attribset";i:11;s:8:"attrname";s:8:"Varianta";s:4:"name";s:14:"Platno - 20x30";s:10:"adjustment";s:3:"123";s:3:"sku";s:5:"00301";}}s:24:"cg_ecomm_cartitem_type";i:1;s:29:"cg_ecomm_cartitem_estimated";b:0;s:27:"cg_ecomm_cartitem_pending";b:0;s:31:"cg_ecomm_cartitem_unit_weight";d:0;s:30:"cg_ecomm_cartitem_unit_price";N;s:27:"cg_ecomm_cartitem_summary";s:55:"Makové snění Platno - 20x30 (123.00) ";s:30:"cg_ecomm_cartitem_item_total";N;s:32:"cg_ecomm_cartitem_subscription";N;s:41:"cg_ecomm_cartitem_allow_quantity_adjust";b:1;}i:1;O:17:"cg_ecomm_cartitem":15:{s:26:"cg_ecomm_cartitem_source";s:8:"Products";s:30:"cg_ecomm_cartitem_product_id";i:5;s:23:"cg_ecomm_cartitem_sku";s:0:"";s:28:"cg_ecomm_cartitem_quantity";i:1;s:30:"cg_ecomm_cartitem_base_price";d:0;s:30:"cg_ecomm_cartitem_attributes";a:2:{i:0;O:8:"stdClass":5:{s:9:"attribset";i:7;s:8:"attrname";s:8:"Velikost";s:4:"name";s:5:"20x30";s:10:"adjustment";s:3:"100";s:3:"sku";s:4:"0511";}i:1;O:8:"stdClass":5:{s:9:"attribset";i:8;s:8:"attrname";s:3:"Typ";s:4:"name";s:10:"Fotopapír";s:10:"adjustment";s:2:"+0";s:3:"sku";s:4:"0521";}}s:24:"cg_ecomm_cartitem_type";i:1;s:29:"cg_ecomm_cartitem_estimated";b:0;s:27:"cg_ecomm_cartitem_pending";b:0;s:31:"cg_ecomm_cartitem_unit_weight";d:0;s:30:"cg_ecomm_cartitem_unit_price";N;s:27:"cg_ecomm_cartitem_summary";s:65:"Hejna racků 20x30 (100.00) Fotopapír  ";s:30:"cg_ecomm_cartitem_item_total";N;s:32:"cg_ecomm_cartitem_subscription";N;s:41:"cg_ecomm_cartitem_allow_quantity_adjust";b:1;}}
Z toho jsem zatím vyčetl, že to začíná vzorem x:x:{
kde v té závorce pro každý produkt platí, že: i:x;O:x:"cg_ecomm_cartitem":...
a product id najdu "cg_ecomm_cartitem_product_id";i:5

Tak teď, ještě s php stále začínam :) je tohle nějakeý zápis, který lze třeba zase převést na array a zpět (s kterou by se asi značně líp pracovalo) nebo cms s tím pracuje v této podobě? Pokud ano, tak nezbývá než pomocí nějakých string funkcí rozdělit na jednotlivé produkty, zkontrolovat jestli ten product_id je jeden z mých, určených a následně to spojit dohromady, bez těch částí s daným prod_id. Pak už jen base64_encode a vrátit do session není asi problém...

EDIT:
jak celý kód začína a:x, tak x označuje počet produktů v košíku, to celý bude opravdu nějakej textovej zápis arrays ne?

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Thu Sep 16, 2010 9:11 pm
by lapak
tak a mam to hotovo :)

tak pro zuhlednění te proměnné stačila funkce unserialize() a pak už jsem měl mně známé array s Objekty jakožto jednotlivými produkty, takže finální UDT vypadá takto:


$id_postovneho == 7; //zadej id produktu postovne

$lin_items = unserialize(base64_decode($_SESSION[cgcart]));

$i = 0;
while ($i get_product_id() == $id_postovneho) {
  unset($lin_items[$i]);
};
$i++;
};

$lin_items = array_values($lin_items);

$lin_towrite = base64_encode(serialize($lin_items));

$_SESSION["cgcart"] = $lin_towrite;


Z košíku úspěšně vymaže produkt s daným id... Dík za pomoc chlapi

Re: Smarty nebo UDT pro vymazání určitého produktu z košíku - Cart, Products, ...

Posted: Fri Sep 17, 2010 5:20 am
by osxfil
No, spíš uznání tobě, že jsi na to přišel v podstatě sám :)