Naar inhoud springen

Overleg MediaWiki:Gadget-mijnKladblok.js

Pagina-inhoud wordt niet ondersteund in andere talen.
Onderwerp toevoegen
Uit Wikipedia, de vrije encyclopedie
Laatste reactie: 12 jaar geleden door Mar(c) in het onderwerp niet naar "bewerken" als het kladblok al bestaat

niet naar "bewerken" als het kladblok al bestaat[brontekst bewerken]

(n.a.v. deze discussie in de kroeg)

Aan de Kladblok-link kan een onClick event worden toegekend die met een AJAX-call checkt of de pagina "Speciaal:MijnPagina/Kladblok" voor de betreffende gebruiker al bestaat, zodat in dat geval naar de pagina zelf gegaan kan worden i.p.v. naar de bewerkingspagina – bijvoorbeeld met de volgende constructie:

Inmiddels verbeteringen aangebracht, zie onder. — Mar(c). [O] 7 apr 2012 13:52 (CEST) Reageren
$( document ).ready( function() {
  var sandboxpage = 'Speciaal:MijnPagina/Kladblok';

  var portletLink = mw.util.addPortletLink(
    'p-personal',
    mw.config.get('wgScript') + '?title=' + sandboxpage + '&action=edit&preload=Template:Hoofding_gebruikerskladblok/preload&editintro=Template:Hoofding_gebruikerskladblok',
    'Kladblok',
    'pt-mysandbox',
    'Uw kladblok',
    null,
    '#pt-preferences'
  );

  $(portletLink).click(function(e) {
    e.preventDefault();
    $.ajax(mw.util.wikiGetlink(sandboxpage) + '?action=raw')
      .done(function() {
        window.location = mw.util.wikiGetlink(sandboxpage);
      })
      .fail(function() {
        window.location = e.target;
      });
    return false;
  });
});

Ik moet hierbij wel opmerken dat mijn kennis van zowel AJAX als de mediawiki libraries niet erg groot is, dus lijkt het me wel verstandig als iemand met kennis van zaken hier even kritisch naar kijkt. (Vanuit mijn Firebug console werkt het i.i.g. prima.)

Met vriendelijke groeten — Mar(c). [O] 22 mrt 2012 23:32 (CET)Reageren

P.S. O ja, "Uw kladblok" vanwege "Uw gebruikerspagina", "Uw overlegpagina", "Overzicht van pagina's die u volgt" en "Overzicht van uw bijdragen". ("Mijn voorkeuren" zou eigenlijk ook daarmee in overeenstemming gebracht moeten worden: "Uw voorkeuren".) — Mar(c). [O] 22 mrt 2012 23:38 (CET)Reageren

Overigens, aangezien we hier niet in wikicode maar in javascript werken, waarom niet i.p.v. 'Speciaal:MijnPagina' de gebruikersnaam uit mw.config halen:
var sandboxpage = mw.config.get('wgFormattedNamespaces')['2'] + ':' + mw.config.get('wgUserName') + '/Kladblok';
Scheelt weer een redirect via Speciaal:MijnPagina.
In addPortletLink dient "sandbox" dan nog vervangen te worden door "mw.util.wikiUrlencode(sandboxpage)":
mw.config.get('wgScript') + '?title=' + mw.util.wikiUrlencode(sandboxpage) + '&action=...
Met vriendelijke groeten — Mar(c). [O] 23 mrt 2012 14:16 (CET)Reageren
Ik heb nog wat verbeteringen aangebracht, zie subkopje "code nieuwe voorstel" hieronder.
Niet gerelateerd aan de issue:
  • De (gelokaliseerde) teksten in variabelen gestopt, t.b.v. internationale portabiliteit en zodat eventuele toekomstige aanpassingen eenvoudiger te doen zijn.
  • De urls relatief gemaakt, en gebruikmakend van (gelokaliseerde) naamruimtenamen. Bijvoorbeeld, mysandbox_relativeurl en mysandbox_redlinkurl worden nu voor mij, respectievelijk:
    /wiki/Gebruiker:Mar%28c%29/Kladblok
    /wiki/Gebruiker:Mar%28c%29/Kladblok?action=edit&editintro=Sjabloon:Hoofding_gebruikerskladblok&preload=Sjabloon:Hoofding_gebruikerskladblok/preload
On-topic verbetering (de $(portletLink).click-code):
  • Wat in mijn vorige voorstel vooral nog niet lekker werkte: window.location gaat voorbij aan gebruikersinstellingen en ctrl/shift+click, betreffende het openen van de pagina in het huidige of in een nieuw venster (of tab). Door e.target.attributes['href'].value te gebruiken (wat de link zelf aanpast voordat de click daadwerkelijk wordt uitgevoerd) is dat opgelost.
Zoals nu hieronder voorgesteld, linkt de kladblok-link in eerste instantie naar de Kladblok-pagina (en dus niet naar de bewerkpagina ervan), en checkt de $(portletLink).click-code of de kladblok-pagina al dan niet bestaat; als niet, dan wordt de href van de link aangepast zodat de bewerkpagina wordt geopend.
Mijn vragen aan ajax/mediawiki-experts: Wordt zo'n ajax-constructie breed (door verschillende browsers) ondersteund, en is het de beste manier om te checken of de pagina bestaat? Is async:false een goede manier om uitvoering van de click uit te stellen (is er een kans dat er geen antwoord komt en de browser blijft hangen)?
Met vriendelijke groeten — Mar(c). [O] 7 apr 2012 13:52 (CEST)Reageren
Ik neem aan dat $.ajax door alle moderne browsers ondersteund wordt. Mensen die een browser gebruiken waarop jquery problemen oplevert zullen wel gewend zijn dat dingen op Wikipedia niet werken.
Maar zou het geen beter idee zijn om deze code als opt-in gadget te gebruiken? Dus dat mensen via hun voorkeuren kunnen kiezen voor deze optie? MrBlueSky (overleg) 11 apr 2012 19:35 (CEST)Reageren
De opzet is om de Kladblok-link juist meer te laten werken zoals andere links op Wikipedia: naar de pagina als de pagina bestaat, naar de bewerkingspagina als de pagina niet bestaat. M.i. zou de link standaard zo moeten werken, maar wellicht zijn er redenen om altijd naar de bewerkingspagina te (willen) gaan? Met vriendelijke groeten — Mar(c). [O] 12 apr 2012 10:42 (CEST)Reageren
Ik weet niet wat e.target geeft qua object, maar in jquery gebruik ik normaal gesproken .attr('href', mysandbox_redlinkurl). Het done()-gedeelte hoeft volgens mij alleen maar return true; te bevatten oid (of gewoon helemaal weggelaten te worden), daar 'href' als het goed is al de relatieve url is. Testen kan ik dat hier niet overigens. Afgezien van dat lijkt het mij prima. Sum?urai8? 14 apr 2012 08:59 (CEST)Reageren
e.target geeft het DOM element dat de event heeft geïnitieerd. De link zelf wordt dus aangepast. Dat is ook zichtbaar als je je kladblokpagina in een nieuwe tab of een nieuw venster laat openen; op de pagina waar je op de Kladblok-link hebt geklikt, is de link veranderd.
Ik heb zowel .done() als .fail() ingevuld, zodat de link altijd aangepast wordt aan de huidige situatie (ook als de kladblokpagina tussentijds aangemaakt of verwijderd wordt), en onafhankelijk is van of er in eerste instantie (in addPortletLink()) naar mysandbox_relativeurl of naar mysandbox_redlinkurl gelinkt wordt.
Overigens, om te testen: Als je de code in je common.js plakt en op "Toon bewerking ter controle" klikt, wordt de functie uitgevoerd zonder dat je de pagina hoeft op te slaan. "Live voorvertoning" dient dan wellicht uit te staan. Als je kladblokpagina al bestaat, kun je voor het testen mysandbox_pagetitle aanpassen om naar een niet-bestaande pagina te linken.
Met vriendelijke groeten — Mar(c). [O] 16 apr 2012 11:40 (CEST)Reageren
Zullen we hem activeren? MrBlueSky (overleg) 16 apr 2012 18:12 (CEST)Reageren
In IE7 werkt je code niet, maar erg verbazingwekkend vind ik dat dan ook weer niet. Op m'n werk kan ik helaas geen andere browser gebruiken. Ajax en jquery werkt wel vaker minder goed in IE7. Vervolgens bedacht ik me dat de functionaliteit al binnen de MediaWiki-software bestaat, namelijk door '&action=edit&redlink=1' in de url te hebben. De volgende code in het uitklapsjabloon doet dus exact wat je met een ajax-call doet. Het werkt voor mij in IE7 en ik neem aan ook in andere browsers. Het heeft dan ook mijn voorkeur om deze code te gebruiken ipv degene met een ajax-call. Sum?urai8? 17 apr 2012 16:11 (CEST)Reageren
Voor de leesbaarheid hierin gezet Sum?urai8? 17 apr 2012 16:11 (CEST) Reageren
$( document ).ready( function() {
  var mysandbox_pagetitle  = 'Kladblok';
  var pt_mysandbox_title   = 'Kladblok';
  var pt_mysandbox_tooltip = 'Uw kladblok';
  var editintro_templatename = 'Hoofding gebruikerskladblok';
  var preload_templatename   = 'Hoofding gebruikerskladblok/preload';
 
  var mysandbox_relativeurl = mw.util.wikiGetlink(mw.config.get('wgFormattedNamespaces')['2'] + ':' + mw.config.get('wgUserName') + '/' + mysandbox_pagetitle);
  var mysandbox_redlinkurl  = mysandbox_relativeurl + '?action=edit&redlink=1'
                               + '&editintro=' + mw.util.wikiUrlencode(mw.config.get('wgFormattedNamespaces')['10'] + ':' + editintro_templatename)
                               + '&preload='   + mw.util.wikiUrlencode(mw.config.get('wgFormattedNamespaces')['10'] + ':' + preload_templatename);
 
  var portletLink = mw.util.addPortletLink(
    'p-personal',
    mysandbox_redlinkurl,
    pt_mysandbox_title,
    'pt-mysandbox',
    pt_mysandbox_tooltip,
    null,
    '#pt-preferences'
  );
});
 
Wauw... hoe simpel kan het zijn! Die eigenschap van redlink=1 kende ik niet; MediaWiki zegt er alleen over: "if the user does not have permission to edit the page, redirect to the empty article page", maar het zorgt er dus ook voor dat als de pagina bestaat, dat je dan tóch niet naar de bewerkingspagina gaat. Geen ajax nodig, dat maakt het inderdaad een stuk eenvoudiger! Ik heb voor de duidelijkheid de code hieronder vervangen door jouw voorstel.
@MrBlueSky: Ik denk dat hij dan zo wel live kan. In de betreffende discussies in de kroeg (deze en deze) las ik alleen maar bijval om de Kladblok-link als verwacht te laten werken.
Met vriendelijke groeten — Mar(c). [O] 18 apr 2012 08:21 (CEST)Reageren
Uitgevoerd Uitgevoerd - MrBlueSky (overleg) 19 apr 2012 18:58 (CEST)Reageren
Ah, dankjewel! Met vriendelijke groeten — Mar(c). [O] 19 apr 2012 19:55 (CEST)Reageren

code nieuwe voorstel[brontekst bewerken]

$( document ).ready( function() {
  var mysandbox_pagetitle  = 'Kladblok';
  var pt_mysandbox_title   = 'Kladblok';
  var pt_mysandbox_tooltip = 'Uw kladblok';
  var editintro_templatename = 'Hoofding gebruikerskladblok';
  var preload_templatename   = 'Hoofding gebruikerskladblok/preload';

  var mysandbox_relativeurl = mw.util.wikiGetlink(mw.config.get('wgFormattedNamespaces')['2'] + ':' + mw.config.get('wgUserName') + '/' + mysandbox_pagetitle);
  var mysandbox_redlinkurl  = mysandbox_relativeurl + '?action=edit&redlink=1'
                               + '&editintro=' + mw.util.wikiUrlencode(mw.config.get('wgFormattedNamespaces')['10'] + ':' + editintro_templatename)
                               + '&preload='   + mw.util.wikiUrlencode(mw.config.get('wgFormattedNamespaces')['10'] + ':' + preload_templatename);

  var portletLink = mw.util.addPortletLink(
    'p-personal',
    mysandbox_redlinkurl,
    pt_mysandbox_title,
    'pt-mysandbox',
    pt_mysandbox_tooltip,
    null,
    '#pt-preferences'
  );
});