display suite kódból

aruna képe

Sziasztok!

D6-os honlapon a display suite régióinak (header, left, right...) tartalmát szeretném modulból változtatni.

Valahogy így látom most:

- Mindegyik régióba berakok valamit, pl. egy kód field-et (vagy akár semmit).

- És egy hook-al megpróbálom a régió tartalmát elérni és ha nincs benne mező, berakni modul kódból valamit, ha van benne mező, akkor módosítani.

Ezek lennének a kérdéseim:

- Milyen hook-al lehet mezőket módosítani?

- Milyen hook-al lehet egy adott régió tartalmát lecserélni?

- Kell-e dummy mezőt berakni egy régióba, csak azért hogy lecserélhessem a régió tartalmát?

Köszönöm előre is a segítséget,
Aruna

Drupal verzió: 
aruna képe

Keresgettem a neten
és ezt az api függvényt:
http://drupal.org/node/697320#hook_ds_fields
módosítottam:

/**
 * Implementation of hook_ds_fields().
 */
function modulom_ds_fields($type_name, $build_mode, $extra) {
  if ($type_name == "tartalom_tipus_azonosíto" && $build_mode == "full") {    
    $fields['art1_title'] = array(
      'title' => t('Article1 title'),
      'type' => DS_FIELD_TYPE_CODE,
      'status' => DS_FIELD_STATUS_STATIC,
      'properties' => array(
        'formatters' => array(
          'ds_eval_code' => t('Default'),
        ),
        'code' => '<?php print "' . $myArticle1Object->title . '"; ?>',
      ),
 
    );
    return array('nd' => $fields);
  }
}

Tehát létrehoztam egy Code field-et és a saját változómat raktam bele tartalomnak.

0
0
Sk8erPeter képe

Ez így elég csúnya, akkor már miért nem a DS_FIELD_TYPE_FUNCTION típust használod?
Idézem:

"DS_FIELD_TYPE_FUNCTION: uses a custom function. The object, key and the complete field is passed to this function"

vagy DS_FIELD_TYPE_THEME-nél (ami szintén sokkal szebb lenne):

"DS_FIELD_TYPE_THEME: uses a theming function."

Egész pontos kódot nem tudok neked most rittyenteni, de érdemes lenne megnézni az nd.module fájlt:

pl.:

  1. /**
  2.  * Implementation of hook_ds_fields().
  3.  */
  4. function nd_ds_fields($type_name, $build_mode, $extra) {
  5.  
  6. // ...............
  7.  
  8. // Book support.
  9. if (module_exists('book') && book_type_is_allowed($type_name)) {
  10. $fields['book_navigation'] = array(
  11. 'title' => t('Book navigation'),
  12. 'type' => DS_FIELD_TYPE_FUNCTION,
  13. 'status' => DS_FIELD_STATUS_STATIC,
  14. 'properties' => array(
  15. 'formatters' => array(
  16. 'nd_book_navigation' => t('Book navigation'),
  17. ),
  18. ),
  19. );
  20.  
  21. $fields['book_add_new_child'] = array(
  22. 'title' => t('Book: add new child'),
  23. 'type' => DS_FIELD_TYPE_THEME,
  24. 'status' => DS_FIELD_STATUS_STATIC,
  25. 'properties' => array(
  26. 'formatters' => array(
  27. 'nd_book_add_new_child' => t('Add new child'),
  28. ),
  29. ),
  30. );
  31.  
  32. $fields['book_printer_version'] = array(
  33. 'title' => t('Book: printer version'),
  34. 'type' => DS_FIELD_TYPE_THEME,
  35. 'status' => DS_FIELD_STATUS_STATIC,
  36. 'properties' => array(
  37. 'formatters' => array(
  38. 'nd_book_printer_version' => t('Printer version'),
  39. ),
  40. ),
  41. );
  42. }
  43.  
  44. return array('nd' => $fields);
  45. }
  46.  
  47. // ..................................
  48.  
  49. /**
  50.  * Book navigation theming.
  51.  */
  52. function nd_book_navigation($field) {
  53. $content = '';
  54. if (isset($field['object']->content['book_navigation'])) {
  55. if (isset($field['object']->content['book_navigation']['#value'])) {
  56. $content = $field['object']->content['book_navigation']['#value'];
  57. }
  58. elseif (isset($field['object']->book['bid']) && !empty($field['object']->book['bid'])) {
  59. $content = theme('book_navigation', $field['object']->book);
  60. }
  61. }
  62. else {
  63. if (isset($field['object']->book['bid']) && !empty($field['object']->book['bid'])) {
  64. $content = theme('book_navigation', $field['object']->book);
  65. }
  66. }
  67. return $content;
  68. }
  69.  
  70. /**
  71.  * Add new child for book.
  72.  */
  73. function theme_nd_book_add_new_child($field) {
  74. if (user_access('add content to books')) {
  75. $child = str_replace('_', '-', variable_get('book_child_type', 'book'));
  76. return l(t('Add child page'), 'node/add/'. $child, array('query' => array('parent' => $field['object']->book['mlid'])));
  77. }
  78. }
  79.  
  80. /**
  81.  * Printer friendly version
  82.  */
  83. function theme_nd_book_printer_version($field) {
  84. return l(t('Printer-friendly version'), 'book/export/html/'. $field['object']->nid);
  85. }

Viszont tudod, mit nem értek egyáltalán?
Hogy miért mutat az nd.module-lal rossz példát a Display Suite:

  1. $fields['post_date'] = array(
  2. 'title' => t('Post date'),
  3. 'type' => DS_FIELD_TYPE_CODE,
  4. 'status' => DS_FIELD_STATUS_DEFAULT,
  5. 'properties' => array(
  6. 'formatters' => array(
  7. 'ds_eval_code' => t('Default'),
  8. ),
  9. 'code' => '<?php echo format_date($object->created, "custom", "d/m/Y"); ?>'
  10. ),
  11. );

Na mindegy, ez elég hülyeség, bár lehet, hogy csak szemléltető jellege van... :)

0
0
aruna képe

főleg
ez:

 'code' => '<?php print "' . $myArticle1Object->title . '"; ?>',

Ha lesz időm és lelkierőm, foglalkozom a szebb megoldásokkal is.

0
0
Sk8erPeter képe

Csak erre mondtam, hogy nem szép, nem a többire. :D
Elég viccesen (?) mutat egy PHP-kódban egy eval()-lal kiértékelendő PHP-kód egy string formájában... :-O

0
0
aruna képe

Ugyanis a display suite adatbázisban eltárolja a field-eket a ds_settings táblában a fields mezőben.

Emiatt hiába változik a változóban ($myArticle1Object->title) az érték más oldalak betöltésekor, mindig a db-ben tárolt érték fog látszani.

Egy kerülő megoldás, hogy az adatbázisban csak a meghívandó függvényt tárolom le, ami majd futáskor előállítja az értéket:

...
'code' => "<?php print call_user_func('modulom_get_field_value', 'field_id'); ?>",
...
 
function modulom_get_field_value($field_id) {
  $$myArticle1Object = load_object(...);
  return $myArticle1Object->getValue(field_id);
}
0
0
Sk8erPeter képe

Nem értem, ez a $myArticle1Object honnan jön? Korábban így használtad:
'code' => '<?php print "' . $myArticle1Object->title . '"; ?>',
Hol volt ez beállítva?
Amit mutattam, ott az nd_book_navigation() függvény megkapja a $field változót. Abban nem találod meg, ami neked kell, az entitáshoz tartozó szükséges adatokat?
Mi az a 'field_id' nálad?
Miért van kettő dollárjel a myArticleObject előtt?

0
0
Sk8erPeter képe

Hátha ez még ad ötletet:

http://drupal.hu/forum/egy-field-%C3%A9rt%C3%A9k%C3%A9b%C5%91l-egy-m%C3%...

Amúgy a korábban feltett kérdések még élnek. :)

0
0