Volgersysteem
Hoi,
Ik wil graag een 'volgsysteem' maken zoals bijvoorbeeld op Twitter. Waarbij je dus op 'Follow' kan klikken waarbij je iemand kan volgen. Ik heb even een versimpelde opzet gemaakt, maar loop een beetje vast.
Het MYSQL-deel kan ik wel - heb ik nog even weggelaten - alleen ben ik niet zo handig met javascript/jQuery deel. Hoe kan ik dat vervolgens doen dat de button op de pagina verandert van Follow naar Unfollow als iemand er (succesvol) op heeft geklikt?
Is tot dusver zo in orde? En is Ajax dan de manier waarop dat moet? Ik vind het altijd een beetje raar dat je de URL kan zien waar die heen gaat. Dat doet een beetje amateuristisch aan voor mijn gevoel, maar dat is geen probleem? Of hoe doen grotere sites dat?
Alvast bedankt voor de hulp.
follow.php
Ik wil graag een 'volgsysteem' maken zoals bijvoorbeeld op Twitter. Waarbij je dus op 'Follow' kan klikken waarbij je iemand kan volgen. Ik heb even een versimpelde opzet gemaakt, maar loop een beetje vast.
Het MYSQL-deel kan ik wel - heb ik nog even weggelaten - alleen ben ik niet zo handig met javascript/jQuery deel. Hoe kan ik dat vervolgens doen dat de button op de pagina verandert van Follow naar Unfollow als iemand er (succesvol) op heeft geklikt?
Is tot dusver zo in orde? En is Ajax dan de manier waarop dat moet? Ik vind het altijd een beetje raar dat je de URL kan zien waar die heen gaat. Dat doet een beetje amateuristisch aan voor mijn gevoel, maar dat is geen probleem? Of hoe doen grotere sites dat?
Alvast bedankt voor de hulp.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<?php
echo "<div class='button' data-button='follow' data-user='12345'><a>Follow</a></div>";
?>
<script>
$(document).ready(function(){
$(".btn").on("click", "a", function(e) { e.preventDefault() });
$(document).on('click', '.button', function(){
var user = $(this).data("user");
var button = $(this).data("button");
$.ajax({
url:"follow.php",
method:"POST",
data:{user:user, button:button},
dataType:"text",
success:function(data){
alert(data);
}
});
});
});
</script>
<?php
echo "<div class='button' data-button='follow' data-user='12345'><a>Follow</a></div>";
?>
<script>
$(document).ready(function(){
$(".btn").on("click", "a", function(e) { e.preventDefault() });
$(document).on('click', '.button', function(){
var user = $(this).data("user");
var button = $(this).data("button");
$.ajax({
url:"follow.php",
method:"POST",
data:{user:user, button:button},
dataType:"text",
success:function(data){
alert(data);
}
});
});
});
</script>
follow.php
Bij je success-event zorg je ervoor dat je met jQuery je style aanpast.
Controleer wel in je PHP-script of alles goed is gegaan, en spuug een true uit. In je JavaScript code controller je hier ook op.
Controleer wel in je PHP-script of alles goed is gegaan, en spuug een true uit. In je JavaScript code controller je hier ook op.
Na wat speurwerk heb ik dit toegevoegd aan het success deel. En het werkt, maar is dat zo netjes op deze manier?
Bij het genereren van de pagina weet je toch al of je iemand volgt of niet? En dit kun je ook dynamisch updaten als dat verandert, dus de bovenstaande code is niet heel erg voor de hand liggend.
Ja, dat haal ik inderdaad op uit de database. Dus bij het genereren van de pagina weet je of er Follow of Unfollow komt te staan.
Het tweede deel van je reactie kan ik niet helemaal volgen. Bedoel je dat ik het weer uit de database moet ophalen? Met PHP en MYSQL kan ik aardig overwegen, maar jQuery en javascript is niet echt mijn ding. Vandaar ook de vraag hoe ik dat bij success moet doen.
Het tweede deel van je reactie kan ik niet helemaal volgen. Bedoel je dat ik het weer uit de database moet ophalen? Met PHP en MYSQL kan ik aardig overwegen, maar jQuery en javascript is niet echt mijn ding. Vandaar ook de vraag hoe ik dat bij success moet doen.
Hm, bij nader inzien dekt het bovenstaande wel de lading denk ik, al zou ik een boolean teruggeven die aangeeft of -iemand in de nieuwe situatie iemand anders volgt (true) of niet (false). Omdat er ook maar 2 smaken zijn zou je dit in een if/else kunnen zetten. En het enige wat in principe bijgewerkt hoeft te worden is de labeltekst en een manier om over te brengen welke actie uitgevoerd dient te worden, dus het bovenstaande kan ook prima.
Maar dan gebruik je dus 'false' voor een succesvolle activiteit, dus eigenlijk true? Wat ik nu met 1 en 2 heb, maar dan met true en false? Want je hebt volgen > ontvolgen, maar ook ontvolgen > volgen.
In dat geval weet ik niet of het met if/else kan. Want dan heb je denk ik wel meer smaken nodig voor het geval er iets mis zou gaan.
Of bedoel je dat je eerst zou nagaan of het om volgen/ontvolgen gaat, en vervolgens true/false daaraan hangt? Dus wijziging is dan true, en geen wijziging is false. Maar dan wordt de code eigenlijk alleen maar groter.
In dat geval weet ik niet of het met if/else kan. Want dan heb je denk ik wel meer smaken nodig voor het geval er iets mis zou gaan.
Of bedoel je dat je eerst zou nagaan of het om volgen/ontvolgen gaat, en vervolgens true/false daaraan hangt? Dus wijziging is dan true, en geen wijziging is false. Maar dan wordt de code eigenlijk alleen maar groter.
Status = true / false, action = follow / unfollow, UserID = 1234
Zou zou ik het doen qua opzet, en dan in json opbouwen. Bij een Status = False kan je nog een Error string meegeven met de error.
Zou zou ik het doen qua opzet, en dan in json opbouwen. Bij een Status = False kan je nog een Error string meegeven met de error.
Gewijzigd op 15/09/2018 08:57:31 door - Ariën -
Bij het uitsturen van de un/follow actie moet je natuurlijk een userid meegeven, maar bij de respons is dat waarschijnlijk niet nodig, omdat je weet welke click de un/follow actie initieert.
Zo'n status is leuk, maar is extra. Tenzij je reden hebt om aan te nemen dat dit vaak kan misgaan kun je dit achterwege laten, of je moet plannen hebben om meerdere acties op eenzelfde wijze op te zetten, dan kun je gaan nadenken over een uniform(er)e opzet, maar voor nu volstaat:
uitgaand (ajax call): follow: true/false, userid: xyz
binnenkomend (ajax response): following: true/false
Allerlei extra foutafhandeling kan handig zijn, maar dit is zoals gezegd allemaal extra. Als je de introductie van complexiteit (statussen, errorcodes) in eerste instantie niet nodig hebt, zou ik deze in eerste instantie niet inbouwen. Neemt niet weg dat je deze functionaliteit goed test, uiteraard. Maar een onnodig "verbose" systeem lijkt mij initieel niet erg zinnig, omdat je dan dingen van begins af aan al complexer maakt dan strict noodzakelijk.
Zo'n status is leuk, maar is extra. Tenzij je reden hebt om aan te nemen dat dit vaak kan misgaan kun je dit achterwege laten, of je moet plannen hebben om meerdere acties op eenzelfde wijze op te zetten, dan kun je gaan nadenken over een uniform(er)e opzet, maar voor nu volstaat:
uitgaand (ajax call): follow: true/false, userid: xyz
binnenkomend (ajax response): following: true/false
Allerlei extra foutafhandeling kan handig zijn, maar dit is zoals gezegd allemaal extra. Als je de introductie van complexiteit (statussen, errorcodes) in eerste instantie niet nodig hebt, zou ik deze in eerste instantie niet inbouwen. Neemt niet weg dat je deze functionaliteit goed test, uiteraard. Maar een onnodig "verbose" systeem lijkt mij initieel niet erg zinnig, omdat je dan dingen van begins af aan al complexer maakt dan strict noodzakelijk.
Gewijzigd op 15/09/2018 12:00:56 door Thomas van den Heuvel
Bedankt voor jullie hulp. Heb het nu inderdaad met following true/false gedaan. Helemaal zoals ik het wil.
Heb alleen nog één bijkomende vraag. Ik heb voor de buttons een hover kleur gezet. Als je iemand volgt en op de button gaat staan geeft hij een rode kleur, als je dus dreigt te ontvolgen. Het probleem is alleen dat als je op 'volgen' klikt je direct de rode kleur krijgt, omdat je al 'hovert'. Hoe kan ik dat voorkomen dat hij bij een click geen hover doet?
Even een versimpelde opzet:
Heb alleen nog één bijkomende vraag. Ik heb voor de buttons een hover kleur gezet. Als je iemand volgt en op de button gaat staan geeft hij een rode kleur, als je dus dreigt te ontvolgen. Het probleem is alleen dat als je op 'volgen' klikt je direct de rode kleur krijgt, omdat je al 'hovert'. Hoe kan ik dat voorkomen dat hij bij een click geen hover doet?
Even een versimpelde opzet:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='button1'>button1</div>
<script>
$(document).on('click', '.button1', function(){
$('.button1').html("button2");
$(this).removeClass('button1');
$(this).addClass('button2');
});
</script>
<style>
.button1 {background-color: #FF0;}
.button1:hover {background-color: #F93;}
.button2 {background-color: #CDE;}
.button2:hover {background-color: #F00;}
</style>
<div class='button1'>button1</div>
<script>
$(document).on('click', '.button1', function(){
$('.button1').html("button2");
$(this).removeClass('button1');
$(this).addClass('button2');
});
</script>
<style>
.button1 {background-color: #FF0;}
.button1:hover {background-color: #F93;}
.button2 {background-color: #CDE;}
.button2:hover {background-color: #F00;}
</style>
Iemand een idee hoe ik bovenstaande kan oplossen?
Euh, in eerste instantie geen rode hoverkleur definiëren? Of wellicht een :active (sub)class introduceren? Of misschien onderscheid maken tussen de "mousedown" en "mouseup" events, in plaats van het "click" event te gebruiken?
Trouwens, regel 9, moet dat niet ook $(this) zijn in plaats van $('.button1')? Geef je daarmee niet alle divs met klasse .button1 deze de inhoud "button2"?
Trouwens, regel 9, moet dat niet ook $(this) zijn in plaats van $('.button1')? Geef je daarmee niet alle divs met klasse .button1 deze de inhoud "button2"?
Thanks voor je hulp. Je hebt me op het goede pad geholpen. Een beetje googlen op die mouse-dingen heeft me naar mouseleave geleid. Heb nu dat na de klik, en nadat je de muis van de button haalt een active class wordt toegevoegd.
Dat tweede heb je gelijk in, dit was ook een beetje prutswerk.
Dat tweede heb je gelijk in, dit was ook een beetje prutswerk.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='button1'>button1</div>
<script>
$(document).on('click', '.button1', function(){
$(this).html("button2");
$(this).removeClass('button1');
$(this).addClass('button2');
$(this).one('mouseleave', function() {
$('.button2').addClass('active');
});
});
</script>
<style>
.button1 {background-color: #FF0;}
.button1:hover {background-color: #F93;}
.button2 {background-color: #CDE;}
.active:hover {background-color: #F00;}
</style>
<div class='button1'>button1</div>
<script>
$(document).on('click', '.button1', function(){
$(this).html("button2");
$(this).removeClass('button1');
$(this).addClass('button2');
$(this).one('mouseleave', function() {
$('.button2').addClass('active');
});
});
</script>
<style>
.button1 {background-color: #FF0;}
.button1:hover {background-color: #F93;}
.button2 {background-color: #CDE;}
.active:hover {background-color: #F00;}
</style>
Of nog een andere optie: maak de button tijdelijk inactief als deze in "transitie" is, en dan, als je AJAX-call resultaat heeft geretourneerd, pas je de classes pas toe? Dan is namelijk ook pas bevestigd dat de wijziging ook daadwerkelijk is uitgevoerd.




