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去勾選
不知道有什麼好的建議 卡關的感覺很悶啊
Re: 關於content display時的一對多型態欄位顯示
(沒有完全理解你所需)
但 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);
?>
Re: 關於content display時的一對多型態欄位顯示
感謝 回應
這樣說好了 在一個現成的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都沒能用
Re: 關於content display時的一對多型態欄位顯示
用views 產生假的node ,然後用views bulk operation 去做你要的勾選表單?
Re: 關於content display時的一對多型態欄位顯示
說真的 我覺得ˊ這裡真的臥虎藏龍
各種各型辦法都有
好吧 其實我也try過 bulk operation
可惜操作不夠直覺 以及手法過於複雜 阿反正我都有理由就是了
其實我try到可以寫formatter掛成module啟用後,讓field可以變成checkbox list
只是 我看了老外們的討論 發現這樣的困擾不是只有我有而已
上來抱怨一下 順便看看有什麼東方神奇的力量
唉 view 與 edit的兩個世界 不禁讓我感覺深深的遺憾
Re: 關於content display時的一對多型態欄位顯示
補充一下 其實ubercart的attribute也是有達成效果
但是drupal7開始有的entity 包括 reference another entity這種形態的欄位
如果要達成這種關連的效果 不光只是文字的attribute 一種固定資料的清單來源
而是另一個資料會因為使用者輸入或是日常作業運行後而變動的entity
那麼 這一切的一切 要達成這樣的效果 會突然發現 非常不知如何下手
尤其是drupal commerce的大大小小彼此牽來牽去entity們
Re: 關於content display時的一對多型態欄位顯示
這是顯示某 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
Re: 關於content display時的一對多型態欄位顯示
讚喔 我研究一下 果然這裡有高手的呀
晚點我貼上上週自己傻傻的trytrytry寫的formatter
儘管如此 我還是覺得啊 fieldapi +widget+formatter 在edit 與 view模式下 可以搭配整合的更無縫一點的呀
Re: 關於content display時的一對多型態欄位顯示
以下這是我上周自己卯起來就是要做出一個可以多重勾選的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);
}
?>