hook_filter và hook_nodeapi

Events happening in the community are now at Drupal community events on www.drupal.org.
jcisio's picture

Hi,

Đang muốn tùy biến cách hiển thị node (kiểu page, story thông thường). Nếu xem ở frontpage thì chỉ hiện ảnh thumbnail, còn xem đầy đủ thì hiển thị ảnh lớn hơn, click vào sẽ hiện ảnh full. Như ở http://www.thongtincongnghe.com hiện nay.

Vấn đề là hook_filter đã dọn sẵn mâm rồi, có đầy đủ cơ chế setting, enable, cache... nhưng lại không biết được khi nào ở teaser hay full mà làm. Còn nếu dùng hook_nodeapi thì hơi thô, và mấy cái setting phải tự viết hết (tuy không nhiều lắm). hook_theme có thể cũng làm được, nhưng càng nặng nề hơn.

Mọi người chọn cách nào ? Và còn cách khác không :D

Comments

Bạn đang tự xây dựng

thehong's picture

Bạn đang tự xây dựng một module:
- cung cấp một node field
- các kịch bản xử lý ảnh: scale
- tự định nghĩa một filter riêng?
- ...
Chỉ để làm cái trò đó thôi hả? Hì hì, hơi phí sức! Xem thử cái này: http://groups.drupal.org/files/KetHopCCK,Imagefield,ImageCache.pdf
Chắc là bạn sẽ nói là Drupal 6 chưa có các module này. Hì hì, OSS là thế, chưa có thì góp sức cho nó mau có. Hì hì


Thế Hồng

Mấy cái trên đều đã

jcisio's picture

Mấy cái trên đều đã biết qua, nhưng không thích lắm. Có vài vấn đề:
1. Nhiều hình cho 1 bài
2. Chia sẻ hình giữa nhiều bài
3. WYSIWYG (ở mức độ nào đó)

CCK imagefield chỉ giải quyết được (1) khi đặt option cho field là multiple. Hết!

Thay vì vậy giờ không dùng gì hết, chỉ việc dùng TinyMCE/FCKeditor, soạn thảo bình thường, upload, chèn ảnh bình thưởng. Cái module này chỉ làm thêm một việc nhỏ là sửa lại url trỏ đến phiên bản thích hợp của hình ảnh mà thôi, ngoài ra có thể chèn vài hiệu ứng (lightbox: click vào hình nhỏ để xem full, hiển thị caption đẹp...).

Nghĩa là module này rất đơn giản. Lúc sáng khi bắt tay thực hiện module này viết theo kiểu filter bị trục trặc với teaser vì thiếu kinh nghiệm. Có lẽ sẽ viết lại và hook vào _nodeapi là xong: chặn và sửa body trước khi hiển thị. Chỉ có mỗi thắc mắc là liệu dùng theme có đơn giản hơn không.

--
www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...

Nhiều hình cho một

thehong's picture

Nhiều hình cho một bài? Tất cả đều hiển thị thumbnail ở teaser và cỡ nguyên ở full mode?
Chia sẻ hình ảnh giữa nhiều bài viết:
i. Module imagefield cần được mở rộng để tái sử dụng các ảnh đã upload.
ii. Có thể thiết lập thư mục để tải ảnh vào /files/images/articles và thiết lập thư mục của IMCE là /files/images

Về việc nhận dạng teaser mode hay full mode, có thể sử dụng (arg (0) == 'node' && is_numeric (arg (1))), thấy OG có sử dụng cách này. Nhưng vẫn chưa hiểu ý của ông bạn cái chỗ "hook_filter đã dọn sẵn mâm rồi", hook_filter với $op là process chỉ được xử lý khi node editing form được submit. Vả lại, mục đích bây giờ là xoay quanh node presentation, mà hook_filter thì có vẻ như đi rộng hơn, block configuration, comment, contact form, ... Something wrong with your approach?

Chặn và sửa body trước khi hiển thị cũng có vẻ không hay lắm, sao không chặn và sửa trước khi nó được cho vào cache nhỉ?


Thế Hồng

Thumbnail hiển thị 1

jcisio's picture

Thumbnail hiển thị 1 cái đầu tiên thôi, hoặc 1 cái do mình chọn.
Còn nếu dùng IMCE thì như đã nói trên, upload bằng TinyMCE/FCKeditor thì dùng thẳng nó luôn chứ đâu cần imagefield ;-)

Ý kiến arg(1) rất hay, sẽ xem lại xem có trường hợp nào khác mà mình phải xử lí không.

hook_filter được gọi sau khi load node, "dọn sẵn mâm" nghĩa là có giao diện để chỉnh tham số, có cơ chế cache dữ liệu. Tức là dữ liệu trong db chưa được xử lí đâu, nói chung hook_filter chạy trước hook_nodeapi một chút thôi (theo đúng cơ chế filter output của Drupal).

Chính vì cái presentation nên mới phân vân nên bắt vào filter, nodeapi hay là theme :)

--
www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...

Có nói ở trên, nhưng

thehong's picture

Có nói ở trên, nhưng có vẻ ông bạn không để ý. hook_filter không phải chỉ được gọi khi trình bày node không thôi đâu. Cách tiếp cận này có vấn đề.


Thế Hồng

hook_filter được gọi

jcisio's picture

hook_filter được gọi nhiều lần ? Cái này hơi ngạc nhiên. Theo tôi biết nó chỉ được gọi trong check_markup() khi không tìm thấy cache của node thôi ? Bạn có thể cho cái link không ;-)

Cũng chính vì cái cache này mà filter cho full & teaser khác nhau không được, vì cùng một nội dung thì sẽ chỉ sử dụng một bản cache, mà nếu không dùng cache thì _nodeapi giải quyết cũng hiệu quả.

--
www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...

Xem mã nguồn module

thehong's picture

Xem mã nguồn module filter thì thấy, không có chuyện, hook_filter chỉ gọi khi trình bày node. Tip: tìm chuỗi module_invoke.


Thế Hồng

Thấy đúng là nó chỉ

jcisio's picture

Thấy đúng là nó chỉ gọi (op = process) 1 lần duy nhất trong check_markup thôi. Vài lần khác là để cấu hình, hiện tip với op khác... check_markup thì lại chỉ được gọi khi sắp hiển thị node (Pro Drupal, p189).

--
www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...

Vấn đề khác nữa là

jcisio's picture

Vấn đề khác nữa là tạo link để click vào hình trong teaser nó chuyển đến bài viết, cái này hook_filter cũng không làm được nốt. Giờ đây hook_nodeapi là lựa chọn duy nhất. Còn cái nào nữa không nhỉ ?

--
www.thongtincongnghe.com
Trang tin điện tử về CNTT, Viễn thông, Điện tử...

hanzhong520's picture

em dùng windows, làm sao để chạy file patch? thanks