Drupal-lomakkeelle accesskey
X-Telnet Oy:n wiki
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.

