Изключения и пробни блокове

Версия 5 на езика PHP въведе концепцията за обработка на изключения, както и средствата за генерирането и прихващането им в блокове try/catch. Подобни концепции и инструменти са налични в Java и други ООП езици. Основният принцип на обработка на изключения е следният: ако дадена програма извърши някаква рискована операция, която не може да бъде напълно контролирана в рамките на тази програма, тогава трябва да се организира проверка за грешки. А блокът пробване/хващане го прави прост и удобен.

За тази цел рисков код, способен да хвърля изключения, се поставя в блок try. Когато възникне състояние на грешка, се изпълнява команда, която генерира ново изключение. В резултат на това се създава обект за изключение и контролът върху изпълнението на програмата се прехвърля към кода от catch блока. В зависимост от вида на изключението в този блок могат да се извършват всички необходими действия. Това може да бъде толкова просто, колкото връщане на булева стойност false или обработка на изключението, в зависимост от неговия характер.

Изключенията могат да бъдат хвърлени в тялото на методите и без блокове try/catch. Но тогава методът трябва да бъде извикан от блока try,, така че блокът catch да улови изключението, което може да бъде хвърлено в този метод. Това определено трябва да се отбележи в документационния блок за методи, които хвърлят изключения, така че програмистите да знаят как да използват такива методи в блокове try..

Този вид обработка на изключения не съществуваше до Joomla 1.6, която изисква PHP 5.2 или по-нова версия, за да функционира правилно. Но тъй като кодът на Joomla се пише и по-старите класове се актуализират, този вид обработка на изключения все повече ще се появява в кодовата база на Joomla.

Сега обратно към метода loadForm() от предишния кодов блок. След като зададете променливата $form на обект от тип JForm, тя проверява дали данните се зареждат във формуляра. Асоциативният масив $options е посочен като трети аргумент в сигнатурата на метода loadForm(). В този пример се изисква предварително зареждане на данните, предназначени за формата, за които елементът loaddata с булева стойност true се въвежда в асоциативния масив.

Когато условието за зареждане на данни е изпълнено, се извиква методът loadFormData(), който получава всички предварително заредени данни, но по правило няма такива. Ако елементът се редактира за първи път или току що се създава, тогава се извиква методът $this->getItem(), който създава обект от тип JObject с полета за формата. И ако елементът вече съществува, тогава данните се получават за него, докато за новия елемент се получават стойностите по подразбиране. И ако те не са посочени в полетата, тогава се получават празни стойности.

Кога се използват данните от текущата сесия? Да приемем, че потребител попълва формуляр, за да въведе нов елемент, но някои от данните във формуляра са невалидни, като например липсващо поле за заглавие или дублиран псевдоним. В този случай операцията за запис няма да завърши успешно и следователно данните няма да бъдат записани в базата данни. И тогава потребителят трябва да премине през неприятната процедура за повторно въвеждане на данни във всички полета на формата, за да коригира единствената грешка, която е допуснал. За да се избегне тази ситуация, въведените данни се записват в текущата потребителска сесия. И едва след като бъдат успешно съхранени в базата данни, те се премахват от тази сесия. По този начин данните се получават от базата данни с помощта на метода get Item () или от текущата сесия с помощта на метода getUserState ().

Следният ред код от метода loadFormData() е важен:

Този ред от код извиква метод от класа JModelForm, тъй като не е заменен в подкласове, получени от класа JModelAdmin или WeblinksModelWebl. По-долу е изходният код за този метод.

Този метод задейства събитието onContentPrepareForm. Това събитие беше въведено в Joomla 1.6 специално за обекти тип JForm. Позволява ви да разработвате плъгини за модифициране на JForm обекти, преди те да бъдат изобразени в прозореца на браузъра. Тези плъгини предоставят JForm обект (в променливата $form) и масив от данни (в променливата $data). Пример за използване на събитието onContentPrepareForm беше показан в глава 5 при създаване на плъгин от файла myregistration2 .php. В този пример добавката беше използвана за въвеждане на редица нови полета във формуляр. Но можете също така да използвате добавки за изтриване, валидиране или редактиране на JForm обекти.

След като добавките се изпълнят, се проверяват възможните грешки. Ако добавката е върнала грешка, която не е обект от тип Exception, тя се преобразува в този обект, който след това се използва в командата throw exception за докладване на грешката на извикващия метод.

И след връщане обратно към метода loadForm() се извиква методът bind() от родителския клас JForm, разположен нагоре в йерархията, тъй като този метод не е заменен в нито един от неговите подкласове. Този метод проверява дали обектът JForm има валиден обект тип JXMLElement, дефиниран в полето, маркирано в XML кода, и дали обектът или масивът е в променливата $data. След тази форма полетаса съпоставени към елементи от данни и всеки от тях е зададен на подходящата стойност.

И отново се връща към метода loadForm() близо до края на блока try. Ако е било хвърлено изключение по време на изпълнение на кода в някой от методите, то трябва да бъде обработено. За тази цел се изпълнява следният catch блок.

В този кодов блок природата на грешката се задава за този модел въз основа на съобщението, получено от обекта за изключение, и след това булевата стойност false се връща към извикващия метод loadForm(). Ако не са хвърлени изключения по време на изпълнението на блока try, блокът catch се пропуска.