קיבוץ שדות בדרופל 7
הגדרת שדות בדרופל 7 תיצר טבלה נפרדת לכל שדה , מה שאומר שלכל שדה תהיה שאילתה נפרדת למסד
עבור ישות עם הרבה שדות עדיף שיווצרו בטבלה יחידה כך שפעולת קריאה\כתיבה תדרוש שאילתה אחת למסד נתונים
ביצעתי את זה על ידי הגדרת סוג שדה , הממשק מוגדר פו field types api :
הגדרת הסכימה בקובץ install :
<?php
function field_example_field_schema($field) {
$schema = array();
if ($field['type'] == 'fx') {
$schema['columns'] = array(
'weight' => array(
'type' => 'float',
'size' => 'small',
),
'height' => array(
'type' => 'float',
'size' => 'small',
),
);
}
return $schema;
}
?>הגדרת השדה כוללת :
הגדרת טופס hook_field_widget_form
<?php
function field_example_field_info() {
$info = array();
$info['fx'] = array(
'label' => 'field example',
'description' => 'field example',
'default_widget' => 'field_example_fx',
'default_formatter' => 'field_example_fxf',
);
return $info;
}
function field_example_field_widget_info() {
$info = array();
$info['field_example_fx'] = array(
'label' => 'field example default',
'field types' => array('fx'),
);
return $info;
}
// height and weight coresponds to columns structure in install file
function field_example_field_widget_form(&$form, &$form_state,
$field, $instance, $langcode, $items, $delta, $element) {
$element['height'] = array(
'#type' => 'textfield',
'#title' => 'height',
'#default_value' => 0,
);
$element['weight'] = array(
'#type' => 'textfield',
'#title' => 'weight',
'#default_value' => 0,
);
if (isset($items[$delta])) {
$element['height']['#default_value'] = $items[$delta]['height'];
$element['weight']['#default_value'] = $items[$delta]['weight'];
}
return $element;
}
// this hook is important, since field_default_submit will filter empty values
// so if the logic implemented here is wrong then submitted values won't be saved
function field_example_field_is_empty($item, $field) {
return empty($item['height']) and empty($item['weight']);
}
?>והגדרת תצוגה hook_field_formatter_view :
<?php
function field_example_field_formatter_info() {
$info = array();
$info['field_example_fxf'] = array(
'label' => 'field example',
'field types' => array('fx'),
);
return $info;
}
// display items in table
function field_example_field_formatter_view($entity_type, $entity,
$field, $instance, $langcode, $items, $display) {
$rows = array();
foreach ($items as $delta => $item) {
$rows[] = array($item['height'],$item['weight']);
}
$element[0] = array(
'#theme' => 'table',
'#header' => array('height', 'weight'),
'#rows' => $rows,
);
return $element;
}
// changing parent #type from container to collapsible fieldset
// depends on actual name for the field in field ui or in field_create_field
function field_example_form_page_node_form_alter(&$form, &$form_state, $form_id) {
$form['field_fff']['#type'] = 'fieldset';
$form['field_fff']['#title'] = 'fx';
$form['field_fff']['#collapsible'] = TRUE;
?>היתרון בהגדרת סוג שדה שאפשר להגיד number of values = unlimited ומקבלים הוספת ajax ל שדה חדש וגם טבלת מיון בחינם
- הבלוג של yakoub
- חברי האתר יכולים לשלוח תגובה - כניסה , הצטרפות.

נראה לי שמה שאתה באמת מחפשֿ/
נראה לי שמה שאתה באמת מחפשֿ/ צריך זה mongodb, ואז אתה לא צריך שום שדות קאסטם.
אמתי -- חברת גיזרה
מונגו
עדיין לא ניסיתי את מונגו , אני יודע שדרופל תומך בו אבל אני עדיין צריך ללמוד על יתרונותיו
אבל מה הבעיה עם שדות קאסטם ?
בינתיים הבעיה היחידה שמצאתי זה עם hook_field_is_empty בגלל זה שמתי ערכים דיפולטים
כי הסתכלתי על field_sql_storage_field_storage_write ושם בונים שאילתה insert בלי לקחת בחשבון שחלק מהשדות יהיו NULL
אז נוצר מצב שכל הערכים או מקבלים ערך או 0 , ואי אפשר למשל לשים height ולהשאיר width ריק
yakoub abaya
אבל מה הבעיה עם שדות קאסטם
אני משתמש ב field-collection, מה שחוסך לי כתיבת קוד.
אמתי -- חברת גיזרה
טבלאות
כל המטרה שתהיה טבלה אחת עם הרבה עמודות עבור הרבה שדות
במקום שיהיה הרבה טבלאות להרבה שדות
עברתי על המודול שציינתה ולא ראיתי שהוא עושה את זה , הוא פשוט מייצר ישות נפרדת לקבוצה של שדות .
חוץ מזה , למה לחסוך בכתיבת קוד שהוא פשוט ,קל לקריאה ומשתמש ב field api , ולהחליף אותו במודול קונטריב שהוא מסובך פי כמה ומסתמך על entity api שהוא לא חלק מהליבה ?
הליבה של דרופל הרבה יותר יציבה מקונטריב , אים ניתן להתממשק איתה בפשטות ולישם פונקציונאליות אז מקבלים אתר יותר יציב וקל לתחזוקה
בעתיד כש דרופל 8 ישתחרר אז לא צריך לחכות עד שכל הקונטריב גם מתעדכנים ובגלל שהקוד שכתבתי פשוט אז אפשר לעדכן אותו לדרופל 8 במהירות ולעדכן כל האתר ל 8
כל זה בהנחה שאני יודע לכתוב קוד שהוא פשוט וקל לתחזוקה .. אבל גם אם לא אז לומדים ומשתפרים עם הזמן .
yakoub abaya
check_plain
<?phpfunction field_example_field_formatter_view($entity_type, $entity,
$field, $instance, $langcode, $items, $display) {
$rows = array();
foreach ($items as $delta => $item) {
$row = array($item['height'],$item['weight']);
$row = array_map('check_plain', $row); // CHECK_PLAIN
$rows[] = $row;
}
$element[0] = array(
'#theme' => 'table',
'#header' => array('height', 'weight'),
'#rows' => $rows,
);
return $element;
}
?>
yakoub abaya
... לתחזק ...זה בעייה של
זה בעייה של הפילדים, אי אפשר לתחזק אותם -- http://drupal.org/node/937442
אמתי -- חברת גיזרה
בעיה
זו אכן בעיה שלא הייתי מודע אליה, תודה שהבאתה את זה לתשומת לבי
yakoub abaya
הרבה שדות
נניח צריכים לישם ישות דוח פיננסי שיש בו 30 שדות, ב field ui זה אומר 30 טבלאות, כלומר בשביל לעשות node_load צריך שאילתה עם 30 inner join, כי אין מנגנון שמאפשר טעינה חלקית של השדות למשל עבור teaser display
אז אין ברירה אלה לממש סוג שדה כמו שעשיתי מעלה ..
אלה אם יש עוד קונטריב מודול שיודע לממש כמה שדות בטבאלה אחת
yakoub abaya