Първи стъпки с CodeIgniter

Публикувано в PHP програмиране на 27.07.2010

Понеже съм голям фен на CodeIgniter, реших да поставя началото на серията от статии и материали за него, именно с днешната тема „Първи стъпки с CodeIgniter“. Надявам се със следващите няколко реда да запаля всеки един от вас и така да разширим още повече българското CI общество. Като цяло материалът е за начинаещи и ако сте програмист или гуру в програмирането може да го пропуснете.

Какво е CodeIgniter?

CodeIgniter е мощен и същевременно изключително лек PHP Framework. Той е създаден за тези PHP разработчици, които искат да създават бързо и лесно богати на функционалност уеб приложения. Както казват хората от CI „Ако сте разработчик, който живее в реалния свят, а именно на споделения хостинг и на кратките срокове и ако не искате да се занимавате с големи недокументирани frameworks, то CodeIgniter е именно за вас.“

Ето няколко примера на готини уеб сайтове направени посредством CodeIgniter:

CodeIgniter е MVC базиран (Models, Views, Controllers), което ще рече, че всички ваши обръщения към базата от данни ще се съхраняват в така наречените Models, целият ви HTML код ще се съхранява във Views файловете и разбира се логиката на приложението в Controllers. Разбира се, CI не ви принуждава да следвате стриктно този модел на работа, но ако пък решите да работите по този начин това ще ви спести доста главоболие и мъки за в бъдеще. Други може би странни думички за вас най-вероятно ще са, Helpers, Libraries, Hooks и т.н.  Ще се опитам да онагледя какво представлява на практика всяка една от тях и как те може да са ви полезни, но в следващите уроци. Моментната версия на CI е 1.7.2, но във фурната се пече вече версия 2.0. В нея ще има доста промени, но статията която ще ги отрази ще е малко по-нататък във времето, за да може информацията да бъде максималко актуална.

Полезни линкове:

Как да позная дали CodeIgniter е за мен?

CodeIgniter e определено за вас ако:

  • Искате мощен и лесен за научаване Framework.
  • Имате нужда от голяма производителност.
  • Работите на различни споделени хостинг доставчици с различни PHP версии с различни конфигурации.
  • Имате нужда от Framework, който тръгва без никаква конфигурация, просто разархивирате и той работи.
  • Имате нужда от Framework, който не изисква разбота с Command-line.
  • Имате нужда от Framework, който не изисква от вас да се придържате към ограничителни правила за кодиране.
  • Не се интересувате от големи библиотеки като PEAR.
  • Не желаете да учите нов Template language.
  • Искате изключително прости решения на вашите задачи.
  • Искате ясна и цялостна документация.

Инсталация и конфигурация на CodeIgniter

Както споменах вече CodeIgniter тръгва без грам конфигурация, но това разбира се не означава, че нямате възможност да си го настроите. Със следващите няколко реда ще ви покажа как можете лесно да си подкарате това IT чудо, на ваш сървър или хостинг акаунт.

Инсталация

Инсталацията на CodeIgniter е изключително проста. Нещата, които трябва да направите е да си свалите архивифираните файлове оттук, след това да разархивирате zip-чето някъде и да си го качите на сървъра. Зареждате URL-а през браузъра и виждате, че CodeIgniter е вече на ваше разположение.

Конфигурация

Сега малко по-подробно за конфигурацията. Като за начало ще се опитам да ви кажа как е организирано всичко на файлово ниво.

Актуална документация на CI за съответната весия:

/ciroot/user_guide/

Системна папка. В тази папка се намира ядрото на CI със всички допълнителни библиотеки, вашия апликейшън фолдър и прочие:

/ciroot/system/

Вашият апликейшън фолдър. Това е папката в която ще пишете вашето приложение:

/ciroot/system/application/

Конфигурационни файлове за вашето приложение:

/ciroot/system/application/config/

Като изключим факта, че можете да си създавате ваши конфигурационни файлове, тук има няколко значими конфиг файла, на които трябва да се обърне нужното внимание:

  • autoload.php
  • config.php
  • database.php
  • routes.php

Папка, в която ще създавате вашите Controllers:

/ciroot/system/application/controllers/

Стандартния пакет на CI идва с един примерен контролер:

  • welcome.php

Папка, в която ще създавате вашите Models:

/ciroot/system/application/models/ - идва празна

Папка, в която ще създавате вашите Views:

/ciroot/system/application/views/

Стандартно CI идва само с един view файл, който работи с welcome контролера:

  • welcome_message.php

Папка, в която ще създавате вашите Helpers:

/ciroot/system/application/helpers/ - идва празна

Папка, в която ще създавате вашите Hooks:

/ciroot/system/application/hooks/ - идва празна

Папка, в която ще създавате вашите Language файлове:

/ciroot/system/application/language/

Папка, в която ще създавате вашите собственоръчно написани библиотеки:

/ciroot/system/application/libraries/ - идва празна

Повече информация за Models, Helpers, Hooks, Languages и Libraries ще получите в следващия урок.

Сега пожене тук си говорим за конфигурация на Framework-а, ще обърнем малко по-сериозно внимание на няколкото конфигурационни файла, които споменах по-горе:

autoload.php

В този файл се определя кои системи трябва да се зареждат по подразбиране. За да се задържа Framework-а максималко лек и бърз тук се зареждат само наистина необходимите системи, които трябва да присъстват на много места и няма нужда да ги зареждате ръчно навсякъде. По подразбиране CI не заражда нищо в autoload.

Нещата които можете да зареждате автоматично чрез autoload.php са:

  1. Libraries
  2. Helper files
  3. Plugins /от версия 2.0 на CI те ще бъдат премахнати/
  4. Custom config files
  5. Language files
  6. Models

Автоматично зареждане на библиотеки:

$autoload['libraries'] = array();

//Прототип
$autoload['libraries'] = array('database', 'session', 'xmlrpc');

//Това са библиотеки, намиращи се в system/libraries или във вашата папка на приложението system/application/libraries.

Автоматично зареждане на хелпъри:

$autoload['helper'] = array();

//Прототип
$autoload['helper'] = array('url', 'file');

Автоматично зареждане на плъгини:

$autoload['plugin'] = array();

//Прототип
$autoload['plugin'] = array('captcha', 'js_calendar');

Автоматично зареждане на конфиг файлове:

$autoload['config'] = array();

//Прототип
$autoload['config'] = array('config1', 'config2');

Автоматично зареждане на Language файлове:

$autoload['language'] = array();

//Прототип
$autoload['language'] = array('lang1', 'lang2');

//Не пишете частта "_lang" от името на вашия файл.
//Пример: Ако файлът ви се казва "codeigniter_lang.php" трябва да го опишете по следния начин, array('codeigniter');

Автоматично зареждане на Models файлове:

$autoload['model'] = array();

//Прототип
$autoload['model'] = array('model1', 'model2');
//model1 и model2 са имената на вашите Models. Те могат да имат и друго име, например users, catalogue и т.н.

config.php

Това е може би най-важният конфиг файл. Оттук можем да си настройваме доста от базовите функционалности на CI. Сега ще ви покажа по-важните неща, на които е хубаво да обърнете внимание.

Основен URL на сайта

$config['base_url']	= "http://example.com/";

Този ред може да ви помогне за в бъдеще, когато използвате различни функционалности, helpers и др. полезнотии в CI.

Индекс файл на приложението ви

$config['index_page'] = "index.php";

Обикновенно това е index.php файла който се намира в root директорията на CI, но при ваше желание можете да го преименувате. Също така ако желаете може да премахнете появата на index.php от URL-a ви, благодарение на mod_rewrite. Когато index.php присъства, URL-а ви ще изглежда по следния начин:

http://example.com/index.php/controller/function/anything/else/

Ако обаче желаете да не се показва index.php в URL-a ви трябва да направите следните неща:

$config['index_page'] = ""; //оставяте го празно

Създавате файл .htaccess в root директорията на CI и в него пишете следното:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

URI протокол

$config['uri_protocol']	= "AUTO";

В повечето случаи AUTO ще ви свърши работа с изключение на случаите когато използвате fastcgi или сте на cPanel и използвате горния .htaccess код и се опитвате да премахнете index.php от URL-а си. В този случай ако с AUTO упорито не иска да работи се опитайте да го подкарате по следния начин:

$config['uri_protocol']	= "ORIG_PATH_INFO";

Повече информация за URI протокола можете да прочетете в документацията.

URL Suffix

$config['url_suffix'] = "";

Тук името говори само за себе си, но ако евентуално все още не може да разберете за какво става дума, ще се опитам да направя кратко и разбрано обяснение на прост български.

Ако приемем, че ще оставим url_suffix празно, както е по подразбиране, ще имаме следния стил URL-и:

http://..../controller/function

Ако обаче направим следната промяна:

$config['url_suffix'] = ".htm";

Ще имаме следния резултат:

http://..../controller/function.htm

Разбира се URL suffix-а може да е какъвто си пожелаем.

Class Extension Prefix

$config['subclass_prefix'] = 'MY_';

Каква е идеята тук. Представете си, че не харесвате нещо по Core библиотеката за работа със сесии и искате да си я поправите, разширите и прочие, но без да пипате по самата нея. И така, ако сте обърнали внимание в началото, имаме една папка в нашия application фолдър, която се казва libraries. Точно в нея ние освен, че можем да си пишем собственни библиотеки можем и да разширяваме Core библиотеките. Именно тук идва на помощ този subclass_prefix.

Ето как работи това нещо:

Когато ние зареждаме приложението и в него се вика, например библиотеката за работа със сесии и предположим, че subclass_prefix-a ни е „MY_“, CI прави следните неща:

//Когато викаме session->userdata метода, например:
$loser = $this->session->userdata('is_loser');

//CI проверява дали нямаме в application/libraries/ файл със име MY_Session.php, защото методът userdata е в class Session. Разбира се, ако го има ще го зареди и ще се свърши останалата работа.

Затова как да си пишем собственни библиотеки и как да разширяваме съществуващи ще се сблъскаме в следващите уроци. Затова не се притеснявайте, ако не може още да разберете за какво всъщност говоря.

Повече информация може да намерите на следните 2 линка:

Позволени символи в URL-то

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

Тук е мястото, в което си описваме какви символи ще можем да използваме в URL-то на приложението. Например, ако преценим, че ще позволим в приложението да се използват само букви и цифри, този ред ще изглежда по следния начин:

$config['permitted_uri_chars'] = 'a-z 0-9';

Съветвам ви ако нямате ясна идея за това какво да напишете в този масив, по-добре го оставете както си е.

Enable Query Strings

По принцип CI идва с работещи SEF URLs (Search Engine Friendly URLs), но това не означава, че цялата система може да работи само така. Именно тук вие имате възможност да промените това. Ако нямате представа за какво говоря, ето това са примерите за това как изглеждат URLs след инсталация  и след като ги промените на query string базирани:

Преди:

http://example.com/who/what/where/

След:

http://example.com?who=me&what=something&where=here

Ето как се прави това:

//Променяте
$config['enable_query_strings'] = FALSE;
//на
$config['enable_query_strings'] = TRUE;

Error Logging Threshold

Както се подразбира, тук ще си конфигурираме логването на всякави съобщения в CI. Разбира се, както всичко останало това също е изключително лесно.
Понеже постоянното логване на цялата система доста забавя работа на вашето приложение, от CI са ви дали няколко възможности:

  • 0 = Забранява логването
  • 1 = Логва само съобщенията за грешки (включително и PHP съобщенията за грешки)
  • 2 = Дебъг съобщенията
  • 3 = Информативни съобщения
  • 4 = Всички съобщения

Ето как можем да се възползваме от тази възможност:

$config['log_threshold'] = 0;
//Както вече казах по-горе, просто си избираме какво искаме да логваме и заместваме 0-та със съответната цифра от списъка.

По подразбиране нашите логове се записват в:

system/logs/

Но, разбира се, ние имаме възможност да си дефинираме къде искаме да бъдат записвани:

$config['log_path'] = '/path/to/my/logs/dir/';

Encryption Key

Ако използвате класа за Sessions с опцията му за криптиране трябва да си сетнете някакъв криптиращ ключ. Хубаво е ключът да има всякакви символи и пр.
Пример евентуално как трябва да изглежда масивчето:

$config['encryption_key'] = "JW#@_!+@#)(@*JD309diw9)(#)+)_#_@@#RFD#&S&";

Sessions

Ето това е стандартната конфигурация на сесиите в CI:

$config['sess_cookie_name']		= 'ci_session';
$config['sess_expiration']		= 7200;
$config['sess_encrypt_cookie']	= FALSE;
$config['sess_use_database']	= FALSE;
$config['sess_table_name']		= 'ci_sessions';
$config['sess_match_ip']		= FALSE;
$config['sess_match_useragent']	= TRUE;
$config['sess_time_to_update'] 	= 300;

По подразбиране сесиите в CI се пазят в cookies. Това в интерес на истината е много хубаво, защото сървърът не се занимава с излишни неща. От друга страна CI ви дава възможност ако искате да си пазите сесиите в базата от данни.

Какво е важно да запомним за някои от тези променливи:

  • ‘session_cookie_name’ = името на кукито, в което ще се пази сесията
  • ‘encrypt_sess_cookie’ = TRUE/FALSE (boolean).  В зависимост дали ще криптираме кукито.
  • ‘session_expiration’  = Секундите неактивност след което сесията се самоунищожава. По подразбиране секундите са 7200 (2 часа), но ако искате да я направите безсмъртна, заместете 7200 с 0.
  • ‘time_to_update’ = На колко секунди CI да ъпдейтва сесийната информация.

По-подробна информация можете да намерите в документацията: http://codeigniter.com/user_guide/libraries/sessions.html

Global XSS Filtering

Global XSS Filtering е последното нещо от config.php файла, на което ще обърнем внимание. Няма да се впускам в подробности какво означава XSS (Cross-site scripting), но за сметка на това искам само да спомена, че CI ни дава възможност да пуснем глобално за целия application XSS филтрирането. Това означава, че всеки POST, GET или COOKIE ще бъдат филтрирани. Тази възможност е доста ценна и ви съветвам да се възползвате.

Ето как става това:

//По подразбиране е FALSE
$config['global_xss_filtering'] = TRUE;

database.php

По името на файла се разбира, че това е файлът, в който ще се налага да пишем неща свързани с базите от данни. Казвам базите от данни, защото CI има възможност лесно да сработва с множество бази от данни. Засега ще ви покажа как да го настроим да работи с една, а в някой от следващите уроци ще разгледаме малко по-подробно как се работи с няколко бази от данни.

Ето как да си настроим CI за работа с база:

$db['default']['hostname'] = "localhost"; // Хостът, на който работи базата. Ако сайтът и базата са на един и същ сървър го оставяте така.
$db['default']['username'] = ""; //Потребителско име, с което имате достъп до базата.
$db['default']['password'] = ""; // Парола.
$db['default']['database'] = ""; // Име на базата от данни.
$db['default']['dbdriver'] = "mysql"; // Пишете с каква база ще работите. Поддържат се: mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE; // TRUE/FALSE поддържане на постоянна връзка с базата от данни.
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE; // TRUE/FALSE кеширане на резултати от queries.
$db['default']['cachedir'] = ""; // /path/to/cache/dir/
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

Има още 2 неща, които трябва да кажа за този конфиг.
Active group:
Както виждате горе в масива $db, първият ключ е default. С тази променлива $active_group вие казвате на CI с коя конфигурация за бази данни да работи. Както ви казах по-рано може да работите с множество бази данни.

$active_group = "default";

Active record:
Active Record е шаблон за дизайн, който се среща в повечето софтуери, работещи с бази от данни. Да ви кажа с две думи какво прави той: „Улеснява живота“, особено ако нямате опит с SQL и се сблъсквате за първи път.

За да го активирате:

$active_record = TRUE;

Повече информация за Active Record при CI : http://codeigniter.com/user_guide/database/active_record.html

routes.php

Това е последният конфиг файл, на който мисля да обърна внимание засега. Има още няколко конфигурационни файла, които не сме разгледали в днешното представяне на CI, но и за тях си има време в някои от следващите статии.

Сега за какво иде реч тук. Routes.php е файлът, в който можем да описваме наши URL маршрути. Ако все още не можете да разберете точно за какво става дума, ето веднага едно примерче:

Ако предположим, че искате да имате статични страници на вашия сайт (да предполагам или не, определено ще имате нужда от такива страници!) имате следния казус:

Поради някаква причина искате URL-а на статичните ви страници да е нещо от сорта:

http://example.com/static/some-page.htm

Сега, кое е интересното тук. Ако ви прави впечатление тук има две малко странни неща.

  1. controller = static
  2. function/method/ = some-page.htm

Да, да… сега ще ви кажа кое е странното…

  1. controller = static – не може да създадем контролер, който да се казва static, защото думичката static е запазена за php.
  2. function/method/ = some-page.htm – няма смисъл за всяка статична страница да създаваме функция. Защо ли? Ами ако имамте 1230 страници!?

Ето точно тук на помощ ни идват Routes в CI. За да си решим проблема бързо и лесно, можем да направим следното:

$route['static/:any'] = "static_pages/view/$1";

Което ще рече, че в момента ние казваме „Ако видя в URL контролер static, вземи и препрати всички параметри след него към static_pages/view/ и то да се оправя.“
Ако искате да научите повече за Routes можете да хвърлите едно око тук: http://codeigniter.com/user_guide/general/routing.html

Последното нещо, което мога да спомена за Routes.php е частта за резервираните маршрути. Ако погледнем във файла, след като си разархивираме CI ще видим, че в него има два вече написани маршрута. Точно те са резервираните за CI маршрути.

Както ни подсказва името тук, ще напишем кой ни е контролера по подразбиране.

$route['default_controller'] = "welcome";

Контролер по подразбиране се ползва тогава когато не сме казали кой контролер искаме да използваме. Да предположим, че имаме следната ситуация:

http://example.com/

Какво ще кажете? Кой контролер ще използваме? Сега вече досещате ли се защо ни трябва default controller.

Другият запазен маршрут е за Scaffolding.
Ето едно просто пояснение какво представлява Scaffolding. Представете си, че създавате нова таблица в базата си от данни (например posts) и в нея ще съхранявате постовете от вашия блог. Така, ако не сте написали функционалност за писане на постове, триене или редактиране, трябва да го направите през phpMyAdmin или някой друг подобен тул, или директно през конзолата. Тук ви идва на помощ Scaffolding.

$route['scaffolding_trigger'] = "";

За повече информация вижте тук:  http://codeigniter.com/user_guide/general/scaffolding.html

Това беше с днешното представяне на CI. Ако имате желание да споделите нещо пишете коментарчета не се стеснявайте :). Също така очаквам да не задържате вашите критики, а да ги споделите! :)

Благодаря ви за вниманието и отделеното време, и до следващия път.

Етикети: , , , , , , ,


8 коментара по “Първи стъпки с CodeIgniter”

  1. Бай Иван казва:

    То всичко хубаво, ама само дето не е „папка“ а „директория“.
    Иначе поздрави, че ползваш този framework

  2. Абсолютно с 2-те ръце съм съгласен и приемам забележката :))

  3. Бай Иван казва:

    Ами промени го бе приятелю ;)

  4. Напълно възможно е някога да го променя :)

  5. PhrozenCrew казва:

    От скоро се занимавам с CodeIgniter и много ми харесва начина на писане. Имам да науча още доста неща, като например как да настроя правилно колацията и енкодинга между базата данни фреймуърк-а. Всички файлове на Codeigniter са в ansi, но се използва UTF-8 енкодинг по подразбиране в конфигурационните файлове.
    Както и да е. С някой друг тест ще му хвана чалъмите.

    Благодаря за хубавата тема! Определено намерих синтезирано инфо за неща, които не знаех или за които трябваше да изчета една каруца документация.
    Поздрави и жив и здрав!

  6. Marian Ignev казва:

    Здрасти,
    благодаря ти за коментара и се радвам, че съм успял да помогна :))

    Жив и здрав :)

  7. Nikolay казва:

    Наистина прекрасно обяснено,тъй като за първи път ще се сблъсквам с CI е обяснено поне началото,и кое за какво е.

    Позравления

Вашият коментар