您在這裡

網站改造馬拉松瓶頸問題一:淡化筆戰文

tky's 的頭像
tky 在 2013-07-11 (四) 13:09 發表

是的,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
至今無人能解的樣子。

有沒有人有處理過這問題?有什麼好建議或替代方案?

多謝。不過 context_addassets 不是我要找的模組。

我要達到的目標是:當管理者 flag 一篇文章為戰文的時候,在 node.tpl 或 page.tpl 中插入特定的 class,比方說 class="flag-abuse"
這樣就可以用 CSS 來控制該篇文章的顯示效果。

context_addassets 是用來在特定條件下加載某些 CSS 檔案,跟修改 tpl 無關。

tky

Denny, 我立馬手刀測試了你的作法,果然有效。
不過後來發現一個問題:因為是討論區,就會有回應。回應有時候也會出現筆戰文,要淡化處理。
如果 class="abuse" 僅加在 body,那 CSS 規則無法處理特定的回應。

所以要能夠把 class 加到被管理者標示為 abuse 的文章或回應的容器裡頭才行。
這要怎麼寫才對?

tky

如果是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_body]

所有的comment 被 flag abuse 就會有class : abuse-Yes (否則就是abuse-No), 你只要在css 檔案裏設定.abuse-Yes 的顯示就行了。

感謝!
我是有考慮過用 views 來做,不過我用了 advanced forum 模組來改裝討論區文章的樣式,要覆寫 advanced forum 不是那麼容易。怕用 views 改寫過後,又要重套一次樣式。
advanced forum 方便是歸方便,但進階客製化的部份很有限,也找不到 tpl 檔可以直接修改。

想想還是用 jquary 的方式來添加 class 比較快;至少 forum post 這部份是沒問題的。
怎麼樣把 class 加到特定的 flagged comment,問題比較大。
真的要惡補一下 JQ 才行 @@

tky

直接加進 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';
}

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 呢?

tky

差不多像這樣:

// 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

Kay, 一個進一步的問題:沒有登入的使用者所看到的論壇內容與回應沒有自動加上 .cooooooooooooooooomment-flag 等 class
我關掉所有和 cache 有關的模組(memcache....),清掉瀏覽器 cache,都沒有用。

只有 logged in user 能夠看到自動加載 class 的內容。這個和你所提供的 code 有關嗎?

tky

果然是!
發現說若一開始沒設成 globle flag,文章一旦 flagged,設定就不能改了。一定要砍掉重練。
重新設定兩個名稱相同的 flag 就搞定了。非常感謝!

I did it!

題外話:Flag 最近也變成一個新的 entity 了,有自己的欄位可加。那些外掛模組,比方 flag abuse 這些要走入歷史了。
以後 flag + views + rules 就可以一次搞定許多模組在做的 workflow,還更加彈性!

tky