• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
راهکار پياده سازي سيستم مديريت محتواي ماژولار (راهنمايي کنيد)
#1
سلام دوستان
اول از همه بگم من قبل از اينکه کاري کنم و پروژه اي رو شروع کنم حسابي از نظر تئوري تموم جوانب رو بررسي ميکنم و ميپزمش
بعد بهترين راه حل رو انتخاب و پياده ميکنم.

پس اينکه هي ميام و در مورد يه سيستم مديريت محتواي فرضي - تخيلي حرف ميزنم از دستم دلخور نشيد .

قبل از همه خب ميخوايم يه سيستم ماژولار باشه
چنين ساختاري رو براش در نظر گرفتم ميگم شمام ببينيد درسته ، خوبه ، پياده ميشه يا نه

شاخه ها به اين صورته
کد پی‌اچ‌پی:
+root/    
    
index.php
    booter
.php
    config
.php
    
core
            core
.php
            router
.php
            controller
.php
            db
.php
            
..
    + 
app
        
library
                pagination
.php
                pdate
.php
                
...
        + 
module
                
post
                     post
.php
                     admin_post
.php
                     post_model
.php
                     
defultview
                                single
.php
                                
                
page
                     page
.php
                     admin_page
.php
                     page_model
.php
                     
defultview
                                page
.php
                                
    
template
            
theme1
                    style
.css
                    header
.php
                    footer
.php
                    single
.php
                    page
.php
                    main
.php
            
theme2
                    style
.css
                    header
.php
                    footer
.php
                    single
.php
                    page
.php
                    main
.php 

پوشه core مربوط به هسته سيستم است
که وظيفه اش فعال و غيرفعال کردن ماژول ها انتخاب قالب
تغيير پسورد مدير و ...

حقيقتش مشکل اصلي من با ماژول هاست پوشه moduleفعلاً شامل دو ماژول post , pageميشه

يه فايل booter اون بالا هست .
وظيفه اش اينه ماژولهاي فعال رو ليست کنه و بفرسته به
ماژول مورد نظر با توجه به روتر انتخاب کنه بفرسته به کنترلر پيشفرض يا کنترلر ماژول

خب اون هيچي

فعلاً من ميخوام روي پياده سازي ماژولها زوم کنم
توي ماژول post بايد يک فايل post.php باشه اين کلاس يک نوع کنترلر محسوب ميشه با امکانات اضافي
توي اينکلاس بايد روتر مربوطه تعريف بشه
يه مثالشو مينويسم

کد پی‌اچ‌پی:
        class post extends module{
    
    function 
__construct()
    {
        
$this->router[] = array('post/(:num)' => 'get_post');  
        
/*
        يعني آدرس مثل 
        mysite.com/post/1
        بره به کلاس جاري يعني post و متدget_post
        */
        
        
$this->library('pagination'); // کود کردن کتابخانه هاي سيستم
        
include MODULE_PATH.'/post/lib.php'// لود کردن کتابخانه هاي داخل ماژول
    
    
}
    
    
    function 
active() // اين متد فقط يکبار ماژول نصب بشه صدا زده ميشه براي ساخت جدول مثلاً
    
{
        
$this->db->query("create tbl");
    }
    
    function 
deactive() // اين متد وقتي که ماژول غيرفعال بشه صدا زده ميشه يکبار
    
{
        
$this->db->query("delete tbl ");
    }
    
    function 
get_post($id// نشان دادن مطلب با توجه به روتر درخواستي
    
{
        $
$this->db->("select post");
        
$this->view->("post");    // تعيين ويو - اگر در قالب فعال سيستم اين فايل باشه لود ميشه اگر نه فايل پيشفرض موجود در ماژول
    
    
}
    
    function 
replacer($text// کار اين متد اينه قبل از نمايش مطالب يه سري تغييرات ميده
    
{
        return 
str_replace("reza","رضا",$text);    
    }
    
    static public function 
related_post() // اين فانکشن انحصاراً براي استفاده در حلقه مطالب جهت نشان دادن مطالب مرتبط مثلاً
    
{
        global 
$post;
        
$category $post->category_list;
        
$this->db->query("select post that cat=cat");
        
        foreach(
$result as $row)
            echo 
"<li>{$row->link}</li>";
    
    }



فايل admin_post.php هم به همين شکل فقط اون براي نشون دادن تنظيمات در مديريت
post_model.php هم براي مدل مورد استفاده در مديريت

اين سري توابع بايد توي تموم ماژول ها باشن

خب به نظر شما ميشه هميچن چيزي پياده کرد .
و بعداً ديگه فقط براش ماژول نوشت .
مثلاً گالري ، فرم و ...

ممنون ميشه ايده تجربه و نظرتون رو بگيد
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : Y.P.Y
#2
شدن که میشه - پروژه خیلی خوبی هم هست
همچین پروژه ای یکی از دوستانم با python و mongodb انجام داد

منم قبلاً همچین کاری میخواستم بکنم
که یه هسته باشه و بشه سیستم های مختلفی رو روش پیاده سازی کرد
ولی خیلی خیلی پیچیدست (شاید مال من اینطور بود)
در عین حال عالی و کار آمد Heart

چیزی شاید شبیه cmf ها

اون کدی که نوشتی به اسم post در حد یه پلاگین wordpress هم نیست Big Grin
اینجوری نمی تونی هر سیستمی رو روش سوار کنی - بعداً هم مجبور به تغییر کل پروژه میشی!

مهمترین مسئله در این پروژه ها اینه که باید تمام کدها portable و همه فن حریف و بی طرف باشن.
یعنی بقول خودت کاربر بتونه هر application ای رو روش سوار کنه: فروشگاه، اتوماسیون، فروم، بلاگ، گالری، bbs، ویکی و...

اول باید ساختار، ورودی و خروجی هر application رو بررسی کنی
همین خودش هفته ها وقتت رو میگیره
بعد نیازمندی هاشو رو بررسی کنی
بعد توانایی ها و تسهیلات مشترکی که هسته در اختیار میده رو بسنجی

بعد با در نظر گرفتن ساختار مشترک/کلی application ها، ساختار universal/global خودت رو بسازی.


init پروژه هم خیلی بزرگتر از این حرفاست. و به یک booter/config پیش پا افتاده ختم نمیشه Big Grin
کلاً باید یک پوشه بنام init داشته باشی
داخلش یک فایل compability برای سازگاری با نسخه ها و توابع متعدد، security برای ایمنی سازی ورودی و متغیر ها، configuration برای پیکربندی، version برای تعیین ورژن تمام کلاس ها و ساختار داخل هسته و...
در آخر initation/index برای همگردانی/ضمیمه نهایی همه اینها

...
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : Reza
#3
نقل قول:اون کدی که نوشتی به اسم post در حد یه پلاگین wordpress هم نیست
منظور من فقط ساختاره .

اینکه چه طوری ورودی و خروجی هر ماژول رو بتونم از یه جا بگیرم .

تاثیرات روی سایت محتوا توسط replacer انجام میشه .
یه چیزی مثل add_filter وردپرس

activ , deactive مثل همون وردپرسه .

متاسفانه action نداریم چون نیازی نیست . چون اکشن ها باید به هسته سیستم وارد بشه
اما اینجا هسته فقط مسئول نگه داری ماژول هاست .

ویو هم که ساده است .

مدل ها هم از یه base پیروی میکنن .

تا اونجا که من میدونم این الان خیلی دست باز تره .

شاید البته من موضوعمو بد گفتم که خوب متوجه نشدی ولی باز ممنون این همه نوشته رو خوندی .

به نظرت سعی کنم یه اسکریپت بنویسم بهتر نیست ؟

منتظر نظر دیگر دوستان هستم

یه بار دیگه متنتو خوندم .
تک تک جواب میدم ببین تا کجا پیش میریم .
نقل قول:اول باید ساختار، وردی و خروجی هر application رو بررسی کنی
ورودی ها ممکنه در بخش مدیریت باشه یا بخش کاربری .
توی مدیریت که فرم ها هستن و ...
توی کاربری هم روتر ورودی ها رو میده .

خروجی و نمایش محتوا سه جوره .
یکی استفاده از replacer ها .
مثلاً مثل وردپرس کد [download id=8] یه لینک دانلود بسازه خب این توی متد replacer مینویسیم و با یه preg_match آی دی رو میگیریم جایگزین میکنیم .
نوع بعدی استفاده از یک view مجزاست . اگر سیستم جاوز رو دیده باشی این روششه .
مثلاً شما ویو گالری رو میخوای .
میگرده ببینه ویرو گالری هست توی پوشه قالب اگر نبود از پیشفرضی که توی ماژول هست استفاده میکنه .
نوع سوم هم استفاده از یه سری تابع توی فایلهای قالب هست .

ماژولها قبل از قالب لود میشن و ااصولش فکر کنم همین باشه پس اگه ما یک متد استاتیک بزنیم راحت میتونیم توی قالب استفاده کنیم .

کد پی‌اچ‌پی:
static public function related_post() // اين فانکشن انحصاراً براي استفاده در حلقه مطالب جهت نشان دادن مطالب مرتبط مثلاً
    
{
        global 
$post;
        
$category $post->category_list;
        
$this->db->query("select post that cat=cat");
        
        foreach(
$result as $row)
            echo 
"<li>{$row->link}</li>";
    
    } 

استفاده در قالب

کد پی‌اچ‌پی:
<?php
foreach($posts as $post):
?>

عنوان : <?php echo $post->title ?>
متن : <?php echo $post->content ?>
مطالب مرتبط : <?php echo post::related_post() ?>


<?php
endforeach;
?>

خب فکر کنم مساله خروجی حل شد.


نقل قول:بعد توانایی ها و تسهیلات مشترکی که هسته در اختیار میده رو بسنجی
بعد با در نظر گرفتن ساختار مشترک/کلی application ها، ساختار خودت رو بسازی
دقیقاً منم همینو میخوام دیگه الان .
منتهامن نمیخوام اصلاً هسته کار مهمی بکنه ، توی این سیستم هسته نقش یه منشی رو داره نه یک مدیر!
این دستورات هم که گفتم پیشفرض هستن دیگه .


نقل قول:init پروژه هم خیلی بزرگتر از این حرفاست. و به یک booter/config پیش پا افتاده ختم نمیشه
کلاً باید یک پوشه بنام init داشته باشی
داخلش یک فایل compability برای سازگاری با نسخه ها و توابع متعدد، security برای ایمنی سازی ورودی و متغیر ها، configuration برای پیکربندی، version برای تعیین ورژن تمام کلاس ها و ساختار داخل هسته و...
در آخر initation/index برای همگردانی/ضمیمه نهایی همه اینها
اینه که من گم نظر بدیدSmile
بهرحال هرچی باشه یه سروگردن که هیچی ، از کمر به بالا از ما سرتری دیگهHeart
فقط یه ذره توضیح بیشتر میدادی که من بره تو مغزم و مفهموم هر کدوم رو درک کنه بهتر میشد .

بهرحال من اینو گرفتم ، برای ایمن سازی از یه lib استفاده میکنیم.
برای ورژن هم صرفاً این تو فکرم هست که فقط فیکس باگ کنم و ارتقا هسته رو نداشته باشم و مستقیم با ماژول ها کار کنم .
فرض کن یه فریم ورک که یه بخش ادمین آماده داره و ...
بهرحال ساختار نهایی این شد .
کد پی‌اچ‌پی:
root/    
    
index.php
    
    
config/
            
database.php
            
...
            
    + 
init/
            
core.php
            router
.php
            base_controller
.php
            base_model
.php
            db
.php
            loader
.php
            
...
    + 
app/
        + 
log/
             ...
        + 
admin/
                + 
model/
                    ...
                + 
view/
                    ...
                + 
controller/
                    ...
            
        + 
library/
                
pagination.php
                pdate
.php
                
...
                
        + 
module/
                + 
post/
                     
post.php
                     admin_post
.php
                     post_model
.php
                     
defultview/
                                
post.php
                     
adminview/
                                
post.php
                                
                
page/
                     
page.php
                     admin_page
.php
                     page_model
.php
                     
defultview/
                                
page.php
                     
adminview/
                                
page.php
                                
    
template/
            + 
theme1/
                    
style.css
                    header
.php
                    footer
.php
                    single
.php
                    page
.php
                    main
.php
            
theme2/
                    
style.css
                    header
.php
                    footer
.php
                    single
.php
                    page
.php
                    main
.php 


یه چیزی template توی رووت باشه یا بذارمش توی app ؟
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :
#4
نقل قول:برای ورژن هم صرفاً این تو فکرم هست که فقط فیکس باگ کنم و ارتقا هسته رو نداشته باشم و مستقیم با ماژول ها کار کنم .
فکر می کنی
پروژه که ترخیص بشه، خود هسته رو از ورژن 1 به 5 هم خواهی رسوند - چه بخوای چه نخوای improvment صورت میگیره - و باید هم بگیره
تا با نیازهای تازه و بروز سازگار باشه و عقب نیوفته


core, db, router و... داخل init نباید باشن - init در واقع قبل از router/dispatcher قرار داره و زود تر از اینا راه میوفته


نقل قول:یه چیزی template توی رووت باشه یا بذارمش توی app ؟
موتور/base ش اصلیش که داخل core/system باید باشه، ولی زیر مجموعش که مال هر application هست بنظرم داخل همون app باشه
بعدم template یا skin؟ یا theme?

template به قالب/چهار چوب صفحه میگن مثل header/footer/menu/content... های mybb
theme بیشتر در مورد تغییر مولفه ها، رنگ و... گفته میشه - یعنی چهار چوب ثابته و فقط عناصر تغییر ظاهری می کنن - مثل global.css/navigation.css و... مال mybb
ولی skin شامل کل اینا میشه - مثل wordpress - همه چی در هم
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : Reza


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان