<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های niloofar noorbakhsh</title>
        <link>https://virgool.io/feed/@nil.noorbakhsh</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 07:37:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/205386/avatar/2MFqHX.jpg?height=120&amp;width=120</url>
            <title>niloofar noorbakhsh</title>
            <link>https://virgool.io/@nil.noorbakhsh</link>
        </image>

                    <item>
                <title>View Composer در لاراول</title>
                <link>https://virgool.io/@nil.noorbakhsh/view-composer-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-r0kkk6ujb1pc</link>
                <description>سلام :)توی این پست میخوام راجع به یک قابلیت توی لاراول صحبت کنم که باعث میشه کد تمیزتری داشته باشیم.فرض کنید ما یه وبسایت خبری داریم که خبرهای مختلفی دارد.( ورزشی، اقتصادی، فرهنگی و ...).خب پس باید یک table بنام categories داشته باشیم.اگه بخواهیم این table را در جاهای مختلف برنامه لود کنیم باید در جاهای مختلف بنویسیم$categories=Category::all();مثلا توی یک view که میخواهیم خبری را منتشر کنیم، بخواهیم که category ها را هم در یک navbar نمایش دهد.پس باید اینگونه بنویسیم $categories=Category::all();
$post=Post::findOrFail($id);
return view(&#039;post.show&#039;)-&gt;with(&#039;post&#039;,$post)-&gt;with(&#039;categories&#039;, $categories);خب همونطور که میدونید طبق اصل اول solid هر متد باید برای انجام یک کار باشد ولی اینجا هم category رو میگیرم و هم post. در واقع در کلاس مربوط به Postها داریم Category میگیریم. مهمتر از اون اینه که اگر چند جای برنامه بخواهیم category ها را نمایش دهیم یک کد را چندین بار  باید تکرار کنیم . اینجاست که میتوانیم از این ویژگی خوب لاراول استفاده کنیم.مرحله ی اول: میتونیم بریم توی appServiceProvider. اما پیشنهاد من اینکه برای اینکه کدامون مجزا و تمیز باشه یک provider جدا درست کنیم.php artisan make:provider ViewServiceProvider
 یا هر اسم دیگه ای که دوست داریم بنویسیم.و بعد کدهای مربوط به view composer  را در متد Boot مینویسیم.مرحله ی دوم:( نوشتن کد)برای نوشتن کد میتوانیم به ۳ روش بنویسیم روش اول :View::share($key,$query);
خب key در واقع همون متغیر ما است که اینجا اسمش categories است و دومین آرگومان ما چیزی است که میخواهیم categories  به ما نشان دهد.پس در واقع کد ما میشود View::share(&#039;categories &#039;,Category::all() );پس دیگه هرجایی توی برنامه میتونیم راحت از categories استفاده کنیم. اما این روش خیلی توصیه نمیشه زیرا هر سری که داریم یک view را فراخوانی میکنیم این query اجرا میشود که اینکار منطقی نیست چون ما نیاز نداریم که در تمام view ها Categories داشته باشیم.از متد share زمانی استفاده میکنیم که بخواهیم اطلاعاتی داشته باشیم که توی هر صفحه به نمایش گذاشته شود.روش دوم: از متد composer استفاده میکنیم.     View::composer([views],function ($view){
           //
       });توی این روش آرگمان اول اسم view یا viewهایی است که میخواهیم خروجی را در آنها نمایش دهیم. میتواند به صورت string باشد( اگر ۱ آیتم داریم) یا array( برای بیشتر از یکی) فقط view هایی که مشخص کردیم به categories دسترسی دارند. نکته: میتوانیم به جای اینکه تک تک اسم viewها را بنویسیم، از * یا مثلا .*.post$ استفاده کنیم. در این حالت تمام viewهایی که در directory بنام post هستند میتوانند به متغیر ما دسترسی داشته باشند.آرگمان دوم هم یک callback function است.View::composer([views],function ($view){  
          $view-&gt;with(&#039;categories&#039;, Category::all() );
      });و توی callback function  اول اسم متغیر و بعد query  مد نظرمون رو مینویسیم.روش سوم :توی این روش یه directoryتوی app درست میکنیم به نام view و بعد یک directory دیگر به نام Composer میکنیم.یک کلاس بصورت دستی درست میکنیم. (command line برای درست کردنش نداریم و باید دستی درست بشه).داخل این کلاس فقط یک متد داریم بنام compose با آرگمان ورودی view.,و بعد دقیقا همان کدی که توی callback فانکشن روش قبل نوشتیم.و بعد توی متد boot مینویسیم .View::composer([&#039;views&#039;],CategoriesComposer::class);
نظر شخصی:اگه تعداد view ها  زیاد شود استفاده از روش دوم باعث شلوغی متد boot میشود پس بهتر است از روش سوم  که کلاس مجزا دارد استفاده کنیم.همین.امیدوارم که این آموزش براتون مفید باشه :)</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Wed, 02 Nov 2022 19:13:30 +0330</pubDate>
            </item>
                    <item>
                <title>نکات لاراولی 1</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D9%86%DA%A9%D8%A7%D8%AA-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84%DB%8C-1-xqzikral0ut0</link>
                <description>سلام بچه ها تو این پست میخوام راجع به یکی از نکات لاراول صحبت کنم تفاوت 1- $model-&gt;relation() ,۲- $model-&gt;relationاگه بطور خلاصه بخوایم بگیم اولی یک object از relation مورد نظر رو برمیگردونه و دومی result  از relation مورد نظر برمیگردونهحالا بریم مفصل توضیح بدیم ببینیم اینا یعنی چی:حالت اول که توضیحش ساده است. فرض کنید یک مدل user داریم و یک مدل post. و توی مدل user هم متد زیر رو داریمpublic function posts(){return $this-&gt;hasMany(&#039; &#039;);}وقتی مینویسیم ()user-&gt;post$  در واقع داریم همین متد رو صدا میکنیم که instance  از Illuminate\database\Eluquent\Relations\hasmanyاست.از این فانکشن زمانی استفاده میشود که بعد از آن بخواهیم query قبل از اجرا بنویسیم.$user-&gt;posts()-&gt;where()-&gt;get();حالت دوم :لاراول این امکان رو میده که مستقیم به result یک relation به عنوان property  دسترسی داشته باشیم. $model-&gt;relationکه در واقعIlluminate\Database\Eloquent\Model هستاین property در اصل وجود ندارد و وقتی این را مینویسیم درواقع تابع get__ را صدا میزندpublic function __get($key){return $this-&gt;getAttribute($key);}متد getAttribute چک میکند که آیا relation لود شده ( توی relation های موجود) اگر نبود relation موجود را لود کند.public function getAttribute($key){if(array_key_exists($key , $this-&gt;relations)){      return $this-&gt;relations[$key];}
$CameKey=camel_case($key);

if(method_exists($this , $CameKey))
   {

           return $this-&gt;getRelationshipFromMethod($key,$camelkey)
    }
}
در نهایت لاراول متد getResult را روی relation کال میکند و سپس متد get  را روی querybuilder . نتیجه ای مشابه زیر میدهد.$model-&gt;relation()-&gt;get()خلاصه ی مطلب:1- $model-&gt;relation()یک object از relation را برمیگرداند.Illuminate\database\Eluquent\Relations\hasmany2- $model-&gt;relationیک کالکشن که result از query relation هست رو برمیگردونه. Illuminate\database\Eluquent\Relations\collection3- $model-&gt;relation()-&gt;get()یک کالکشن که result از query relation هست رو برمیگردونه. Illuminate\database\Eluquent\Relations\collectionدقیقا مثل 2امیدوارم که این مطب بدردتون خورده باشه ?</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Wed, 16 Feb 2022 18:10:42 +0330</pubDate>
            </item>
                    <item>
                <title>پادکست برای برنامه نویس‏ها</title>
                <link>https://virgool.io/fboard/%D9%BE%D8%A7%D8%AF%DA%A9%D8%B3%D8%AA-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D9%87%D8%A7-wuno2l2z2l1j</link>
                <description>سلام به همگیداشتم فکر میکردم بعد از مدتها چه پستی بذارم که مفید باشهفکر کردم معرفی چندتا پادکست در زمینه ی برنامه نویسی میتونه ایده ی خوبی باشه.اولین پادکستی که میخوام معرفی کنم از وبسایت https://podcode.ir/  هست که چندتا برنامه نویس خوب پادکست برنامه نویسی پر میکنن که توش کلی نکات کاربردی خوب برای کسایی که تو مسیر برنامه نویسی هستند رو معرفی میکنن.https://podcode.ir/من کلا پادکستایی که گوش میدم از اپلیکیشن castbox گوش میدم و تمام پادکستهایی که عکسشون رو میذارم از این application هست.پادکست که میخوام معرفی کنم پادکست clean code  که  میتونه توی مسیر که کدهای تمیزتری بنویسیم خیلی میتونه کمک کنه پادکست بعدی so bob  که از uncle Bob  هست و درباره ی agile  توضیح میدهدر زمینه ی agile  یک پادکست دیگه هست بنام The Agile Coffee Padcast هستیک پادکست دیگه در زمینه agile پادکستی بنام agile Instructor هستهمونطور که قبلا گفتم من برنامه نویس php هستم پس دوتا پادکست هم درباره زبان  php معرفی میکنمphpRoundtable Padcast , php[padcast]دوتا پادکست دیگه هم هستن که بنظرم ارزش گوش دادن دارن Learn To Code With Me , Developer Teaامیدوارم این پست بدردتون بخورهپادکست ها رو گوش کنید و استفاده کنید و توی حرفتون بیشتر و بیشتر پیشرفت کنید. </description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Thu, 13 Jan 2022 17:48:48 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت یازدهم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%DB%8C%D8%A7%D8%B2%D8%AF%D9%87%D9%85-egc0r69wuxsd</link>
                <description>خب توی قسمت قبل آموزش register و login  رو داریم. توی این قسمت میخوایم راجع به inner join توی CI صحبت کنیم.خب تا اونجا گفتیم که کاربر اطلاعاتش چک میشه و در صورت درست بودن میتونه login کنهتوی عکس بالا اول چک کرده اگه شرط درست نبود خطا میده و صفحه ی login دوباره load میشود و اگر درست بود یک سری سشن را set میکند. حالا میخوایم توی صفحه ی جدید یک سری اطلاعات از کاربر را نمایش دهیم.فرض کنیم یک جدول داریم بنام Info که توش اطلاعات مثل کد پستی و آدرس و شماره تماس کاربر رو داریم. و الان میخوایم اونا رو توی صفحه ی کاربر همراه با یک سری از اطلاعات جدول users  را نمایش دهیم.اول یک controllerو  model بنام account درست میکنیم.توی controller یک متد برای گرفتن اطلاعات از model درست میکنیم.و بعد توی مدل اطلاعات رو میگیریم:اول select  میکنیم که چه اطلاعاتی را بگیریم. میتوانیم به جای این همه فیلد یک * داخل کوتیشن بذاریم که تمام اطلاعات را بگیرد. اما اینجا به همه ی اطلاعات نیاز نداریم و فقط فیلدهایی که نیاز داریم رو میگیریم.همونطور که میبینید علاوه بر اسم فیلد از کلمه ی کلیدی as هم استفاده شده.کار از اینه که اسم فیلد رو برای ما عوض کنه و ما موقع نمایش دیگه از اسم جدید که گذاشتیم استفاده میکنیم.بعد از دستور join استفاده کردیم که table جاری رو به table مد نظر که user هست join  میکنیم. شرط join شدن ان دوتا table این است که فیلد کلید فرعیtable جاری که accounts است با کلید اصلی users برابر باشد.و بعد از join  شدن اطلاعات را میگیرد و یک ردیف برمیگرداند.و بعد خیلی راحت توی view  اطلاعات را چاپ میکنیم.&lt;td&gt;&lt;?php echo $info-&gt;name?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $info-&gt;email?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $info-&gt;city?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $info-&gt;postID?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $info-&gt;cellnumber?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $info-&gt;address?&gt;&lt;/td&gt; همین.?LogOut: برای logout کردن هم یک متد بنام logout توی controller  مربوط به user درست میکنیم و تمام سشن ها را پاک میکنیم.</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Wed, 22 Sep 2021 11:34:37 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت دهم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%87%D9%85-zohqjx9x78ea</link>
                <description>Register and Login:خب توی این پست میریم که راجع به register  و login صحبت کنیم.register formبرای Register یک فرم داریم مثل فرم بالا (بسته به نیاز برنامه فیلدها فرق دارد).روش register کردن پست ما دقیقا مثل create کردن و هیچ فرقی نداره اما یک نکته داره:ما دیتای مهمی مثل password رو  هیچوقت همینطور ساده ذخیره نمیکنیم (یعنی اگه password ما 12345678 هست دقیقا همین مقدار رو ذخیره نمیکنیم و داده باید hash شده باشد).برای اینکار یک راه داریم. داده ی ورودی رو میگیریم و توی یک متغیر میریزیم بعد با استفاده از متد password_hash مقدار رو به hash تبدیل میکنیم.$password=password_hash($password,PASSWORD_DEFAULT);
فانکشن password_hash یک فانکشن یک طرفه برای تولید password جدید است.یک سری الگوریتم هستن که توسط فانکشن hash_password , ساپورت میشوند. یکی از آنها PASSWORD_DEFAULT است. این الگوریتم از الگوریتم bcrypt استفاده میکند و هر دفعه یک password جدید و قوی تولید میکند و داده ای که توی دیتابیس ذخیره بشه شبیه اینه$2y$10$ID3lq36jP7NL/oyQyMz8ZeUB4FBFSENl9fng1F/5ALFrxhO1rOY8yهمین.Login:Login formبرای login یک فرم داریم مثل فرم بالا که اطلاعات رو میگیریم. مثل register اول داده های ورودی رو validate میکنیم. سپس بررسی میکنیم که آیا داده ای با این مشخصات توی دیتابیس داریم یا نه. اگه نبود که خطا میدهد و اگر بود که وارد وبسایت میشیم.اطلاعات رو میگیریم توی کنترلر و بعد میفرستیم به متد login توی model.توی متد Login اول چک میکنه که آیا همچین user داریم یا نه اگر نبود false برمیگرداند.اما اگه کاربر پیدا شد مقدار password ذخیره شده رو میگیریم و چک میکنیم که آیا password با مقدار ورودی برابر است یا خیر. اگر نبود false برمیگردانیم. نکته:همونطور که بالاتر گفتیم password توی دیتابیس hash شده هست و برای اینکه داده ی ورودی که خام هست رو با این مقدار hash شده مقایسه کنیم از متد password_verify استفاده میکنیم.مقدار ورودی با مقدار hash شده در جدول مقایسه میشود.کد کامل قسمت login توی model:توی کنترلر وقتی که login موفقیت آمیز بود بهتر چندتا سشن set کنیم برای قابلیت هایی که فقط اعضای سایت بهش دسترسی دارن.$this-&gt;session-&gt;set(&#039;username&#039;,$login-&gt;name);
$this-&gt;session-&gt;set(&#039;LogIn&#039;,true);تمام. </description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Wed, 01 Sep 2021 23:37:36 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت نهم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D9%86%D9%87%D9%85-oqsvjx3ehvgj</link>
                <description>سلام توی پست این هفته بریم که راجع به Validation در CI بخونیم.خب validation یا اعتبار سنجی چی هست؟ فرض کنید که شما یک فرم مثل فرم زیر برای ثبتنام توی یک وبسایت دارید.فرض کنید که شما برای ثبتنام باید name به تعداد 15 کارکتر داشته باشید و از نوع string  باشد ولی شما به اشتباه ورودی کوتاه تر یا عددی وارد میکنید. خب این data برای ذخیره در database نامعتبر است و شما نمیتوانید این data رو ذخیره کنید. پس باید اول اطلاعات شما بررسی شود که آیا برای ذخیره معتبر است یا خیر؟! و اگر معتبر نبود باید به کاربر خطا بدهد که اطلاعات وارد شده در این field نادرست است و کاربر اطلاعات درست را وارد کند.اعتبار سنجی (validation) :اول بگم که برای validation حتما باید از helper function های url و form استفاده کنید. helper([&#x27;form&#x27;, &#x27;url&#x27;]);پس توی متد __construct مینویسیم.$this-&gt;helpers=helper([&#039;url&#039;,&#039;form&#039;]);یک متد درست میکنیم مثلا بنام register و کد زیر را داخل متد مینویسیم$validation=$this-&gt;validate([
    &#039;name&#039;=&gt;&#039;required|trim|string|max_length[15]&#039;
]);
همانطور که در متد بالا میبینید از متد validate برای اعتبار سنجی استفاده میکنیم. داخل این متد یک آرایه میذاریم و توی آرایه اسم فیلد را که اینجا name هست را مینویسیم و بعد شرایطی که فیلد مورد نظر باید داشته باشد را مینویسیم.اولین نوشته required است به این معنی که این فیلد حتما باید پر شود و در صورت خالی بودن فیلد خطا میدهد.دومی trim است که فضای خالی قبل و بعد نوشته نباید باشد.سومی string  است که یعنی داده ی ما حتما باید از نوع string  باشد و هر نوع دیگر باشد خطا میدهد.و max_length میگه حداکثر تعداد کارکتر های موجود چقدر باشد.
&#039;email&#039;=&gt;&#039;required|string|valid_email&#039;در کد بالا valid_email چک میکند که آیا ورودی فیلد ایمیل ما درست است  یا خیر.تمام شرطهای مربوط به validation را توی یک متغیر مینویسیم و بعد میگوییم که اگر validation  درست نبود دوباره همان صفحه را load کند و اگر درست بود بره به صفحه ی دیگر.خب توی کد بالا \Config\Services::validation() چیه؟؟؟این کد در واقع library مربوط به validation هست که ما به view ارسال میکنیم.  بعد خطا های مربوط به validation را در view  نمایش میدهیم.نمایش خطاها در view:برای نمایش داده ها در view  از دو متد hasError , getError استفاده میکنند. به این صورت متد hasError چک میکند که آیا فیلد name خطایی دارد یا خیر. اگر داشت با متد getError  نمایش میدهد. این کد را برای تمام فیلد ها مینویسیم.اما یک نکته اینجا هست.وقتی بار اول صفحه ی view  رو لود میکنیم خطا میدهد که فیلدها خالی هستن مثل عکس زیر:خب این اصلا درست نیست. چکار کنیم ؟؟بهترین کار اینه که یک متد درست کنیم برای load کردن view  برای بار اول مثلا توی controller  یک متد درست کنیم بنام signو توی این متد یکبار view مربوط به load میکنیم.نکته: حتما باید ()Config\Services::validation\  رو بنویسیم چون توی view از متد getError و hasError استفاده کردیم و اگه ننویسیم خطا میده.بعد کدهای مربوط به register را در یک متد دیگر مینویسیم. مثلا متد register:همین ?میتونید برید توی سایت codeigniter و تمام شرایط مربوط به validation و کابردهاشون رو بخونید و بسته به نیازتون استفاده کنید.خب توی جلسه ی بعد راجع به register و login صحبت میکنیم.</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Tue, 10 Aug 2021 15:38:11 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت هشتم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D8%B4%D8%AA%D9%85-quuzjhdqedmz</link>
                <description>سلام و ... بریم یکم راجع به session ها بخونیم. ببینیم چجوری میشه باش کار کرد.خب برای اینکه با sessionها کار کنیم باید اول کد زیر را بنویسیم.$session = \Config\Services::session($config);این تنظیمات بهتر است توی متد construct  نوشته شود تا تمام متدهای controller ما به این تنظیمات دسترسی داشته باشند. یکبار که لود شد session ها در  دسترس قرار میگیرند. config$ تنظیماتی است که ما میخواهیم اضافه کنیم. اگر چیزی برای اضافه کردن نداریم داخل پرانتز را خالی میگذاریم.اگر نخواستیم از دستور بالا استفاده کنیم میتوانیم از helper function مربوطه استفاده کنیم.$session = session();سشن ها چگونه کار میکنند؟وقتی که یک صفحه laod میشود کلاس session چک میکند ببیند که آیا session معتبری از سمت کاربر ارسال شده؟ اگر ارسال شده با مقدار ذخیره شده برابر است یا خیر. اگر نبود مقدار جدید تولید میکند.اگر session معتبر موجود بود، سشن update میشود.این اتفاقات بالا خودشون خود به خود اتفاق میافتد و لازم نیست که ما کار خاصی بکنیم.خواندن مقدار session:توی CI برای گرفتن مقدار session از متد get استفاده میکنیم. مثلا یک session داریم بنام item. برای گرفتن مقدارش اینگونه مینویسیم:$session-&gt;get(&#x27;item&#x27;);یا با استفاده از  helper function اینگونه مقدار را میگیریم: session(&#x27;item&#x27;);مقدار دهی session در CI:برای مقدار دهی session در CI از متد set استفاده میکنیم.Session-&gt;set(&#x27;hello&quot;, &quot;hi every body&quot;);روش دیگر مقدار دهی هم اینگونه است که مقادیر را داخل associative array قرار بدهیم و بعد آرایه رو به متد set بدهیم مثال:$newdata = [
        &#039;username&#039;  =&gt; &#039;johndoe&#039;,
        &#039;email&#039;     =&gt; &#039;johndoe@some-site.com&#039;,
        &#039;logged_in&#039; =&gt; TRUE
];
$session-&gt;set($newdata);برای پاک کردن مقدار session از متد remove  استفاده میکنیم.$session-&gt;remove(&#x27;item&#x27;);معرفی flashData:یک مدل session دیگر داریم بنام flashdata. این session اینگونه است که فقط برای request بعدی در دسترس هست و بعد بصورت خودکار پاک میشوداین  flashData بسیار پر کاربرد است. برای پیام های موقت و ارسال error ها و این قبیل استفاده ها بسیار مفید است.مثلا میخواهیم پستی را update کنیم اگه موفقیت آمیز بود پیام میدهد که &quot; پست شما با موفقیت ویرایش شد&quot; و اگر به خطا خورد بگوید &quot;ویرایش پست شما موفقیت آمیز نبود. لطفا دوباره امتحان کنید&quot;. و از این قبیل پیام ها. مقدار دهی از طریق متد ()setFlashdata است.$session-&gt;setFlashdata(&#039;item&#039;, &#039;value&#039;);و برای خوندن مقدار این مدل session ها از متد ()getFlashdata استفاده میکنیم.$session-&gt;getFlashdata(&#039;item&#039;);برای پاک کامل session ها از متد destroy استفاده میکنیم. این متد در مواردی مثل logOut استفاده میشود.$session-&gt;destroy(); و تمام sessionها پاک میشود.این هم از session  بصورت مختصر و مفید  ??</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Tue, 03 Aug 2021 23:42:42 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت هفتم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D9%81%D8%AA%D9%85-oof8qfi55qyl</link>
                <description>سلام خب توی پست قبل روش create و delete کردن اطلاعات از database رو گفتیم. تو این پست بریم راجع به update , show  صحبت کنیم.میخوایم یک user  با Id مورد نظر از database بگیریم و نمایش بدیم. برای این کاری توی controller مینویسیم: متد findUser در تصویر بالا Id  مورد نظر رو به model میده و model توی دیتابیس کاربری با این Id پیدا کند و برگرداند. توی مدل متد where چک میکند که آیا توی دیتابیس id  با مقدار وارد شده داریم یا خیراگر بود اون رو get میکنه و توی متغیر row$میریزه. بعد با استفاده از متد ()getRow  کل اطلاعات کاربر را به  controller برمیگرداند و بعد از طریق متد view  اطلاعات را به view  پاس میده. ویرایش (update) :توی ویرایش سناریو ماجرا اینطوریه که اول اطلاعات کاربر مورد نظر را میگیریم و بعد به view  مورد نظر پاس میدیم. تا اینجا کاملا شبیه show هست. اما یک تفاوت دارد:اطلاعات ارسالی رو داخل form  باید نمایش بدیممثل عکس زیر یعنی توی input مقدار value برابر است با مقدار گرفته شده از دیتابیس&lt;input type=&amp;quottext&amp;quot name=&amp;quotname&amp;quot value=&amp;quot&lt;?php echo $user-&gt;name?&gt;&amp;quot   &gt;یک نکته ی دیگه اینه که برای این کار یک متد توی controller بنام مثلا edit درست میکنیم و داده ها میگیریم و به view پاس میدیم. و همانطور که گفتیم توی فرم نمایش میده. نکته ی ماجرا اینجاست که action رو روی متدی بنام update تنظیم میکنیم که داده های جدید برای ویرایش به این متد بروند و کدهای مربوط به ویرایش توی این متد نوشته میشود. به این صورت:public function edit($id)
{
    $data[&#039;user&#039;]=$this-&gt;user-&gt;findUser($id);
    echo view(&#039;users/edit&#039;,$data);
}

public function update($id)
{
    
} توی متد update اطلاعات را یکی یکی میگیریم:$name=$this-&gt;request-&gt;getPost(&#039;name&#039;);
$email=$this-&gt;request-&gt;getPost(&#039;email&#039;);و بعد میفرستیم به مدل$this-&gt;user-&gt;editUser( $id, $name, $email);خب همینطور که میبینید اول با متد where کاربری با Id مورد نظر رو پیدا میکنیم و بعد مقادیر جدید رو set میکنیم و در آخر update  میکنیم. و تمام.این هم از update ??</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Wed, 28 Jul 2021 18:13:54 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت ششم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D8%B4%D8%B4%D9%85-m9miwuai4gg0</link>
                <description>سلام امیدوارم که تا اینجا خسته نشده باشید و مطالب براتون مفید باشه. آموزش CI رو ادامه میدیم.توی این پست میخوایم اطلاعات رو از ورودی بگیریم و توی دیتابیس ذخیره کنیم.اول از همه بریم روش ذخیره رو با داده های ثابت انجام بدیم.روش اول:اول از همه توی controller یک متد می نویسیم به نام storecontroller codeاسم متد ما توی مدل create است. داده هایی که میخواهیم به متد پاس بدیم رو اینطوری و بصورت یک آرایه پاس میدیم به متد. یا اینکه مثل عکس زیر همه رو توی یک آرایه بنویسیم و آرایه رو پاس بدیم.و بعد توی مدل insert میکنیمروش دوم:روش دیگه اینه که مقادیر رو توی متغیر جدا بذاریم و یکی یکی پاس بدیم به مدل. مثل عکس زیربعد یکی یکی مقادیر رو توی متد create مدل set میکنیم و بعد insert میکنیمگرفتن data از form  و ذخیره در دیتابیس:برای گرفتن اطلاعات از فرم و ذخیره ی اونا اول فرض کنید یک فرم مثل فرم زیر داریم.توی فرم بالا میخوای سه تا فیلد name, email, password از ورودی بگیریم و ذخیره کنیم.دوتا نکته اینجا بگم:1- سریع شروع نکنید کد زدن! اول ورودی بگیر و برای تست چاپش کن بعد برو برای کدهای اصلی2- من توی controller یک متد create درست میکنم و view رو توش load میکنم. بعد که توی فرم پر شد میفرستمش به متد store( درست مثل لاراول).خب حالا میریم توی controller:برای گرفتن اطلاعات از فرم request استفاده میکنیم. به این صورت:$this-&gt;request-&gt;getPost(&#x27;name&#x27;);برای دریافت اطلاعات از فرم با متد post باید از getPost استفاده کنیم و name هم اسم input ماست.اینم از روش دوم:حذف کردن (delete):برای حذف user  باید id  رو مثل کد زیر بفرستیم به متد delete توی controller.&lt;a href=&quot;&lt;?php echo base_url(&#x27;/users/delete/&#x27;.$user-&gt;id)?&gt;&quot;&gt;delete&lt;/a&gt;حالا کد مربوط به delete:به همین راحتی اول ID رو با دستور where پیدا میکنیم و بعد با متد delete راحت حذف میکنیم.خب توی قسمت بعد میریم برای آموزش update. قسمت بعد میبینمتون.</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Mon, 19 Jul 2021 20:01:48 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت پنجم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85-vus0vdtkhfir</link>
                <description>سلام دوباره ?تا اینجای آموزش خیلی راجع به view صحبت نکردیم وقتشه که بریم و یکم با view آشنا بشیم. بازم تاکید میکنم بهتره بعد از خوندن پستای من به سایت اصلی codeigniter برید و توضیحات بیشتر رو بخونید. خب حالا view چیه و چکار میکنیم باهاش؟فایلهای view شامل html-css و هر چیزی که با ظاهر وبسایت ربط داره میشه و کاربر از طریق view با pplication ما در ارتباط هست. view مستقیما با controller در ارتباط هست. ازش اطلاعات رو میگیره و بهش اطلاعات رو ارسال میکنه. امروز میخوایم روی این قضیه بحث کنیم.اول از همه باید view رو بسازیم و لود کنیم. برای اینکار توی پوشه ی view رفته و یک فایل php درست میکنیم و دستورات مربوط به ظاهر رو توش مینویسیم. بعد میریم توی controller  و مینویسیم public function show(){echo view(&#x27;viewName&#x27;);} که view در واقع helper function برای لود شدن view هست.ارسال اطلاعات به view:برای ارسال اطلاعات به view  دوتا نکته هست که باید بگیماول باید اطلاعات رو داخل آرایه ای بنام data$ بریزیم. مثال: $data[&#x27;name&#x27;]=&#x27;John&#x27; و بعد به عنوان آرگومان دوم  توی فانکشن view مینویسیمشecho view(&#x27;viewName&#x27;,$data); و اطلاعات به view  انتقال پیدا میکنه نکته ی دوم مربوط به نمایش متغیر است. برای نمایش اطلاعات توی فایل view  دیگه data$ رو استفاده نمیکنیم و فقط اسم متغیر رو مینویسیمبه این صورت:&lt;?php echo $name; ?&gt; و مقدار متغیر را نشان میدهد. یک نکته ای که اینجا خیلی به چشم میاد اینه که ما توی application چندین view خواهیم داشت. و توی بیشتر اونها باید کد html تکراری بنویسیم. به عبارتی تمام اونا رو باید توی هر فایل view کپی کنیم. خب این کار درست نیست. توی برنامه نویسی شی گرایی حرف از dry code  میزنیم dry  =&gt;  don&#x27;t repeat yourselfبرای جلوگیری از این کار اون قسمت از کدهامون که توی تمام صفحه ها تکرار میشه مثل header رو توی یک فایل جدا میریزیم و بعد توی view بالای صفحه با استفاده از دستور include  اضافه میکنه.همانطور که میبینید از APPPATH استفاده کردم که در واقع مسیر application رو تا پوشه ی app میده و بعد هم میگیم که از پوشه ی view فایل مورد نظر ما رو include  کنه. به جای دستور include میتونیم از require یا require_once هم استفاده کنیم.درست کردن form در CI: توی CI برای نوشتن فرم با دستور html  یک روش دیگه هم هست اونم استفاده از helper function خود CIبرای کار با این helper function قبل از نوشتن تگ form مینویسیم helper(&#x27;form&#x27;); و بعد برای باز کردن یک تگ فرم اینگونه مینویسیم.&lt;?php echo form_open(&#x27;example/show&#x27;)?&gt;&lt;?php echo form_close ()?&gt;و input ها و ... رو وسط این دو خط کد مینویسیم.از مزایای استفاده از این روش این است که دیگه توی action لازم نیست url  کل app رو بنویسیم. فقط اسم controller  و method و اگر لازم بود آرگومان ورودی. برای اضافه کردن attribute  به این  تگ میتونیم از آرایه ها استفاده کنیم. به این صورت$attribute=[        &#x27;method&#x27;=&gt;&#x27;POST&#x27;,        &#x27;id&#x27;=&gt;&#x27;form&#x27;,        &#x27;class&#x27;=&gt;&#x27;form-controller&#x27;        ];و attribute  رو به عنوان آرگومان  دوم به form_open اضافه میکنیم. &lt;?php  echo form_open(&#x27;example/show&#x27;, $attribute)?&gt;یا اینکه بصورت یک string بنویسیمش.echo form_open(&#x27;example/show&#x27;,  &#x27;class=&quot;form-controller&quot;  id=&quot;myform&quot;&#x27;);form_textarea, form_input , form_button() ,form_password(), ....  همگی به همین روش نوشته میشوند. attribute هایی که لازم داریم رو توی یک آرایه میریزیم و آرایه رو فانکشن میدیم.میتونیم هم از هیچکدوم از این المانها استفاده نکنیم و تگ html رو همونطور که هست بنویسیم&lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;خب توی قسمت بعد بریم که از فرم اطلاعات بگیریم و داخل database ذخیره کنیم.</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Mon, 05 Jul 2021 16:44:40 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت چهارم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-d3ud0ttg9xj8</link>
                <description>خب بریم سراغ شروع برنامه نویسی توی CIاول از همه میخوایم به دیتابیس وصل بشیم. برای وصل کردن app به دیتابیس باید بریم توی قسمت App+ Config+ Database و توی public $default  و تنظیمات دیتابیس خود را وارد کنیم مثل hostname, username , password, databaseعکس شماره ی ۱خب برای شروع کدنویسی اول باید توی پوشه ی controller و یک فایل php  درست میکنیم. اسم فایل و اسم کلاس ما هر دو باید یکی باشد.  این اسم در واقع اسم controller ماست (من به اسم users درستش کردم.) دقت کنید که هر اسمی که انتخاب کنیم توی url  ما بعنوان اولین آرگومان می آید.( جلسه ی پیش راجع بهش توضیح دادم)توی فایل php بالای کدها باید namespace  رو مشخص کنیمnamespace App\Controllers; هر controller که درست میکنیم باید کلاس BaseController هم بهش extends کنیم تا بتوانیم از متدها و property های controller استفاده کنیم. عکس شماره ۲از اونجایی که برای کار با دیتابیس به model نیاز داریم وارد پوشه ی model شده و فایل php با اسم مورد نظر( من user انتخاب کردم) درست میکنیم و مانند controller باید namespace بنویسیم. چونکه باید کلاس model رو به modelمون extends کنیم :use CodeIgniter\Model; رو بالای صفحه مینویسیم.عکس شماره ۳وقتی که یک کلاس model  رو تازه درست میکنیم یا باید تنظیمات مربوط به دیتابیس رو توش وارد کنیم یا بگیم که به تنظیمات پیش فرض( که توی app + config + database ) است برود.برای  این که به تنظیمات پیشفرض برود یک property درست میکنیم که به حالت پیش فرض برودprotected $DBGroup = &#x27;default&#x27;;چرا default ؟ چون توی پوشه ی app + config + database اسم آرایه مربوط به تنظیمات دیتابیس default بود. ( عکس شماره 1)کلاس model تعدادی property برای تنظیمات اولیه داره و ما هرجا که نیاز داشتیم از این property ها استفاده میکنیم. عکس زیر: عکس شماره ۴همینطور که میبینید $table را برابر users ( یکی از جدولهای ما در دیتابیس) قرار دادیم  و primaryKey کلید اصلی رو مشخص میکنه( اگه کلید ما id هست لازم نیست بنویسیم). allowedfields$ همونطور که از اسمش پیداست یعنی این فیلدا اجازه ی پر شدن و اضافه کردن اطلاعات دارند. $db رو خودمون تعیین میکنیم که اتصال به دیتابیس رو توی این متغیر بریزیم.برای اتصال به دیتابیس توی model  از method construct استفاده میکنیم و کد اتصال به دیتابیس را مینویسیم.$this-&gt;db= \Config\Database::connect();خب بریم سر اصل مطب: توی controller  یک متد درست میکنیم با هر اسمی مثلا index. فرض کنید این متد میخواهد که اطلاعات تمام کاربرها رو از دیتابیس بگیرد.اول بصورت public  یک property بنام مثلا userدرست میکنیم که مدل رو توی اون بریزیم. چون میخوایم از دیتابیس اطلاعات رو بگیریم پس باید از model استفاده کنیم. اول model رو لود کنیم. برای این کار از helper function بنام model  استفاده میکنیم. به این صورت public $user; و بعد متد index را مینویسیم.public function index(){$this-&gt;user =  model(&#x27;user&#x27;);$this -&gt;user-&gt;getUsers();}توی متد construct در model مینویسیم $this-&gt;builder=$this-&gt;db-&gt;table(&#x27;users&#x27;); و به table بنام users در دیتابیسمون دسترسی داریم. یک متد درست میکنیم توی model  به اسم مثلا getUsers  و توش کد زیر رو مینویسیمpublic function getUsers  (){$query=$this-&gt;builder-&gt;get();return $query-&gt;getResult();}از طریق متد get تمام اطلاعات usersرو میگیریم و با استفاده از getResult همش رو برمیگردونیم به Controller. کدهای modelcontrollerهمونطور که میبینید من model رو توی متد construct لود کردم. چون توی متدهای دیگه هم میخوام ازش استفاده کنم. اگه توی construct  ننویسیم باید همین کد رو توی هر متد تکرار کنیم که کار جالبی نیست. پس همون بالا توی construct مینویسیم و توی کل controller بهش دسترسی داریم. خب پس تا اینجا یاد گرفتیم که چجوری اطلاعات رو از دیتابیس بگیریم.توی پست بعدی بیشتر روش کار میکنیم. یادتون نره که تا اینجا رو حتما تمرین کنید تا خوب یاد بگیرید.</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Tue, 29 Jun 2021 00:40:48 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت سوم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-mxasaiblslsa</link>
                <description>سلام خب بریم سراغ ادامه ی مطالبهمینطور که میبینید وقتی وارد پروژه میشیم این صفحه رو به ما نمایش میده حالا ببینیم دلیلش چیه وقتی وارد فایل Route توی مسیر زیر میشیمApp + Config +Routeمیبینیم که همچین کدی توش نوشته شده$routes-&gt;setDefaultController(&#x27;Home&#x27;);$routes-&gt;setDefaultMethod(&#x27;index&#x27;);$routes-&gt;get(&#x27;/&#x27;, &#x27;Home::index&#x27;);یعنی بطور پیش فرض برو توی کنترولر Home  و متد index توی این متد نوشته view به اسم welcome_message رو نمایش بده که view این صفحه دقیقا چیزی هست که توی صفحه ی اول دیدیم ?اگه خواستیم میتونیم اسم controller و method مورد نظر خودمون رو جایگزین کنیم که بعد از اجرا اول بره اونجا. خب حالا ببینیم Controller چیه: Controller یک فایل php ساده هست که کدامون رو مینویسیم و رابط بین model  و View هست. بطور خلاصه controller در واقع view , model رو براساس request که ارسال میشود به هم وصل میکند.فایل های کنترولر توی پوشه ی controller توی قسمت app قرار میگیره و قانون نامگذاریش به این صورت که حرف اول باید uppercase باشه  و همچنین بصورت plural است. مثلا Users. هم uppercase هست و هم plural.خب حالا model چیه: model  در واقع ارتباط مستقیم با database داره و برای کار روی داده ها مثل insert و delete و Update و read ازش استفاده میشه.( میشه برای validation  هم استفاده بشه). model ها توی پوشه ی model قرار میگیرند و حرف اول باید uppercase باشه و مفرد است مثلا user.و صفحه ی view: صفحه ای که ما به کاربر نشون میدیم و کابر از طریق اون درخواستی که میخواد رو میده و اطلاعات میگیره. توی پوشه ی viewقرار میگیرد. پس method  چیه?: متدها همون function ها هستن ولی داخل class  نوشته میشن.حالا بیاید یکم با عملکرد URL آشنا بشیم؟ بعد از baseURL که برای وبسایت تعیین کردیم اول کلمه ی public میاد بعد index.php بعد اسم controller  و بعد اسم method و آرگومان های بعدی ورودی های method هستند که جلوتر باش کار میکنیم و یادش میگیریم. عکس زیر یک نمونه url هست.میره توی Controller به اسم users و متد hello رو اجرا میکنه.اما این که توی آدرسمون بنویسیم public/ index.php چیز قشنگی نیست حالا چکارش کنیمخب میتونیم خیلی راحت از دستش راحت شیم چجوری ? اینجوری ??اول: توی پوشه ی App + Config +app میریم و BaseUrl رو به url مدنظر خودمون عوض میکنیم.مثلا روی سیستم من http://localhost:3000/Apps/virgool/  رو توی baseUrl باید بنویسم.دوم: توی همون فایل یکم پایین تر public $uriProtocol = &#x27;REQUEST_URI&#x27;;بهpublic $uriProtocol = &#x27;PATH_INFO&#x27;;تغییر میدیم.سوم: فایل index.php , .htaccess  موجود توی پوشه ی public رو کپی میکنیم و توی root  پروژه میذاریم.و در آخر همین فایل index.php رو باز میکنیم و $pathsConfig = FCPATH . &#x27;../app/Config/Paths.php&#x27;; رو به $pathsConfig = FCPATH . &#x27;app/Config/Paths.php&#x27;;تغییر میدیمو تمام ?</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Sun, 20 Jun 2021 18:43:31 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت دوم</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-r7rqxowgsmyj</link>
                <description>دوباره سلام خب بریم سراغ ادامه ی آموزش توی پست قبل یاد گرفتیم که چجوری یه پروژه رو نصب کنیم. بعد از نصب باید وارد localhost بشیم و پروژه رو بالا بیاریم. اینجا برای من یه مشکلی پیش اومد که گفتم به شما هم بگم اگه شما هم مشکل داشتید راحت برطرفش کنید.حالا مشکل چی بود؟ من تا توی localhost وارد پروژه CI میشدم خطا میداد. بعد از اینکه کلی اینترنت رو رصد کردم فهمیدم باید برم توی xampp و توی پوشه ی php.ini  و علامت ; جلوی extension=intl و extension=crul بردارم مثل توی عکس زیر و خطام به راحتی برطرف شد.تصویر شماره ۱ اگر هم که مشکلی ندارید و  پروژتون راحت بالا اومد این قسمت رو کلا کاری نداشته باشید.حالا بریم سراغ Code igniter:با php storm  یا هر IDE دیگه ای که پروژمون رو باز میکنیم پروژه شامل یک تعداد فولدر به نام های App , public, system , writable و تعدادی فایل دیگر هستپوشه ی app: جایی هست که ما تمام کدهامون رو اونجا مینویسیم.تصویر شماره ۲پوشه ی public:  بخشی که مرورگر ما بهش دسترسی داره و ما فایل های css, js و ... رو توش قرار میدیم.فایل htaccess و index.php هم توی این پوشه هستپوشه ی system: شامل فایل های تشکیل دهنده ی فریمورک ماست و بهتره که تنظیمات این قسمت دستکاری نشه پس ما باهاش کاری نداریم?و پوشه ی writable:  این پوشه برای قرار دادن فایلا و داکیومنت هاست. مثل عکس ها و .... cachهامونم توی این فایل قرار میگیره .خب توی پوشه ی app همینطور که توی تصویر شماره ی ۲ میبینید یکسری پوشه ی  دیگه هست. ما عمده ی کارمون با controller , model , view هست که از جلسه ی آینده شروع به کار میکنیم :)خب برای آموزش Code igniter  لازم بود که تا حدی با داخل این فریمورک آشنا بشیم. امیدوارم که مطالب امروز مفید بوده باشه توی قسمت سوم میبینمتون ?</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Tue, 15 Jun 2021 16:13:48 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Code Igniter- قسمت اول</title>
                <link>https://virgool.io/@nil.noorbakhsh/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-code-igniter-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-ql6qr5g5j5kp</link>
                <description>سلاممن نیلوفر هستم برنامه نویس PHPمن تصمیم گرفتم اولین مطالبی که میخوام توی ویرگول بذارم رو با آموزش ساده و اولیه Code igniter شروع کنم.اول از همه بگم بهترین منبع آموزش CI وبسایت رسمی خودشه که خیلی خوب و کامل توضیح داد۰.https://codeigniter4.github.io/userguide/index.htmlخب بریم که شروع کنیماز طریق لینکی که اینجا گذاشتم وارد وبسایت CI بشید https://codeigniter4.github.io/userguide/installation/installing_manual.htmlتوی قسمت Manual Installationدانلود پروژه ی CI مطابق عکس روی این قسمت که خط قرمز کشیدم کلیک کنید و وارد صفحه ی زیر میشید. روی فایلی که فلش قرمز جلوشه کلیک کنید و اجازه بدید که دانلود بشه.پروژه ی CIفایل دانلود شده را از حالت zip خارج کنید و اسمش رو به هرچی میخواید تغییر بدید و توی قسمت htdocs پوشه ی زمپتون بذارید. :)تمام پروژه ی شما نصب شد :) به زودی توی قسمت بعد میبینمتون ?‍♀️</description>
                <category>niloofar noorbakhsh</category>
                <author>niloofar noorbakhsh</author>
                <pubDate>Sun, 13 Jun 2021 15:33:15 +0430</pubDate>
            </item>
            </channel>
</rss>