yacorro Posted August 26, 2013 Share Posted August 26, 2013 Witam, Czy istnieje jakiś moduł (albo inne rozwiązanie) żeby monitorować pobieranie załączników produktów? Strona którą tworzę ma wyłączone wszystkie opcje sprzedażowe. Użytkownik loguje się wtedy ma możliwość pobrania załącznika. Dzięki za pomoc. Link to comment Share on other sites More sharing options...
vekia Posted August 26, 2013 Share Posted August 26, 2013 niestety w "standardzie" nie ma takiej opcji, jedyne co przychodzi mi na myśl to modyfikacja core presty (i to jest chyba jedynie rozwiązanie) Link to comment Share on other sites More sharing options...
yacorro Posted August 28, 2013 Author Share Posted August 28, 2013 Dzięki za odpowiedź. W takim razie może mógłbym dorzucić do buttona Download kawałek Javascripta z funkcją mailto? Czy Presta w ogóle puści wysyłkę maila wywołaną JavaScriptem? Pozdrawiam Link to comment Share on other sites More sharing options...
vekia Posted August 28, 2013 Share Posted August 28, 2013 wydaje mi się, że łatwiej bedzie dopisać skrypt który będzie zliczał w bazie damych ilość pobrań każdego z plików Link to comment Share on other sites More sharing options...
yacorro Posted August 28, 2013 Author Share Posted August 28, 2013 A czy będzie tam info o użytkowniku który pobrał plik bo to istotne. Na razie spróbuję pokombinować z tym "mailto" i przechwyceniem info o użytkowniku z userinfoblock. Coś na zasadzie maila weryfikacyjnego w BO presty, gdzie przycisk "Wyślij" ma po prostu onclick="verifyMail();" - a to z kolei funkcja z pliku sendMailTest.js. Link to comment Share on other sites More sharing options...
vekia Posted August 28, 2013 Share Posted August 28, 2013 no to tu się problem nieco komplikuje, ja to widzę tak: modyfikacja ps_attachment, dodać kolumnę "licznik", pole INT w front controllerze przygotowac funkcję np. podbij_licznik($id) gdzie $id to id_cattachment a w kodzie funkcji zapytnie sql ktore podbija o 1 "licznik" do buttona dodajemy $.post() ktory wywola tę funkcję z kontrolera to samo w sumie mozna osiagnac dla zapisania gdzies informacji o uzytkowniku Link to comment Share on other sites More sharing options...
yacorro Posted October 8, 2013 Author Share Posted October 8, 2013 no to tu się problem nieco komplikuje, ja to widzę tak: modyfikacja ps_attachment, dodać kolumnę "licznik", pole INT w front controllerze przygotowac funkcję np. podbij_licznik($id) gdzie $id to id_cattachment a w kodzie funkcji zapytnie sql ktore podbija o 1 "licznik" do buttona dodajemy $.post() ktory wywola tę funkcję z kontrolera to samo w sumie mozna osiagnac dla zapisania gdzies informacji o uzytkowniku Mógłbyś rozwinąć pkt 3? Mam już funkcję tylko nie mogę pod button odpowiedzialny za download podpiąć wykonania fukcji. Link to comment Share on other sites More sharing options...
vekia Posted October 8, 2013 Share Posted October 8, 2013 onclick="podbij(TUTAJ_ID_ZAŁĄCZNIKA);" następnie w pliku tpl towrzymy funkcję js:(nie zapomnij o {literal} {/literal} ) function podbij(id){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: { podbijanie: 1, id_attachment: id, }); } w frontcontrolerze w funkcji init(); dodajemy: if (isset($_POST['podbijanie'])){ $this->podbij_licznik($_POST['id_attachment']); } mogłem popełnić jakąś drobną literówkę powyżej (nie mam możliwości w chwili obecnej przetestowania) ale schemat opisany powyżej jest poprawny. Link to comment Share on other sites More sharing options...
yacorro Posted October 10, 2013 Author Share Posted October 10, 2013 Witam, Wielkie dzięki za pomoc. Zmieniła się trochę koncepcja i wracam do opcji powiadomienia mailowego. W ProductController.php w funkcji init(); mam: if (isset($_POST['postIt'])){ $to = '[email protected]'; $subject = "Użytkownik pobrał plik:$id_product"; $message = "ID Produktu $id_product" ; mail($to, $subject, $message); } I teraz dwa pytania: 1. Jak powinien wyglądać post ajaxowy? Udało mi się zrobić form z inputem typu submit gdzie name="postIt" (name submita nie forma). I wtedy mail wychodzi bez problemu. Ale nie wiem jak to podpiąć pod button pobierania stąd pytanie $.ajax. 2. Jak wydłubać informację o użytkowniku. W product tpl nic nie ma, ale może jakoś z nagłówka dałoby się to złapać jako że pobieranie dostepne jest tylko dla zalogowanego usera. Link to comment Share on other sites More sharing options...
yacorro Posted October 10, 2013 Author Share Posted October 10, 2013 (edited) Witam ponownie, Dokonałem pewnych modyfikacji i temat ruszył z kopyta. Ale nie do końca... Wygląda to tak: W product.tpl:{literal} <script> var id_product = '{$product->id|intval}'; function postIt(){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: {postIt : 1, id_product: id_product,} }); } </script> {/literal} we front kontrolerze, funkcja wysyłająca mail. Tylko za nic nie mogę przekazać id produktu:/ Wcześniej (czyli wyżej opisana wersja w forms) przekazywała ID bez problemu natomiast obecnie w mailu nie ma ID. Pytanie nr.2 jest nadal aktualne, jak dodać do posta info o użytkowniku. Edited October 10, 2013 by yacorro (see edit history) Link to comment Share on other sites More sharing options...
vekia Posted October 10, 2013 Share Posted October 10, 2013 witam data: {postIt : 1, id_product: {/literal}{$smarty.get.id_product}{literal},} Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 Witam, Dziękuję za dotychczasową pomoc. Mam jeszcze pytanie o podbijanie tego licznika. 1. Dodałem sobie kolumnę licznik do ps_attachment 2. Przerobiłem jeden z modułów Statystyki tak że wyświetla Id_produktu, nazwe oraz licznik z ps_attachments 3. czy query : UPDATE ps_attachment SET licznik=licznik+1 WHERE id_product = id_product - jest ok? 4. Jak powinna wyglądać funkcja podbij? t.j jak wykonać to query? Dzięki Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 w kontrolerze trzeba umieścić if (isset($_POST['podbijanie'])){ $this->podbij_licznik($_POST['id_attachment']); } oprócz tego, wewnątrz klasy musisz utworzy funkcję public function podbij_licznik($id){ Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'ps_attachment` SET licznik=licznik+1 WHERE id_attachment='.$id.' '); } pamiętaj aby przekazać zmienną id_attachment, nie id_product Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 "oprócz tego, wewnątrz klasy musisz utworzy funkcję" - wewnątrz której klasy? Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 tutaj są dwie opcje do wyboru, albo kontroler: produktu (controllers/front/ProductController.php) frontu (classes/controllers/frontController.php) wewnątrz tych plików masz klasę: Class nazwaklasy { TUTAJ FUNKCJA } Link to comment Share on other sites More sharing options...
presta4you.com Posted October 28, 2013 Share Posted October 28, 2013 (edited) Robiłem swojego czasu taki licznik. Ja wyedytowałem tylko plik attachment.php w głównym folderze. U mnie była trochę inna koncepcja, ale może się przyda. Poniżej zamieszczam kod tego pliku. require(dirname(__FILE__).'/config/config.inc.php'); require(dirname(__FILE__).'/init.php'); if($cookie->logged != 1) { Tools::redirect('authentication.php'); } else { $a = new Attachment((int)(Tools::getValue('id_attachment')), (int)($cookie->id_lang)); $customer = new Customer($cookie->id_customer); $ida = Tools::getValue('id_attachment'); $sql = 'INSERT INTO '._DB_PREFIX_.'product_attachment_download VALUES(\'\', \''.date('Y-m-d').'\', '.$ida.', '.$cookie->id_customer.')'; Db::getInstance()->ExecuteS($sql); header('Content-Transfer-Encoding: binary'); header('Content-Type: '.$a->mime); header('Content-Length: '.filesize(_PS_DOWNLOAD_DIR_.$a->file)); header('Content-Disposition: attachment; filename="'.utf8_decode($a->file_name).'"'); readfile(_PS_DOWNLOAD_DIR_.$a->file); exit; } Czyli tworzyłem nową tabelę, gdzie dodaję dane o użytkowniku oraz id_attachment i datę pobrania. Dzięki temu z tabeli można już stworzyć sobie statystyki. Edited October 28, 2013 by presta4you.com (see edit history) Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 public function podbij_licznik(id){Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'ps_attachment` SET licznik=licznik+1 WHERE id_attachment='.$id.' ');} - dostaję wyjątek- 500 internal Jak wurzucę parametr id z deklaracji funcji nie rzuca wyjątku. Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 mój błąd, zamiast id użyj $id Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 Dzięki, wyjątek nie leci ale też nie podbija licznika. Uporządkuję trochę dla czytelności. W product.tpl mam: {literal} <script> function postIt(){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: {postIt : 1, id_product: name_product,} }); } </script> {/literal} we front kontrolerze: if (isset($_POST['id_product'])){ $id_fn = Context::getContext()->customer->firstname; $id_ln = Context::getContext()->customer->lastname; $id_pr = $_POST['id_product']; $to = '[email protected]'; $subject = "Użytkownik ${id_fn} ${id_ln}, pobrał plik: ${id_pr}"; $message = "Użytkownik ${id_fn} ${id_ln}, pobrał plik: ${id_pr}"; mail($to, $subject, $message); } i to działa pięknie. Teraz chcę dodać to podbijanie licznika. We front kontrolerze dodaję: public function podbij_licznik($id){ Db::getInstance()->execute('UPDATE `ps91_attachment` SET licznik=licznik+1 WHERE id_attachment='.$id.' '); } oraz: //podbicie licznika if (isset($_POST['id_product'])){ $this->podbij_licznik($_POST['id_attachment']); } nic się dzieje, pewnie dlatego że nie przekazuję id załącznika w poście z product.tpl. Spróbowałem więc w product.tpl dodać w data: {literal} <script> function postIt(){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: {postIt : 1, id_product: name_product, id_attachment: id_attachement} }); } </script> {/literal} i zmienić odpowiednio: //podbicie licznika if (isset($_POST['id_attachment'])){ $this->podbij_licznik($_POST['id_attachment']); } ale jak tylko dodał coś do "data" w product.tpl - przestaje działać wysyłka maila, a licznik i tak nie skacze:/ Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 zrobimy inaczej, dodaj do kodu poniżej: $this->podbij_licznik($_POST['id_attachment']); if (isset($_POST['id_product'])){ $id_fn = Context::getContext()->customer->firstname; $id_ln = Context::getContext()->customer->lastname; $id_pr = $_POST['id_product']; $to = '[email protected]'; $subject = "Użytkownik ${id_fn} ${id_ln}, pobrał plik: ${id_pr}"; $message = "Użytkownik ${id_fn} ${id_ln}, pobrał plik: ${id_pr}"; mail($to, $subject, $message); $this->podbij_licznik($_POST['id_attachment']); } wtedy obejdzie się bez zduplikowanego ifa + gdzie masz zdefiniowane zmienne: nazwa_produktu i id_attachment z tego zapytania ajaxowego? to co musiałbyś zrobic to dodać go do funkcji onclick="" na buttonie i przekazać do funkcji function postIt(id_attachment){ Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 (edited) Racja! Słuszna uwaga o zmiennych. O ile name_product mam zdefioniowane na początku product.tpl : var name_product = '{$product->name}'; o tyle nie mam zmiennej id_attachment. Próbowałem var id_attachment='{$attachment.id_attachment}' bo tak używam przy pobieraniu załączników ale nie działa. Sprawdziłem sam mechanizm przypisując do var id_attachment stałą wartoś 4 i działa! Więc to już chyba ostatnie pytanie. Jak zadeklarować id_attachment w product.tpl? Edited October 28, 2013 by yacorro (see edit history) Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 no to już jesteśmy na końcu, po długich bojach http://www.prestashop.com/forums/topic/270224-statystyki-pobran-per-uzytkownik/?do=findComment&comment=1409540 w tym poście zaznaczyłem że: onclick="podbij(TUTAJ_ID_ZAŁĄCZNIKA);" gdzie masz dokładnię tę funkcję? możesz pokazać kod z tym fragmentem? Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 U mnie wygląda to tak : <a id="button_dwn" onclick="postIt()" href="{$link->getPageLink('attachment', true, NULL, "id_attachment={$attachment.id_attachment}")}"></a> postIt nie ma parametru konretnego bo do w "data" w poście ajaxowym ustalam co ten post ma wysyłać. A to dlatego że post ma przekazać nie tylko id_załączniuka ale też nazwe_produkty. Czy w product tpl. mogę utworzyć zmienną var id_attachment = tylko tu nie wiem co żeby ją złapać. coś na zasadzie var id_attachment='{$attachment->id_attachment}' ? Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 no to dajesz: <a id="button_dwn" onclick="postIt({$attachment.id_attachment})" href="{$link->getPageLink('attachment', true, NULL, "id_attachment={$attachment.id_attachment}")}"></a> + modyfikacja funkcji postit {literal} <script> function postIt(id_attachment){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: {postIt : 1, id_product: name_product, id_attachment: id_attachement} }); } </script> {/literal} teraz będzie tak, że po wciśnięciu buttona wykona się fukncja postit z parametrem id_załącznika no i z automatu zostanie on przekazany do id_attachment w data: {} Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 Po zmianach nie dzieje się nic - nie idzie mail i nie podbija licznika. A jak zadeklarować id_załącznika do zmiennej? Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 kolejna literówka. data: {postIt : 1, id_product: name_product, id_attachment: id_attachement} tak to wyglądało: {literal} <script> function postIt(id_attachment){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: {postIt : 1, id_product: name_product, id_attachment: id_attachement} }); } </script> {/literal} Link to comment Share on other sites More sharing options...
yacorro Posted October 28, 2013 Author Share Posted October 28, 2013 To nie kwestia literówki. Dodawałem tylkot o co w nawiasach, we wskazanym przez Ciebie miejscu jest ok u mnie. I tak jak pisałem po zmianach nic się nie dzieje. Rozumiem że var id_attachment = ??? - nie robialne w tym przypadku? Link to comment Share on other sites More sharing options...
vekia Posted October 28, 2013 Share Posted October 28, 2013 To nie kwestia literówki. Dodawałem tylkot o co w nawiasach, we wskazanym przez Ciebie miejscu jest ok u mnie. I tak jak pisałem po zmianach nic się nie dzieje. Rozumiem że var id_attachment = ??? - nie robialne w tym przypadku? nie w tym przypadku nie jest potrzebne var id_attachment. wręcz przeciwnie, trzeba to usunąć. strona jest online? Link to comment Share on other sites More sharing options...
yacorro Posted October 29, 2013 Author Share Posted October 29, 2013 Tak stronka jest online : http://showroom.konkretpr.pl. Link to comment Share on other sites More sharing options...
yacorro Posted October 29, 2013 Author Share Posted October 29, 2013 (edited) Problem jest ze zmienna attachment_id. Zrobiłem test: <a id="button_dwn" onclick="postIt(5)" href="{$link->getPageLink('attachment', true, NULL, "id_attachment={$attachment.id_attachment}")}"></a> i bez problemu wysyłany jest mail oraz podbija licznik dla załącznika z id=5 (i ofc pobierany jest załącznik) Edited October 29, 2013 by yacorro (see edit history) Link to comment Share on other sites More sharing options...
vekia Posted October 29, 2013 Share Posted October 29, 2013 w zmiennej {$attachment.id_attachment} przechowywany jest ID załącznika. jak zrobisz onclick="postIt({$attachment.id_attachment});" powinno się pojawić postit(5) postit(7) itp. jak ustawisz spowrotem na onclick="postIt({$attachment.id_attachment});" to podlągając źródło strony, co masz w tym fragmencie? Link to comment Share on other sites More sharing options...
yacorro Posted October 29, 2013 Author Share Posted October 29, 2013 Jest ok! Dzięki piękne! Ostatnia sprawa : to samo tylko nie ze strony produktu a strony "głównej" czy de facto strony kategorii. Dodałem onclicka po button na stronie kategorii i źródle strony wyświetla prawidłowo id_załącznika jak parametr. Pytanie czy gdzie oprócz front kontrolera musze dodać funkcję mail/podbij żeby działało ze strony kategorii? Link to comment Share on other sites More sharing options...
yacorro Posted October 30, 2013 Author Share Posted October 30, 2013 Czy coś powinienem dodać do product-list.tpl żeby wykonał tą funkcję postIt? Link to comment Share on other sites More sharing options...
vekia Posted October 30, 2013 Share Posted October 30, 2013 strona kategorii czyli główna? coś mi tu nie pasuje w każdym razie, do plików tpl musisz dodać funkcje javascript (te z ajaxem) no i ten onlcick="postit(id załacznika)" do buttonów w php już nie trzeba się bawić bo cała funkcja jest już zdefniowana Link to comment Share on other sites More sharing options...
yacorro Posted October 30, 2013 Author Share Posted October 30, 2013 Robię tak jak mówisz, i niestety tak jakby nie wykonywał fukcjii postIt. http://showroom.konkretpr.pl - jak widzisz od razu po wejściu jest strona kategorii (to akurat kategoria zbiorcza, ale to nie istotne). Link to comment Share on other sites More sharing options...
vekia Posted October 30, 2013 Share Posted October 30, 2013 to jest to, co widze ja w kodzie: <a id="button_dwn" class="button" href="#" onclick="document.getElementById('popup').style.display = 'block'; return false;" title="Pobierz"></a> poza tym jquery leży i kwiczy: Link to comment Share on other sites More sharing options...
yacorro Posted October 30, 2013 Author Share Posted October 30, 2013 (edited) To co widzisz to kod dla niezalogowanego usera - zalogowany ma taki jak wkleiłem. Co znaczy że jquery leży i kwiczy? Po wejściu w szczegóły produktu jest ok a tu nie? Widzę te same komuniakty w konsoli po przejściu w do szczegółów produktu. Edited October 30, 2013 by yacorro (see edit history) Link to comment Share on other sites More sharing options...
yacorro Posted October 30, 2013 Author Share Posted October 30, 2013 Ok z Jquery się uporałem - nie wiem czym to groziło ale już dorzuciłem jquery.min.js do katalogu głównego (wcześniej był z numerkiem wersji). Ale nadal to samo: ze strony konkretnego prod. działa a z listy prod. nie.:/ Link to comment Share on other sites More sharing options...
vekia Posted October 30, 2013 Share Posted October 30, 2013 moge załozyć tam konto testowe? Link to comment Share on other sites More sharing options...
yacorro Posted October 30, 2013 Author Share Posted October 30, 2013 login: [email protected] pass: Qwerty123 Link to comment Share on other sites More sharing options...
yacorro Posted October 31, 2013 Author Share Posted October 31, 2013 Zastanawiam się czy to nie jest kwestia tego, że sam przycisk jest w product_list.tpl a kod funkcji postIt w category.tpl? Link to comment Share on other sites More sharing options...
yacorro Posted October 31, 2013 Author Share Posted October 31, 2013 Ok, już znalazłem. Problem był w funkcji postIt od strony listy produktów. W data: przekazywany była zmienna name_product której nie ma ani w category.tpl ani w product_list.tpl. Po wyrzuceniu zmiennej z POST;a Ajaxowego licznik podbija się ale niestety mauil przychodzi bez informacji jaki produkt został pobrany. Jakiś pomysł? Link to comment Share on other sites More sharing options...
vekia Posted October 31, 2013 Share Posted October 31, 2013 witaj, przepraszam za długi czas oczekiwania na odpowiedź, wczoraj po 17 już byłem offline, zmienna {$product->name} nie zadziała, natoimast {$product.name} tak Link to comment Share on other sites More sharing options...
yacorro Posted October 31, 2013 Author Share Posted October 31, 2013 Ale gdzie tą zmienną wstawić? Próbowałem na początku category.tpl i product_list.tpl dać <script type="text/javascript">var name_product = '{$product.name}';</script> wtedy mail jest wysyłany, ale nadal w treści maila nie mam nazwy produktu. Zastanawiam się czy nie dodać kolejnej kolumny do tabeli ps_attachements i tam nie wrzucać INSERTEM nazwy użytkownika. Nie wiem jeszcze jak to później wyświetlić, ale coś się wykombinuje. Na razie chcę dorobić tylko ten kawałek z nazwa. Link to comment Share on other sites More sharing options...
vekia Posted October 31, 2013 Share Posted October 31, 2013 dzieje się tak dlatego, że ta zmienna dostępna jest dopiero w pętli foreach która wyświetla produkty to co nalezy zrobić w tym przypadku, to rozbudować funkcję postit o dodatkowy parametr: {literal} <script> function postIt(product_name,id_attachment){ $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, data: {postIt : 1, id_product: product_name, id_attachment: id_attachement} }); } </script> {/literal} nastepnie dla buttona w onclick="postit()" dodajesz nazwę oraz id załącznika, tj: postIt('{$product.name}',{$attachment.id_attachment}); Link to comment Share on other sites More sharing options...
Recommended Posts