tired



Cегодня занялся прикручиванием авторизации через сервис loginza.ru на один из своих сайтов, при этом требовалось сохранить существующую систему регистрации и авторизации.
Основная проблема: все OpenID-провайдеры возвращают различную информацию о пользователе, а, иногда, вообще не возвращают. Приходится вручную перед интеграцией анализировать, что приходит от сервера и что нам писать в базу.
Дабы хоть кому-то упростить жизнь, публикую параметры, которые приходили мне от популярных OpenID-сервисов.
Хоть я особо тут и не пишу ничего, но спам-боты меня очень любят досаждать своими комментариями. Премодерация, конечно, работает, но как-то иногда лень удалять все эти десятки сообщений, тем более что множественное удаление сообщений мне тоже лень делать.
Решил себе приделать простенький метод борьбы со спамом от Михаила Андреева.
Смысл прост: заменяем настоящие названия полей формы на случайный набор символов, а старые поля скрываем через css.
echo $this->Form->input('34kjffe343', array('label' => __('Ваше имя', true)));
echo $this->Form->input('name', array('label' => false));
echo $this->Form->input('34f3f34f3fc34r6', array('label' => __('Ваш электронный адрес', true)));
echo $this->Form->input('email', array('label' => false));
echo $this->Form->input('458vn54jfkjm3', array('label' => __('Сайт', true)));
echo $this->Form->input('url', array('label' => false));
echo $this->Form->input('934hf9v34fhjc', array('label' => __('Комментарий', true), 'type' => 'textarea'));
echo $this->Form->input('comment', array('label' => false, 'type' => 'textarea'));
#CommentName, #CommentEmail, #CommentUrl, #CommentComment{
display: none;
}
Дабы не менять логики контролера, немного схитрим и вспомним про метод модели beforeValidate...
Селектор жуквери element#id неккоректно работает в браузерах Opera 9 и Internet Explorer 7. Вместо всех елементов с заданным id выбирается только первый. Дабы и в них всё работало, используйте .class
read more at Блог Шурашова Антона aka Sinkler
Как это ни печально, но в версии CakePHP 1.3.3 опять криво работают каллбэки модели, если модель использует поведение Tree.
В чем заключается эта кривость? Допустим, вы пытаетесь удалить запись №1 в модели Category, использующей tree behavior, у которой есть дочерние записи №2 и 3.
$this->Category->delete(1);
И, допустим в модели определен каллбэк beforeDelete(). Вы будете удивлены, но beforeDelete() сработает только для записи №1, проигнорировав записи 2 и 3.
Не знаю, может в этом есть какая-то глубокая логика, но мне лично и многим другим, судя по обсуждениям в google groups, она не понятна.
В версии CakePHP 1.2 это "лечилось" переопределением в app_model.php метода deleteAll и использованием его вместо delete:
function deleteAll($conditions, $cascade = true, $callbacks = true) {
$this->Behaviors->disable('Tree');
$return = parent::deleteAll($conditions, $cascade, $callbacks);
$this->Behaviors->enable('Tree');
return $return;
}
С кейком 1.3.3 у меня эта фишка не прокатила, рыться глубоко в коде мне лень, поэтому для beforeDelete делаю так:
1. Переношу весь код из beforeDelete в приватный метод beforeDeleteId($id):
private function beforeDeleteId($id) {
//код Вашего каллбэка
return true;
}
2. В beforeDelete() прописываю:
function beforeDelete() {
$children = $this->children($this->id, false, array('id'));
if (!empty($children)) {
$ids = Set::format($children, '{1}', array('{n}', "{n}.$this->alias.id"));
foreach ($ids as $id) {
if(!$this->beforeDeleteId($id)) {
return false;
}
}
}
return $this->beforeDeleteId($this->id);
}
С afterDelete() ситуация немного сложнее, т.к. после удаления мы не можем узнать детей удаленной записи (они ведь тоже уже удалены). Что ж, будем узнавать их и запоминать перед удалением...
Вы читаете журнал
shurashov