Алексей Качаев | Web-developer, фрилансер, менеджер

PHP, jQuery, AJAX, CodeIgniter, ZendFramework, Web2.0, блоггинг, Wordpress, бизнес, StartUp, Инветоры, web-проекты, бизнес-идеи, фриланс, интерфейсы

Глюки в Янедкс.Рейтинге Блогов. Виноват Google?

Опубликовано: Алексей Качаев | 28 комментариев

Несколько последних дней на моей блоге можно было наблюдать такую картину:

Глюки Яндекса

Я сначала думал, что это связано с какой-то ошибкой в генерировании рисунка на сервере Яндекса. Но ситуация затянулась и я решил поинтересоваться, а что же все-таки произошло.

Какого же было мое удивление, когда оказалось, что мой блог ВЫЛЕТЕЛ из рейтинга (занимая 478 позицию и входя в сотню автономных). А затем вернулся туда, но уже с новым идентификатором (раньше был 8580722, а теперь 9185360). Новая позиция в рейтинге - 936. Ну хоть из тысячи не вылетел :)

С чем может быть связан такой переворот.. Единственное, что приходит на ум - смена RSS ленты на гугловскую (Яндекс.Блоги работает именно через чтение контента rss лент). Может у кого-то другие соображения по этому поводу?

Спонсор поста: Создание нестандартного фирменного стиля. Дизайн рекламы.

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

PHP-кейс #1: “Переменные, Классы и Клонирование”

Опубликовано: Алексей Качаев | 8 комментариев

PHP-кейс #1. Переменные, классы и клонированиеВ одном из предыдущих постов, я уже писал, что мне иногда приходят на почту и в аську вопросы от читателей по поводу тех или иных вопросов разработки. Иногда простые, иногда посложнее. Но так или иначе, у меня уже “подсобралось” коллекция вопросиков и ситуаций “на догадку”. Назову их по аналогии из бизнеса “PHP - кейсами”. Периодически я буду публиковать наиболее показательные из них. Я не буду брать дословные вопросы из своей переписки с читателями. Скорее всего это будут некие абстрактные примеры в стиле “foo-bar” и “MyCar-YouCar”.

Если вы часто в практике встречаетесь с подобными “PHP-кейсами” - присылайте или оставляйте в комментариях!

Итак, начнем с простого, но очень полезного для новичков PHP ООП.

PHP-Кейс #1. Классы и переменные

Рассмотрим простейший код:

/**
 * @project  PHP-Case #1.  
 * @author   Alex Kachayev
 *               http://www.kachayev.ru
 */
$car_1 = 'Merce';
$car_2 = $car_1;
 
$car_1 = 'Boing';
 
print $car_2;

Даже в детском саду вам скажут, что на экран будет выведено

Merce

Изменение в первой переменной, никак не отобразилось на второй.
Рассмотрим теперь другую ситуацию.

/**
 * @project  PHP-Case #1. 
 * @author   Alex Kachayev
 *               http://www.kachayev.ru
 */
 
class Car
{
    public $model;
 
    public function __construct( $model )
    {
        $this->model = $model;
    }
}
 
$myOwnCar = new Car('BMW');
print 'My car: '. $myOwnCar->model ."\n";
 
/**
 * Даю тебе машину, такую же как моя :)
 */
$youCar = $myOwnCar;
 
/**
 * У нас с тобой одинаковые модели
 */
print 'You car: '. $youCar->model ."\n";
 
/** 
 * Мне надоело BMW, собираю все деньги, покупаю Астон Мартин
 */
$myOwnCar->model = 'Aston Martin';
print 'My new car: '. $myOwnCar->model ."\n";
 
/**
 * Посмотрим, какая машина у тебя?
 */
print 'You new car: '. $youCar->model ."\n";

Итак, что мы получим на выходе? Вот ответ:

My car: BMW
You car: BMW
My new car: Aston Martin
You new car: Aston Martin

Почему мы получили именно такой результат… Думаем и читаем мануалы :).

Давайте пойдем еще дальше, и дополнил наш кейс новым кодом: предположим мой машина разбилась…

/**
 * Разбиваем мою машину :)
 */ 
$myOwnCar = null;
 
/**
 * Посмотрим теперь на наши машины
 */
var_dump($myOwnCar);
var_dump($youCar);

Что получим на выходе? Вот такое вот “жизненное безобразие”:

My car: BMW
You car: BMW
My new car: Aston Martin
You new car: Aston Martin
NULL
object(Car)#1 (1) {
["model"]=>
string(12) “Aston Martin”
}

Т.е. твоя машина - как новенькая, а от моей только дырка от руля осталась :).

Клонирование

А если на практике мне понадобиться сделать “независимую копию объекта класса”? Для этого можно можно (и нужно) использовать clone.
[Читать далее...]

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

СПАМеры. Эпизод 2. Атака клонов :)

Опубликовано: Алексей Качаев | 20 комментариев

Спамеры. Атака клонов.В общем, я так понял, что тема СПАМеров в комментариях будет жить еще очень долго. А может и вечно :) И чем популярнее блог, тем “горе-комментаторов” становиться все больше и больше.

Лично для себя я эту проблему решил (как оказалось частично) с помощью трех вещей:

- обязательной премодерации первого комментария автора
- обязательной премодерации любого комментария с ссылкой в тексте
- капчей со сложным вопросом по математике :)

И этого было вполне достаточно. В течении двух месяцев, как минимум. Но… Последнее время на модерацию стали приходить какие-то тупые до безобразия комментарии.

И что самое удивительное, подписаны эти комменты женскими именами. Нет, я, конечно, не против женского пола в аудитории блога, только вот слабо вериться что в последнее время развелось уж столько девушек-программисток.

Зато эти мега-программистки помимо полного не понимания материала, который комментируют, показывают уверенные знания веб-мастерства. У каждой то сайт свой, то блог… Очень интересно пишут! О строительстве, ремонте и спортивных событиях…

Чего только не узнаешь из таких комментариев!

…И о том, что мой на мой блог можно попасть из поисковика Google… (удивительно, правда. Я бы сам и не додумался иногда). Ну, кто про Яндекс вспомнит?
…И о том, что я давно не писал о евроремонте (странно, я вроде никогда о нем не писал).
…И даже о том, что мой каскад динамических списков не работает в Opera 12 (!!!). Неужели я один так отстал от новостей софта…

Пробежавшись взглядом по статистике переходов на блог нашел одну интересную ссылку:

http://commentwriter.ru

Конторка, я так посмотрю, не очень популярная. Но может, ее все же кто-нибудь прикроет? Ибо сеять разумное, доброе, вечное у ее служителей не получается.

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

JQuery-навигация: каскад динамических списков произвольной длины

Опубликовано: Алексей Качаев | 39 комментариев

Добрый день, читатели. Решил сегодня расслабиться от каждодневной работы и написать очередной tutorial. На повестке дня сегодня магия jQuery и небольшой рассказ о том, как динамически создавать на странице группы select`ов. Для того, чтобы вам была понятна задача, которую мы решаем, немного предыстории.

Сейчас я работаю над крупным проектом, который условно можно поделить на две части: 1) парсинг данных со сторонних ресурсов в наше базу данных, 2) расширенный поиск по этой базе с кучей условий и фильтров. Задача, которую мы решим сегодня, появилась именно при создании пользовательского интерфейса для задания условий поиска.

В дело в том, что в информация в базе данных разделена по категориям неограниченной вложенности. И этих самых категорий очень много. Для того, чтобы дать возможность пользователю выбрать категорию для поиска, было решено использовать динамические select`ы. Т.е. изначально на страничку загружается список с категориями верхнего уровня. Если пользователь выбирает для в этом списке какую-то категорию, то мы даем ajax-запрос на специальный скрипт, который возвращает нам список подкатегорий (т.е. тех, для которых выбранная категория является непосредственным родителем).

jQuery, Ajax и PHP - создание каскада динамических списков

О том, как организовать подобную иерархию списков, можно прочитать здесь. Но. Такое решение не снимает проблем, ведь оно создано специально под 3 списка, в которых динамически меняется содержимое. А при работе с деревом категорий неограниченной вложенности мы никогда не знаем, сколько списков нам понадобиться. Поэтому описанную в статье методику пришлось “расширить”.

Вооружимся jQuery, PHP и современными традициями AJAX, начнем (сразу скажу, что нам понадобиться jQuery 1.3)…

Для нетерпеливых: то, что у нас получиться в итоге, вы можете посмотреть здесь:

jQuery, Ajax, PHP - создание каскада динамических списков.

[Читать далее...]

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

“Аутентификация пользователей = Zend_Auth + Zend_Acl” - мой рецепт

Опубликовано: Алексей Качаев | 21 комментарий

В эпоху веб2.0 пользовали - неотъемлемая часть практически любого серьезного проекта. А значит, не менее серьезным есть вопрос управления пользовательским доступом. Под этим я понимаю то, что пользователь:

1) должен уметь “зайти” (авторизироваться) / “выйти”;

2) должен делать на сайте только то, что ему позволил создатель веб-мастер.

Последнее касается не только авторизированных пользователей, а и всех остальных (мы будем для удобства называть их “гостями”).

Сегодня я хочу поделиться своим опыт создания такой системы в рамках фреймворка Zend. В самом Zend`e есть два очень мощных инструмента:

а) Zend_Auth - он успешно решает первую задачу;

б) Zend_Acl - это мощная система управления правами пользователей, которая решает вторую задачу.

Дело встало за малым… Соединить их в единую трудо способную систему. О том, как сделать эту связку наиболее продуктивной и/или гибкой точиться много споров. Если внимательно прочитать официальную документацию, то ничего конкретного там по этому поводу не содержится. Поэтому, сколько разработчиков, столько и мнений.

Помню, когда передо мной встал этот вопрос впервые, я прошерстил много материалов, но целостной конечной реализации, которая удовлетворила бы все мои интересы… не нашел. Недавно подобный вопрос “всплыл” и в ЖЖ комьюнити ru_php.

Я приведу свой способ без разбора его производительности. Единственное, что могу сказать точно: описанный способ достаточно гибок для того, что удовлетворить все мои потребности в процессе аутентификации пользователей и распределении их прав.

Итак, начнем…

1. Задача

Сформулируем для себя простенькую задачу, которая бы отобразила все моменты реальной разработки. Ну, например, так:

- пользователь для того, чтобы залогиниться вводит логин и пароль;

- список пользователей храниться в базе данных в таблице `users`;

- авторизированный пользователь видет в углу блок со своим именем и ссылкой “выйти”;

- авторизированный пользователь не может еще раз войти и не может зарегистрироваться, а “гость” не может “выйти” (так как он еще не вошел).

Требования, сами понимаете, минимальные, и легко расширяемые до того, что вам нужно.
[Читать далее...]

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

Страница 1 из 11