Az mostani művem kapcsán vettem észre az érdekességet, hogy amikor ugyanazzal a címkével van ellátva egy mező, hát ha még sok is van belőle, a manage display oldal, ahol a mezők megjelenítési sorrendje állítható, kvázi használhatatlan. Szóval szeretnénk at, hogy a címke mellett a mező gépi neve is látszódjék a táblázatban
Ez bizony a core field_ui része, így lecsaptam a lehetőségre, hogy talán nekem is sikerül felkerülni azok listájára, akiknek a keze nyomát dícséri a drupal core.
Így van most:

És így szeretnénk:

Itt egy kis kitérő: A drupal ugye a 7.8-as főverziónál jár. Lesz ám drupal 8 is, előbb-utóbb, de talán kevesen tudják, hogy a drupal 8 fejlesztése nem sokkal a drupal 7.0 kiadása után meg is kezdődött.
Ez miért érdekes ebből a szempontból?
Mert ugyan nekem a drupal 7-tel van bajom. Viszont ha drupal 7-ben megcsinálom a javítást, akkor mi garantálja, hogy a drupal 8-ban ugyanaz nem lesz hiba? Szóval bármilyen hibajavítást, még ha drupal 7-ben van is, először a 8-as, még most készülő verzióra kell elvégezni.
Ha a közösség, illetve a project vezető fejlesztői úgy döntenek, hogy ennek a 7-esben is helye van, akkor azt az issueban jelzik, és én (vagy valaki más) megírjuk ugyanezt drupal 7-re is.
Node miről is szól ez a patch?
Először megnéztem, hogy a drupalban van-e már valami kész eset, ahol ezt a bizonyos machine_name érték megjelenik. Bezony ám, a content types oldalon (admin/structure/types):

Igazából már csak meg kellett néznem, hogy ide hogyan kerül bele az a bizonyos machine name. Ez azért fontos, mert a core-ba nem kerülhet be "pistike kódja", ott mindennek rendesen dokumentálva, teljesen "drupalosan" kell lennie megírva.
Itt láttam, hogy egy sminkfüggvényt vezettek be ehhez a mezőhöz, hát én is azt tettem, és természetesen az elején alaposan dokumentáltam, hogy mit csinál ez a sminkfüggvény:
/** * Returns HTML for a field name and machine name for the field overview and field display overview page. * * @param $variables * An associative array containing: * - human_name: The human-readable name of the field * - machine_name: The machine-name of the field * * @ingroup themeable */ function theme_field_ui_field_name($variables) { $output = check_plain($variables['human_name']); $output .= ' <small>' . t('(Machine name: @machine-name)', array('@machine-name' => $variables['machine_name'])) . '</small>'; return $output; }
Az új függvényemet a hook_theme hurokban is regisztrálnom kellett (a field_ui_theme már korábban benne volt):
/** * Implements hook_theme(). */ function field_ui_theme() { return array( 'field_ui_table' => array( 'render element' => 'elements', ), 'field_ui_field_name' => array( 'variables' => array('human_name' => NULL, 'machine_name' => NULL), ), ); }
Majd lecseréltem a szükséges helyeken a
'label' => array( '#markup' => check_plain($instance['label']), ),
sorokat az újonnan bevezetett sminkfüggvényemre:
'label' => array( '#theme' => 'field_ui_field_name', '#human_name' => $instance['label'], '#machine_name' => $instance['field_name'], ),
És kész is. Elkészült a patch, amit párszor még boobaa segítségével reszeltem kicsit, és íme az issue, ami szeretettel várja, hogy valaki kipróbálja, letesztelje, és belekerüljön a coreba a módosítás: http://drupal.org/node/1270732
Update:
Amíg ezt a bejegyzést írtam, a drupal.org tesztrendszere szépen visszadobta a patchemet.
Na ez ugyan mi lehet?
Drupal 7-től a core része a Testing modul, leánykori nevén Simpletest. Mivel a drupal egy iszonyat összetett rendszer, ezért a fejlesztése során igencsak oda kell figyelni, ha egy hibát kijavítunk, az másik x helyen ne okozzon újabb hibákat.
Na erre találták ki a unit testeket. Amikor egy módosítás történik, a drupal robotja lefuttatja a patchet ezen a teszt rendszeren. A test unitok is a core részei, .test kiterjesztéssel szerepelnek azok a fileok, amik ezeket az előre megírt eseteket tartalmazzák.
Itt kell megjegyeznem, hogy ezelőtt még életemben nem használtam unit testet, hogyha valami zöldséget írok, nyugodtan lehet javítani.
Nálam konkrétan ott hasalt el a dolog, hogy ez a teszt program létrehozott egy mezőt, elmentette, és legenerálta a Manage Display, és a Manage Field oldalakat. Igenám, de mivel én átírtam ezekben az oldalakban a mezőt, ezért reklamált, hogy figyu, itt nem az az érték jelenik meg, ami nekem kell.
Mivel az én általam generált érték jó, ezért magába a test esetbe kellett belenyúlni, és megértetni vele, hogy mostantól ez a helyes érték:
A field_ui.test file-ban ez a sor végezte a mező vizsgálatát:
$this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $label, t('Field was created and appears in the overview page.'));
Márpedig itt a $label változó az eredetileg használt címke volt, nem az, amire én módosítottam.
Mivel a $label változót máshol is használja ez a test case, ezért bevezettem egy $rendered_label változót, ami már az újonnan létrehozott sminkfüggvényünket használja:
$rendered_label = theme('field_ui_field_name' ,$label, $field_name); $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $rendered_label, t('Field was created and appears in the overview page.'));
Innen már átment a teszten, legalábbis localhoston, és várom, hogy a drupal.org testrobotja is bólintson rá.
Ehh, ugye, hogy nem is olyan egyszerű a core fejlesztése?