您在這裡

關於content display時的一對多型態欄位顯示

Drupaler's 的頭像
Drupaler (未驗證) 在 2013-01-21 (週一) 01:34 發表

Dear all,

我最近有個卡關的點
看過form api可以用table_select的呈現方式提供一次選取以及多選功能的table格式,以及可以客制formatter for field

但如果是要呈現在display而不是edit模式的時候,也能提供user這種格式,突然就卡住了

感覺上,drupal的form api是給edit時候用的,而display時則是用themem function來解決
偏偏如上所術的需求,有時候就是需要讓user可以在檢視頁面資訊時,提供勾選、標記的功能

例如加入購物車 例如分享到臉書 而且所需要的內容並一定只是這個node頁面呈現的單一node
例如多筆型態的field,就常會有需求讓user去勾選

不知道有什麼好的建議 卡關的感覺很悶啊

(沒有完全理解你所需)

但 FORM API 什麼時候都能用啊, 不是嗎??
<?php
// http://api.drupal.org/api/drupal/includes%21form.inc/function/theme_tabl...
function test(){
$options = array(
array(
'title' => 'How to Learn Drupal',
'content_type' => 'Article',
'status' => 'published',
'#attributes' => array('class' => array('article-row')),
),
array(
'title' => 'Privacy Policy',
'content_type' => 'Page',
'status' => 'published',
'#attributes' => array('class' => array('page-row')),
),
);
$header = array(
'title' => t('Title'),
'content_type' => t('Content type'),
'status' => t('Status'),
);
$form['table'] = array(
'#type' => 'tableselect',
'#header' => $header,
'#options' => $options,
'#empty' => t('No content available.'),
);
return $form;
}

$test = drupal_get_form('test');
print drupal_render($test);
?>

或者一些只在 *.admin.inc / *.page.inc / *.XYZ.inc 中的

<?php
module_load_include('inc', 'node', 'node.admin');
$admin_form = drupal_get_form('node_admin_content');
print drupal_render($admin_form);

?>

hahalin's 的頭像

感謝 回應
這樣說好了 在一個現成的node 檢視頁面

要能夠把多筆類類型的欄位用checkbox list的方式輸出

而且要能記錄勾選結果 作為下一步動作 例如 ajax , action 之類的來源

您的作法我大概了解 但是這是使用form api根據傳來的menu來render一個頁面

但是很多時候是要在現有頁面上去formatter一個新的欄位

我開發經驗下來 發現如果是edit的話, 可以只要開發好field的widget

不管是下拉 勾選 把欄位分tab去放 搭配panel去設定位置所在region

都有琳琅滿目的module可選或是自行開發都很有可為

但很奇怪 就是在view 的模式下 這些神奇的widget都用不上 例如 jquery tab field

只能悶著頭去寫theme function 在edit模式下能用的手法 widget都沒能用

hahalin's 的頭像

說真的 我覺得ˊ這裡真的臥虎藏龍

各種各型辦法都有

好吧 其實我也try過 bulk operation

可惜操作不夠直覺 以及手法過於複雜 阿反正我都有理由就是了

其實我try到可以寫formatter掛成module啟用後,讓field可以變成checkbox list

只是 我看了老外們的討論 發現這樣的困擾不是只有我有而已

上來抱怨一下 順便看看有什麼東方神奇的力量

唉 view 與 edit的兩個世界 不禁讓我感覺深深的遺憾

hahalin's 的頭像

補充一下 其實ubercart的attribute也是有達成效果

但是drupal7開始有的entity 包括 reference another entity這種形態的欄位

如果要達成這種關連的效果 不光只是文字的attribute 一種固定資料的清單來源

而是另一個資料會因為使用者輸入或是日常作業運行後而變動的entity

那麼 這一切的一切 要達成這樣的效果 會突然發現 非常不知如何下手

尤其是drupal commerce的大大小小彼此牽來牽去entity們

d

這是顯示某 WIDGETs
<?php

function print_field($field_name, $entity_type, $entity, &$form, &$form_state) {
$form += array('#parents' => array());
$options = array(
'default' => TRUE,
);
module_load_include("inc","ctools","includes/fields");
$form += (array) ctools_field_invoke_field($field_name, 'form', $entity_type, $entity, $form, $form_state, $options);
}

function test($node, &$form_state){
$form = array();
$node = new stdClass();
$node->type = 'article';

print_field('field_user_ref', 'node', $node, $form, $form_state);
print_field('field_list', 'node', $node, $form, $form_state);

return $form;
}

$test = drupal_get_form('test');
print drupal_render($test);

?>

Formatter 更簡單, 直接 field_view_field

以下這是我上周自己卯起來就是要做出一個可以多重勾選的formatter 如果我記憶力沒減退的話 依稀還記得是根據boolean類型的欄位來做formatter

但離可以用multiple的reference entity/node的field 還不一樣就是

其實到達formatter只是一半 自己先在腦袋跑 配置一個按鈕要能ajax的方式post出去這些勾選的資料以及node/entity 其他欄位的資料 又是一個關卡了

我目前想到的是 hook_node_save 或是 hook_entity_save 之類的方式

在這個按鈕按下後 組裝一個entity來裝載這些資訊然後ajax送出 發射


<?php

function table_select_field_formatter_info() {

return array(
'table_select_checkbox' =>
array(
'label' => t('Checkbox field'),
'field types' => array('list_boolean')
)
);

}

function table_select_field_formatter_table_select_checkbox($variables) {

$element = array();

foreach ($variables['#items'] as $delta => $item) {
switch ($variables['#field']['type']) {
case 'list_boolean' :
$element[$delta] = array('#type' => 'checkbox',
'#title' => '',
'#value'=>$item['value'],
'#checked'=>$item['value'],
);
break;
default :
break;
}
}

return drupal_render($element);
}
?>