ایجاد قالب داینامیک

[font="Tahoma"][right]سلام

بچه ها میخوام،توی سایتم چندتا قالب تعریف کنم

بعد هر یک از کاربرایی که دارم،بتونه قالب دلخواهشو انتخاب کنه و

واسه همیشه براش همون قالب بیاد مگر اینکه دوباره بخواد عوضش کنه

کسی پیشنهادی داره؟

[/right][/font]

سلام.

باید تم انتخابی کاربر رو توی database ذخیره کنید و توی کامپوننت Controller یه function init اضافه کنید که Yii::app()->theme رو ست کنه.




class Controller extends CController

{


    public function init()

    {

        if (Yii::app()->user->getState('theme'))

        {

            Yii::app()->theme = Yii::app()->user->getState('theme');

        }

        else

        {

            Yii::app()->theme = 'default';

        }

    }


}



زمانی که دارین user رو login می کنید, باید themeرو از database بگیرید و روی object UserIdentity ست کنید:




    function authenticate()

    {

        // this is just an example method of looking up usernames/passwords; your method must be more secure

        $model = User::model()->findByAttributes(array(

            'username' => $this->username,

            'password' => $this->password

        ));

        if ($model)

        {

            $this->theme = $model->theme;

        }

    }



وقتی شما روی UserIdentity یک property رو ست می کنید, اون property روی session هم ست می شه, و شما می تونید با getState() اون رو بخونید.

امیدوارم کمکتون کرده باشه.

[right][font="Tahoma"]

دوست عزیز از راهنمایی خیلی خوبت واقعا ممنونم

اگه بخوایم داینامیک ترش بکنیم،جوری که کاربر خودش قالب بسازه و بذاره ،واسه این کسی پیشنهادی داره؟

مثل همین سی ام اس ها که طرف براش قالب میسازه و روی سایتش نصب میکنه

من میخوام هر کاربرم بتونه برای خودش با سلیقه خودش قالب بسازه و محدود به قالب من نباشه

واضح تر بگم اینکه،یه سری امکانات توی پنل مدیریت سایتم هست،

میخوام این امکان رو به

نویسنده های سایتم بدم که به سلیقه خودشون،محیطی که باهاش کار میکنن رو بچینن

مثلا یکی دوست داره منو بالا باشه،یکی دوست داره مثلا آبشاری بشه و هزار نوع دیگه که میشه

براش قالب طراحی کرد

[/font][/right]

[rtl]کار جالبی باید باشه. بنده خودم این کار را نکردم ولی به نظرم به این صورت نشه. باید محیطی را برای کابران ایجاد کنید تا داخل آن طرحش را بدهد و در نهاید شما فایلهای مربوطه به آن را تولید کنید.

[/rtl]

[right][font="Tahoma"]اگه خود نویسنده بتونه قالبو خودشو بسازه و نصب کنه، خیلی کار جالبی میشه

یه دوستی چند وقت پیش توی همین فروم یه آدرس سایتی که خودشون زده بودن رو گذاشته بودن

اسم سایتش "نقد بلاگ" بود

داخلش به کاربرش اجازه ویرایش کد اچ تی ام ال را داده بود

مثلا برای هدر سایت این کدو باید داخل قالب میذاشتیم

{header}

[/font][/right]

[rtl]خوب دقیقا این همون محیطی است که گفته بودم برای کاربر ایجاد کنی.

بنده تونستم اینها را پیدا کنم:[/rtl]

http://www.yiiframework.com/wiki/36/how-to-use-markitup-on-a-text-field-for-full-wysiwyg-editing

http://www.yiiframework.com/wiki/432/ckeditor-integration-includes-steps-for-file-uploads-step-by-step

[font="Tahoma"][right]

ممنون

آدرسهایی که شما زحمتشو کشیدید

فکر نکنم بشه پارامترهایی که از دیتابیس میان رو داخلش قرار داد درسته؟

[/right][/font]

[rtl]ایده شما مهندسی نرم افزار قوی می خواد; باید راجع بهش فکر بشه.

بستگی به کاربرها داره. اگر کاربرهای شما HTML بلد باشن, می تونید HTML هایی که خودشون می نویسن رو نگه دارید, و یه سری variable بهشون بدین (مثلا {header}, {footer}, و غیره). اما این ساده ترین حالت هست که فکر نمی کنم زیاد به دردتون بخوره.[/rtl]

[rtl]

دوست عزیز لطف کنید در نوشته هایتان از تگ [rtl] استفاده کنید.

وقتی انگلیسی و فارسی را با هم می نویسید جابجا می کند.

[/rtl]

[right][font="Tahoma"]

اومدم متد رندر رو

override

کردم

داخل

layout/main.php

توی کدهای اچ تی ام ال،علامت خاص

{title}

رو گذاشتم

بعد داخل

[left]

components/Controller.php




public function render($view,$data=null,$return=false)

    {

        if($this->beforeRender($view))

        {

            $output=$this->renderPartial($view,$data,true);

            if(($layoutFile=$this->getLayoutFile($this->layout))!==false)

                $output=$this->renderFile($layoutFile,array('content'=>$output),true);

 

            $this->afterRender($view,$output);

 			

            $output=$this->processOutput($output);

			

			$output = str_replace('{' . "title" . '}', "عنوان صفحه", $output);


            if($return)

                return $output;

            else

                echo $output;

        }

    }



[/left]

کد بالا رو گذاشتم

الان با اجرا کردن صفحه

به جای

{title}

عبارت "عنوان صفحه" قرار میگیره

حالا اینش سخت نبود،مشکل ازین جا به بعدشه

یعنی بیام یه سری ویجت هایی که دارم رو به صورت داینامیک داخلش قرار بدم

مثلا با نوشتن عبارت

{menu}

ویجت منویی که خودش انتخاب کرده جایگزینش بشه

دوستان برای استفاده از این روش، و حل این مشکل نظرتون چیه؟

[/font][/right]

[rtl]کار جالبی می خواهید انجام بدید. پیشنهاد می کنم که مطلب را توی فروم forum.iranphp.org هم مطرح کنید. دوستان اونجا خیلی کمک می کنند حتی اگر Yii کار نکنند.

به نظرم بهتره که همونطور که Parham Doustdar عزیز گفتند، تحلیل بیشتری بکنید. حتی به دنبال یک کلاس برای این موضوع باشد.

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

یک کلاس CWebModule هست شاید از اون برای این موضوع بتونید استفاده کنید.[/rtl]

[right][font="Tahoma"]ممنون دوست عزیز بابت پیگیر بودن و راهنماییتون

یه تاپیک به این آدرس زدم

:)

اینجا کلیک کنید

[/font][/right]

[right]

سلام

من یه سیستم مدیریت شکل ظاهری درست کردم که می خواستم راه پیاده سازیشو بگم شاید به کارتون بیاد .

من اومدم سیستم رو جوری طراحی کردم که تمام اطلاعات مربوط به صفحات سایت( سمت کاربر) رو بتونیم از توی ادمین طراحی کنیم و عملا برای ساختن ظاهر سایت نیازی به کدنویسی و کوئری نوشتن نباشه و تنها با نوشتن چند بیزرول بتونید داده اه را داخل پورتلت ها وارد کنید.

این کار چند تا مزیت داره

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

دوم اینکه هسته برنامه دست نخورده میمونه و میشه راحت تر روش کار کرد و آپدیتش کرد

سرعت پیاده سازی سایت ها بسیار بالا میره

شما می تونید ابزارهایی که ازشون استفاده می کنید مانند کد های اسکریپ و اسلایدر ها یا … رو داخل پورتلت هایی که به صورت بلک باکس ساختید قرار بدید و تنها کاری که باید بکنید ارسال داده به آنها برای نمایش خواهد بود

تکنیک استفاده شده ساده است

در مرحله اول در دیتا بیس یک جدول می سازیم که در آن انواع صفحاتی رو که داریم تعریف می کنیم مثلا صفحه اصلی ، صفحه داخلی مطالب ، صفحات لیست گیری و …

[left]

TABLE PAGES

id name

1 mainPage

2 listPage

3 viewPage

[/left]

در مرحله بعد یک جدول درست میکنیم که در آن اطلاعات مربوط به ستونهایی که هر صفحه را می سازد را نگهداری می کنیم ، به عنوان مثال اگر قرار است صفحه اول ما ۲ ستونه باشد در این جدول ۲ ستون را با نام های باکس۱ و باکس ۲ تعریف می کنیم و اگر از بوت استرپ یا بلوپرینت استفاده کرده باشید می توانید به هر کدام از این باکس ها یک کلاس اسپن اختصاص دهید که برای صفحه اول جدول مشابه این حالت خواهد بود

[left]

TABLE BOXES

id name class

1 Box1 span4

2 Box2 span8

[/left]

حالا باید در جدولی دیگر باکس ها رو به صفحات اختصاص بدهید

[left]

TABLE PAGE-BOX

id page_id box_id

1 1 1

1 1 2

[/left]

خب تا اینجا استایل صفحه اول رو ساختیم، البته برای ساختن استایل های پیچیده تر هم میشه به اضافه کردن یکی دو تا فیلد انجامش داد که چون پیچیده میشه الان اگه خواستید بعدا میگم براتون

حالا به یه جدول نیاز داریم که توش پرتلت ها رو تعریف کنیم ، قبل اینکه وارد این بحث بشم باید یه توضیح مختصر بدم .

من اینجوری فرض کردم که هر پرتلت داخل صفحه دارای ۲ بخشه. بخش اول ظاهره خود پرلته که شامل هدر و فوتر و رنگ بندیش میشه و بخش دوم هم محتواییه که داخل این پرتلت قرار میگیرد.

با این کار این امکان برای ما فراهم می شود که از یک پرتلت برای نمایش چندین نوع داده استفاده کنیم

برای پیاده سازی این موضوع ما به ۲ جدول نیاز داریم ، یک جدول که در آن استایل پرتلت ها را نگهداری کنیم و یک جدول هم برای سناریویی که قرار است در آن پرتلت اتفاق بیفتد

در جدول اول که مربوط به ظاهر پورتلت است ما یک اسم به پرتلت اختصاص می دهیم و نام یک فایل سی اس اس که کدهای کلاس مربوط به آن را در داخلش قرار می دهیم ،

و شما تنها نیاز دارید یک فایل پی اچ پی مثلا با اسم دیفالت بسازید که شامل کلاس هایی برای ساخت هدر ، فوتر و رنگ بندی باشد که مقادیر این کلاس ها را از فایل سی اس اس معرفی شده می خواند و اطلاعاتی هم که باید در این فایل پی اچ پی چیده شود از طریق جدول دوم که سناریو را تولید می کند تولید و به آن ارسال می شود

[left]

TABLE PORTLETS

id name cssFileAddress senario_id

1 topPages /css/redProtlets.css 1

2 lastPages /css/bluePortlets.css 2

TABLE PORTLET-SENARIO

id name bissrule

1 topPage 'active = 1 AND is_top =1 orderBy date DESC limit 5 ’

2 lastPages ‘active = 1 date DESC limit 5’

[/left]

حالا کاری که باید بکنیم اینه که بگیم گه چه پرتلتهایی باید در کدام باکس ها قرار گیرند

[left]

TABLE BOX-PORTLETS

id box_id portlet_id

1 1 1

2 1 2

[/left]

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

حالا شما می توانید تنها با چند تا حلقه تو در تو اطلاعات را از این جداول استخراج و در صفحات نمایش بدهید که یه چیزی میشه تو این مایه ها

[left]

$layoutID = 1;

$page = Pages::model()->findByPk($layoutID);

$boxes = $page->pageBoxRelation; // pageBoxRelation is a many to many relation between Pages and Boxes

foreach($boxes as $box){

 echo '<div class=" '.$box->class.' ">;


          $portlets = $box->boxPortletsRelation    //boxPortletsRelation is a one to many  relation between box and port lets


          foreach($portlets as $portlet){


               $this->widgets('application.components.portlets.defaultPortlet,


                          array(


                                    'portletModel' => $portlet,       


                                  )


               )


          }


 echo '</div>'; 

}

[/left]

که در داخل پورتلت هم از روی مدلی که برایش ارسال کردیم بر اساس سی لس لس تعریف شده ظاهر را می سازد و با استفادا از یک رابطه یک به یک به جدول سناریو داده های داخل پورتلت را آماده می کند و نمایش میدهد .

همونطور که دیدید ایده ساده است

البته باید بگم سیستمی که در عمل پیاده کرده تعداد جداول بیشتری دارد و در جداول آن هم می توان آپشن های متنوع تری را داشت و تنها هدف من در اینجا ارائه روش بود و بسیاری از جزییات رو حذف کردم چون نمی دونستم چقدر برای شما می تونه کاربردی باشه ، برای من که بود

[/right]

[rtl]بیا آقاجون این هم راه حلش. فقط باید یک دستی به سرو گوشش بکشی:[/rtl]

http://markitup.jaysalvat.com/home/

[right][font="Tahoma"]

mereeelin آقا

خواستم روشتونو پیاده کنم اما انگار توی ساخت و فراخوانی پرتلت کارم میلنگه

نمیتونم اون قسمت آخر رو پیاده کنم

من پروژه ای که ساختم با دیتابیسش که داخل همون پوشه هست

براتون ضمیمه میکنم

لطف کنید نگاه کنید

[/font][/right]

[font="Tahoma"][right]

آقا سجاد از پیگیر بودنت واقعا ممنونم

این ادیتوری که شما بهم معرفی کردیرو خیلی بررسی کردم

اما نمیتونم دقیقا ارتباطشو به مشکلی که دارمو متوجه بشم

این ادیتور میاد یه سری کاراکتر خاص میذاره بعد در نهایت تبدیل به اچ تی ام ال میکنه درسته؟

اما اون قسمت داینامیک بودنش و تعریف کاراکترهای خاص براش رو چطور داخلش میذارن؟

[/right][/font]

[rtl]نصبش کردید؟

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

[/rtl]

[right]

سلام

شما تهرانی هستید؟

[/right]

[font="Tahoma"][right]

سلام

من مازندرانی هستم

ساکن ساری

چطور؟

[/right][/font]

[right]

گفتم اگه تهرانی هستی ، میدیدیم ، بهت می گفتم

[/right]