是的,Drupalcamp Taipei 2013 第2日網站改造馬拉松仍在進行當中(五人一天要完成一個網站真的很吃力 XD),預計下週一完成後能夠上線。
在幫 ubuntu tw 改版論壇網站的時候碰到兩個瓶頸問題,上來問問大家。
第一個是要淡化筆戰文,打算用 flag + CSS class 的方式來處理,被管理標示成筆戰文章者就添加 CSS class 到 body 或 node 裏面,用 CSS 規則把文字變淡或縮小容器。
有找到 https://drupal.org/project/flag_classes ,但是好像停止開發了。
有相關教學文章,但 D7 中不管用:https://drupal.org/node/312220
至今無人能解的樣子。
有沒有人有處理過這問題?有什麼好建議或替代方案?
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
剛剛試了一下,這個應該可以解決:
https://drupal.org/project/context_addassets
先設定好 Conditions (例如當管理者指定該篇文章屬於筆戰文),就會得到你設定的 Reactions(帶出指定的 CSS)
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
多謝。不過 context_addassets 不是我要找的模組。
我要達到的目標是:當管理者 flag 一篇文章為戰文的時候,在 node.tpl 或 page.tpl 中插入特定的 class,比方說 class="flag-abuse"
這樣就可以用 CSS 來控制該篇文章的顯示效果。
context_addassets 是用來在特定條件下加載某些 CSS 檔案,跟修改 tpl 無關。
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
可考慮用 jquery,一篇文章, 如果被flag 為戰文,那麽flag link 的class 會包含 unflag-action.
jquery if 上述條件成立 (flag link 的class 中有 unflag-action),就在某個selector 上 addClass : flag-abuse .
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
感謝 Danny 的提示(話說好久不見了啊!)。
不過我不太會寫 jquery,有範例可以參考嗎?
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
@tky
在你的theme.info 裏面加上 your-script.js , 然後放上下面code 到 your-script.js
假設你的tag 名字是abuse
(function ($) {
$(document).ready(function() {
if($("li.flag-abuse a").hasClass("unflag-action")) {
$("body").addClass("abuse");
};
});
}(jQuery));
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
Denny, 我立馬手刀測試了你的作法,果然有效。
不過後來發現一個問題:因為是討論區,就會有回應。回應有時候也會出現筆戰文,要淡化處理。
如果 class="abuse" 僅加在 body,那 CSS 規則無法處理特定的回應。
所以要能夠把 class 加到被管理者標示為 abuse 的文章或回應的容器裡頭才行。
這要怎麼寫才對?
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
如果是comment 要加上flag class, 建議你用views 來顯示整篇文章, 因爲用views 比較有彈性。
add new view (show : content) -> create page
進入設定頁面后,format show : fields ;
relationships : 第一 Comment: Comments of the node + 第二 (Comments) Flags: abuse (by any user)
Contextual filters : node nid
path: node/%
Format -> format unformatted list : setting grouping Nr 1 : content title
然後在fields 的設定 (我下面只寫出最基本的)
1: Content: Title (exclude from display)
2: (flag) Flags: Flagged (Flagged) (output format : Yes/No, exclude from display)
3 : (Comments) Comment: Comment : 選擇 Rewrite the output of this field
rewrite output 如下:
所有的comment 被 flag abuse 就會有class : abuse-Yes (否則就是abuse-No), 你只要在css 檔案裏設定.abuse-Yes 的顯示就行了。
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
感謝!
我是有考慮過用 views 來做,不過我用了 advanced forum 模組來改裝討論區文章的樣式,要覆寫 advanced forum 不是那麼容易。怕用 views 改寫過後,又要重套一次樣式。
advanced forum 方便是歸方便,但進階客製化的部份很有限,也找不到 tpl 檔可以直接修改。
想想還是用 jquary 的方式來添加 class 比較快;至少 forum post 這部份是沒問題的。
怎麼樣把 class 加到特定的 flagged comment,問題比較大。
真的要惡補一下 JQ 才行 @@
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
jquery 雖然方便,但是只能做小面積顯示上的修改,comments 有時候一頁顯示許多,用jquery恐怕對網站速度有影響 。
建議你修改comment.tpl.php。
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
多謝!我後來也發現用 JQ 去找出特定 comment 非常困難。
目前正朝 Kay 給的方向去研究。
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
$flag = flag_get_flag('flag_name');
if($flag->is_flagged($node->nid)) {
print 'class_XYZ';
}
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
Kay,請問一下你這段是要放在哪裡?
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
直接加進 node.tpl 最簡單 (放在文檔最開始就可以), 比如:
$flag = flag_get_flag('flag_name');
if($flag->is_flagged($node->nid)) {
$classes = $classes . ' flag-class';
}
加進 template.php hook_preprocess_node 也可以 (或 _page, _html..etc,看你最終要加到 node 還定 body tag)
$node = menu_get_object();
$flag = flag_get_flag('flag_name');
if($flag->is_flagged($node->nid)) {
$variables['classes_array'][] = 'flag-class';
}
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
Kay, 經過幾次的嘗試之後,我把
$flag = flag_get_flag('flag_name');
if($flag->is_flagged($node->nid)) {
$classes = $classes . ' flag-class';
}
放到了 advanced-forum-post.tpl.php 裡頭,有效!
不過麻煩是 advanced forum 將 comment 也當成 post 來處理,所以當論壇文章有 .flag-class 的時候,回應也都會有。
這樣無法區別論壇文章及其回應之間的差別。
我另外做了一個 abuse_comment 的按鈕,可以對回應做標記。
要怎麼樣分別讓回應有 .abuse_comment、論壇文章有 .abuse_node 的 CSS class 呢?
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
差不多像這樣:
// dpm($content);
if(isset($content['comments'])) {
$entity_id = $content['body']['#object']->nid;
$flag = flag_get_flag('bookmarks');
if($flag && $flag->is_flagged($entity_id)) {
$classes = $classes . ' toooooooooooooooooopic-flag';
}
}
if(isset($content['comment_body'])) {
$entity_id = $content['body']['#object']->cid;
$flag = flag_get_flag('abuse_comment');
if($flag && $flag->is_flagged($entity_id)) {
$classes = $classes . ' cooooooooooooooooomment-flag';
}
}
我直接判斷有沒有 comments / comment_body,感覺有效率一點,你也可以用 $content['body'] 下的 #entity_type
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
Cool, Kay, it works!
這篇我一定要收藏起來!
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
Kay, 一個進一步的問題:沒有登入的使用者所看到的論壇內容與回應沒有自動加上 .cooooooooooooooooomment-flag 等 class
我關掉所有和 cache 有關的模組(memcache....),清掉瀏覽器 cache,都沒有用。
只有 logged in user 能夠看到自動加載 class 的內容。這個和你所提供的 code 有關嗎?
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
權限問題吧 ? 設為 " Global flag "
Re: 網站改造馬拉松瓶頸問題一:淡化筆戰文
果然是!
發現說若一開始沒設成 globle flag,文章一旦 flagged,設定就不能改了。一定要砍掉重練。
重新設定兩個名稱相同的 flag 就搞定了。非常感謝!
題外話:Flag 最近也變成一個新的 entity 了,有自己的欄位可加。那些外掛模組,比方 flag abuse 這些要走入歷史了。
以後 flag + views + rules 就可以一次搞定許多模組在做的 workflow,還更加彈性!