קיבוץ taxonomy

הי,
קיים מודול חדש עבור CCK, אשר מאפשר לקבץ שדות מסויימים תחת קבוצה.

האם קיים משהו דומה עבור taxonomy או category?
שיאפשר לי, גם לקבץ ועל הדרך גם לסדר בצורה טובה יותר את מיקום הקטגוריות במקומות הרצויים ולאו דווקא בתחילת דך התוכן...

מיקום קטגוריות

במיקום הקטגוריות ניתן לשלוט בקלות דרך עריכת העיצוב. ערוך את קובץ node.tpl.php. פשוט תזיז אותן מההתחלה לאמצע או לסוף.

אבל אם הבנתי אותך נכון אתה רוצה גם קיבוץ קטגוריות. אני לא כל כך מבין מה זה קיבוץ קטגוריות - האם המדובר על מצב שבו יש באתר מילונים שונים שאפשר לסווג את פריט התוכן לפיהם (נניח צבע וגודל)? האם אתה מעוניין להציג את הסיווגים של כל מילון בנפרד? בכל מקרה המקום להכניס גם את זה הוא לדעתי בתוך node.tpl.php.

אמנון מאיר לבב
בניית אתרים בדרופל, ייעוץ והדרכה

קיבוץ מונחים

לבבי ענה לך על השאלה השנייה. לגבי הראשונה: לו היית מקליד term by vocabularies drupal בגוגל היית מגיע ל:

http://drupal.org/node/53089

(אם כי אני לא מרוצה מהקוד; כתבתי שם הערה.)

אני אנסח את זה מחדש...

האם המדובר על מצב שבו יש באתר מילונים שונים שאפשר לסווג את פריט התוכן לפיהם (נניח צבע וגודל)?

כן, ועוד המון סיווגים אחרים...

לבבי ענה לך על השאלה השנייה. לגבי הראשונה: לו היית מקליד term by vocabularies drupal בגוגל היית מגיע ל:

http://drupal.org/node/53089

לא היו שתי שאלות, והלינק הזה לא עונה לי על השאלה...

עכשיו שבאמת הגעתי להתעסק עם זה, אני מבין את בעיית הניסוח הראשוני שלי.
מודול FieldGroup מאפשר איחוד של שדות הCCK, בזמן עריכה או יצירת הדף התוכן.
מה שאני מחפש זה אפשרות ב-form_alter של אותו דף תוכן, לשלב את ה-taxonomy בתוך אותן קבוצות, כאילו היו חלק מהן.
במקום שיופיע בתוך קבוצה אחת ענקית שנקראת Categories.

מדובר על שאלון מעוד גדול, ויש המון סיווגים שונים, כדי לאפשר לי בשלב מאוחר יותר, חיתוכי מידע שונים...

תודה

מיקום הטקסונומיות בטופס

עכשיו הבנתי.

נצרכתי לעשות דבר דומה לפני כשבועיים. כתבתי מודול של node, ובוררי הטקסונומיות ("בורר" = selector), שהוצגו בתחילת הטופס רחוק מהמקום שבו היו אמורים להשתמש בהם, נראו כנטע זר ועלולים היו להקשות על ההבנה. לכן מימשתי את hook_form_alter, ובו העברתי את הטקסונומיות, קומפלט, ממקומן המקורי אל תוך הקבוצה (קבוצה = fieldset) בה חפצתי.

אבל אצלך המצב מסובך יותר: אתה לא רוצה להעביר את הטקסונומיות קומפלט, אלא אתה רוצה להעביר כל בורר, בנפרד, ל-fieldset אחר.

במקום לתת הרצאה איך לעשות זאת, הקלדתי בגוגל drupal taxonomies fieldset והגעתי ל:

http://lists.drupal.org/archives/development/2006-06/msg00542.html

form_render

בדוק את הפונקציה form_render.
היא מאפשרת לך לארגן את הטופס איך שבא לך, עד לרמות הכי פרטניות שניתן.
לדוגמה:

<?php
$output
.= "<fieldset><legend>a fieldset</legend>";
$output .= form_render($form['taxonomy']);
$output .= "</fieldset>";
$output .= form_render($form);
?>

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

בדוק את

בדוק את הפונקציה form_render.

אפשרי, אבל, במקרה הנדון, בשיטת ה-themeing שהצעת יש למעשה הרבה יותר עבודה מאשר בשימוש ב-form_alter (וישנה גם בעית תחזוקה: אנחנו קובעים בעצמנו את סדר ה-fieldsets ואם נרצה להוסיף...)

הקישור שנתתי עושה עבודה גרועה בהדגמת העניין, אבל מדובר בהעברה פשוטה של אלמנטים במערך.

מה הקשר?

הקשר

הקישור מתאר בדיוק מה שאתה רוצה. מדובר שם על טפסים, לא על קישורים. אבל הוא מיועד לבעלי ידע בתיכנות. אני עסוק היום, אבל אשתדל למצוא זמן לחבר דוגמה קונקרטית.

העברת טקסונומיות

הנה הקוד שהבטחתי:

<?php
function mymodule_form_alter($form_id, &$form)
{
 
// Replace 'mp3' with the name of your CCK node-type.
 
if ($form_id == 'content_mp3_node_form') {
   
$vocab_placement = array(
     
// move each 'vid' vocabulary to the 'fieldset' fieldset.
     
array('vid' => 2, 'fieldset' => 'group-author'),
      array(
'vid' => 1, 'fieldset' => 'group-author'),
      array(
'vid' => 3, 'fieldset' => 'group-publisher'),
    );
    foreach (
$vocab_placement as $vocab) {
     
$vid      = $vocab['vid'];
     
$fieldset = $vocab['fieldset'];
     
$form[$fieldset]['taxonomy'][$vid] = $form['taxonomy'][$vid];
     
$form[$fieldset]['taxonomy']['#tree'] = TRUE;
     
$form[$fieldset]['taxonomy']['#weight'] = -10;
      unset(
$form['taxonomy'][$vid]);
    }
   
// Remove the original taxonomy fieldset if no more
    // vocabularies remain in it:
   
if (!element_children($form['taxonomy'])) {
      unset(
$form['taxonomy']);
    }
  }
}

// Increase our weight so that we see the taxonomy.module additions.
function mymodule_install() {
 
db_query("UPDATE {system} SET weight = 5 WHERE name = 'mymodule'");
}
?>

שמור בקובץ mymodule.module והתקן. את "mp3" שנה לשמה האמיתי של "פיסת התוכן" שלך.

בדוגמה הנ"ל אנו מעבירים שלושה סלקטורים (במערך vocab_placement שלושה איברים) של מילונים למקום אחר. שניים מהם אנו מעבירים אל fieldset בשם author, ואחד מהם אל fieldset בשם publisher (המודול fieldgroup מקדים את המחרוזת "-group" לכל fieldset שהוא יוצר). לכל מילון יש vid שעל פיו הוא מזוהה -- ועליך למצוא אותו.

נדמה לי שהדוגמה מחדדת את ההכרה שכדי לבנות אתרים בדרופל צריך לדעת גם לתכנת בדרופל.

שתי שורות המפתח הן אלה:

<?php
...
$form[$fieldset]['taxonomy'][$vid] = $form['taxonomy'][$vid];
...
unset(
$form['taxonomy'][$vid]);
?>

הסבר: אנו מעתיקים את הפקד (פקד = widget) למקומו החדש ואח"כ מוחקים אותו. העתקה + מחיקת הישן = העברה.

הסבר על שינוי המשקל

דרופל טוען את המודולים ואת הפונקציות שבאות איתם עפ"י סדר ה-ABC. לכן, אם נקרא למודול mymodule, הוא ייטען לפני המודול taxonomy ולא יוכל לשנות את הטופס כפי שאנחנו רוצים.
לחילופין, במקום לשנות את המשקל בבסיס הנתונים, ניתן פשוט לתת למודול שם אחר, כמו transfer_taxonomy.module, או משהו כזה...

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

תודה

זה דומה למה שעשיתי ידני, רק שאני לא יצרתי מערך של העברות לכן הרעיון שלך יותר אלגנטי.

שאלה חיונית, משהו שעוד לא בדקתי: היא מה יקרה בזמן SUBMIT?
אני אהיה חייב להזין את הנתונים של ה-vocabularies השונים באופן ידני או שדרופל לבד יודע לעשות את השיוך בחזרה (למרות שינוי המיקום בסידור המקורי)

מה זאת אומרת

מה זאת אומרת "לשייך בחזרה"?
השינוי במקום לא משנה את העובדה שאתה עורך node מסויים. לנוד הזה יש ID, והמונחים שאתה בוחר ישוייכו ל-ID הזה בכל מקרה.

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

הכל טוב ויפה

ותודה לכל התורמים והעוזרים.
ה-node מכיל שדות וסיווגים בדיוק במיקום שאני צריך אותם.

עכשיו צריך לבנות את טופס החיפוש ככה שמשתמש יוכל לחפש לפי אותם סיווגים.
מה הדרך הפשוטה לעשות את זה?

(השילוב של חיפוש לפי שדות פחות מעניין אותי)

מתי, פתח נושא

מתי,
פתח נושא חדש לצורך העניין - למען הסדר הטוב :-) .
(ובדוק אם החיפוש המתקדם המובנה של דרופל לא עונה לך כבר על השאלה)

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות

זהר סטולר, לינווייט
לינווייט תשתיות תוכן קהילתיות