![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Fulminator |
|
||||||||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 16.2.2006 Где: Молдова Репутация: нет Всего: нет |
Привет. Хочу поделиться своим способом реализации тегов(меток) под Zend Framework. Предположим, что он установлен, и вы умеете под него немного писать. Если не умеете - самое время научиться, это довольно просто и чует мой главный орган интуиции, что будущее за подобными штуковинами.
Это будет простое приложение, позволяющее добавлять, удалять и редактировать новости или записи в личном дневнике - подогнать можно под разное. Для начала распланируем БД и создадим нужные таблицы. Всего их три. В первой таблице будут храниться сами посты, во второй теги и третья, кросс-таблица, будет содержать id поста и имя привязанного к нему тега. Что-то вроде того: POSTS: post_Id;post_title;post_post;post_date. TAGS: tag_name. POSTS2TAGS: post_id, tag_name. Допустим, за все эту прелесть будет отвечать AdminController.php, как вы будете проверять, что это действительно админ - проблема! Ваша проблема, я не об этом. И так первым action'ом будет addPostAction(). С простецкой, можно сказать, детсадовской логикой. Если _POST не отослан - выводим HTML-форму для заполнения, а если отослан - данные обрабатываем и куда нужно пихаем. Для обработки и запихивания воспользуемся богатым арсеналом зенда и методами классов Tags, Posts, Posts2Tags. Вот написанием этих методов и займемся. Понадобится 3 модели: Posts.php, Posts2Tags.php, Tags.php. Для начала нужно привести в чувство теги (подрузумевается, что пустым _POST[tags] быть не может, хотя бы одним тегом, но пометить надо), которые сейчас в виде строчки и через запятую, вроде: tag0, tag1, tag2. Пусть даже невнимательный пользователь забыл запяту в конце или лишний пробел, preWorkTags() решит эту проблему. preWorkTags() находится у меня в модели tags.php - это не совсем правильно.. ))
Все просто. Берется строка, по запятой разбивается в массив. Если в конце была забыта запятая, происходит unset пустой ячейки. Дальше нужно проверить, существует ли тег. И если не существует, нужно его добавить.
С тегами разобрались, самое время добавить запись в таблицу для этого нужно сделать массив с данными и отправить его в addPost. $data = array('post_title'=>$title,'post_post'=>$post,'post_date'=>$date); // вот например такой массив
Функция возвращает id добавленного поста, для того чтобы чуть дальше можно было прилинковать теги в кросс-таблице.
линкуем. linkPost2Tags() должна находится в модели Posts2Tags.php Вот и всё. С добавлением покончено, можно приступить и к редактированию. Отличаться оно сильно не будет editPostAction() в _GET получает id поста и если _POST не отосланы выводит форму для редактирования, в противном случае - редактирует Можно просто закопипастить addPostAction() и изминить пару строк. Вместо addPost($data) - editPost($data,$where). И перед линковкой старые ссылки удаляются по id поста(deletePosts2Tags).
Далее getPostsByTagAction() - этот action будет выводить посты по заданному тегу. Тег получает из _GET, далее id постов и сами посты по этим id.
На этот раз мы разбиваем массив в строку(getPostIdsByTagName()) и уже строку передаем в getPostsByIds(). Осталось вывести все посты с прилинкованными тегами. В качестве бонуса - постраничная разбивка =)))
$limit - это кол-во постов на страницу и $page - страница из _GET. Теперь на руках есть все посты, воспользуемся getTagsByPostId($postId).
И в самом конце, когда есть массив с ключами(равными id постов) и сами тегами, превратим его в готовый массив со ссылками, которые будут отфутболивать пользователя на написанный ранее getPostsByTagAction().
финита. Присоединённый файл ( Кол-во скачиваний: 13 ) ![]() |
||||||||||||||||||
|
|||||||||||||||||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |