Contorizare click-uri

Salutări, am o platformă de genul PTC și aș dorii să contorizez click-urile date pe o reclamă și adresa IP a utilizatorului, salvând informațiile în baza de date. Cum aș putea face lucrul acesta?

Codul paginii de reclame

@extends('layouts.dashboard')
@section('title', 'View All Available Ads')
@section('content')



    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header card-header-icon" data-background-color="green">
                    <i class="material-icons">important_devices</i>
                </div>
                <br>
                <h4 class="card-title">All Available Ads</h4>
                <div class="card-content">
                    <br>

                    @if(count($adverts) > 0)
                        <div class="table-responsive">

                            <table class="table">
                                <thead>
                                <tr>
                                    <th class="text-center">ID</th>
                                    <th>Ad Title</th>
                                    <th>Ad Rewards</th>
                                    <th>Status</th>
                                    <th>Action</th>

                                </tr>
                                </thead>
                                <tbody>

                                @php $id=0;@endphp
                                @foreach($adverts as $advert)
                                    @php $id++;@endphp

                                    <tr>
                                        <td>{{ $id }}</td>
                                        <td>{{ $advert->ptc->title }}</td>
                                        <td>{{config('app.currency_symbol')}} {{ $advert->ptc->rewards +0 }}</td>
                                        <td>
                                            @if($advert->status == 0)
                                                <span class="btn btn-danger"><i class="material-icons">edit</i> Not Show</span>
                                            @else
                                                <span class="btn btn-primary"><i class="material-icons">edit</i> Viewed</span>
                                            @endif
                                        </td>

                                        <td >
                                            @if($advert->status == 0)
                                                <a href="{{route('userCashLinks.show', $advert->id)}}" type="button" rel="tooltip" class="btn btn-info">
                                                    <i class="material-icons">edit</i>
                                                    View Ads
                                                </a>
                                            @else
                                                <span class="btn btn-primary"><i class="material-icons">edit</i> Viewed</span>
                                            @endif
                                        </td>



                                    </tr>

                                @endforeach


                                </tbody>

                            </table>



                        </div>
					@else

                        <h1 class="text-center">No Advertisement Right Now</h1>
                    @endif
                    <div class="row">
                        <div class="col-sm-6 col-sm-offset-5">

                            {{$adverts->render()}}

                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>



@endsection

Baza de date:

Păi spune-ne cum salvezi IP-urile, ai făcut o tabelă pivot sau cum?
Poți rezolva tot cu o tabelă, gen user_clicks cu user_id, ad_id, ip_address, clicks, timestamps

1 Like

Fix așa am și acum, pe mine mă interesează partea de PHP de data asta, cum aș putea face să contorizez click-urile în coloana clicks

  1. capturezi evenimentul click în browser (javascript)
  2. transmiți informația la server (ajax)
  3. înregistrezi informația în db

Tu întrebi de pasul 3. Ai făcut pașii 1-2?

Folosesti blade deci presupun ca lucrezi cu Laravel. Exista pe request metoda care iti returneaza ip-ul:

request()->ip()

Dacă aș scrie tot codul necesar în partea de view fără să mă mai folosesc de altă rută ar fi ok?

NU, nu este ok

De ce nu este?

Daca am inteles bine e in laravel, practic poti face asta, dar ca structura a codului nu e frumos.

Poti da detalii, te rog?

Nu, vreu sa dau detalii, e opinia mea si fac ce vreau cu ea :smiley: :smiley:

Sincer nu cred ca ar fi ok.

View ar fin partea de afisare a informatiilor si numai aia ar trebui sa faca. Tot ce tine de backend, ar trebui sa fie treaba back-enddului

1 Like

Până la urmă toată treabă se face cu increment, ideea e că nu știu exact cum aș putea începe.

Poate pe unii ii ajuta sa-ti argumentezi opinia, sa inteleaga si DE CE, nu doar DA/NU.

2 Likes

Păi ce rost mai are să foloseşti framework-uri cu denumiri care mai de care mai fancy dacă tot le faci varză? :slight_smile: Bănuiesc că “view” nu se cheamă aşa doar pentru că nu au găsit altă rimă, ci că pur şi simplu aia e partea de afişare, nu de efectuat operaţii cu baza de date.

1 Like

Daca a studiat framework-ul laravel, cred ca a invatat MVC pentru a aplica.

Iar pe tine @msd te am inteles, mi-ai dat in obraz, ca fiecare raspuns oferit de mine sa fie si explicat. Multumesc pentru feedback :smiley:

1 Like

Inca ma bate grav problema asta :))

pai bate-o si tu pe ea !

in alta ordine de idei

  1. pe acel link pui onclick=clicks()
  2. initializezi o variabila cu 0 si apoi o incrementezi
  3. trimiti variabila click care are nr de click-uri la baza de date. Poti folosi ori fetch ori alt ceva

Pt ip poate trebuie sa folosesti ce stie acel Blade din Laravel. Cred ca ce a zis @Cristi_Nebunu, te ajuta pt partea de ip. Cred ca ar fi bine ca mai intai sa setezi o sesiune pt user-ul logat.

Edit: Am adaugat si partea de trimitere la server. De chestiile comentate este posibil, sau nu, sa ai nevoie. Cauti si tu pe mdn ce fac

Atat


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    let clicks = 0;
    const url = `your_url`;
    function clickMe() {
        clicks += 1;
        document.getElementById("clicks").innerHTML = clicks;
        sendClicks(url, {nr_clicks: clicks, ip: "192.168.0.45"})

    }

    function sendClicks(url = ``, data = {}){
        return fetch(url, {

            method: "post",
            //mode: "cors",
            //cache: "no-cache",
            //credentials: "same-origin",
            headers: {
                'Content-Type': 'application/json'
            },
            //redirect: "follow",
            //referrer: "no-referrer",
            body: JSON.stringify(data),

        })
        .then(response => response.json())
            .then(data => console.log(data))
            .catch(err => console.error(err));

    }
</script>
<a href="https://stackoverflow.com/questions/22402777/html-javascript-button-click-counter" onclick="clickMe()" target="_blank">Click</a>
<p>Clicks: <a id="clicks">0</a></p>
</body>


</html>
1 Like

Eu personal nu as reinventa roata, Piwik e super ok si te scuteste de implementarea rapoartelor uzuale.

Este recomandad ca View-urile și Controler-ele să își păstreze scopul. View afișează, controler procesează. Un prim beneficiu al acestei reguli ar fi faptul că astfel se evită codul de tip legacy: testele sunt mai ușor de scris, codul mai ușor de citit/interpretat/modificat.