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

hoe reload page eenmalig nadat op anchor geklikt

bewerkt vr 30 okt 2015 in PHP, MySQL Posts: 879
Het gaat om de volgende functie waarin een paar anchors geechood worden:

foreach($Reactions as $Action) {
if(CheckPermission($Action->Permission)) {
$CountString = ($ShowCount && $Action->Count) ? $Action->Count : '';
$ActionsString .= Anchor(
Wrap(' ', 'span', array('class' => 'ReactSprite React-' . $Action->ActionID . ' ' . $Action->CssClass)) .
WrapIf($CountString, 'span', array('class' => 'Count')) .
Wrap($Action->Name, 'span', array('class' => 'ReactLabel')), 'react/' . $Type . '/' . $ID . '/' . $Action->ActionID,
array(
'class' => 'Hijack ReactButton',

'title' => $Action->Tooltip)
);
}
}

$AllActionsString = Wrap($ActionsString, 'span', array('class' => 'ReactMenu'));

if($Echo) {
echo $AllActionsString;


return true;
}
else {
return $AllActionsString;
}
}

}

Op regel 19 wordt de hele meuk geechood. Hoe krijg ik het nu spits dat er een eenmalige page reload plaatsvind als er op een anchor geklikt is?

Reacties

  • Bedoel je dit misschien?
    header("location: ".$_SERVER['REQUEST_URI'])
  • bewerkt vr 30 okt 2015
    PMPosts: 879
    ja die had ik ook al geprobeerd maar dan blijft ie op de refresh hangen als die header location binnen de functie zit. Probleem is die refresh moet eenmalig uitgevoerd worden als er op een anchor geklikt wordt, en anders niet. Dus er zal zoiets moeten komen: "Als anchor is hit, header location...." Hoe kan ik die "als anchor is hit" nu catchen? Moet ik d at niet met javascript doen? Triggeren op de classe Reactlabel hierboven?
  • bewerkt za 31 okt 2015
    PMPosts: 415
    Probleem met javascript, is dat de php code misschien (nog) niet uitgevoerd wordt alvorens een refresh (of is dat niet nodig?).
    Maar wat ik niet snap, waarom zou je een refresch willen na een klik op een anchor, waarom maak je er niet gewoon een link van?
    nuet
  • PMPosts: 879
    vinTage schreef:: Probleem met javascript, is dat de php code misschien (nog) niet uitgevoerd wordt alvorens een refresh
    Klopt, daar loop ik nu al tegenaan. Er wordt door javascript een refresh gedaan terwijl de classe nog niet geparsed is door PHP.
    Waar het eigenlijk om gaat is die icoontjes Inzichtvol, Excellent, Lol en Thank You. Als je daar op klikt wordt door het javascript zoals het nu is de classe "gehijacked" waardoor er gelijk een 1 achter het anchor komt te staan. Maar het icoontje dat geplaatst wordt in de classe UserReactionsWrap wordt pas getoond na een refresh. En dat wil ik dus eigenlijk ook direct laten verschijnen zonder refresh.
    Hierondr zie je in de eerste Public function hoe de anchors geechood worden:
    In regel 8 worden ze toegekend aan de variable en op regel 23 worden ze geechood.
    Op regel 13 wordt gelijk de classe veranderd in Hijack waardoor de 1 bij het anchor gelijk izchtbaar wordt zonder refresh.

    function RenderReactionList($ID, $Type, $Echo = TRUE) {
    $Reactions = Yaga::ReactionModel()->GetList($ID, $Type);
    $ShowCount = Gdn::Session()->CheckPermission('Yaga.Reactions.View');
    $ActionsString = '';
    foreach($Reactions as $Action) {
    if(CheckPermission($Action->Permission)) {
    $CountString = ($ShowCount && $Action->Count) ? $Action->Count : '';
    $ActionsString .= Anchor(
    Wrap(' ', 'span', array('class' => 'ReactSprite React-' . $Action->ActionID . ' ' . $Action->CssClass)) .
    WrapIf($CountString, 'span', array('class' => 'Count')) .
    Wrap($Action->Name, 'span', array('class' => 'ReactLabel')), 'react/' . $Type . '/' . $ID . '/' . $Action->ActionID,
    array(
    'class' => 'Hijack ReactButton',

    'title' => $Action->Tooltip)
    );
    }
    }

    $AllActionsString = Wrap($ActionsString, 'span', array('class' => 'ReactMenu'));

    if($Echo) {
    echo $AllActionsString;


    return true;
    }
    else {
    return $AllActionsString;
    }
    }

    Pas in de public function erna vind de class parsing plaats waarin het usericoontje met het Inzichtvol, Excellent..... icoontje erbij wordt geplaatst:
    De classe is UserReactionWrap. Deze zou dus eigenlijk OOK direct moeten verschijnen als op anchor geklikt is. Maar dat krijg ik niet spits.

    function RenderReactionRecord($ID, $Type) {
    $Reactions = Yaga::ReactionModel()->GetRecord($ID, $Type);
    $Limit = C('Yaga.Reactions.RecordLimit');
    $ReactionCount = count($Reactions);
    $i = 0;
    foreach($Reactions as $Reaction) {
    $i++;

    // Limit the record if there are a lot of reactions
    if($i <= $Limit || $Limit <= 0) {
    $User = Gdn::UserModel()->GetID($Reaction->UserID);
    $DateTitle = sprintf(
    T('Yaga.Reactions.RecordFormat'),
    $User->Name,
    $Reaction->Name,
    Gdn_Format::Date($Reaction->DateInserted, '%B %e, %Y')
    );
    $String = UserPhoto($User, array('Size' => 'Small', 'title' => $DateTitle));
    $String .= '<span class="ReactSprite Reaction-' . $Reaction->ActionID . ' ' . $Reaction->CssClass . '"></span>';

    //////////////

    //////////////
    $Wrapttributes = array(
    'class' => 'UserReactionWrap',
    'data-userid' => $User->UserID,
    'title' => $DateTitle
    );
    echo Wrap($String, 'span', $Wrapttributes);
    ............





  • Kun je het niet zo doen? (harop denk modus want die codes betekenen niet zo veel voor me)

    function RenderReactionList($ID, $Type, $Echo = TRUE) {

    //knipje

    RenderReactionRecord($ID, $Type)
    }
  • PMPosts: 879
    Een functie aanroepen binnen die andere functie; dat zou idd logisch zijn maar dat werkt hier niet helaas. Breek me hier vaker de nek over. Heeft denk ik met die Controllers te maken die alles verwerken. vlg mij mag ook alleen maar een protected function binnen een public function aangeroepen worden....Enfin, zal eens op Vanilla forum balletje opgooien
  • PMPosts: 48
    Ik gebruik window.open met een onclick binnen een span / div / h1..h6.
  • kbcs schreef:: Ik gebruik window.open met een onclick binnen een span / div / h1..h6.

    nuet schreef::
    vinTage schreef:: Probleem met javascript, is dat de php code misschien (nog) niet uitgevoerd wordt alvorens een refresh
    Klopt, daar loop ik nu al tegenaan. Er wordt door javascript een refresh gedaan terwijl de classe nog niet geparsed is door PHP.
  • bewerkt vr 6 nov 2015
    PMPosts: 48
    Voor zover ik kan nagaan wordt eerst alle php uitgevoerd voordat de pagina gerunned wordt.

    Anders moet je de gehele pagina als een string resolven en daarna met 1 echo aan het eind aan de browser doorgeven. Dan is gegarandeerd alles geparsed door PHP.

    Dat is nu zeker de beste oplossing. Als je een andere pagina wilt laden, dan kun je alles tot dan aangemaakt dumpen, toch niet nodig.

    De header / location optie van php kun je dan gebruiken.

    header("Location:" -> hierachter de gewenst complete URL);


    Dit werkt alleen als het het eerste commando is wat gegeven wordt. Dit gaat zelfs al fout als je een lege HTML regel hebt.
  • bewerkt vr 6 nov 2015
    PMPosts: 879
    Ik heb het spits gekregen. In onderstaande functie heb ik de 2e else op regel 15 verwijderd en nu kleurt de V gelijk groen bij klikken en wordt direct erna een refresh gedaan waarna link "Beste antwoord" bovenaan li naast de textarea verschijnt van de topic starter. Deze verdwijnt ook weer als je de V uitschakeld.

    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' => "img-swap on"));
    //echo Wrap("", array('title' => "Beste Antwoord", 'class' => "img-swap"));
    }
    else {
    echo Anchor("", 'discussion/markv/' . $Comment->CommentID, array('title' => "Beste Antwoord", 'class' => "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'));
    }
    }*/
    }

    Hier wordt de link gecreeerd:

    public function DiscussionController_BeforeCommentDisplay_Handler($Sender) {

    $Discussion = $Sender->EventArguments['Discussion'];
    $Comment = $Sender->EventArguments['Comment'];
    if ($Comment->MarkV) {
    ?>
    <li class="BestAnswerLink">
    <div class="BestAnswer">
    <?php
    echo Anchor('Beste<br />Antwoord', Url('discussion/comment/' . $Comment->CommentID . '/#Comment_' . $Comment->CommentID), array('name' => 'Item_'.($CurrentOffset), 'class' => 'beste_antwoord', 'rel' => 'nofollow'));
    ?>

    </div>
    </li>
    <?php
    }
    //else {
    //echo 'voldoet niet aan voorwaarde';
    //}// endif (Comment->MarkV)
    }
  • PMPosts: 732
    Wordt hier niet op user gecontroleerd ?
    Ik zie als iemand het aanvinkt kan ik het weer uitvinken ?
    If it's not fun, you're not doing it right!
  • bewerkt vr 6 nov 2015
    PMPosts: 879
    ReneV schreef:: Wordt hier niet op user gecontroleerd ?
    Ik zie als iemand het aanvinkt kan ik het weer uitvinken ?
    Dat klopt omdat jij Admin rechten hebt. Een normale member kan alleen in zijn eigen gestarte topics de antwoorden van anderen aanvinken met V.
    Deze regel staat er ook bij maar had ik hierboven weggelaten:

    if($Session->UserID == $Discussion->InsertUserID || $Session->CheckPermission('Garden.Moderation.Manage')) {

  • PMPosts: 732
    A oke, ja die had ik niet gezien ;)
    If it's not fun, you're not doing it right!
Login of Registreer om te reageren.