(no subject)

Aug 18, 2008 22:14

Так уж выходит, что по работе мне мало приходится программировать, но в сутках 24 часа, из них работаю я 8, сплю где-то 10, так что у меня ещё остаётся время :) Ни семьи, ни жены, ни девушки у меня нет, второй работы или какой-то подработки тоже не имеется. А из-за моего неумелого планирования финансов иногда так выходит, что и денег тоже не остаётся.

Я не лажу по горам, не бегаю с фотоаппаратом, не езжу по заграницам, и даже не Алтае не был. Чем же я занимаюсь?

Часть времени я общаюсь. Общаюсь в интернете, общаюсь с друзьями, встречаюсь и стараюсь хоть как-нибудь оторваться от компьютера. Есть время когда я смотрю что-нибудь, в кино или за компьютером, например, сейчас я смотрю весь сериал «Скользящие»

А ещё одно любимое занятие - программирование!! Да-да, мне нравится программировать, особенно когда это у меня получается.

В последнее время я пописываю на РНР :) Разбираюсь с Zend Framework'ом и потихонечку делаю сайт. Делаю неторопясь, делаю хорошо, на совесть и для себя.

Сегодня я впервые за всё время нашел применение логической операции XOR! Мне пришлось немного порыться в википедии, чтобы найти таблицы истинности для неё и увериться, что она подходит для моей задачи. Подошла!

Вкратце, для тех не не знает или забыл напоминаю: xor (или исключающее ИЛИ) возвращает истину когда только один из аргументов истинен, а второй нет. Т.е. если оба истинны или оба ложны, то возращается false.

А задача была следующая. Есть форма, с тремя полями для ввода. Название страны, ссылка на её описание, это два обязательных поля. Также есть два необязательных, для перевода - название страны на русском языке и ссылка на русскоязычное описание.

Два поля являются опциональными, но если уж пользователь их выбрал, то заполнять требуется оба (таковы условия)! Именно здесь-то операция xor и пригодилась. Ниже я приведу пример кода на РНР, для иллюстрации того, как это можно проверить.

Маленькое отступление. Я хотел и несколько раз порывался написать про Zend Framework, но всё никак не хватало меня. В кусочке кода ниже, кстати, демонстрируется новая фишка из ещё пока не стабильного Zend Framework 1.6.0: программист может вмешаться в стандартный ход проверки полей формы на валидность.

Казалось бы, есть Zend_Validate, который легко прикручивается к Zend_Form, но есть случаи, и они не так уж редки, когда проверка должна быть несколько выше и касаться не одного поля, а нескольких. Например, пароль и его подтверждение - нужно проверить, что значение в двух полях идентичны. Или в задаче, которую я привёл выше - нужно выдать ошибку, если из двух опциональных полей одно незаполнено.

Вот мой код (к сожалению я не знаю как бы его раскрасить):

if ($this->getRequest()->isPost()) {

if ($form->isValid($this->getRequest()->getPost())) {

$values = $form->getValues();
$t_name_empty = empty($values['country_name_l10n']);
$t_url_empty = empty($values['country_url_l10n']);

// When user supply only translated country name or only
// country url but not a both
if ($t_name_empty xor $t_url_empty) {

// determine what field leave empty
$empty_field_name = ($t_name_empty ? 'country_name_l10n' : 'country_url_l10n');

// find this field and mark as failed validation
foreach ($form->getElements() as $element) {
if ($element->getName() === $empty_field_name) {
// addError() function appears in ZF since
// 1.6.0RC1
$element->addError('isEmpty');
}
}

} else {
$this->addCountry($values);
}
}
}

P.S. Обилие закрывающих скобочек мне не нравится, но после этого есть ещё код и вставить return я не могу. Что ж, может потом код изменится сам или я его как-то отрефакторю и он будет более опрятным.

P.P.S. А ещё Zend довольно прожорлив и мне пришлось повысить memory_limit c 5 Мб до 8 (очень не хотелось, но пришлось).

Updated(20100123):: НЕ НАДО проверять значения в контроллере, как я это пытался делать тогда, когда писался этот пост. Правильным способом является написание собственного валидатора.

php, programming, zend framework, code, xor

Previous post Next post
Up