Webprofis is een Forum waarin je vragen kunt stellen die webgerelateerd zijn. Heb je vragen over of problemen met je Webpagina, HTML, CSS, Javascript, PHP of andere client of serverside scriptingtalen? Stel ze dan gerust op dit forum. Op dit forum zijn een aantal vrijwilligers actief die u graag met uw vragen willen helpen en u waar mogelijk een passend antwoord aanbieden. Hebt u zelf veel ervaring en kennis met betrekking tot het bovenstaande? U bent van harte welkom om uw kennis met anderen te delen!

We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.

Team Webprofis

andere anchors blokkeren als er eentje op actief staat

bewerkt zo 25 okt 2015 in PHP, MySQL Posts: 879
het gaat om de volgende functie waarin de groene V actief wordt als je op de kleine grijze V klikt.

protected function AddMarkV($Sender) {
$Discussion = $Sender->EventArguments['Discussion'];
$Session = Gdn::Session();
$Comment = $Sender->EventArguments['Comment'];
if($Session->UserID == $Discussion->InsertUserID || $Session->CheckPermission('Garden.Moderation.Manage')) {
if ($Comment->MarkV) {

echo Anchor("", 'discussion/markv/' . $Comment->CommentID, array('title' => "Annuleren", 'class' => "Hijack img-swap on"));

}
else {
echo Anchor("", 'discussion/markv/' . $Comment->CommentID, array('title' => "Beste Antwoord", 'class' => "Hijack img-swap"));
}
}
else {
if ($Comment->MarkV) {
echo Wrap("", 'div', array('class' => 'Hijack img-swap on'));
$Sender->CommentModel->SetField($Comment->CommentID, 'MarkV', !$Comment->MarkV);

}
else {
echo Wrap("", 'div', array('class' => 'Hijack img-swap'));
}
}
}

Wat hierboven gebeurt: Als je op de grijze V klikt, swapt de classe op on (classe img.swap on bezit de groene V)
Als je er niet op klikt (default) blijft de V grijs (classe img.swap)
Als je op een V klikt die al groen is, wordt ie weer grijs (classe img.swap on switch naar img.swap terug).
Nu is het echter mogelijk meerdere V's groen te maken. Hierop wil ik een check maken zodat dat niet meer mogelijk is als er al een V groen is. De anderen kunnen dan niet ook nog eens groen worden.
Hoe kan ik dit het beste realiseren?

Reacties

  • bewerkt zo 25 okt 2015
    PMPosts: 415
    Dit hele verhaaltje klinkt mij meer als javascript in de oren, alleen tijdens het parsen van de pagina heb je iets aan de serverside code.
    Als je dit dus (ook) serverside wilt oplossen, zul je dus bij de aanroep van deze functie moeten gaan kijken of er al een post een achor bevat of niet, om er dan een (nieuwe) if rule bij te plempen.
  • bewerkt ma 26 okt 2015
    PMPosts: 879
    idd @vinTage Het is logischer om de click te blokkeren in het javascript; dit is het bijbehorende javascript:

    jQuery(document).ready(function ($) {
    $('a.img-swap').click(function () {
    $(this).toggleClass('on');
    });
    });
    Er moet dus nu iets komen van: als de classe op on staat, dan alle andere anchors blokkeren, behalve het anchor op de classe die op on staat, want anders kan die niet meer teruggezet worden

    Edit
    Heb het nu zo dat een 2e V niet veranderd bij clicken als er al eentje groen is (classe dus op on staat); je kunt de groene wel direkt weer terugzeten op grijs

    jQuery(document).ready(function ($) {
    $('a.img-swap').click(function () {
    if($('a.img-swap.on').not(this).length) return;
    $(this).toggleClass('on');
    });
    });

    Maar na een refresh slaat het 2e anchor dat je probeerde aan te klikken WEL op groen
    Dus ik zal ook een check serverside moeten doen denk ik dan?

  • Hmm, beetje vreemd of ook niet alle code?
    Ik neem aan dat wanneer je die toggleClass aanroept, dat er dan ook een ajaxcall gedaan wordt naar het php gedeelte?
    Die call zou je dan dus ook niet moeten doen.
  • PMPosts: 879
    Dit is de meest basale php code waarop het functioneert:

    protected function AddMarkV($Sender) {
    $Discussion = $Sender->EventArguments['Discussion'];
    $Session = Gdn::Session();
    $Comment = $Sender->EventArguments['Comment'];
    if($Session->UserID == $Discussion->InsertUserID || $Session->CheckPermission('Garden.Moderation.Manage')) {
    if ($Comment->MarkV) {

    echo Anchor("", 'discussion/markv/' . $Comment->CommentID, array('title' => "Annuleren", 'class' => "Hijack img-swap on"));
    //echo Wrap("", array('title' => "Beste Antwoord", 'class' => "img-swap"));
    }
    else {
    echo Anchor("", 'discussion/markv/' . $Comment->CommentID, array('title' => "Beste Antwoord", 'class' => "Hijack img-swap"));
    }
    }

    }
    Als je het anchor aanslaat, switched de classe op on. Het javascript zorgt er alleen voor dat de Hijack niet direct plaatsvind, maar na een refresh zal die toch op classe on gaan
  • Voor zover ik het begrijp, zul je dan een query moeten maken waarbij je het aantal markers telt uit een topic, en wanneer het resultaat dan < 1 is, de marker plaatsen en anders niets.
  • PMPosts: 879
    zit ff te denken over die waarde: ik zou dus idd een check moeten doen of er binnen die discussie ID al een anchor actief is. Makkleijkste is natuurlijk in de database een waarde 1 toekennen en dan checken of er al een waarde 1 staat en anders het anchor vrijgeven. Kan ik dit niet ook realiseren zonder DB? Maar hoe zou dat dan oeten in die if loop hierboven?
  • Zonder db wordt het erg lastig (en je kunt als je fanatiek bent en verder geen leven hebt) altijd om het javascript heen (dus het is een soort van onveilig of beter gezegd onbetrouwbaar).
    Waar je onder andere mee te maken hebt als je een js only check doet, is dat het niet gaat kloppen als je de anchors op de pagina checked zodra je meerdere pagina's hebt.

    Het makkelijkst zou zijn als je in de openingspost (in de db) bijhoud welke post het anchor heeft.
    Bij het aanklikken (met de juiste rechten) update je gewoon die waarde (als het dezelfde post betreft zet je de waarde op 0)
  • bewerkt vr 6 nov 2015
    PMPosts: 48
    Als je alle anchors een vaste naam geeft, of als je ze een naam met opvolgend nummer geeft, is het niet zo moelijk in javascript.

    Bij een vaste naame maak je een lijstje met de vaste namen, eventueel doorgeven aan javascript bij de aanroep of in de setup. Dat lijstje kun je genereren in PHP.

    Bij opvolgende nummers maak je een lus en ga je ze langs totdat een nummer niet meer bestaat. Dt zou dan het einde van het lijstje zijn. Of als je er gaten in hebt zitten ga door tot een bepaald eindnummer.

    Hieronder een voorbeeld met unieke namen:

    Select_ID = een lijstje met namen gescheiden door een spatie.

    Bij opvolgende nummers kan Select_ID vervallen en kun je het "anchor_id_ + nummer ipv Select_ID gebruiken. $select_IDs.length moet je dan vervangen door het aantal. $select_IDs.lengt kun je op 0 zetten als er een undefined is gevonden.


    function jvs_setting_changed (Select_ID, Base_URL) {
    $select_IDs = Select_ID.split (" ");
    sValue = "";
    for (index = 0; index < $select_IDs.length; index ++) {
    var sel_ID = $select_IDs[index];
    var sel_obj = document.getElementById("wtps_select_" + sel_ID);

    if(sel_obj != undefined) {
    var sel_Value = nsel_obj.value;

    if(sel_Value != "") {
    sValue += "&" + sel_ID.toLowerCase() + "=" + sel_Value.toLowerCase();
    };
    };
    };

    if(sValue != "") {
    window.open(Base_URL + sValue, "_Top");
    };
    };

    vinTage edit:
    Code tussen codetags gepropt
  • Dit werkt ook niet bij meerdere pagina's i.m.h.o..?
    Als je op pagina een bent, weet je niet of er op pagina 2 of pagina 450 al een "like" gegeven is. (zonder met een sql query alle resultaten af te gaan.
  • PMPosts: 48
    Dit zou moeten werken zolang een pagina geladen is. Zodra je een andere pagina laad, begin je weer opnieuw.

    Als je over meerdere pagina's wilt werken zul je het resultaat moeten opslaan, zodat je dat terug kunt halen. Dan zou je code moeten aanpassen, zodat daarin wordt opgeslagen welke item geselecteerd was.
  • PMPosts: 732
    Alles wordt uit de database geladen, waarom niet een extra row bv. 1 oke, en 0 niet weergeven.
    of indien topic row is 1 dan niks meer mogelijk.

    ben met eerder bericht van vinTage eens (db).
    If it's not fun, you're not doing it right!
Login of Registreer om te reageren.