Drupal-lomakkeelle accesskey

X-Telnet Oy:n wiki

Loikkaa: valikkoon, hakuun

Muistiinpanoja Drupalin Form API -rajoitteesta ja ohitusyrityksestä:

Rakentelen Drupal-lomakkeiden syöttöä nopeuttavaa skriptiä Autohotkeyllä. Koska Autohotkey-skriptillä ei pääse (ainakaan helposti) käsiksi Firefoxin DOM-rakenteeseen, on tietoa liikuteltava leikepöydän ja näppäimistömakrojen tasolla.

Olen rakentanut skriptiin jo tiedon poiminnan (aktiivisen linkin urlin ja otsikon kopioinnin leikepöydälle), ja yritän nyt kehittää tavan, jolla saisin vietyä tiedot sieltä automaattisesti Drupal-syöttölomakkeen kenttiin.

Saan avattua skriptillä selaimessa tiedonsyöttöön käytetyn lomakkeen, mutta en ole keksinyt fiksua tapaa kohdistaa fokusta haluttuihin kenttiin. Tabin painaminen tarpeeksi monta kertaa ei ole järkevä ratkaisu, joten ajattelin käyttää accesskey-pikanäppäintä.

Drupal 5.2:ssa ei voi määrittää accesskey-attribuuttia lomakkeen kentille, mutta löysin Hotkey-nimisen contrib-modulin (http://drupal.org/project/hotkey), jolla se onnistuu. Hotkeyn toiminta perustuu pikanäppäimelle määritellyn tekstijonon etsimiseen form-hierarkiasta kenttänimen perusteella.

CCK:n Link-widget tuottaa lomakkeelle kuitenkin fieldset-rakenteen, eikä siihen kohdistettu acceskey toimi, ts. Alt-Shift+<pikanäppäin> ei tuota ainakaan Firefoxissa toivottua tulosta ja siirrä fokusta fieldsetiin.

Vaihtoehtona on käyttää Firefox-lisäosaa tai JavaScriptiä, joka lisää lomakkeelle esim. XPath-viittauksen avulla accesskeyn haluttuun kenttään. Tämä alkaa olla jo virhealtista, mutta parempaakaan ratkaisua en nyt keksi.

Toinen havainto Hotkeystä: Kokeilin lisätä lomakkeen tallennusnappulalle MediaWikistä tutun pikanäppäimen (Alt+Shift+S). Koska saman niminen submit-elementti löytyy sivulta kahdesta eri kohdasta, ei tämäkään ratkaisu toiminut.

Drupal 6:n Form API:ssa on muistaakseni luvassa helpotusta jälkimmäiseen ongelmaan, eli se tukee yhdellä sivulla olevaa usean formin submit-rakennetta.

[muokkaa] Ratkaisumalli 1: Greasemonkey, XPather, CoLT ja Autohotkey

Greasemonkey, XPather ja CoLT ovat Firefox-laajennuksia, Autohotkey on Windows-sovellus makrojen ohjelmointiin.

Vaihe 1: Selvitetään XPatherilla, mikä on toivotun syöttöelementin XPath-polku

Vaihe 2: Luodaan Greasemonkey-skripti, joka lisää sivun latauduttua Accesskey-attribuutin syöttöelementtiin:

// ==UserScript==
// @name          Linkkiapu
// @namespace     http://assemblix.net/
// @description   Luo lomakkeelle HTML-accesskeyn, jolla pääsee suoraan linkkiin.
// @include       http://assemblix.net/node/add/linkki
// ==/UserScript==

var allElements, thisElement;
allElements = document.evaluate(
    "/html/body/div[@id='sivu']/div[@id='sisalto']/form[@id='node-form']/div/div/div[1]/fieldset[3]/legend",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
for (var i = 0; i < allElements.snapshotLength; i++) {
    thisElement = allElements.snapshotItem(i);
    thisElement.accessKey = 'l';
}

Vaihe 3: Määritellään CoLT-laajennukseen uusi rakennesyntaksi: %T%N%U (linkin otsikko, rivinvaihto, linkin URL). Annetaan nimeksi Assemblix tai muu, joka sijoittuu valikon alkuun (liittyy Authotkey-skriptin oletukseen).

Vaihe 4: Luodaan kaksi Autohotkey-makroa. Ensimmäinen kopioi leikepöydälle kohdistimen alla olevan linkin osoitteen ja otsikkotekstin käyttämällä CoLT-laajennusta, toinen käyttää HTML-pikanäppäintä ja syöttää tiedot leikepöydältä lomakkeelle.

Vaihe 4a: Luodaan ensimmäinen Autohotkey-skripti:

;
; Drupal-linkkisyötön automatisointi: Linkkitiedon kopiointi leikepöydälle
; 26.9.2007
;
; 1. Avaa tilannevalikon hiiren kohdalla (oikea hiiren painallus)
; 2. Paina "o", valitsee tilannevalikosta "Copy Link Text and Location As..." (huom! edellyttää CoLT-laajennuksen asennuksen)
; 3. Paina Enter, joka valitsee ensimmäisen vaihtoehdon (= Assemblix, tämä siis myös oltava konfiguroituna)
; 4. Valinta tuottaa leikepöydälle tekstimuodossa: 1. riville linkin otsikko, 2. riville linkin URL
#s::
    Send {RButton Down}
    Sleep 100
    Send {RButton Up}
    Sleep 100
    Send o
    Sleep 150
    Send {Enter}
    Sleep 150
return

Vaihe 4b: Luodaan toinen Autohotkey-skripti leikepöydän tietojen siirtämiseksi lomakkeelle:

;
; Drupal-linkkisyötön automatisointi: Linkkitiedon kopiointi leikepöydältä Drupal-lomakkeelle
; 5.10.2007
;
; 1. Lomakesivun ollessa auki, valitaan linkin syöttöalue painamalla pikanäppäintä Alt+Shift+L.
; 2. Kaksi sarkainpainallusta, jolla siirrytään varsinaiseen syöttökenttään.
; 3. Haetaan leikepöydän sisällöstä ensimmäinen rivi, joka syötetään otsikkokenttään.
; 4. Haetaan leikepöydän sisällöstä toinen rivi, ja syötetään se URL-osoitekenttään.
#d::
    Send +!l
    Sleep 200
    Send {Tab 2}
    Loop, parse, clipboard, `n, `r
    {
        Send %A_LoopField%
        Sleep 200
        Send {Tab}
    }
return

Nyt pikanäppäin Alt+Shift+S tallentaa linkin tiedot ja Alt+Shift+D syöttää ne Drupal-lomakkeelle XPath-lausekkeella määritettyyn Link-widgettiin.

[muokkaa] Lisätietoa

Henkilökohtaiset työkalut