Jump to content

Moduły a multistore


theDoris

Recommended Posts

Witajcie, dawno temu zrobiłam prosty moduł posiadam słabą wiedze w php ale po wielu staraniach zaczął działąć. Zasada działania jest prosta moduł tworzy nową tabelę w db i w konfiguracji produktu moge uzupełnić pola które się później wyświetlają na stronie produktu, dla każdego produktu jest mozliwość wyświetlenia innych informacji. Teraz mam zamiar uruchomić multistore więc tak myślę że skoro jest tworzona tylko jedna tabela to z automatu te same wartości zostaną przedstawione w drugim sklepie, a właśnie tego chcę uniknąć. Nie chce dublować modułu ponieważ tylko zwiekszy się lista zakładek natomiast chcę się dowiedzieć jak to działa że dla każdego sklepu z osobna można przy użyciu jednego modułu konfigurować wyświetlaną treść. Może mi ktoś przybliżyć zasadę działania, ewentualnie jak powinna wyglądać konstrukcja takiego modułu? Szukałam w panelu modułu zbliżonego działaniem jednak nie widzę nic co działa tylko na stronie produktu, może jest jakiś darmowy moduł gdzie moge takie coś podejrzeć?

 

Jeszcze dla spełnienia informacji tabelę w module tworzę tak:

 

$sql = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'product_custom_values` (
          `id_product` int(10) unsigned NOT NULL,
          `value_numbers_one` float unsigned NOT NULL,
          `value_numbers_two` float unsigned NOT NULL DEFAULT 1,
          `value_name_string` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
          PRIMARY KEY (`id_product`)
        ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8';

 

 

Potrzebuję dobrej rady która pchnie mnie do działania :D

Link to comment
Share on other sites

a jak wg tego modulu wprowadzasz te zmienne? masz rozbudowany rowniez panel edycji produktu?

 

teoretycznie, powinno sie to robic za pomoca helperow i kontrolerow. obecnie juz bardzo rzadko, chyba tylko stara szkola uzywa sie update czy insert table ;) ale, jak psizesz, nie masz zbytniej wiedzy w PHP to raczej z kontrolerami bedzie ciezko... tam nic nie jest oczywiste :D ale ozesz to zrobic o wiele prosciej.. .w sumie uzyskujac podobny efekt. tylko pytanie wlasnie jak wprowadzasz te zmiany. czy normalnie przez insert/update table? wtedy sprawa by byla prosta, ale trzeba by uwazac na to, zeby zmiany byly w multistore wykonywane dla poszczegolnego sklepu a nie grup sklepow. mianowicie, towrzysz w tabeli nowa kolumne id_shop i w niej zapisjesz odpowiednie ID danego sklepu, w ktorym wlasnie wprowdzasz zmiany. i w sumie tyle, to samo przy odczycie z select wprowadzasz 'where' dla id_shop, tego odczytujesz z $params i masz juz rozwarstwienie zmiennej po multi.

Link to comment
Share on other sites

Wszystko wywołuję selectem, natomiast zapis robię REPLACE INTO, wszystkie zmiany mam na karcie produktu jako dodatkowa złaładka wczytuje sobie plik z inputami, a pózniej już rozdzielam to sobie na poszczególne hooki i w smarty przekazuje do pliku wyjściowego, dzieki za naprowadzenie mojego myślenia to wszystko brzmi prosto tylko jedno pytanie jak pobrać id danego sklepu?

 

I jeszcze sprawa primary key w tej chwili jest dla id produktu, a może się to id przecież powtórzyć w multistore.

Link to comment
Share on other sites

no, jezeli zrobisz dodatkowa kolumne z id_shop to na pewno sie powtrzy, polacz sobie zaleznosc primary z id_product do id_shop. jak pobrac zmienna sklepu? to tez zalezy, czy dane pobierasz bezporenio z kontrolera i dopiero wysylasz je do hook (do tpl) czy wysylasz wszystko i dopeiro w tpl pobierasz np. po foreach czy zaleznosciach od jakiegos tam paramertru. w samym kontrolerze tez masz wiele rozwaizan, albo jak pisalem, pobierasz z $params, albo z cookie, albo, chyba najbardziej porapwnie z contextu ;) [$this->context->shop->id] a co za tym idzie z fukcji clasy Shop:: getContextShopID()

Link to comment
Share on other sites

  • 3 weeks later...

Czasu brakowało żeby to na bieżąco wtedy sprawdzić, dzisiaj siadłam od rana i gotowe, multistore działa już w module.

 

Teraz mam ochotę powalczyć dalej i dodać multilanguage, z początku myślałam że zasada będzie ta sama jak z multistore, samo pobranie języka przecież jest dostępne po zmiennej $languages w smarty. Tylko trapi mnie to jak dodać wybór języka podczas wprowadzania treści, moduły które przeglądałam wszystkie korzystają z helper i w zasadzie całą obsługę modułu mają w kontrolerze, ja inputy mam w tplu. Nie do końca rozumie te helpery i sam sposób zapisu przez nie, jeśli możesz mi jeszcze wytłumaczyć zasadę dodawania, oraz samego działanie multilanguage będę miała z czym się zmierzyć na kolejne wolne godziny.

Link to comment
Share on other sites

helpery to piekna rzecz... nie da sie opisac tak w kilku slowach jak to dziala... poprostu jest to tak proste, ze az trudne do opisania ;) obecnie juz wrecz wsiaklem w helpery i teraz musialbym sie cofnac zeby cos podpowiedziec jak zrobic input multilanguage bez nich ;/ w helperach zalatwiasz to jedna linijka w kontrolerze wysweitlania i reszte juz robi sam kontroler ;) a tutaj, bez niego, trzeba by pokombinowac... zasadniczo trzeba by sie cofnac do modulow z wersji 1.4, tam nie bylo jeszcze az tak skondensowanych helperow i mysle, ze jakies rozwiazanie z tych "archaicznych" modulow by zlapal jak tam byly tworzone te niezapomniane flagi przy polach ;) ale jak pisalem.... mnie juz helpery "kupily" i jakos tok myslenia sie pozmienial... jak to bylo kiedyc juz zapomnialem ;) po co zawracac sobie glowe jakimis skomplikowanymi ukladami, jezlei na chwile obecna jest juz pelna prostota ;)

Link to comment
Share on other sites

Wrzucam ważniejszą część z kontrolera żebyś miał obraz o czym piszę.
 

public function install()
	{
		$sql = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'product_text` (
		  `id_shop` int(10) unsigned NOT NULL,
		  `id_product` int(10) unsigned NOT NULL,
		  `pr_txt` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
		  PRIMARY KEY (`id_product`, `id_shop`)
		) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8';
		if (!parent::install() || 
		!$this->registerHook('header') ||
		!$this->registerHook('displayAdminProductsExtra') || 
		!$this->registerHook('actionProductAdd') || 
		!$this->registerHook('actionProductUpdate') || 
		!$this->registerHook('actionProductDelete') || 
		!$this->registerHook('actionDispatcher') || 
		!$this->registerHook('displayProductPriceBlock') || 
		!Db::getInstance()->execute($sql))
			return false;
		return true;
	}

	public function uninstall()
	{
		$sql = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'product_text`';
		if (!parent::uninstall() || !Db::getInstance()->execute($sql))
			return false;
		return true;
	}

	public function hookDisplayAdminProductsExtra()
	{		
		$id_shop = (int)$this->context->shop->id;		
		$id_product = (int)Tools::getValue('id_product');
		$row = Db::getInstance()->getRow('SELECT `pr_txt` 
			FROM `'._DB_PREFIX_."product_text`
			WHERE `id_product` = '$id_product' AND `id_shop` = '$id_shop'");
		$this->context->smarty->assign('id_shop', $id_shop);
		$this->context->smarty->assign('pr_txt', $row['pr_txt']);
		return $this->display(dirname(__FILE__), "views/templates/admin/product-txt.tpl");
	}

	public function hookActionProductAdd()
	{
		return $this->hookActionProductUpdate();
	}

	public function hookActionProductUpdate()
	{
		$id_product = (int)Tools::getValue('id_product');
		$id_shop = (int)$this->context->shop->id;	
		$product_txt = Tools::getValue('pr_txt');
		if (isset ($pr_txt) && ($pr_txt != 0))
		{
			return Db::getInstance()->execute('REPLACE INTO `'._DB_PREFIX_."product_text`
				SET `id_product` = '$id_product', `pr_txt` = '$pr_txt', `id_shop` = '$id_shop'");
		}
		else
			return Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_."product_text`WHERE `id_product` = '$id_product' AND `id_shop` = '$id_shop'");
			
			
	}

	public function hookActionProductDelete()
	{
		$id_product = (int)Tools::getValue('id_product');
		return Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_."product_text` WHERE `id_product` = '$id_product' AND `id_shop` = '$id_shop'");
	}
}
 

 
tpl

<div class="col-lg-6">
          <input type="text" value="{$pr_txt}" id="pr_txt" name="pr_txt">
          <input name="id_shop" type="hidden" id="id_shop" value="{$id_shop}" >
</div> 

 
generalnie nie daje mi to spokoju i szukam jakiegoś sensownego nakierowania, próbowałam to dodać na podobnej zasadzie jak id_product jednak nie wiem jak ma to działać po stronie klienta gdy zmieni język to skąd ma wiedzieć co wyświetlić. Potrzebuję jakiegoś dobrego nakierowania, może jakiejś lektury do czytania, coś co da mi kopa do przodu ponieważ teraz jestem w kropce.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...