• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Sarkesh CMF
#1
عنوان:
Sarkesh CMF/ فریم ورک مدیریت محتوای سرکش

شرح:
یک فریم ورک کوچک PHP برای استفاده در پروژه های ساده، مثل سیستم بلاگ.

نسخه:
0.9.3.1

بستر/Platform:
Linux

نیازمندی ها:
PHP +5.3
MySQL +4

SAPI:
Apache +2

زبان:
پارسی، انگلیسی

تولیدکننده/توسعه دهنده:
بابک علیزاده

پروانه:
Gnu GPL v3

تماس:
[email protected]

لینک:
http://maddad.blogsky.com
https://github.com/morrning/sarkesh

دانلود:
https://github.com/morrning/sarkesh/archive/master.zip
https://github.com/morrning/sarkesh/arch...ter.tar.gz

ویکی/راهنما:
https://github.com/morrning/sarkesh/wiki

گزارشات/مشکلات:
https://github.com/morrning/sarkesh/issues

انشعاب/Clone:
Github:
کد:
HTTPS: https://github.com/morrning/sarkesh.git
SSh: [email protected]:morrning/sarkesh.git



یه ۵-۶ ماهی هست که دارم روی یه سیستم مدیریت محتوا کار میکنم . در این مدت تونستم کلی چیز جدید یاد بگیرم که شاید اگر این پروژه نبود یاد نمیگرفتم.
حاصل ۵-۶ ماه توسعه رو میتونید از آدرس زیر دریافت کنید.
https://bitbucket.org/morrning/sarkesh
همچنین قبلا لوگ تغییرات رو در سایت برنامه نویس قرار میدادم که تصمیم گرفتم کلا روند پیشرفت رو در این تایپینگ قرار بدم.
http://barnamenevis.org/showthread.php?4...ost1945433

همچنین دمو رو هم میتونید از آدرس sarkesh.org مشاهده کنید.
این سورس تحت مجوز gnu gpl v3 منتشر میشه و میتونید ازش استفاده کنید.
سعی میکنم بعد از اتمام بخش مدیریت یه مستنداتی برای توسعه در همین تایپینگ قرار بدم .
امکاناتی که در این مدت تونستم بهش اضافه کنم

نقل قول:-وجود کلاس های متنوع و کاربری برای کار با دیتابیس کوکی ها نست ها و ...
- پشتیبانی از چند زبانه بودن تمام وب سایت هایی که با این فریمورک نوشته میشن
-ماژولار بودن به همراه محلی سازی پلاگین ها ( به راحتی میشه برای این فریمورک پلاگین نوشت و به پلاگین ها به صورت آدرس زیر دسترسی پیدا کرد
کد:

http://site.com/?plugin=plugin_name&action=action_name
برای درخواست های ajax هم به صورت زیر:
http://site.com/?service=1plugin=plugin_...ction_name

-پشتیبانی از قالب ها
-تشخیص خودکار جهت متن قالب (راست به چپ / چپ به راست) با تنظیم زبان فریمورک.(یعنی با انتخاب یه زبان مثل فارسی میتونید از قالب راست چین شده استفاده کنید)
-پلاگین های پیش نیاز (به صورتی میتونید پلاگین بنویسید که خروجی یک پلاگین ورودی پلاگین دیگه باشه)
-استفاده از کلاس pdo برای اتصال با بانک اطلاعاتی(فعلا فقط mysql)
-طراحی کلاس sys_io که دو متد cin , cout (مثل سی پلاس پلاس) برای ورود و خروج اطلاعات فیلتر شده در اختیار توسعه دهنده قرار بگیره . از این دو متد برای جلوگیری از حملات sql injextion و xss و دزدیدن کوکی و ... میشه استفاده کرد . همچنین برای تشخیص صحیح بودن ایمیل و ... نیز کاربرد داره.

- یه کلاس به نام رجیستری برای ذخیره تمام تنظیمات پلاگین ها در نظر گرفتم که کانفینگ ها به صورت یکپارچه ذخیره بشن
- یک تم جدید ایجاد کردم با نام beez (البته یه ریپ از یه قالب دیگس). خوبی این نرم افزار اینه که ظرف ۱۰ دقیقه میشه یه قالب html رو براش هماهنگ گرد.
- یکی از دوستان گیر داد که معماری در این سیستم دیده نمیشه به همین دلیل پلاگین ها رو با معماری MVC نوشتم.
-با این فریمورک از پایه میتونید یه سایت چند زبانه داشته باشید. با استفاده از کلاس core/cls/cls_licalize.php
-مسیریابی آدرس ها رو تغییر دادم و از کلاس cls_router استفاده کردم.۶-قبلا کلاس ها رو دستی include کرده بودم ولی با اضافه شدن تابه _autoload در فایل boot.php لازم نیست کلاس ها رو پیوست کنید۷-مثلا نسخه قبل در این نسخه هم پلاگین ها میتونن از همدیگه ارث بری داشته باشن با استفاده از کلاس cls_plugin و متد get_object($plugin_name) یک شی از کلاس controller پلاگین درخواستی برگست داده میشه.۸-چون قصد دارم بیشتر پلاگین ها رو بر پایه آی جکس طراحی کنم تصمیم گرفتم از jquery در سیستم استفاده کنم. که به صورت پیش فرض به صفحات الصاق میشه . برای خاموش کردنش در ریجستری core/jquery رو برابر ۰ کنید.
- مثل نسخه قبل در صورت درخواست تماشای وب سایت با یکی از زبان ها rtl مثل فارسی غیر از استایل اصلی یه استایل فرعی style-rtl.css نیز برای راست چین کردن صفحه الصاق میشود(در صورت موجود بودن در فایل تم)
- اضافه شدن موتور پردازش قالب RainTpl . یه موتور قالب سریع و کم حجم برای اطلاعات بیشتر به وب سایتش مراجعه کنید. http://raintpl.com
- تغییر در پلاگین users برای کار با فایل های قالب
- اضافه شدن پلاین languages برای نمایش بلوک تغییر زبان
- افزوده شدن قابلیت دانلود پلاگین از مخزن در کلاس cls_plugin
- افزوده شدن قابلیت کش شدن بلوک ها که در پوشه upload/buffer ذخیره میشوند
- افزودن ویرایشگر متن tinymce . برای فعال / غیر‌فعال کردن در رجیستری core/editor رو تغییر بدید.
- قابلیت انتخاب نام سایت . قالب . جهت قالب .صفحه خانه برای هر زبان
- پشتیبانی از bootstrap 3
- پشتیبانی از jquery
-و یه سری قابلیت دیگه که یادم نیست. برای اطلاعات از امکانات کامل لیست کامیت ها رو مشاهده کنید.

هدفم از توسعه ابتدا تفریح بود ولی الان دوست دارم یه ساختار درست کنم که هم برای کاربر شیک و کارا باشه و هم از طرف دیگه توسعه اون راحت باشه.

البته یه بخش هایی مثل کلاس phpmailer , raintpl , bootstrap , jquery و قالب های bootstrap کار بنده نیست و فقط در پرژه وارد شدن (همراه با کمی تغییرات)

اسکرین شات: تم اوبونتو
http://s5.picofile.com/file/8113914768/s..._theme.png

اگه کسی میتونه در توسعه مشارکت کنه . خوشحالم میکنهRolleyes
  پاسخ
تشکر شده توسط : admin shgninc Y.P.Y
#2
کارتون بسیار عالی بود. ولی یه چندتا مشکل کوچیک توی کدهاتون دیدم.
از @ تا جای ممکن استفاده نکن. پیدا کردن اخطارها کار سختی میشه
به جای
__autoload
از spl autoload استفاده کن. به صورت یک کلاس auto load رو بنویس
از camel case استفاده کنی راحتتر میشه کدها رو خوند.
  پاسخ
تشکر شده توسط : morrning
#3
(۱۳۹۲ اسفند ۰۳, ۱۲:۰۱ ق.ظ)admin نوشته: کارتون بسیار عالی بود. ولی یه چندتا مشکل کوچیک توی کدهاتون دیدم.
از @ تا جای ممکن استفاده نکن. پیدا کردن اخطارها کار سختی میشه
به جای
__autoload
از spl autoload استفاده کن. به صورت یک کلاس auto load رو بنویس
از camel case استفاده کنی راحتتر میشه کدها رو خوند.

ممنونم
فقط تو فایل فکر کنم boot.php بود که از @استفاده کردم.
اگه ممکنه در مورد camel case یه توضیح مختصری بدید ممنون میشم.
  پاسخ
تشکر شده توسط :
#4
(۱۳۹۲ اسفند ۰۳, ۰۲:۱۵ ق.ظ)morrning نوشته:
(۱۳۹۲ اسفند ۰۳, ۱۲:۰۱ ق.ظ)admin نوشته: کارتون بسیار عالی بود. ولی یه چندتا مشکل کوچیک توی کدهاتون دیدم.
از @ تا جای ممکن استفاده نکن. پیدا کردن اخطارها کار سختی میشه
به جای
__autoload
از spl autoload استفاده کن. به صورت یک کلاس auto load رو بنویس
از camel case استفاده کنی راحتتر میشه کدها رو خوند.

ممنونم
فقط تو فایل فکر کنم boot.php بود که از @استفاده کردم.
اگه ممکنه در مورد camel case یه توضیح مختصری بدید ممنون میشم.

یه نگاهی به این بندازین
https://github.com/php-fig/fig-standards...tandard.md
و
https://github.com/php-fig/fig-standards...e-guide.md
  پاسخ
تشکر شده توسط : morrning
#5
سلام

املای کلمه Module رو هم اگر درست بفرمایید بهتره .
Facebook
EMail: Mohsen [@] EDadkhah [.] ir
  پاسخ
تشکر شده توسط : morrning
#6
(۱۳۹۲ اسفند ۰۳, ۱۱:۱۱ ب.ظ)mohsened نوشته: سلام

املای کلمه Module رو هم اگر درست بفرمایید بهتره .

رفع شد.
  پاسخ
تشکر شده توسط :
#7
[عکس: pezeshkan-logo-1909955686-1_avatar.png]
همزمان با توسعه هسته اصلی تصمیم گرفتم یه پلاگین هم توسعه بدم بر همین اساس قصد دارم یه پلاگین برای نوبت دهی کلینیک های پزشکی طراحی کنم که کاربران بتونن به صورت آنلاین برای خودشون نوبت رزرو کنن.
این پلاگین تحت GPL V3 منتشر میشه و میتونید ازش فورک بگیرید.
مخزن پروژه https://bitbucket.org/morrning/pezeshkan
  پاسخ
تشکر شده توسط : admin
#8
سعی میکنم از کلاس‌های پایه که در آدرس core/cls قرار دارند یه داکیومنت تهیه کنم.

ابتدا از کلاس cls_database شروع میکنیم.
این کلاس جهت کار با بانک اطلاعاتی در نظر گرفته شده و با استفاده از آن نیازی به آگاهی از کلاس های پایه PDO نیست.
همچنین در این کلاس از اشیای PDO که به زودی جایگزین توابع کار با پایگاه داده خواهد شد استفاده شده است.
توجه : این کلاس از متغییر های ایستای تعریف شده در فایل config.php در پوشه اصلی فریمورک استفاده میکن.
اگر با اتصال به پایگاه داده با مشکل مواجع شدید ابتدا از صحت اطلاعات ورودی در این فایل مطمئن شوید.
کد کلاس:
کد:
<?php
#this class work with database
#this class use pdo extention for work with mysql database

class cls_database{
    private $Link;
    private $Query;
    private $Result;
#this function is construct of class
#perpare database for work with that

function __construct(){
# connect to the database server and select database to work with that

        try{
            $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);
            $this->Link = new PDO("mysql:host=" . DatabaseHost . ";dbname=" . DatabaseName , DatabaseUser, DatabasePassword,$options);
            $this->Link->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            }
        catch(PDOException $e) {
            echo "Error In query from database! <br> reason: " , $e->getMessage();
            exit;}
        }    
public function do_query($QueryString,$QueryParamaters = array ("\0")){
    
            
            if ($QueryString=="" || is_null($this->Link )){ return 0;}
             #perpare query string from security
            
             $this->Query = $this->Link->prepare($QueryString);
             #going to do query
            
             if($QueryParamaters[0]=="\0"){
                     $this->Result=$this->Query->execute();
             }
             else{
                    $this->Result=$this->Query->execute($QueryParamaters);
              }
            return $this->Result;
            
          try{    
        }
     catch(PDOException $e) {
        echo "Error In query from database! <br> reason: " , $e->getMessage();
        exit;
     }
}
#this function di quary with paameters for find parameters type see link below
#http://www.php.net/manual/de/pdo.constants.php
#OR
#http://www.php.net/manual/de/pdostatement.bindvalue.php

public function do_query_with_type($QueryString,$parameters){
    try{
        if ($QueryString == "" || is_null($this->Link)){ return 0;}
             #perpare query string from security
            
             $this->Query = $this->Link->prepare($QueryString);
             #going to do query
            
             for ($i=0 ; $i<count($parameters) ; $i++){
                 #find type on value
                
                    if($parameters[$i][1] == 'integer'){
                        $type = PDO::PARAM_INT;
                        $this->Query->bindValue($i+1 ,(int) $parameters[$i][0], $type);
                    }
                    else{
                        $type = PDO::PARAM_STR;
                        $this->Query->bindValue($i+1 ,$parameters[$i][0], $type);
                     }
                
                 #---------------------------------------------
            
             }
        $this->Result=$this->Query->execute();
    }
    catch(PDOException $e) {
        _e("Error In query from database! <br> reason:");
        echo  $e->getMessage();
        exit;
     }
}

//this function send back last insert id
//warring : this function most run after insert query
public function last_insert_id(){
return $this->Link->lastInsertId();
}

#this function return obj of last quary
#you can use like this $resultobj->column_name
public function get_object(){
try{
    $this->Quary->setFetchMode(PDO::FETCH_OBJ);
    return $this->Query;
}
catch(PDOException $e) {
        echo "Error In quary from database! <br> reason: " , $e->getMessage();
        exit;
}    
        
}
#this function return array of last query

public function get_array(){
    try{
        $this->Query->setFetchMode(PDO::FETCH_ASSOC);
        return $this->Query->fetchAll();
    }
    catch(PDOException $e) {
        echo "Error In query from database! <br> reason: " , $e->getMessage();
        exit;
    }            
}
#this function return first column of query in array

public function get_first_row_array(){
    $result=$this->get_array();
    foreach ($result as $row ){return $row;}
}
#ths function return number of rows that return in last query

function rows_count(){
    #no quary not started yet

    if(is_null($this->Query)){return 0;}
    return $this->Query->rowCount();
}
#end of class
}
?>

این کلاس دارای چندین متد مختلف برای کار با بانک اطلاعاتی هست.

کد:
function do_query($QueryString,$QueryParamaters = array ("\0"))
تابع do_query دارای دو پارامتر هست که پارامتر اول QueryString رشته sql برای انجام هست که میتواند شامل انواع دستورات select , delete, insert و ... باشد.
توجه : دستورات وارد شده باید توسط برنامه مدیریت بانک اطلاعاتی پشتیبانی شوند.
پارامتر دوم یا همان parameters یک متغییر آرایه ای است که پارامتر هایی که در متغییر QueryString قرار دارند در آن قرار میگیرند.
توجه: parameters یک گذینه اختیاری است پس اگر در رشته sql خود پارامتری ندارید parameters را وارد نکنید.
توجه: در فریمورک سرکش هیچ پارامتری نمیتواند دارای مقدار /n باشد . این یک مقدار رزرو شده برای کلاس cls_database است.

مثال:
کد:
$db = new cls_database;
$db->do_query('select * from ' . TablePrefix . 'users where UID=? and username=?', array(12,'ali');

-------------------------------------------------------
کد:
function do_query_with_type($QueryString,$parameters){
این متد کاری شبیه به متد do_query انجام میدهد با این تفاوت که از نوع داده های integer و string پشتیبانی میکند.
parameters یک متغییر دو ستونه است که در ستون اول مقدار پارامتر و در ستون دوم نوع آن قرار میگیرد.
-توجه ستون دوم متغییر parameters (فعلا) دو مقدار integer و string را قبول میکند و اگر مقداری غیر از این دو برای نوع پارامتر وارد شود به صورت string در نطر گرفته میشود.

مثال:
کد:
$a = new cls_database;
$query = 'select * from ' . TablePrefix . 'users where UID=? and username=?';
$par[2][2] = array{{'123','integer'}{'ali', 'string'}};
$a->do_query_with_type($query, $par);
نتیجه بازگشتی این تابع بستگی به دستور sql دارد.
-------------------------------------------------
کد:
function last_insert_id()
این متد به خودی خود کارایی نداره و باید بعد از متد های do_query و یا do_query_with_type به کار بره.
اگر در یک جدول یک ستون رو به صورت auto incrassment در نظر گرفتین. یعنی با درج سطر های جدید یه عدد جدید در اون سطون قرار میگیره پس از دستور INSERT INTO ... میتونید با این متد شماره سطر جدید اضافه شده رو به دست بیارید.

-----------------------------------------------------
کد:
function get_object()
پس از انجام رشته SQL اگر مقدار بازگشتی وجود داشته باشد.(مثلا از دستور SELECT استفاده کرده باشید) توسط این متد میتوانید مقدار بازگشتی را به صورت یک شی دریافت کنید.
مثال:
کد:
$a = new cls_database;
$a->do_query('SELECT * FROM ' . TablePrefix .'users WHERE uid=?', array(123);
$result = $a->get_object();
echo $result->username;
--------------------------------------------------------
کد:
function get_array()
این تابع دقیقا مانند تابع get_object عمل میکند با این تفاوت که نتیجه بازگشتی یک متغییر آرایه ای است که میتوانید با استفاده از foreach از آن استفاده کنید.
مثال:
کد:
$a = new cls_database;
$a->do_query('SELECT * FROM ' . TablePrefix .'users WHERE uid=?', array(123);
$result = $a->get_array();
foreache($result as $row){
    echo $row['username'];
}
-------------------------------------------------------------

کد:
get_first_row_array()
اگر از یک دستور select استفاده میکنید و سپس تنها به اولین سطر نتیجه نیاز دارید میتوانید از این متد کمک بگیرید. مثلا برای چک کردن صحت داده های ورودی تنها وجود یک سطر برای صحت اطلاعات کفایت میکند
.این متد هیچ آرگومانی ندارد و نوع بازگشتی أن یک آرایه تک بعدی است که اندیس های آن با نام ستون های جدول داخل بانک اطلاعاتی علامت گذاری شده است.
مثال :
کد:
$a = new cls_database;
$a->do_query('SELECT * FROM ' . TablePrefix .'users WHERE uid=?', array(123);
$result = $a->get_first_row_array();
echo $row['username'];
------------------------------------------------------------------
کد:
rows_count()
این متد تعداد سطر های بازگشتی توسط دستور SELECT را بر میگرداند . این متد هیچ آرگومانی ندارد و معمولا بعد از متد های do_query و do_query_with_type به کار میرود.


این مستندات کلاس cls_database است که در آدرس core/cls/cls_database.php قرار دارد و در تاریخ 17/12/92 نوشته شده. تغییرات این نوشته از طریق wiki این نوشته در آدرس زیر قابل رویت است.
https://bitbucket.org/morrning/sarkesh/wiki/
  پاسخ
تشکر شده توسط :
#9
cls_network
این کلاس برای تبادل اطلاعات در شبکه و مبادله فایل ایجاد شده است.
توجه:تمام فایل های دریافت شده توسط این کلاس در پوشه upload/buffer/ با یک نام تصادفی ذخیره میشوند.

کد کلاس:
کد:
<?php
    //this class is for working with network objects
    class cls_network{
        
        //this function get file from url and save that in temp directory with random file name
        //and return file address on serverto access that
        public function download($url){
            $headers = @get_headers($url);
            if($headers[0] == 'HTTP/1.1 404 Not Found') {
                //file not exist
                return '0';
            }
            else{
                //file exist going to download
                $file_name = AppPath . "upload/buffer/" . cls_general::random_string(5) . ".zip";
                echo $file_name;
                file_put_contents($file_name, file_get_contents($url));
                return $file_name;
            }

        }
    }
?>

این کلاس فعلا دارای یک متد میباشد.
کد:
function download($url)
متد download تنها دارای یک آرگومان ورودی میباشد که با نام $url مشخص شده است. این پارامتر آدرس فایل روی شبکه را مشخص میکند که باید دریافت شود. نوع بازگشتی این تابع از نوع رشته ای است و محل ذخیره فایل روی سرویس دهنده را مشخص میکند.
توجه:در صورت بازگشت عدد 0 از این تابع به این معنی است که فایل پیدا نشده است. به عبارتی خطای 404 not found رخ داده است.

هشدار: این متد (فعلا) تنها از فایل هایی با پسوند .ZIP پشتیبانی میکند.

مثال:
کد:
$a = new cls_network;
echo $a->download('http://sarkesh.org/test.zip');
//output is like /home/public_html/upload/buffer/jjo65hyjrre4.zip

cls_general
این کلاس حاوی متد هایی است که کاربرد عمومی دارند.
توجه: ممکن است متد های این کلاس یه کلاس های دیگر منتقل شوند.

سورس کلاس:
کد:
<?php
class cls_general{

    #this function is for create raundom string    
    public function random_string($length = 10 ,$type = 'NC') {
        if($type == 'NC'){
             $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
        }
        elseif($type == 'N'){
            $characters = '0123456789';
        }
        else{
            $characters = 'abcdefghijklmnopqrstuvwxyz';
        }
          $string = '';    
          for ($p = 0; $p < $length; $p++) {
              $string .= $characters[mt_rand(0, strlen($characters)-1)];
          }
          return $string;
    }
    
}
?>
این کلاس فعلا دارای یک متد میباشد.

کد:
function random_string($length = 10 ,$type = 'NC')
این متد برای تولید رشته های تصادفی به کار میرود و دارای دو آرگومان ورودی است.
$length طول رشته بازگشتی را مشخص میکند.
$type نوع رشته را مشخص میکند و میتواند یکی از مقادیر 'NC' , 'N' , 'C' باشد .
نقل قول:NC به معنی ترکیبی از اعداد و حروف است.
N به معنی ترکیبی از اعداد صفر تا نه است.
C به معنی ترکیبی از کاراکتر های حروف انگلیسی میباشد.

مثال:
کد:
$a = new cls_general
echo $a->random_string(20,'NC');
//output is like a34g7j889974tn8gu4s5
  پاسخ
تشکر شده توسط :
#10
این کلاس یکی از مهمترین کلاس های این فریمورک میباشد که وظیفه ترسیم قالب ها و بلوک ها را بر عهده دارد.
همچنین اضافه کردن هدرهای لازم و تشخیص راست به چپ یا چپ به راست بودن قالب و ... از دیگر وطایف این کلاس است.

توجه: یک شی با نام $sys_page از این کلاس توسط هسته ایجاد شده و در فایل های تم و بلوک بندی ها باید از آن استفاده کرد.

کد کلاس:
کد:
<?php
#this class show website and replace blocks

class cls_page{
    //settings will be saved in this varible
    private $localize_settings;
    private $settings ;
    private $page_tittle;
    private $blocks;
    private $db;
    private $registry;
    function __construct(){
        $this->registry =new cls_registry;
        $this->settings = $this->registry->get_plugin('core');
        $obj_localize = new cls_localize;
        $this->localize_settings = $obj_localize->get_localize();
        $this->page_tittle = $this->localize_settings['name'];
        //load all blocks data from database
        $this->db = new cls_database;
        $query_string = "SELECT b.name AS 'b.name',";
        $query_string .= "b.position AS 'b.position', b.permations AS 'b.permations', ";
        $query_string .= "b.pages AS 'b.pages', b.show_header AS 'b.show_header', b.plugin AS 'b.plugin', p.id AS 'p.id', p.name AS 'p.name', b.rank FROM " . TablePrefix . "blocks b INNER JOIN plugins p ON b.plugin = p.id ORDER BY b.rank DESC;";
        
        $this->db->do_query($query_string);
        $this->blocks = $this->db->get_array();

    }
    
    #if active language is RTL this function return true else return false
    
    public function is_rtl(){
        
        if($this->localize_settings['direction']=='RTL') {
            return true;}
        else {
            return false;}
    }

    public function load_headers () {
    
        #LOAD HEEFAL GENERATOR META TAG
        $header_tags = '<meta name="generator" content=" Sarkesh CMS! - Open Source Content Management" />' ."\n";
        //cache controll
        $header_tags .= '<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">' . "\n";
        #load jquery
        if($this->settings['jquery'] == '1'){
            $header_tags .= "\n" . '<script src="./core/ect/scripts/jquery.js"></script>';
            $header_tags .= "\n" . '<script src="./core/ect/scripts/bootstrap.min.js"></script>';
            $header_tags .= "\n" . '<script src="./core/ect/scripts/bootstrap-dialog.js"></script>';
            $header_tags .= "\n" . '<script src="./core/ect/scripts/pace.min.js"></script>';
            $header_tags .= "\n" . '<link rel="stylesheet" type="text/css" href="./core/ect/styles/bootstrap.min.css" />';
            $header_tags .= "\n" . '<link rel="stylesheet" type="text/css" href="./core/ect/styles/bootstrap-dialog.css" />';
            //get bootstrap theme
            $header_tags .= "\n" . '<link rel="stylesheet" type="text/css" href="./core/ect/styles/bootstrap/' . $this->settings['bootstrap_theme'] . '.min.css" />';
            //get pace(loading in ajax theme
            if($this->settings['pace_theme'] != '0'){
                $header_tags .= "\n" . '<link rel="stylesheet" type="text/css" href="./core/ect/styles/pace/' . $this->settings['pace_theme'] . '.css" />';
            }
            $header_tags .= "\n" . '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
            $header_tags .= "\n" . '<!-- HTML5 shim for IE backwards compatibility -->';
        }
        #load style sheet pages (css)
        $header_tags .= '<link rel="stylesheet" type="text/css" href="./themes/'  . $this->localize_settings['theme'] . '/style.css" />' . "\n";
        #load rtl stylesheets
        if ($this->is_rtl()){
            $header_tags .= '<link rel="stylesheet" type="text/css" href="./themes/'  . $this->localize_settings['theme'] . '/rtl-style.css" />' . "\n";
        }

        #load favicon
        if(file_exists("./themes/"  . $this->localize_settings['theme'] . "/favicon.ico")){
            $header_tags .= '<link rel="shortcut icon" href="./themes/'.$this->localize_settings['theme'] .'/favicon.ico" type="image/x-icon">';
            $header_tags .= "\n" . '<link rel="icon" href="./themes/'.$this->localize_settings['theme'] .'/favicon.ico" type="image/x-icon">';
        }
        #load nessasery java script functions
        $header_tags .= "\n" . '<script src="./core/ect/scripts/functions.js"></script>';

        

        #show header tags
        echo $header_tags;
    }
    //this function add recived string to page tittle
    public function set_page_tittle($tittle = ''){
        //get site name in localize selected
        $this->page_tittle = $this->localize_settings['name'] . ' | ' . $tittle;
        return $this->page_tittle;
        //now we wand to send tittle to render.
    }
    //this fuction return page tittle usually for runder.php
    public function get_page_tittle(){
    
        return $this->page_tittle;
    }
    //this function atteche some tags to blocks and show that.
    public function show_block($header, $content, $view ,$type = null, $result = 0){

        //create special value for access to that
        if($view == 'BLOCK'){
            echo '<div class="panel panel-default">';
                echo '<div class="panel-heading">';
                    echo '<h3 class="panel-title">';
                          //block header show in here
                          echo $header;
                    echo '</h3>';
                echo '</div>';
                echo '<div class="panel-body">';
                      //block content show in here
                      echo $content;
                echo '</div>';
            echo '</div>';

        }
        elseif($view == 'MAIN'){
            echo '<div class="well well-sm">';
                echo '<div class="panel-heading">';
                    echo '<h3 class="panel-title">';
                          //block header show in here
                          echo $header;
                    echo '</h3>';
                echo '</div>';
                echo '<div class="panel-body">';
                      //block content show in here
                      echo $content;
                echo '</div>';
                
            echo '</div>';
        }
        elseif($view == 'MSG'){
                echo '<div class="alert alert-' . $type . '"> ';
                echo '  <a class="close" data-dismiss="alert">×</a>';
                echo '<strong>';
                    //block header show in here
                    echo $header;
                echo '</strong>';  
                //block content show in here
                echo $content;
            echo '</div>';
        }
        else{
            //else it's modal
            echo '<?xml version="1.0"?>' . "\n";
                echo '<message>' . "\n";
                    echo '<result>';
                        echo $result;
                    echo '</result>' . "\n";
                    echo '<type>';
                        echo $type;
                    echo '</type>' . "\n";
                    echo '<header>';
                        echo $header;
                    echo '</header>' . "\n";
                    echo '<content>';
                        echo $content;
                    echo '</content>' . "\n";
                    echo '<btn-ok>';
                        echo _('Ok');
                    echo '</btn-ok>' . "\n";
                    echo '<btn-back>';
                        echo _('Back');
                    echo '</btn-back>' . "\n";
                    echo '<btn-cancel>';
                        echo _('Cancel');
                    echo '</btn-cancel>' . "\n";
                echo '</message>' . "\n";

        }
    }
    //this function set and show blocks
    public function set_position($position){
        //search blocks for position matched
        //if add 'MAIN' to cls_router::show_content that's show like main content that come with url
        //and if add 'BLOCK' tag , sarkesh show that content like block
        //and if Send 'NONE' sarkesh do not show that(just run without view
        foreach( $this->blocks as $block){
        
            if($block['b.position'] == $position){
                //going to proccess block
                if($block['p.name'] == 'core'){
                    //going to show content;
                    $obj_router = new cls_router;
                    $obj_router->show_content();

                }
                else{
                    $plugin_name = $block['p.name'] . '_controller';
                    $plugin = new $plugin_name;
                    //run action metod for show block
                    //all blocks name shoud be like  'blk_blockname'
                     // create local domain
                    bindtextdomain($this->localize_settings['language'], './plugins/' . $block['p.name'] .'/languages/');
                    $plugin->action($block['b.name'], 'BLOCK');
                    //back localize to theme
                    bindtextdomain($this->localize_settings['language'], './themes/' . $this->localize_settings['theme'] .'/languages/');
                      
                    
                }
            
            }
        
        }
    }
    
    //this function return content for show in custombox for show on page
    public function show_in_box($header, $content, $type = 'warning', $result = '0'){
        $type = 'type-' . $type;
        $this->show_block($header,$content,'MODAL', $type, $result);
    
    }
    public function show_message($header, $content, $type = 'warning', $result = '0'){
        $this->show_block($header,$content,'MSG', $type, $result);
    
    }
    
}

متد ها:

کد:
function is_rtl()
این متد در صورتی که زبان فعال وب سایت راست به چپ باشد true و در غیر این صورت false را بر میگرداند.
از معروف ترین زبان های راست به چپ میتوان به زبان عربی و پارسی اشاره کرد.
تعریف زبان فعال: زبان فعال یکی از زبان هایی است که در جدول localize ثبت شده و فعلا توسط کاربر در حال استفاده است.

---------------------------------------------------------------------

کد:
function load_headers ()
این متد وظیفه لود header ها را بر عهده دارد . این هدر ها شامل فایل های css قالب و bootstrap و jquery و... میباشد.
این متد فقط در فایل قالب باید استفاده بشه که بین تگ های head قرار میگیره.
مثال:

کد:
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<?php $sys_page->load_headers();?>

<title></#PAGE_TITTLE#/></title>
</head>
<body>
  BODY OF PAGE
</body>
</html>
همچنین وجود عبارت زیر به جای عنوان صفحات الزامی است. در این مورد در بخش آموزش طراحی قالب بیشتر توضیح داده شده است.
کد:
</#PAGE_TITTLE#/>

---------------------------------------------------------------------
کد:
function set_page_tittle($tittle = '')

این متد باعث تغییر عنوان صفحه وب میشود. در واقع اگر قصد تغییر نام صفحه را دارید باید از این متد استفاده کنید.
توجه داشته باشید که عنوانی که در آرگومان $tittle وارد میکنید بعد از نام وب سایت که در جدول localize ستون site_name وارد کرده اید نمایش داده میشود و این دو با علامت | از هم جدا میشوند.
مثال:
کد:
$a = new cls_page;
$a->set_page_tittle('my page tittle');
//output like 'Site Name | my page tittle'
------------------------------------------------------------------
کد:
function get_page_tittle()
این متد عنوان صفحه کنونی را بر میگرداند . توجه داشته باشید برای صحت عملکرد این تابع از کلاس شی جدید نسازید بلکه از شی تعریف شده با نام $sys_page استفاده کنید.
برای دریافت اطلاعات بیشتر درباره متغییر های سراسری و نحوه استفاده از آنها لینک زیر را دنبال کنید.
http://ir2.php.net/manual/en/language.va....scope.php

مثال:
کد:
global $sys_page;
$sys_page->set_page_tittle('hi all');
echo $sys_page->get_page_tittle();
//output like SITENAME | hi all

---------------------------------------------------------------
کد:
function show_block($header, $content, $view ,$type = null, $result = 0)
این تابع شاید مهمترین تابع در این کلاس باشد.
متد show_block وظیفه ترسیم محتوا بر روی صفحه را دارد و این کار را به 4 صورت 'MAIN' , 'BLOCK' , 'MSG' , 'MODAL' انجام میدهد . در ابتدا لازم است فرق بین هر کدارم با دیگری را نشان دهیم.
در سرکش ناحیه های دارای محتوا به دو دسته تقسیم میشوند. دسته اول نوع بلوک هستند که از متد set_position برای نشان دادن آنها استفاده میشوند و در جدول نام های بلوک ها اسامی مجاز برای آنها آمده است. به سایت های مختلف اطرافتان نگاه کنید. عناصری که تقریبا در تمام صفحات نمایش داده میشوند (خواه ثابت یا پویا) همگی از دسته 'block' به حساب میآیند.
دسته دوم نیز در فایل قالب سایت با متد set_poition مشخص میشود با این تفاوت که نام آن 'CONTENT' است. این محل جایی است که درخواست های کاربر روی آن نمایش داده میشود. مثلا اگر کاربر درخواست نمایش فرم عضویت را داشته باشد این درخواست از طریق URL ها به هسته منتقل و فرم مذکور در این ناحیه لود میشود.

در این متد آرگومان $header عنوان این نوع محتوا را نمایش میدهد.
آرگومان $content محتوای قابل نمایش را دریافت و نمایش میدهد به عبارتی بدنه محتوا محسوب میشود.
$view نشان دهنده شیوه نمایش محتوا است که میتواند یکی از مقادیر MAIN' , 'BLOCK' , 'MSG' , 'MODAL' را دریافت کند.
$type تنها در دو شیوه نمایش MSG و MODAL کاربرد دارد و نمایش دهنده نوع پیغام است. و میتواند شامل یکی از مقادیر زیر باشد.
primary
success
info
warning
danger
با توجه به آرگومان وارد شده رنگ بندی عناصر در نمایش پیغام نیز تغییر میکند. برای مثال در نمایش با نوع success پیغام با پس ضمینه سبز و در نوع danger پس ضمینه دارای رنگ قرمز است.
$result تنها زمانی استفاده میشود که آرگومان $view = 'MODAL' باشد. در این صورت این خروجی برای ایجاد ارتباط با کد های جاوا اسکریپت مورد استفاده قرار میگیرد.
--------------------------------------------------------------------------------
کد:
function set_position()
  پاسخ
تشکر شده توسط :


پرش به انجمن:


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