Показаны сообщения с ярлыком navigation. Показать все сообщения
Показаны сообщения с ярлыком navigation. Показать все сообщения

четверг, 17 сентября 2009 г.

Простое решение красивых URL

Если Вы просматриваете какую-то запись/пост на Cake-сайте, то скорее всего адрес выглядит так:
/posts/view/5, где posts - модель, а 5 - номер id записи.
Чтобы сгенерировать такую ссылку надо порписать что-то вроде:$html->link('CakePHP Tips', array('controller' => 'Post','action' => 'view',5));
Но вы не будете писать id вручную, скорее всего это будет что-то вроде:
$html->link($post['Post']['title'], array('controller' => 'Post','action' => 'view',$post['Post']['id']));

А сейчас самое интересное:
Вы можете написать дополнительный параметр, и он будет перенаправлен туда же.
То есть /posts/views/5/Cakephp-tips, ведет туда же, куда и /posts/views/5

Все! Нам больше нигде не нужно хранить Slug. Достаточно прописать его в ссылке

$html->link($post['Post']['title'], array('controller' => 'Post', 'action'=>'view', $post['Post']['id'], Inflector::slug($post['Post']['title'], '-')));
Это даст нам что-то вроде: /posts/view/5/cakephp_tips

среда, 16 сентября 2009 г.

Cakephp TreeBehavior и отдельная ветка

Сегодня расскажу о замечательном свойстве TreeBehavior-a для Cakephp generatetreelist()
Как правило, он выдает большое дерево с подкатегориями и тому подобное.

чтобы использовать tree behavior, в вашей таблице должны быть хотя бы эти 3 поля:
parent_id, lft, rght

$this->Category->generatetreelist();
и все наше дерево готово!

Оказывается не все! а если я хочу не всю ветку, а начиная с id=5?
сразу скажу что варианты типа
$this->Category->generatetreelist(array('id'=>5));
Не прокатит. т.к. в этом случае он вернет только 'id'=5. а нам нужна ветка.

Ну что ж, пойдем дальше...
заменим $this->Category->generatetreelist(); на $this->Category->find('threaded');
этим мы ничего не изменили, а всего лишь вывели все поля, а не только key=>value

а для чего спросите Вы, здесь lft, rgth? странно. я сам долго не мог понять, а чем им id не понравился для сортировки?

как выяснилось, они вовсе не для сортировки.
пока у строк parent_id=0, т.е все они нулевого уровня, lft+1=rght
до того как Вы для какого нибудь элемента добавите дочерний.

Что же тут происходит? lft и rght продолжают нумерацию дальше, как ни в чем ни бывало, не смотря на то что это уже дочерние элементы.
А вот у родительского lft тот же самый, но вот rght = "последний дочерний rght"+1

и так приступим:
$prn = $this->Category->find('first',
array('conditions'=>array('id'=>5))
);
$out = $this->Category->find('threaded', array('conditions'=>array('Category.lft BETWEEN ? AND ?'=> array($prn['Category']['lft'], $prn['Category']['rght'])), 'order'=>'lft');

удачного приготовления :-)

воскресенье, 13 сентября 2009 г.

Выборка релевантных тегов (ярлыков)

Суть проблемы — на нескольких сайтах можно видеть фильтрацию новостей по нескольким тегам: если выбрать один тег — будут показаны новости которые имеют этот тег, а отображаемый список тегов будет уменьшен так, чтобы остались только те теги, которые встречаются в отфильтрованных по первому тегу новостях. И так далее, пока не закончатся теги в результате их «фильтрации». Тоесть, чтобы при выборе нескольких тегов остались только те новости, которые содержат полный их набор.
Хороший пример этому Delicious принадлежащий компании Yahoo!

Как это сделать на ?
Опишу только алгоритм.
Имеются 3 таблицы posts(id,content), tags(id,tag), posts_tags(id,post_id,tag_id).
как Вы поняли, третья таблица соединяет первые две.
1. сначала выбираю статью, со всеми тегами.
2. выбираю остальные статьи с этими же тегами.
3. выбираю список тегов в этих статьях.
4. сортирую этот список тегов, удаляю одинаковые (например через array_unique())

Если Вы хотите хранить теги через запятую, а потом искать их через "tags LIKE '%тег%'", то спешу Вас огорчить. Этот способ плохой до не узнаваемости. Все дело в том, что даже если на поле tags вы повесили index, то при использовании "tags LIKE '%тег%'" этот индекс учтен не будет.

Взято из обсуждения с одного сообщества, а так как это ответ мой, то я смело публикую это здесь.

Что делать с Ajax, при отключенном Javascript

Все мы знаем чтО такое Ajax.
Для тех кто не знает, вкратце скажу.
Что это такое?
Эта такая система, которая с помощью Javascript, делает запрос на какую-либо страницу и результат выводит на экран.
Зачем это нужно?
Больше не надо грузить всю странице целиком, а только ее часть. Я просто умалчиваю о других бесценных свойствах..
А что если пользователи отключили Javascript?
А вот об этом, я как-раз и хочу рассказать...


Первое что я делаю: все ссылки привожу к виду 
<a href="/articles/page:2" onclick="open('/articles/page:2'); return false;">Далее</a>


Далее, в начале страницы, между <script type="text/javascript> и </script> пишем Ajax запрос, который будет доставать ту самую '/articles/page:2', но ссылка не сработает, т.к. мы прописали "return false;"


А если у пользователя отключен Javascript, то он тупо перейдет по ссылке и получит страницу целиком.
Кстати, такой подход полезен и для разных ботов, которые сканируют ваш сайт