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.

Link to comment
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.

Link to comment
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

Link to comment
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.

Link to comment
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.

Link to comment
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.
Link to comment
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)
Link to comment
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 

Link to comment
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

Link to comment
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)
Link to comment
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.

Link to comment
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:/

 

Link to comment
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){

Link to comment
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)
Link to comment
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}'

?

Link to comment
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: {}

Link to comment
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}
Link to comment
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?

Link to comment
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?

Link to comment
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)
Link to comment
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?
 

Link to comment
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?

Link to comment
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 :)

Link to comment
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ł?

Link to comment
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.

Link to comment
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});
Link to comment
Share on other sites

×
×
  • Create New...