Рамка за уеб приложения, изградена на CodeIgniter

приложения
Със сигурност много уеб програмисти са изучавали и може би дори са използвали такава прекрасна рамка катоCodeIgniter. Изборът ми се спря на него поради факта, че е с най-нисък входен праг, най-лесен е за научаване, добра документация, бърз и т.н. и така нататък. За прости проекти най-„това“ е да опитате ръката си като разработчик. Разбира се, за по-сериозни проекти е по-добре да използвате по-функционални и сложни рамки.

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

приложения
Освен това ни позволява да заредим няколко контролера или модела от различни модули и да изградим структура, която е удобна за нас (или да стартираме контролер на друг модул от един модел и т.н.). В това, разбира се, не открих нищо ново. Така че да продължим. В основния CI URL адресът се анализира по следния начин: example.com/class/function/ID

Тези. първият сегмент е извиканият контролер (клас), вторият е функцията в него, третият е параметърът, предаден на функцията (може четвъртият и петият). Честно казано, дори за посредствен проект това е много неудобно, затова реших да изградя собствена логика за обработка на URL адреси, която ми дава пълна свобода на действие. За да направите това, редактирайте файла routes.php в папката application/config и добавете към него:

Това показва, че във всеки случай основният контролер ще бъде зареден и функциятаindex()ще се изпълнява. След това създайте файл в папкатаapplication/controllersи го наименувайте "main.php". Не забравяйте, че сме инсталирали разширението HMVC,така че нашите контролери вече няма да наследяват отCI_Controller, а отMX_Controller. Този контролер ще бъде основният и всичко ще "минава" през него. В същото време ще бъде много просто и просто ще прехвърли управлението на други модули. Ето как изглежда функциятаindex()за мен:

Засега няма да засягаме последните два реда от класа “tp”. Base CI не използва PHP сесии, а вместо това съхранява данни в бисквитки (което води до объркване на начинаещите, като наименува своята библиотека Session, въпреки че работи с бисквитки). Все пак реших да използвам естествени PHP сесии, въпреки че не изоставих напълно функционалността, предлагана от CI за работа с бисквитки (използвам и двете).

И така, първото нещо, което правя, е да проверя за езика (проектите ми често са многоезични).

Може да се види, че първият сегмент в URL адреса ще отговаря за езика. Във файлаapplication/config/config.phpпосочете:

За да промените езика на конфигурацията от контролера, използвайте това

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

Функциятаcheck_module()трябва да провери втория сегмент от URL адреса (или първия, ако не използвате многоезичност), за да видите дали е валиден модул, т.е. Предписвам позволените модули в конструктора предварително, например така:

След това във функцията проверявам:

По този начин, ако вторият сегмент е празен, тогава се зарежда главната страница. Ако има валиден модул в URL адреса, той се зарежда, ако не, той го хвърля на 404. След това създавам 2 моделаtp.phpиcommon.phpв папкатаapplication/models, които ще бъдат достъпни за мен навсякъде (записвам ги в автоматичното зарежданеapplication/config/autoload.php):

"tp" ще опише функциите за моята проста машина за шаблони, която се разширявавъзможностите на много слаб натив. В "common" пиша всички други функции, които ще се използват често. Така че$this->common->load_module($m)ще зареди модула$m(вторият сегмент от URL адреса) и функциятаindex()в него. Тук всичко е просто:

Всеки модул, зареден от URL, трябва да използва някакъв шаблон за цяла страница, като този

Основните шаблони за цялата страница се създават в папкатаapplication/views/templates(папкатаtemplatesсе създава ръчно). Различните модули могат да използват едни и същи шаблони. Самата рамка на модулния контролер изглежда така:

В нашия модулНовинисъздаваме 3 папки -контролери, модели, изгледи. В папкатаcontrollersсъздайте файлnews.phpи напишете описания по-горе код в него. Ние изграждаме собствена логика във функциятаindex(). Например там зареждам модела news_model.php, който се намира в папката models на новинарския модул. Още в модела описвам функциите за работа с базата или други сложни функции, свързани с този модул.

Накрая, целият резултат от новинарския модул се записва в етикетаCONTENT, който се заменя в шаблона с този резултат. За да разберете как се случва това, е необходимо да разкажа как изградих логиката на моята "шаблонна машина". Само разширих възможностите на основния "Parser" и го пренесох в "човешка форма". Ако не знаете как работи базата, най-добре е първо да разберете.

Така че, разгледайте модела "tp".

Тук има 2публичнипроменливи -$D,$tpl.$Dе нашият глобален масив, който в крайна сметка ще замени всички етикети на изгледа в шаблона със съдържанието на$this->D['LABEL'], изобразено в модули. $tpl е основният главен шаблон на цялата страница,който се записва във всеки модул от URL адреса и след това се предава на главния главен контролер, където се извиква$this->tp->load_tpl($this->tp->tpl).

Вече видяхме функциятаparse()по-горе. 2 параметъра трябва да бъдат предадени на тази функция, първият е етикетът, където ще бъде записан резултатът (html част), вторият е същата html част, намираща се в папкатаviews. Ноparse()ще провери този html за тагове и ще ги анализира, ако е необходимо:

От всичко това трябва да е ясно, че ако създадете файлnews.tplвътре в модула за новини в папката с изгледи и напишете най-простия html там, напр.

След това стартирайтеexample.com/ru/news, след което ще стартира основният контролерmain.php, който ще прехвърли управлението към модулаnews, там ще бъде зареден шаблонътp_default.tpl(от горния код).

След това контролерът на модулаnewsще замени съдържанието на файлаapplication/modules/news/views/news.tplсъс съдържанието на шаблонаp_default.tplи ще покаже съдържанието на шаблонаp_default.tplна екрана. Но… това все още е теоретично, защото не сме описали функциите$this->tp->load_tpl($this->tp->tpl)и$this->tp->print_page().

Функциятаload_tpl()приема като параметър шаблон, който е основен, т.е. шаблона на цялата страница (в папкатаviews/templates). След това този шаблон се проверява за други етикети, които могат да бъдат или модули, или просто променливи (като заглавие или авторско право). Етикетите и числата с главни букви са модули, етикетите с малки букви са прости променливи. Ако не се намери заместител на етикетите, те просто се презаписват (премахват). Ето и самия код:

В края на нашия главен контролерmainсе изпълнява функциятаprint_page(), която трябва да отпечатаразработен шаблон на екрана:

Опитах се да опростя всичко описано по-горе, доколкото е възможно. Всъщност всичко е много по-сложно и разширено за мен, но можете да го направите сами (защото може би не всеки е прочел това до края). В модела “tp” все още имам куп всякакви функции за машината за шаблони, например:

Лесно е да се разбере логиката им. С$this->tp->assign('page_title', 'Main Page'), например, можете просто да го замените с "Main Page" в шаблона.

В рамките на шаблоните може да има и модули, които могат да показват нещо, като извънредни новини или менюта. В шаблон те се вмъкват във фигурни скоби, например или . Функцията parse(), когато срещне такъв етикет, ще провери дали този етикет е модул и ако е така, ще го замени с това, което този модул ще произведе. Такива модули също се намират в папката modules и имат собствен M-V-C. Основният контролер на модулаheader, например, изглежда така:

Трябва да се отбележи, че винаги първи ще работи модулът, който се зарежда от URL адреса и е основният, след което се зарежда шаблонът и parse() обработва всички модули в него. За по-голяма яснота, всичко описано по-горе е изобразено на снимката

изградена

Извинявам се за примитивната графика, все пак съм програмист, а не дизайнер.

Ще се радвам да чуя критиките на професионалистите.

Моят модифициран CodeIgniter може да бъде изтеглен от тук.