A Drupal 7 adminisztrációs felület több részén előkerül olyasmi, hogy beírhatunk egy címet, majd megjelenik egy ehhez tartozó "Programok által használt név", ami egy (címnek megfelelő) ASCII karakterlánc. Azonban az ékezetes betűk _ jellel vannak pótolva. Megoldható az, hogy inkább az ékezetmentes változatra történjen a csere, és ezt ne kelljen mindig manuálisan helyretenni?
Drupal verzió:
Fórum:
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:
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):
É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 ó, ö, ő, ü, ű.
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
+1, köszönöm a kiegészítést!
+1, köszönöm a kiegészítést!
Eddig csak 6-osra fejlesztettem komolyabban, a hook_js_alter() függvényt még nem használtam, de nagyon hasznos, és valóban így a helyes, nem a core modulok és egyéb fájlok módosítgatása!
hook hogyan?
Köszönöm én is a válaszokat! Sikerrel jártam, legalábbis nyersen kicserélve a régit az újra minden tökéletes.
Ez volt a régi fájl, ez meg lett az új. A legalja az érdekes.
Küzdök ezzel a hook_js_alter-rel, de eddig nem vezetett sikerre.
Arra gondoltam, hogy a saját mybartik sminkembe felveszem a template.php-be a következő függvényt:
De ezzel nem működik (pedig nem felejtettem el a gyorstár törlését). A favágó módon viszont megy (ha kicserélem a misc/machine-name.js fájlt az újra). Tudnátok segíteni, hogy hogy szokás ezt intelligensen megoldani? A js registryvel is kéne ügyeskedni valamit?
Tedd fel a devel modult, és
Tedd fel a devel modult, és nézd meg milyen kulcs-érték párokkal van tárolva a javascript. Ha csak egy sima mezei array(0 => 'path'), akkor ilyesmi kell:
vagy inkább
Lecsekkolni, hogy mi van a $javascriptben arra a dsm($javascript) tök jó. Nézd meg azért mindenképpen, mert sejtésem szerint a settingst is valahol itt hordozza, és akkor nem lesz jó, amiket fentebb írtam.
----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.
több kéne
Még több segítség/tudás kéne, hogy a "lecserélem az eredeti fájlt" helyett szebb módon tudjam megoldani a "programok által használt név" ékezetekkel is bánni tudó kialakítását. Fent van a devel modul, és megnéztem a dsm($javascript)-et, de nem látszik benne a misc/machine-name.js sehol, pedig azt használja a drupal, nem az általam (a sminkbe) betettet. Itt van a látható dsm($javascript), ami egy olyan oldalon hívódik meg, ami épp használja a machine-name.js szkriptet.
Az is lehet gond, hogy nem az adminisztrációs sminkkel dolgozom.
hoppa van egy kis szivas, kb
hoppa van egy kis szivas, kb zöldséget vadásztunk idáig
egyrészt jobban nem is nyúlhattam volna mellé a javascript tömbbel, de legalább ezt is megtudtuk.
másrészt meg ez nem egy classic drupal_add_js, hanem egy form elementhez egy process callbackben hozzácsapott js. @see form_process_machine_name
Szóval ezt eleve nem js_alterből kéne bántani, hanem _element_info_alterből.
Ja, a módosított js-t ne a sminkedbe tegyed, hanem a modulodhoz. Ha netán a modul anélkül a smink nélkül lesz használva, akkor sem fog eltörni.
----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.
modulom
Köszönöm a fejtágítást! Egyelőre vákuumban van a "modulom" szó, merthogy nem terveztem új modult készíteni (csak sminket), de majd akkor átgondolom.
Az eddigiek alapján a kész modul:
szantog, kutakodásod nem volt haszontalan, sőt, köszi, ez alapján, meg a korábbiak alapján elkészítettem egy első változatát a modulnak. "Utólagos engedelmeddel" az általad leírt részt is felhasználtam.
Teszt:
"Árvíztűrő tükörfúrógép típus"
ELŐTTE a generált machine name:
_rv_zt_r_t_k_rf_r_g_p_t_pus
UTÁNA (
drush pm-enable machine_name_mod
) a generált machine name:arvizturo_tukorfurogep_tipus
A működő modul elérhető itt.
Kódja:
machine_name_mod.info
machine_name_mod.module
js/machine-name.js
megcsináltam modulban
Haj
Összedobtam neked(meg másoknak) egy modulban ha érdekel. Sajnos ide nem tudom feltölteni, de egy admin talán tud majd segíteni ebben.
muti :D
szantog lényegében az alapját már megmutatta itt korábban. :)
Ehhez csak a megfelelően módosított JS-fájlt kell hozzácsapni, és kész is a modul.
Ettől függetlenül feltölthetnéd a tiédet is legalább valami (ingyenes) tárhelyre (akár Dropbox), és megoszthatnád, ha gondolod.
Én is
Közben én is mellékeltem egy saját változatot, lásd korábban.