Jump to content

Statystyki pobrań per użytkownik


Recommended Posts

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

no to tu się problem nieco komplikuje, ja to widzę tak:

  1. modyfikacja ps_attachment, dodać kolumnę "licznik", pole INT
  2. 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"
  3. do buttona dodajemy $.post() ktory wywola tę funkcję z kontrolera

 

to samo w sumie mozna osiagnac dla zapisania gdzies informacji o uzytkowniku

Share this post


Link to post
Share on other sites

  • 1 month later...

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 by yacorro (see edit history)

Share this post


Link to post
Share on other sites

  • 3 weeks later...

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 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

}

Share this post


Link to post
Share on other sites

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 by presta4you.com (see edit history)

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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:/

 

Share this post


Link to post
Share on other sites

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){

Share this post


Link to post
Share on other sites

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 by yacorro (see edit history)

Share this post


Link to post
Share on other sites

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}'

?

Share this post


Link to post
Share on other sites

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: {}

Share this post


Link to post
Share on other sites

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}

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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 by yacorro (see edit history)

Share this post


Link to post
Share on other sites

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?
 

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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 :)

Share this post


Link to post
Share on other sites

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:

PgmOufO.png

Share this post


Link to post
Share on other sites

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 by yacorro (see edit history)

Share this post


Link to post
Share on other sites

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.:/

Share this post


Link to post
Share on other sites

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ł?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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});

Share this post


Link to post
Share on other sites

 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More