Felőlem nyugodtan
Felőlem nyugodtan használhatod :), nehogy félreérts, nem arra céloztam, hogy ne használd, mert irgumburgum. :) Egyébként remélem most már látod a JavaScript-kódot is, ami az egésznek a lényege.
Részemről akár az egész kódot bemásolhatod, de felhívtam a figyelmed, hogy létezik jobb megoldás is, és hogy adnod kellene előbb egy esélyt pl. a Colorboxnak, mert valószínűleg könnyebben megoldható a segítségével, amit szeretnél. Ha nem megy, segítünk.
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
Lehetséges megoldásra javaslat/szemléltetés
A machine name-re való átírogatásra vonatkozó objektumot és metódusokat a /misc/machine-name.js
fájlban láthatod.
Ha pl. megnyitod az /admin/structure/types/add
oldalt, akkor ez is betöltődik.
A transliterate
függvény alakítja át a szöveget, ez pedig egy replace patternt (settings.replace_pattern) vár, meg egy karaktert, amire le kellene cserélni a megfelelő karaktereket (settings.replace).
Így néz ki a függvény:
/** * Transliterate a human-readable name to a machine name. * * @param source * A string to transliterate. * @param settings * The machine name settings for the corresponding field, containing: * - replace_pattern: A regular expression (without modifiers) matching * disallowed characters in the machine name; e.g., '[^a-z0-9]+'. * - replace: A character to replace disallowed characters with; e.g., '_' * or '-'. * - maxlength: The maximum length of the machine name. * * @return * The transliterated source string. */ transliterate: function (source, settings) { var rx = new RegExp(settings.replace_pattern, 'g'); return source.toLowerCase().replace(rx, settings.replace).substr(0, settings.maxlength); }
A default replace pattern és a karakter, amire cserél, látszik a
jQuery.extend(Drupal.settings, .......)
résznél a forráskódban:
"replace_pattern":"[^a-z0-9_]+","replace":"_"
Nos, a fenti transliterate függvényt át kellene kicsit alakítanod.
Legegyszerűbb az lenne, ha egy ékezetátalakító metódust betennél ebbe az objektumba, hasonlóan a transliterate-hez, majd ezt a függvényt a transliterate-en belül utolsó sor ELŐTT meghívnád úgy, hogy a "source" változót adod át neki paraméterül.
Tehát ilyesmire gondolok (a kommentbe tett pontok azt jelzik, hogy előtte kód vagy komment van):
// ........ transliterate: function (source, settings) { var rx = new RegExp(settings.replace_pattern, 'g'); // IDE KERÜL a plusz függvényhívás source = this.remove_accents(source); // innentől ismét az eredeti kód... return source.toLowerCase().replace(rx, settings.replace).substr(0, settings.maxlength); }, // FIGYELEM! Ha ezután teszed, ne felejtsd el a vesszőt!! // ........ remove_accents: function (source) { // ide kerül az ékezet eltávolítására szolgáló kód!! // ... return source; } };
Ékezet átalakításával kapcsolatban hasznos lehet:
http://4rapiddev.com/javascript/javascript-remove-vietnamese-accents/
Persze a remove_vietnamese_accents függvénynevet változtasd meg, és tegyél bele innen kimaradt ékezetes karaktereket is, mint pl. az ó, ö, ő, ü, ű.
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
Mármint jQuery...
"Queryben pedig (még) nem vagyok otthon"
Gondolom a jQuery-re gondolsz (j az elején). :)
A hivatalos honlapja nagyon jól dokumentált, és szerencsére tele van példákkal:
http://jquery.com/
Később aztán a jQuery UI mellett sem lehet csak úgy elmenni, itt is jó sok demó van:
http://jqueryui.com/
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
Behaviors
Ne egyszerű (function($){
-be helyezd a kódod, mert ha AJAX-ot használsz, akkor a hover() függvényt egy nem létező elemre hívod meg.
Így kell kezelni Drupalban az AJAX-os elemeket:
http://drupal.org/node/756722#behaviors
Lippai Ádám
young element
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
.delegate()
Azért nem működik az AJAX-szal lekért elemekre, mert azok még nincsenek a DOM-ban akkor, amikor a "hover" eseményre feliratkozol, rákötöd az oldal betöltődése után megjelenő elemekre.
Ezért gondolni kell a "jövőben létrejövő" elemekre is - erre szolgál a jQuery .delegate() függvénye (1.4.3-tól felfelé (tehát a 7-es által alapértelmezettként használt 1.4.4-gyel kell működnie); korábbi: .live(), későbbi (csak 1.7-től felfelé működik): .on()).
Lásd a dokumentációt:
"Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements."
Valahogy így (csak példa):
$('body').delegate('.views-fluidgrid-item', 'hover', function () { $(this).find('.eventtitle').css({ backgroundColor: 'transparent' }); });
Hasonlóan a többire is.
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
Majdnem
Majdnem tökéletes válasz, még arra ügyelj, hogy ne a /misc/machine-name.js fájlt írd át, hanem hozz létre egy modult, ami a hook_js_alter() függvényt valósítja meg.
Így nem kell minden Drupal frissítésnél újra elvégezni a változtatást.
Lippai Ádám
young element
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
Igazándiból...
Igazándiból első körben csak be copy-ztam az egészet, mert így tuti, hogy működnie kellene és csak ezek után hasznosítanám egy-egy részét. Azért vágtam be a forrást, mert a queryt nem akarja hasznosítani az oldalam, persze nem a full forrást gondoltam használni :)