Polskie wsparcie PrestaShop
PrestaShop => Konfiguracja => Wątek zaczęty przez: zwora w Listopad 24, 2012, 07:04:29 am
-
Witam
Chciałbym uruchomić sklep, który będzie sprzedawał rolety i w związku z tym muszę dość konkretnie przemodelować opis produktu. Muszę dodać pola typu edit w których będzie można wprowadzać szerokość i wysokość i na tej podstawie będzie obliczana cena. W back office nie ma mozliwości, żeby takie coś dodać, więc jestem zmuszony albo napisać nowy moduł albo zmodyfikować istniejący. Problem w tym, że nie mogę znaleźć, gdzie to jest (które pliki) zaszyte. Ustawiłem sobie w back office atrybut o unikatowej nazwie, a następnie próbowałem wyszukać przy pomocy windows 7. Niestety system ten korzysta z indeksowania i pomimo dodania folderu prestashop do folderów indeksowanych i przebudowania bazy indeksów nie zwraca żadnych wyników wyszukiwania. Czy wie może ktoś gdzie mogę znaleźć opis produktu?
-
A czy jest w stanie ktoś odpowiedzieć na takie pytania:
1. Jakiego hooka użyć, żeby móc umieszczać elementy z plików tpl w obszarze, w którym wybiera się atrybuty produktu. Probowałem już wiely hooków i w najlepszym razie udało mi się umieścić elementy zaraz pod ceną - hook productActions (ale nie o to mi chodzi).
2. W jaki sposób można modyfikować cenę (jaki obiekt i jaka metoda)?
Pozdrawiam
-
1. hook extraRight
2. napisz dokladnie o chodzi, bo manipulacji nad cena moze byc wiele, kazde w innym miejscu
-
Dzięki za odpowiedź, niestety ani extraRight ani jego nowszy odpowiednik displayRightColumnProduct nie powodują zaczepienia mojego kodu w miejscu gdzie są wyświeltane atrybuty produktu. Z tymi hookami kod zaczepiany jest pod ceną i informacjami o punktach lojalnościowych za zakup.
No chyba że całość elementów po prawej stronie jest zaczepiona w tym hooku i moj kod ląduje za ostatnim elementem zaczepionym w tym miejscu. Ale zatem jak podnieść się wyżej? Mam w pliku css ustawione position:relative oraz top:10px, więc powinno to być u góry. No chyba, że moduły presty rządzą się jakimiś innymi prawami jeśli chodzi o roznieszczenie na stronie?
Co do drugiego pytania to chodziło mi o to, jak mógłbym zmodyfikować cenę na podstawie wprowadzonych informacji, tzn. załóżmy, że mam już obliczoną wartość ceny i chciałbym, aby dokonała się modyfikacja ceny właściwej (tej która jest wyświetlana) tego produktu. Powinienem zatem odnieść się do jakiegoś obiektu i wywołać metodę, która zmodyfikuje wartość odpowiedniego pola tego obiektu, coś w stylu obiekt_cena->update($nowacena)
Pozdrawiam
-
co do rozmieszczenia modulow odpowiada za to ich pozycjonowanie, czyli PA>moduly>Rozmieszczenie modułów
oznaczas dalej opcje Pokaż niepozycjonowalną zawartość i wyszukujesz swojego hooka, dalej modul, poznosisz go w wybrane miejsce i tyle.
co do drugiego pytania odnosnie ceny.... bardzo fajne, ale nie wiem czy ja jestem taki glupi i nie jestem w stanie tego zrozumiec, czy jest to tak zagmatwane, ze raczej zrozumiec sie tego nie da. sobie modyfikujesz, sobie zmieniasz.... a łyżka na to.....
nie wiem czy o to chodzi, ale moze poprostu chodzi o atrybuty i zmiany cen wzrostowo albo znizkowo....
-
Dzięki za szybką odpowiedź. Co do podnoszenia to działa, ale w hooku displayRightColumnProduct mam tylko 2 moduły (mój + punkty lojalnościowe), stąd wniosek, ża atrybuty są w innym hooku, albo ten obszar nie jest objęty żadnym hookiem.
Jeśli chodzi o drugie pytanie to chciałbym w jakiś sposób tą cenę zmodyfikować, sposób jest nieważny byleby działał. Mogę też podmieniać bezpośrednio w bazie, bo z tego co widzę ceny tam są przechowywane. Pytanie tylko która tabela za to odpowiada, bo jak sobie tak przeglądam bazę to jest wiele tabel dotyczących produktu, w których umieszczana jest akaś tam cena. Co prawda mógłbym kombinować i dać w back office jakąś nietypową - unikatową cenę, a następnie szukać w której tabeli taka wartość została zapisana, ale wolałbym nie kombinować na własną rękę, bo może być tak, że ta wartość ma jakiś wpływ na rekordy w innych tabelach (choć zgodnie z teorią w bazach relacyjnych nie powinno się przechowywać wartości, które da się wyliczyć z innych wartości -ale to tylko takie dywagacje). No i po podmienienu w bazie pozostaje jeszcze problem odświeżenia wartości na stronie.
-
1. atrybuty to atrybuty i nie ma ich w hook, bo to nie modul. wszystko jest zawarte w product.tpl i odpowiednio miedzy {if isset($groups)} {/if}
2.Jeśli chodzi o drugie pytanie to chciałbym w jakiś sposób tą cenę zmodyfikować, sposób jest nieważny byleby działał. Mogę też podmieniać bezpośrednio w bazie, bo z tego co widzę ceny tam są przechowywane. Pytanie tylko która tabela za to odpowiada, bo jak sobie tak przeglądam bazę to jest wiele tabel dotyczących produktu, w których umieszczana jest akaś tam cena. Co prawda mógłbym kombinować i dać w back office jakąś nietypową - unikatową cenę, a następnie szukać w której tabeli taka wartość została zapisana, ale wolałbym nie kombinować na własną rękę, bo może być tak, że ta wartość ma jakiś wpływ na rekordy w innych tabelach (choć zgodnie z teorią w bazach relacyjnych nie powinno się przechowywać wartości, które da się wyliczyć z innych wartości -ale to tylko takie dywagacje). No i po podmienienu w bazie pozostaje jeszcze problem odświeżenia wartości na stronie.
ja jednak chyba za glupi jestem do tego rozwiazania. za chiny nie wiem o co chodzi. po co w bazie zmieniac cene jak mozna to w karcie produktu albo w netto albo w brutto zrobic. jakie odswierzenie na stroeni, jezeli (jak juz) zmienisz w bazie to sama sie wyswietli taka jak zmieniona....
mzoe opisz to na jakims przykladzie: masz taka a taka cene produktu, chcesz zmienic na taka i taka, w jakim przypadku co i jak ma zmieniac. bo naprawde to co piszesz to chyba (albo ja taki glupi jestem) ty wiesz o co chodzi.
-
Chodzi o to, że cena nie będzie ustalona na sztywno, tylko wyliczana będzie w zależności od podanych przez użytkownika wymiarów. Tak naprawdę to jest jakiś cennik, w którym ceny zależą od szerokości i wysokości i muszę cenę pobierać z tabeli w bazie. A co do odświeżania to cena nie powinna się uaktualnić bez przeładowania strony lub odświeżenia samego obiektu (jak w ajaxie).
-
jezeli chodzi o cene pobierana rozmiarowo to juz taki watek przewijal sie po forum i chyba, z tego co pamietam, zostal dos rzeczowo rozwiazany. raczej nie obedzie sie bez wiekszej przebudowy core.
interesuje mnie tylko jeden fakt, dlaczego ceny nie maja sie przelaczac z automatu? przeciez klient w kazdym momencie powienien wiedziec ile i za co placi.
-
Z tym odświeżaniem chodzi o to, że w architekturze klient-serwer (a w takiej architekturze działają przeglądarki internetowe) żeby coś się zmieniło w wyświetlanym obrazie, to musi być wysłane żądanie od przeglądarki do serwera, a następnie serwer musi odpowiedzieć treścią, która jest interpretowana przez przeglądarkę. Może to być żądanie przeładowania całej strony, albo tylko jej jakiegoś elementu. W każdym bądź razie należy zażądać zmiany czegoś, żeby móc tę zmianę zobaczyć w oknie przeglądarki.
-
eh...........
aby wyświetliło ci żądany element tam gdzie chcesz i chcesz użyć wbudowanego w prestę hook-a to po prostu w kodzie tpl np product.tpl umieszczasz w wybranym miejscu np {$HOOK_EXTRA_RIGHT} i tam będzie ci wyświetlał to co masz powieszone na tym hooku.
Oczywiście możesz stworzyć własny hook i powiesić go w wybranym miejscu.
Cena - ustalasz w produkcje cenę za 1 metr kwadratowy i jest to bazowa cena
dopisujesz w product.tpl 2 pola - szerokość i wysokość a do nich obsługę w jquery, która zmieni cenę (szerokość x wysyokość x cena bazowa - czy jak tam chcesz inaczej)- tak jak to jest robione np w przypadku - aktualizacja w jquery bez przeładowania strony.
Dalej musisz tylko dopisać funkcjonalność która pozwoli ci przesłać wcześniej wpisane wartości do koszyka i dalej do zamówienia
-
Ale ja to wszystko wiem (i już zresztą o tym pisałem). I tak też robiłem, ale:
1. Mam problem ze znalezieniem odpowiedniego hooka. Hook extraRight umieszcza moje elementy pod ceną, a ja chciałbym je mieć w bloku, gdzie są wyświetlane atrybuty (możliwe, że taki hook nie istnieje i trzeba będzie sobie samemu go napisać i jakoś wypozycjonować).
2. Cenę będę wyliczał na podstawie cennika umieszczonego w odpowiednich tabelach w bazie danych (z tym nie bede miał problemu, bo mam już doświadczenie w aplikacjach webowych), ale po jej wyliczeniu muszę odświeżyć na stronie element wyświetlający cenę (te parę cyfr opisujących cenę). Żeby to zrobić muszę odnieść się do obiektu, który ten element reprezentuje i wywołać odpowiednią metodę. Chodzi o coś w stylu getElementById("id_obiektu_cena").innerHTML=nowa_cena.
Bardzo proszę o wypowiadanie się przez osoby, które mają praktyczne doświadczenie w pisaniu modułów (pisaniu kodu) dla prestashop. Ja pytam już o konkrety, a nie jak się za to zabrać.
Moje dwa (konkretne) pytania brzmią:
1. Gdzie zaczepić kod, żeby wyświetlał się tam gdzie blok atrybutów?
2. Gdy mam już obliczoną wartość ceny jak mam się odnieść do elementu graficznie reprezentującego cenę (cyfry obrazujące cenę), żeby do niego załadować nową cenę i żeby się od razu wyświetliła?
Cały problem polega na tym, że pełno w sieci instrukcji i tutoriali o tym, jak coś w prescie wykonać poprzez backoffice, ale materiałów o tym, jak pisać kod oraz jak wygląda struktura sklepu od strony obiektowej jest jak na lekarstwo. Z informacji o kodzie są tylko proste przykłady pisania modułów i tyle. Brak jest dokumentacji dla developerów, takiej dokumentacji z prawdziwego zdarzenia.
-
Najprosciej to modyfikacja/rozbudowa kontrolerow, przekazujesz dodatkowe zmienne, dopisujesz/rozszerzasz templatke. Reszta to juz js, no i oczywiscie cookie.
Z modulami to wiekszy problem. I tak nieobedzie sie bez modyfikacji elementow wymienionych powyzej. Standardowe hooki ci w tym nie pomoga.
A nauka? no coz studiowac kod presty i jej modulow.
Manuali jest sporo, one ci tu nie pomoga, ty masz specjalne wymagania.
Jesli chcesz przez modul, to tak jak pisal sower $HOOK_EXTRA_RIGHT + funkcja jquery + dodatkowe tabele mysql + modyfikacja koszyka + templatki zamowien.
Gdzies juz widzialem taki modul do kupienia, ale sorki niepamietam, trzeba szukac.
-
Dzięki za rzeczową odpowiedź. Szczerze powiedziawszy to obawiałem się takiej odpowiedzi, bo gdyby to można było łatwo zrobić przez moduł, to byłoby wiele porad jak to zrobić, lub wręcz bezpłatnych modułów. A zamiast tego są tylko pytania na ten temat na różnych forach. Ofertę na zrobienie czegoś takiego widziałem już na freelancer.com i w ostateczności złożę tam ofertę na zakup, ale ja zazwyczaj lubię wiedzieć jak coś działa i mieć nad tym kontrolę, więc fajnie byłoby to zrobić samemu. Ale muszę skalkulować czy opłaca się temu poświęcać, bo może to zająć sporo czasu, który może lepiej byłoby spozytkować na coś innego. W każdym bądź razie poszukam na razie materiałów o zmianie templatki i o strukturze sklepu.
-
no ja nie wiem czemu ludzie mają tendencję do utrudniania sobie życia ;)
tu masz przykład
http://easyartstore.com/product.php?id_product=17&width=15&height=10
-
Chyba podołam temu zadaniu. Kluczem do sukcesu jest odpowiednia modyfikacja product.tpl Niepotrzebnie ładowałem się w te moduły, ale to przez to, ze nie przypuszczałem, że to będzie można po prostu dodać w templatce (w końcu poszczególne atrybuty ustawia się w backoffice), a nie chciałem za bardzo ingerować w treść samego sklepu, bo wyczytałem gdzieś, że lepiej tego nie robić, jeśli chce się kiedyś robić upgrade do nowszej wersji.
-
ale to tylko templetka ;)
poza tym masz coś takiego jak override ;) właśnie po to aby uniknąć problemów z upgrade.......... przy czym więcej problemów masz z modułami niż z poprawnie wykonaną modyfikacją core.
-
Witam
Miałem trochę przerwy w swojej działalności przy sklepie, ale dzisiaj trochę nad nim posiedziałem i mam kolejny problem.
Już mam swoje dwa pola na wymiary, wprowadziłem walidację i update ceny wyświetlanej na stronie produktu (tak jak to się odbywa na stronie z linka podanego przez sowera). Ale nie wiem jak odświeżyć tą cenę, która jest następnie przekazywana do koszyka. Teraz jakkolwiek nie zmieniłbym wyświetlanej ceny to i tak w koszyku ląduje cena podstawowa produktu (ewentualnie zmodyfikowana przez atrybuty dodane z poziomu backoffice).
W źródle strony z linka jest coś takiego (frounding to nowa cena po zaokrągleniach):
document.buy_block.price_new.value=frounding;
Ale u mnie to nie działa, bo prawdopodobnie trzeba w jakimś pliku tpl dodać element price_new, ale nie wiem w którym pliku, a ze źródła strony ciężko to wywnioskować.
-
Może uściślę o co mi chodzi. Wartość pola price_new jest pobierana z formularza podczas zdarzenia onSubmit, które jest obsługiwane przez jakiś skrypt php (niby cart.php), który dane z formularza odpowiednio prześle dalej. Taki skrypt mógłby przesłać wartości pól do bazy danych, skąd koszyk będzie pobierał dane. Tylko, że nie mogę znaleźć jak te dane są przesyłane, żebym mógł dodać obsługę pola price_new (cart.php odsyła do innych skryptów i jakoś nie mogę się w tym odnaleźć). No i jeszcze nowe pole musi być jakoś interpretowane przez skrypt tpl tak, że onMouseOver nad koszykiem daje prawidłową wartość (no chyba, że to po prostu jest zwykłe pobieranie z bazy danych za pomocą skryptu php).
-
W swoich poszukiwaniach po kodzie doszedłem do blockcart i zmieniłem już wywołanie metody ajaxCart.add w pliku ajax_cart.js, ale teraz muszę jakoś popracować nad tym obiektem, żeby takie wywołanie było prawidłowe (żeby dodanie nowej zmiennej wywołania powodowało uaktualnienie ceny).
-
A czy mógłby ktoś przynajmniej opisać zależności pomiędzy plikami dotyczącymi koszyka i funkcje tych plików. Np. gdzie (w którym pliku) należy przechwycić dane wysłane przez ajaxCart.add() ?
-
Zdarzenia obsługiwane są przez kontrolery. Katalog /controllers/. Tam masz CartController.php i jeśli umiesz czytać kod to spokojnie znajdziesz to czego szukasz.
-
Dzięki za odpowiedź. Tak właśnie myślałem, że muszę je odebrać w cartController.php bo są tam odwołania do innych zmiennych wysyłanych przez ajaxCart.add() I już sobie odebrałem tam nową zmienna, ale mam kolejny problem, bo nie wiem jak wpłynąć na cenę w koszyku.
Robiłem takie takie testy:
Podmiana w cartController.php na: $product['price_without_quantity_discount'] = 10;
Jak również w classes/Product.php w funkcji addCustomizationPrice() mnożenie przez jakieś wartości (np. 10) następujących zmiennych:
$product_update['total_wt']
$product_update['total_customization_wt']
$product_update['total']
$product_update['total_customization']
I żadna z tych zmian nie wpłynęła na cenę w koszyku.
-
Zabrales sie za robote od tylu, gwarantuje ci to sporo problemow, cofania sie, zmiany koncepcji.
Zaczac powinienes od projektu !
Czeka cie naprawde duzo roboty.
O module zapomnij, modyfikuj core, robiac czeste kopie po kolejnych etapach.
Kazdy krok zamowienia zapisywany jest w bazie danych, konieczna rozbudowa kolumn, dodanie pol i triggerow do formatki dodawania produktu, itd. itp.
Pomysl, moze wymiary, ktore poda kupujacy traktowac jako atrybuty i zapisywac w bazie jako dodatkowe?
wtedy cena wyliczona bedzie pobierana z bazy
-
Pomysl, moze wymiary, ktore poda kupujacy traktowac jako atrybuty i zapisywac w bazie jako dodatkowe? wtedy cena wyliczona bedzie pobierana z bazy
Czy masz może na myśli features? Albo customization -> text fields? I przerobienie ich tak, żeby w templatce pojawiały się nie na zakładce u dołu, tylko tam gdzie chcę? To by było całkiem rozsądne rozwiązanie.
A może attributes i przerobienie w jakiś sposób na input type="text"?
To co wcześniej zacząłem robić to było na podstawie strony z linka podanego przez sowera, i tam to jakoś działa. Ale ze źródła strony zbyt wiele nie jestem w stanie wyciągnąć (tylko to, co wysyłane jest do przeglądarki).
-
dalej nie rozumiem po co tyle kombinacji, pytan i niedorzecznowsci jezeli juz taki modul zostal stwprzony i bylo o nim wczesniej, chodzi o Attributes Wiard Pro. wszystko o czym piszesz i czego oczekujesz masz w tym jednym module, wystarczy zainstalowac wg zalaczonej instrucko i po klopocie.
kontynuowanie tego watku wydaje sie malo dorzeczne i do niczego nie prowadzi. jak narazie to tylko wypominki tego, czego nie udalo sie zrobic....
-
Ale AttributeWizardPro z tego co widzę nie rozwiązuje jego problemu. Nie ma tam funkcjonalności pozwalającej na wyliczanie ceny na podstawie podanej szerokości i wysokości produktu. Jeśli się mylę to mnie popraw i daj mi jakiś przykład, w demach i konfiguracji modułu nie widzę takiej możliwości.
Po za tym nie wiesz w jaki sposób ma być liczona cena, jaki jest wpływ szerokości na cenę, a jaki wysokości. Tego nie ustalisz z tego modułu.
Parę wskazówek:
1. Cenę liczysz w klasie Cart.php, powinny zainteresować Cię metody getProducts oraz getOrderTotal.
2. To nie prawda, że "wszystko presta trzyma w bazie". Modyfikacja ceny na końcowym etapie może być poprzedzona nadpisaniem poszczególnych danych bezpośrednio w obiekcie koszyka. Tak na dobrą sprawę możesz stworzyć atrybut szerokość, atrybut wysokość i operować na danych tych obiektów by otrzymać rzeczy jakie Cię interesują.
-
do deejay3:
Od tego jest forum, żeby zadawać pytania. Ja nie tworzę posta, w którym chcę się pochwalić tym, co udało mi się wspaniałego zrobić, tylko po to, żeby ktoś poradził mi coś sensownego w kwestii problemu, z którym nie mogę sobie dać rady. Póki co, nikt nie udzielił mi wyczerpującej odpowiedzi i w sumie się tego nie mogę spodziewać, bo przecież większość specjalistów od presty chce na tym zarobić, więc nie mogą za darmo rozpowszechniać wiedzy, za którą mogą być wynagrodzeni. Moje pytanie dotyczy dość skomplikowanej rzeczy, a ja delikatnie mówiąc nie jestem ekspertem w dziedzinie prestashop ani nawet smarty. Znam się trochę na php, js, mysql, html i css (w takim zakresie, że mogę tworzyć aplikacje internetowe), ale sklep to zupełnie inna bajka, bo trzeba poznać dobrze jego strukturę, żeby móc dobrze w nim działać. Co do modułu z presto changeo to już dawno przeglądałem jego opis, ale podobnie jak Krystian Podemski wnioskuję, że nie spełni on moich oczekiwań. A wydawanie 150USD w ciemno zupełnie mi nie pasuje. Mogę to taniej zlecić na freelancer(dot)com, ale jak już pisałem chciałbym się nauczyć działania presty i mieć świadomość tego, co się tam dzieje. Jeśli Cię irytuje ten temat, to nikt Cię nie zmusza do jego przeglądania.
do Krystian Podemski:
A czy Twoim zdaniem zapisanie wymiarów w Customization (przepisanie ich z moich nowych pól do pól w Customization) i ukrycie całej zakładki Product customization, a następnie wyliczanie ceny za pomocą danych pobranych z tabeli ps_customized_data byłoby dobrym rozwiązaniem? Szukam teraz rozwiązania, które przysporzyłoby najmniej problemów. Muszę jeszcze brać pod uwagę to, że w moim sklepie mogę mieć też standardowe dla presty produkty (tzn. nie wymagające wprowadzania wymiarów). A Customization dotyczy konkretnych produktów, więc mogę wymiary początkowe pobierane po załadowaniu produktów traktować jako flagi (np. sprawdzać, czy wartość tych pól w bazie (wartość ustawiona wcześniej z back office) wynosi np. szer=1 i w takim przypadku nie ładować dodatkowych pól do wprowadzania wymiarów, a gdy wartość ta jest inna to te pola ładować). A może zamiast przepisywać dane z nowych pól do pól w Customization, przeniósłbym zawartość zakładki Product customization w inne miejsce w layoucie, dodałbym walidację tych pól i update wyświetlanej ceny produktu? Według mnie to mogłoby być dobre rozwiązanie, ale wolę spytać o radę kogoś bardziej doświadczonego.
-
Nie wiem w jaki sposób wyceniasz produkt, jeśli mnożnik dla każdego produktu z osobna jest inny to potrzebujesz dodatkowego pola lub właściwej cechy produktu, której wartość byś pobierał.
Oczywiście możesz użyć funkcjonalności, o której piszesz - spełni Twoje oczekiwania jeśli odpowiednio odbierzesz dane i zmodyfikujesz mechanizm naliczania ceny w koszyku. Dodatkowo masz zapewnione wyświetlanie tych pól czyli szerokość, wysokość już na samym starcie w całym systemie. Jedyne co zostaje Ci do zrobienia to wpływ na cenę końcową, oraz sposób na rozgraniczenie produktów "specjalnych" i "zwykłych" ale z tym nie powinno być problemu bo przecież wykryjesz czy istnieją jakieś pola "Customization" :)
-
Zacząłem to robić według ostatniego planu, ale coś mnie zatrzymało. Teraz mam dwa swoje pola tekstowe, w których onblur wywołuje mi walidację, update wyświetlanej ceny i przepisanie zawartości do odpowiedniego pola customization (które docelowo będzie ukryte). Ale teraz muszę jakoś połączyć funkcje przycisku Save na karcie Product customization i przycisku Add to cart. Próbowałem to zrobić na wiele sposobów, ale doszedłem do wniosku, że najprościej będzie dodać do mojej funkcji obsługującej onblur w nowych polach z wymiarami, dodatkowe wywołanie saveCustomization(). Ale wtedy musiałbym zablokować przeładowanie strony po submit customizationForm. I nie wiem gdzie to można zmienić (w którym pliku).