Project MVC application với nhiều theme, và một theme có một logic lấy dữ liệu khác nhau

Chào các bạn, Mình đang có một vấn đề như sau.

Mình xây dựng một project MVC với nhiều theme (Vấn đề này mình đã làm được). Tuy nhiên bây giờ minh phát sinh một yêu cầu là mỗi theme có cách thức lấy dữ liệu và logic khác nhau.

Ví dụ. Trong HomeController theme A yêu cầu lấy 10 bài viết, theme B yêu cầu lấy 10 sản phẩm. (Mình chưa có cách để giải quyết vấn đề này)

Mục đích của việc làm nhiều theme của mình là để phần backend không phải viết lại cũng như clone ra thành nhiều phần.

Mong anh em chia sẻ.

Up. Mong các bác cho giải pháp

vấn đề này bạn có thể tham khảo pattern của WordPress (mặc dù WP ko hẳn là MVC), một trong những yếu tố tạo nên thành công của WP chính là tính lịnh hoạt của nó. về cơ bản pattern này dựa trện 2.5 thứ:
0. cái này coi như là yêu cầu đi :slight_smile: :

  • phần model của bạn phải đảm bảo có đủ các functions cần thiết để cung cấp API cho các theme
  • controller: thay vì cấp thẳng data cho view controler cỏ thể cung cấp 1 object (có thể là model) chứa các API access dến database.
  1. templates: mỗi site chia ra thành nhiều components (header, footer, sitebar, etc) và mỗi component đặt trọng một file template, mỗi theme thì sẽ có các template khác nhau và load theo mỗi trình tự nhất định nếu template không được override thì sẽ load cái default (cái này để tránh lặp code).
  2. Hooks: cái này là linh hồn của WP, về bản chất mỗi hook là một loạt các call backs, mỗi theme sễ định nghĩa, thêm, bớt các logic thông qua các callback, vd một trang template ntn:
<html>
    <head>
        <?php do_action('site_head'); ?>
    </head>do_action('site_head');
    <body>
        <?php 
             do_action('site_header');
             do_action('site_content');
             do_action('site_footer');
        ?>
    </body>
</html>

theme A muốn lấy 10 sản phẩm cồn theme B lấy 10 bài viết và hiển thị trong content, ta sẽ add 1 callback cho action site_content (việc add action phải thực hiện trước khi load template):

//logics for theme A
<?php 
    function get_articles(){
        return "10 articles";
    }

    add_action('site_content', 'get_articles');
?>
//logics for theme B
<?php 
    
    function get_products(){
        return "10 products";
    }

    add_action('site_content', 'get_products');
?>

mỗi theme bạn sẽ cần định một loạt các hooks gọi đến model để lấy data.

các hàm add_action sẽ thêm một call back cho 1 action nhất định còn do_action sẽ gọi hết các callback ra một lượt (dài qúa lười viết :smiley: ).

cơ bản là thể, hy vọng có thể cho bạn thêm một giải pháp để tham khảo.

1 Like

Cảm ơn bạn.

Giải pháp của bạn nghe khá ổn. Tuy nhiên như thế này có một nhược điểm là sẽ phát sinh nhiều code C# ở view. Nếu view chỉ có model và html là đẹp nhất.

Mình sẽ nghĩ thêm để khắc phục nhược điểm này

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?