PDA

View Full Version : آموزش Cakephp



cybercoder
شنبه 26 مرداد 1387, 22:55 عصر
این تاپیک رو امشب زدم و آموزش Cake رو از فردا از ابتدا شروع می کنیم هر کی می بینه می تونه کمک کنه بسم ا..

خواهشا
1- پست اضافی و بی مورد نزنید چون نمی خوام این تاپیک از نظر زیبایی و گویایی کثیف بشه.
2- هر کی که می خواد کمک کنه قبلش هماهنگ کنه که تکرار پیش نیاد

توضیح :
cakephp یک framework هست که کار با php و ساخت نرم افزار با اون رو بسیار روان و ساده می کنه تا حدی که ممکنه آدم کدهای php رو حتی فراموش کنه.
در سایت cakephp.org این گونه تعریف شده:

"Cake is a rapid development framework for PHP which uses commonly known design patterns like Active Record, Association Data Mapping, Front Controller and MVC. Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility."

معماری MVC و نحوه استفاده در cake به طور ساده در تصویر ضمیمه.

cybercoder
دوشنبه 28 مرداد 1387, 18:32 عصر
ابتدا cake را از نشانی http://cakephp.org (http://cakeph.org) دانلود و در documentroot آن را extract می کنیم
اندکی در مورد url rewriting :
دلایل معمول برای استفاده :

1- برای اینکه سایت search engine friendly باشد به طور مثال درک http://mysite.com/articles/view/1 برای یک موتور جستجو ساده تر از http://mysite.com/?option=articles&itemid=1 خواهد بود.

2- برای user friendly بودن تا راحت تر در ذهن بگنجد
3- از لحاظ امنیت و ارسال پارامتر توسط هکرها و ...

تنظیم Apache برای انجام Url rewriting در cake :
در صورت وجود mod_rewtrite فایل httpd.conf یا apache.conf را باز کرده و خطوط زیر را اضافه می کنیم:



LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c
و در قسمت دایرکتوری مربوطه Allowoverride را به all ست می کنیم


<Directory "/var/www/caketut">
Options Indexes FollowSymLinks
AllowOverride all
Order Deny,Allow
Allow from all
</Directory>
و محتوای فایل .htaccess در web root به صورت زیر :


<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
Apache را restart می کنیم.

cybercoder
یک شنبه 17 شهریور 1387, 01:52 صبح
همه نیامدن هایم را به حساب وقت نکردن بگذارید.

تنظيم cakephp براي کار با بانک اطلاعاتي:
به مسير /app/config رفته و فايل database.php.default را به database.php تغيير نام مي دهيم.
سپس فايل database.php را توسط editor ي مي گشاييم. کرسر را به خط ( فکر مي کنم 72 يا 73 ) مي بريم آرايه اي به نام $default مشاهده مي شود :
که پارامترهاي لازم را در اين جا مقدار دهي مي کنيم.


var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'نام ميزبان',
'port' => '',
'login' => 'نام کاربري',
'password' => 'کلمه عبور',
'database' => 'نام پايگاه داده',
'schema' => '',
'prefix' => '',
'encoding' => ''
);

cybercoder
جمعه 29 شهریور 1387, 13:49 عصر
واقعا کسی حاضر به همکاری نیست؟ من حواسم هست و این تاپیک داره به اعماق می ره

tanha2007
جمعه 29 شهریور 1387, 18:17 عصر
سلام.
میشه لطفا یک مثال کاربردی را با آن شروع نمایید.

org.kiani
جمعه 29 شهریور 1387, 20:27 عصر
سلام
من به تازگی شروع به یادگیری این فریم ورک کردم. اگه چیز بدرد بخوری یاد گرفتم کمک می کنم.
برای شروع برنامه Hello World رو می نویسم.
در شاخه app/controllers یک فایل به نام test_controller.php ایجاد می کنیم. در نام گذاری باید دقت کنیم تا cakephp بتونه بطور اتوماتیک بره سراغ فایل ، کلاس یا متد مورد نظر.
حالا این کد رو داخلش کپی می کنیم و اونو بهاین صورت اجرا می کنیم:

http://mysite.com/test/helloالبته اگه شاخه cakephp رو روی localhost قرار دادید باید ازاین آدرس استفاده کنیم :
http://localhost/cakephp/test/hello




<?php
class TestController extends AppController {
var $autoRender = false;
var $uses = null;
function hello() {
echo "Hello World!";
}
}
?>


همینطور که دوست عزیز cybercoder در پست قبلی گفتند cakephp از ماژول rewrite استفاده می کنه بنابراین می تونه از آدرس دهی جعلی استفاده کنه. در مثال بالا از test/hello استفاده شد بنابراین cakephp میره سراغ فایل test_controller.php در شاخه app/conrollers و از کلاس TestController متد hello رو اجرا میکنه!
باز همینطور که دوست عزیز cybercoder فرمودن این فریم ورک از معماری MVC استفاده می کنه. اصولا در این معماری عمل خروجی باید توسط لایه view انجام بگیره، که در این مثال از این موضوع پیروی نشد.
قبل از اینکه توی مثال بعدی خروجی رو به عهده view بذاریم یک توضیح در مورد



var $autoRender = false;
var $uses = null;
بدم. var $autoRender = false برای اینکه cakephp نره دنباله hello.ctp بگرده
و var $uses = null مشخص می کنه که خبری از لایه model نیست. اگه این دوتا متغیر رو تعریف و مقدار دهی
نمی کردم cakephp بطور خودکار دنبال فایلهای مربوط به view و model برنامه hello می گشت و چون موجود نبودم error میداد.

tanha2007
جمعه 29 شهریور 1387, 20:39 عصر
تشکر از هر دو شما،
واقعا جالبه.
من از سایت خودش هم یک مثال بلاگ را خوندم خیلی جالبه ....

org.kiani
جمعه 29 شهریور 1387, 20:44 عصر
حالا همون مثال رو دوباره انجام می دیم منتها از view هم استفاده می کنیم.
این کد رو با کدهای قبلی فایل test_controller.php جایگزین می کنیم :


<?php
class TestController extends AppController {
//var $autoRender = false;
var $uses = null;
function hello() {
$this->set("hello", "Hello World!");
}
}
?>

شاخه ای به نام test در شاخه app/views ایجاد می کنیم و یک فایل با نام hello.ctp در اون ایجاد میکنیم.
این کد رو داخلش کپی می کنیم :


<span style="font:20px sans-serif;color:blue;"><?php echo $hello; ?></span>
حالا صفحه رو refresh می کنیم. در کد جدید مربوط به controller من $autoRender = false رو کامنت کردم تا cakephp از view استفاده کنه که همون فایل hello.ctp در شاخه test هستش.
چون view در cakephp مثل controller از کلاس بهره نمی بره شاخه test رو ایجاد کردیم.


$this->set("hello", "Hello World!");با متد set یک متغیر به نام hello ایجاد کردیم و مقدار "Hello World!" رو داخلش قرار دادیم تا بشه در view ازش استفاده کرد.

منابع :
http://deepbluespaces.blogspot.com/2008/05/cakephp-hello-world.html

tanha2007
جمعه 29 شهریور 1387, 21:07 عصر
سلام.
من دارم از داتا بیس استفاده مینمایم، ولی در پایین صفحه یک جدول اضافی نمایش داده میشود. من میخواهم اون نمایش داده نشود باید چی کنم؟

org.kiani
جمعه 29 شهریور 1387, 23:10 عصر
سلام به tanha2007 عزیز،
شما باید داخل فایل core.php در شاخه app/config دستور

Configure::write('debug', 2)
رو پیدا کنید و بجای عدد 2 عدد0 یا 1 رو قرار بدید.
البته توضیحاتی در این مورد رو می تونید در خطوط قبل از کد مربوطه ملاحظه کنید.

منابع : http://groups.google.com/group/cake-php/browse_thread/thread/163b3ca7e7b0e8f7/cffefe2bc0e6478a?lnk=gst&q=hiding+query+table#cffefe2bc0e6478a

tanha2007
جمعه 29 شهریور 1387, 23:26 عصر
تشکر دوست عزیز ....

tanha2007
شنبه 27 مهر 1387, 17:03 عصر
سلام.
من میخواهم فرق بین این دو را بدونم ...



echo $form->submit('Login');
و


echo $form->end('Login');

tanha2007
شنبه 27 مهر 1387, 17:28 عصر
دوباره سلام.
هم چنان میخواهم بدونم که در قسمت باید تغیرات ایجاد نمایم که درعوض متن خود cakephp در قسمت بالای صفحه و هم چنان در سمت پایین و چپ متن جدید بنویسم؟

tanha2007
شنبه 27 مهر 1387, 18:12 عصر
جواب این سوال را یافتم:
فایلی بنام default.ctp وجود دارد که درآن قسمت میتوانیم متن header و footer را تغیر دهیم...


دوباره سلام.
هم چنان میخواهم بدونم که در قسمت باید تغیرات ایجاد نمایم که درعوض متن خود cakephp در قسمت بالای صفحه و هم چنان در سمت پایین و چپ متن جدید بنویسم؟

tanha2007
سه شنبه 05 آذر 1387, 23:03 عصر
سلام.
من دوجدول دارم که رابطه بین شان چند به چند است. بنا یک جدول دیگر را جهت ایجاد رابطه بین شان ایجاد نمودم.

جداول:
1. users (id, firstName, lastName)
2. subjects(id, subjectName)
3. subjects_users(id, subject_id, user_id))

خوب من با دستور bake cake همه فایل های لازم را ایجاد نمودم و همه چیز به صورت درست کار مینماید.

مشکل:
در بخش views فایل add.ctp مربوط به subjects_users من میخوام به جای id های users و subjects نام firstName و lastName مربوط به جدول users و هم چنان به جای subject_id من میخوام subjectName نمایش داده شود.

باید کدام قسمت را ویرایش نمایم؟

تشکر

zoghal
جمعه 07 فروردین 1388, 10:18 صبح
شاید خیلی دیر جواب میدم اما ممکن هست دوستان دیگر نیاز هست.
به این صورت هست

echo $form->input('title',array('label' => 'تست'));

کاش این تاپیک ادامه پیدا میکرد :ناراحت:

pesarkhobeee
جمعه 07 فروردین 1388, 10:37 صبح
سلام
خیلی خوشحال شدم که دیدم یه همچین حرکتی شروع شده چون واقعا جای خالیش احساس میشد!
در مورد اموزش کیک هم http://weblog.alvanweb.com/ اموزش های بسیار جامع و کاربردی به شرح زیر گزاشته:
(http://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/)
کار با CakePHP (http://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/)


(http://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/)
مقدمه‌ای بر معماری MVC در CakePHP (http://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/)


(http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/)
ساخت لینکدونی با CakePHP (بخش اول) (http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/)



ساخت لینکدونی با CakePHP (بخش دوم) (http://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/)


(http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/)
ساخت لینکدونی با CakePHP (بخش سوم) (http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/)


(http://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/)پیکربندی Eclipse برای کار با CakePHP (بخش اول) (http://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/)


(http://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/)
نحوه کارکرد سیستم تصدیق هویت در CakePHP (http://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/)


(http://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/)
کاربرد کامپوننت Authentication در CakePHP (http://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/)

باید بگم اموزش های بسیار خوبی هستند و امیدوارم ادامه پیدا کنند و خوب برای افراد مبتدی مثل خودم نتیجه تحقیقات و ازمایشات خودمو در مورد اینکه کدهامونو با ساختار mvc بنویسیم در یک مقاله 30 صفحه ای در وبلاگم منتشر کردم:
اموزش استفاده از الگوی mvc طراحی در php همراه با مثال عملی (http://pitm.net/Blog/?p=10)

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

zoghal
جمعه 07 فروردین 1388, 11:00 صبح
عالیه اما کاش همینجا اطلاعاتتون رو شیر کنید.

zoghal
شنبه 08 فروردین 1388, 00:12 صبح
سوال من یک بلوک در elements به نام navpath.ctp درست کردم که قرار آدرس صفحه ای که کاربر توش هست به همراه صفحات قبلی نمایش بدم
و اومدم تو views/layouts یک قالب دیفالت به اسم defualt.ctp ایجاد کردم به این صورت


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fa" lang="fa">
<head>
<?php echo $html->charset(); ?>
<title>
<? __( 'xxx :: SoftWare Engineer Co. >>> ') ?>
<?php echo $title_for_layout; ?>
</title>
<?php
echo $html->meta('icon');

echo $html->css('reset');
echo $html->css('interface');
echo $scripts_for_layout;
?>
</head>

<body>
<div id="BodyDiv">
<img src="/img/Banner.gif" width="800" height="151" alt="banner" />
<div id="NavBar">
<?php echo $this->element('navpath'); ?>
</div>
<div id="introBoxs">
<?php $session->flash(); ?>
<?php echo $content_for_layout; ?>

<div class="clear"></div>
</div>
<img src="/img/footer.gif" alt="footer" />
</div>
<? echo $html->css('cake.generic'); ?>
<?php echo $cakeDebug; ?>
</body>
</html>




حالا تو navpath هرچی من کامپنت رو صدا میکنم با خطایی که میگه تابع وجود ندارد مواجه میشم

سوال اینجاست که در elemants چه طور می تونم به کامپونت ها یا کلاس های cakephp دست رسی پیدا کنم؟

cybercoder
شنبه 08 فروردین 1388, 18:55 عصر
بستگی به کنترلری داره که داری استفاده می کنی ساده بگم اگر می خوای بعضی چیزا رو همیشه داشته باشی باید در beforeRender کامپوننت ست کنی یا در beforeRender خود AppController

اگر منظورت از NavPath همون BreadCrumb هست می تونی خیلی ساده به این صورت استفاده کنی:
این برای element فایل crumb.php


<?php <?php if($this->params['action'] != 'display') { ?>
<div id="breadcrumbs">
<?php
$html->addCrumb(__('Homepage', true), "/");
if(isset($breadcrumbs)) {
if($this->params['controller'] == 'categories') {
unset($breadcrumbs[count($breadcrumbs)-1]);
}
foreach($breadcrumbs as $row) {
if(isset($this->params['prefix'])) {
$url = $html->url(array('controller' => 'categories', 'action' => 'view', 'id' => $row['Category']['id']));
} else {
$url = $seo->url($row['Category'], 'categories');
}
$url = str_replace(Configure::read('App.dir'), '', $url);
$html->addCrumb($row['Category']['title'], $url);
}
}
$html->addCrumb(__($this->name , true),"/".$this->name);
$html->addCrumb('<strong>'.$this->pageTitle . '</strong>');
echo $html->getCrumbs();
?></div>
<?php } ?>
و در فایل ctp مربوط به default المنت رو فراخوانی کنی

توجه : بسته به کنترلرهای شما ممکنه قدری تغییر کنه ولی صورت کلیش همینه.
توجه 2 : helper مربوط به html رو در appcontroller فراخوانی کنید.

موفق باشی

cybercoder
شنبه 08 فروردین 1388, 19:08 عصر
echo $form->input('title',array('label' => 'تست'));

البته اگر از localization استفاده کنید نیازی به label نیست.

zoghal
شنبه 08 فروردین 1388, 20:35 عصر
توجه 2 : helper مربوط به html رو در appcontroller فراخوانی کنید.

یعنی چه؟

cybercoder
شنبه 08 فروردین 1388, 23:04 عصر
یعنی در appcontroller.php خط زیر رو اضافه کن تا از helper مربوط به html در کل برنامت بتونی استفاده کنی:



var $helper=array('Html') ;

zoghal
یک شنبه 09 فروردین 1388, 01:27 صبح
یعنی در appcontroller.php خط زیر رو اضافه کن تا از helper مربوط به html در کل برنامت بتونی استفاده کنی:



var $helper=array('Html') ;

یعنی یک فایل به اسم app_controller.php در شاخه app درست کنم و این مقدار رو قرار بدم؟

cybercoder
یک شنبه 09 فروردین 1388, 14:55 عصر
یا اونجا یا در مسیر controllers.

zoghal
دوشنبه 10 فروردین 1388, 23:38 عصر
بستگی به کنترلری داره که داری استفاده می کنی ساده بگم اگر می خوای بعضی چیزا رو همیشه داشته باشی باید در beforeRender کامپوننت ست کنی یا در beforeRender خود AppController

اگر منظورت از NavPath همون BreadCrumb هست می تونی خیلی ساده به این صورت استفاده کنی:
این برای element فایل crumb.php


<?php <?php if($this->params['action'] != 'display') { ?>
<div id="breadcrumbs">
<?php
$html->addCrumb(__('Homepage', true), "/");
if(isset($breadcrumbs)) {
if($this->params['controller'] == 'categories') {
unset($breadcrumbs[count($breadcrumbs)-1]);
}
foreach($breadcrumbs as $row) {
if(isset($this->params['prefix'])) {
$url = $html->url(array('controller' => 'categories', 'action' => 'view', 'id' => $row['Category']['id']));
} else {
$url = $seo->url($row['Category'], 'categories');
}
$url = str_replace(Configure::read('App.dir'), '', $url);
$html->addCrumb($row['Category']['title'], $url);
}
}
$html->addCrumb(__($this->name , true),"/".$this->name);
$html->addCrumb('<strong>'.$this->pageTitle . '</strong>');
echo $html->getCrumbs();
?></div>
<?php } ?>
و در فایل ctp مربوط به default المنت رو فراخوانی کنی

توجه : بسته به کنترلرهای شما ممکنه قدری تغییر کنه ولی صورت کلیش همینه.
توجه 2 : helper مربوط به html رو در appcontroller فراخوانی کنید.

موفق باشی
تو help خودندم که addCrumb مقادریش رو به یک آرایه اضافه میکنه
من به صورت خیلی ساده واسه تست این جوری استفاده کردم
در همون لایه default.ctp



$html->addCrumb($this->pageTitle,$this->here);
echo $html->getCrumbs('>');


اما هر پیجی که میرم انگار آرایه ریست میشه و و از نو مقدار دهی میشه و بهش اضافه نمیشه؟

cybercoder
سه شنبه 11 فروردین 1388, 10:52 صبح
توجه کنید که page title رو تعریف کردید یا نه علاوه بر اون می تونید از اسم کنترلر فعال نیز استفاده کنید که با استفاده از localization میشه ترجمش هم کرد.

zoghal
سه شنبه 11 فروردین 1388, 15:56 عصر
بله تعربف شده ، اما تو هر صفحه که میری فقط همون صفحه رو نمایش میده و صفحات قبل رو نمایش نمیده

cybercoder
جمعه 14 فروردین 1388, 19:58 عصر
نباید هم صفحات قبل رو نشون بده مگه داره history نشون می ده؟!

s-soleimani
پنج شنبه 24 دی 1388, 14:50 عصر
با سلام

من وقتي تغيير بالا رو در فايل httpd ايجاد مي كنم ، يعني اون دو كد كه گفتيد اضافه مي كنم به آخر فايلم آپاچي ديگه run نمي شه :افسرده:

بايد چي كار كنم

zoghal
جمعه 25 دی 1388, 10:21 صبح
کدوم تغییرات؟

payamsp
جمعه 25 دی 1388, 14:13 عصر
اگه منظورتون از تغییر کد فعال کردن قابلیت mod_rewrite هست نباید کدی اضافه کنید و فقط توی فایل httpd.conf باید mod_rewrite رو سرچ کنید و توی هر خطی بود علامت # رو که اول خط هست رو حذف کنید تا این خط از حالت کامنت خارج بشه و این قابلیت فعال بشه .