an alternative to @name

  • Betroffene Version
    WoltLab Suite 3.0

    Hello ,

    there are a plugin or something in woltlab to copy the name of a user to a post ? , i know i can use the @ plus the name . My users like to put the name to thanks and a click on the name to have the name in the post would be a good solution .

    we have

    Zitat

    thanks julie,marc, epic32 , epic22 ., admin , modo 1 ...... for the answer

  • I don't know if it helps you.

    Suite Core has a built in user tag which uses the id of an user. [user=1474569][/user] becomes marcbelgique.

    The other way is creating a link with an own link text. <a href="https://www.woltlab.com/user/1340400-fighter456/">Fighter456</a> becomes Fighter456.

    For both solutions it should be possible to create a box containing the codes for a visited user profile for simple copy and paste.

  • Thanks for your reply , but i need more help , the box is a good idea but if you have 5 or more people to thanks it is not a good idea , to copy and paste

    If i want to add a new button under the avatar and the name i must modifiy the template

    messageSidebar and create a new group by exemple mypersonaltemplate it is correct ?

    Smarty
    <div class="messageAuthorContainer">
                    <a href="{link controller='User' object=$userProfile->getDecoratedObject()}{/link}" class="username userLink" data-user-id="{@$userProfile->userID}"{if $enableMicrodata} itemprop="url"{/if}>
                        <span{if $enableMicrodata} itemprop="name"{/if}>{if MESSAGE_SIDEBAR_ENABLE_USER_ONLINE_MARKING}{@$userProfile->getFormattedUsername()}{else}{$username}{/if}</span>
                    </a>
                    {if $userProfile->banned}<span class="icon icon16 fa-lock jsTooltip jsUserBanned" title="{lang user=$userProfile}wcf.user.banned{/lang}"></span>{/if}
                    
                    {event name='messageAuthorContainer'}
                </div>

    and insert a new <div> under this code


    Code
    <div>
        <button class="mythanksbutton" onclick="insertName($username)">Thanks</button>
    </div>

    and create a jscript

    if have many questions

    where i must write my new jscript , in wich template ?

    when i modify a template , how the new template is used and not the default template

    what is the name of redactor inside the forum , i found the code on redactor site

    Thanks for your help

  • Yes, this is a possible implementation path.

    Since I have not yet dealt with the editor myself, I can not help you with your javascript inserting the names in the editor area. The script element can be inserted in the mentioned messageSidebar template.

    JavaScript
    <script data-relocate="true">
        $(function() { 
            elByClass('mythanksbutton')[0].addEventlistener(WCF_CLICK_EVENT, function(event) {
                // here your code inserting the information in the editor
            });
        });
    </script>

    The name and the link of the user can be stored in data-attributes by the button element.

    HTML
    <button class="mythanksbutton" data-link="{link controller='User' object=$userProfile->getDecoratedObject()|encodeJS}{/link}" data-username="{$userProfile->getDecoratedObject()->username|encodeJS}">Thanks</button>

    You can access the values by the following:

    JavaScript
    var link = elData(event, 'link');
    var username = elData(event, 'username');

    With these information you can build the link and insert the link in the editor.


    The created template group has to be selected in the style. Otherwise the default group will be used.

  • try it


    but i have a error and don't understand it

    Code
    TypeError: e.getAttribute is not a function
    • Offizieller Beitrag

    $(function() {

    This is actuall jQuery code and not really needed, you can invoke your code right away, as long as you make use of data-relocate="true".

    elByClass('mythanksbutton')[0]

    Your can use elBySel('.mythanksbutton') instead, it will return the first match only (uses document.querySelector).

  • JavaScript
    var username = "marcbelgique";
    $('#text').redactor('insert.text', username);

    The method insert.html differs by treating the passed arguments as a HTML string, which comes in handy when you want to link to the actual user profile.

    when i use your code or insert.html , i have a problem , if the username is admin , i have adminadmin in redactor

    and if i try window.alert (username) , i have two time the window.alert


    try with elBysel

    and the same problem with two time the name and the window.alert

    Einmal editiert, zuletzt von marcbelgique (14. September 2017 um 16:10)

  • when i look in the html page

    my script is two time too , if i remove the script of my template , there are nothing (thus it is only one time ) , if i add the script on my template , it is too time in my html page...

    An idea ?

    • Offizieller Beitrag

    If somebody can explain this code , i'm very happy to understand

    Basically, your template is output more than once, and so is your JavaScript. Because it appears multiple times, it is also executed multiple times, causing more and more click handlers to be bound to the button. Each handler operates independently from others, so they start stacking up and causing the same code to be executed in parallel.

    The tiny template scripting wrapper above simply checks if a specific variable is set, and if not, sets it and outputs your JavaScript code. On the next code iteration, the variable will be set and the JavaScript is not presented to the browser again. Of course this only works because the variable isn't set already, so if you want to re-use it, pick a new variable (the more strange it sounds, the more likely it's going to be not used already).

    tl;dr: Prevents your JavaScript code from appearing more than once on your page.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!