Пользовательские закладки (добавление/удаление)

Angelight

Новичок
Пользовательские закладки (добавление/удаление)

Доброго времени суток!

Встал передо мной следующий вопрос: "Как создаются пользовательские закладки?"

Постараюсь обрисовать ситуацию как можно подробнее:

Сайт. Есть зарегистрированные пользователи. Есть страницы с публикациями (к примеру, новости, статьи, заметки). Как обычно - есть краткая публикация с ссылкой на полную публикацию. Ниже каждой краткой публикации есть текстовая ссылка (либо кнопка) с надписью "Добавить в закладки". Зарегистрированный пользователь жмет ссылку, тем самым, добавляя публикацию в закладки для последующего прочтения. Тут же, возле краткой публикации ссылка "Добавить в закладки" тут же сменяется следующей "Убрать из закладок". Пройдя по ссылке "Мои закладки" в пользовательском меню, он попадает на страницу своих закладок, где лежат выбранные им публикации. Возле каждой публикации есть ссылочки "Убрать из закладок". Прочтя ту или иную публикацию, пользователь жмет на ссылку - закладка удаляется.

Вторые сутки "ковыряю" DLE - ничего не получается. Слишком мудренный код для того, кто с начала сего года изучает php. Бьюсь как рыба об лед, а отдачи нет.

Разобрал лишь то, что в таблицу с пользователями (назовем ее "users"), в поле "favorites" (к примеру), добавляются id этих самых публикаций, которые перечисляются через запятую. При каждом добавлении/удалении, таблица "users" (поле "favorites") обновляется. Ситуацию с изучением закладок на DLE усугубляет то, что там используется Ajax (чтобы страничка не перезагружалась при нажатии на ссылку/кнопку добавления/удаления закладок). Наверняка так и используется повсеместно, пусть не Ajax, но Javascript уж точно.

В подведении итогов, хотелось бы узнать:

1. По какому принципу создаются пользовательские закладки?

2. Если есть возможность, покажите на примере, как они создаются? Быть может какие-то статьи на соответствующую тему, возможно у кого есть код, по которому можно было бы учиться (не используя его как готовый материал по принципу "получил на руки - вставил - пользуюсь, незная каким образом он работает").

Зачастую встречаю сайты, где используется функция добавления/удаления закладок, но как все это реализуется на практике (как, впрочем, и в теории) очень хотелось бы знать...

Заранее огромное спасибо за любую помощь по данным вопросам!
 

С.

Продвинутый новичок
1. Пользовательские закладки создаются так, как удобнее разработчику. Нет священного завета по созданию закладок.

2. Нет ниакой принципиальной разницы между закладками и товаром в корзине.
 

Angelight

Новичок
Автор оригинала: С.
Пользовательские закладки создаются так, как удобнее разработчику. Нет священного завета по созданию закладок.
Догадывался об этом. Но, хотелось бы увидеть на примере хотя бы один из способ создания... :)

Автор оригинала: С.
Нет ниакой принципиальной разницы между закладками и товаром в корзине.
Спасибо за подсказку! Буду штудировать материалы на предмет того, как создаются корзины с использованием mysql...
 

soines

Новичок
Лучше хранить такие данные не в табличке с пользователями, а в отдельной. Например с полями user_id , article_id. И по сути тебе нужно две функции:
addToFavorites( $userID, $articleID )
removeFromFavorites( $userID, $articleID )

Задачу вообще надо разбить на две:
1) добавление/удаление закладок
2) делать это через ajax

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

А потом уже пытайся сделать пункт №2.
 

Angelight

Новичок
Автор оригинала: soines
Лучше хранить такие данные не в табличке с пользователями, а в отдельной. Например с полями user_id , article_id.
Возьму на заметку.

Автор оригинала: soines
И по сути тебе нужно две функции:
addToFavorites( $userID, $articleID )
removeFromFavorites( $userID, $articleID )

Задачу вообще надо разбить на две:
1) добавление/удаление закладок
2) делать это через ajax

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

А потом уже пытайся сделать пункт №2.
Спасибо за рекомендации. Обязательно учту. Эх, еще бы увидеть все это на ладони... в виде практического примера. Было бы намного легче. В теории вроде понятно, а вот как реализовать в смысле написания кода - пока в раздумьях...
 

dimagolov

Новичок
Angelight, здесь не подают, если ты об этом.

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

Angelight

Новичок
Автор оригинала: dimagolov
Angelight, здесь не подают, если ты об этом.
Я не о подаянии, а о возможности, есть таковая есть, взглянуть на готовые примеры, решения, касательно моего вопроса с целью посмотреть, проанализировать и написать по-своему, применить на практике. В теории я немного разобрался, но теория так и осталась теорией. Не всякий ткач сможет соткать ковер, зная в теории, как "вяжутся" ковры, имея в руках лишь иглу и нити...

Автор оригинала: dimagolov
непонятно, в чем конкретно проблема:

то ли в том, как сохранить в БД закладки
то ли в том, как передать что именно добавлять
то ли в том где и как отображать закладки
Во всех пунктах. Затрудняюсь все это собрать воедино в силу нехватки должного опыта...
 

dimagolov

Новичок
Затрудняюсь все это собрать воедино в силу нехватки должного опыта...
а ты начни с частностей, потом собирать будешь, как по частям все заработает. так делают ВСЕ, в том числе и суперпроффи, это основопологающий принцип, причем не только программирования, декомпозиция называется.

п.с. про первое: http://phpfaq.ru/formtable
 

soines

Новичок
Angelight, в чем именно проблема? Напиши скрипт который будет записывать в базу две переменные для начала. Потом сделай чтобы одну переменную он брал из $_GET, вот у тебя и получится скрипт по добавлению закладки.
 

Angelight

Новичок
Автор оригинала: dimagolov
а ты начни с частностей, потом собирать будешь, как по частям все заработает. так делают ВСЕ, в том числе и суперпроффи, это основопологающий принцип, причем не только программирования, декомпозиция называется.

п.с. про первое: http://phpfaq.ru/formtable
&&

Автор оригинала: soines
Angelight, в чем именно проблема? Напиши скрипт который будет записывать в базу две переменные для начала. Потом сделай чтобы одну переменную он брал из $_GET, вот у тебя и получится скрипт по добавлению закладки.
Задачу с закладками решил практически полностью - выбранные статьи добавляются в закладки определенного пользователя, закладки успешно выбираются:

===================================================================================

Файл: index.php

===================================================================================

PHP:
// Tables:

// bookmark (id_bookmark(int(30))(auto_increment)), id_user(int(30)), id_news(int(30)))
// articles (id(int(30))(auto_increment)), name(varchar(255)), ... остальные поля)

// $dbcnx - соединение с базой данных

if( isset( $_COOKIE['nickname'] ) ) {
	$nickname = $_COOKIE['nickname'];
}

// Выбираем из таблицы с пользователями (members) id пользователя
$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'";
$res_member = mysql_query($sel_member, $dbcnx);
$member_id = mysql_fetch_array($res_member);
// Получаем id_пользователя
$id_user = $member_id['id'];

// Выбираем все поля из таблицы статей
$sel_art = "SELECT * FROM articles ORDER BY name DESC";
$res_art = mysql_query($sel_art, $dbcnx);
// Выводим краткое описание статей в цикле (в качестве примера, выводим лишь наименования)
while($row_art = mysql_fetch_array($res_art)) {
	echo "" . $row_art['name'] . "";
	echo "<br /><br />";
	// Если статьи просматривает зарегистрированный пользователь - выводим ссылки на добавления/удаления из закладок
	if(isset($id_user)) {
		// Проверка: если id с выбранной статьей уже найдена в поле "id_new", показывать ссылку "Удалить из закладок",
		// иначе ссылку "Добавить в закладки"
		if(/**/) {
			echo "<a href=\"bookmark.php?action=remove_bookmark&amp;id=" . $row_art['id'] . "\">Удалить из закладок</a>";
		} else {
			echo "<a href=\"bookmark.php?action=add_bookmark&amp;id=" . $row_art['id'] . "\">Добавить в закладки</a>";
		}
	}
	echo "<br /><br />";
}
	
// Ссылка в раздел "Мои закладки"
echo "<br />";
echo "<a href=\"my_bookmarks.php\">Мои закладки</a>";
echo "<br /><br />";
===================================================================================

Файл: bookmark.php

===================================================================================

PHP:
if( isset( $_COOKIE['nickname'] ) ) {
	$nickname = $_COOKIE['nickname'];
}

// Выбираем из таблицы с пользователями (members) id пользователя
$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'";
$res_member = mysql_query($sel_member, $dbcnx);
$member_id = mysql_fetch_array($res_member);
// Получаем id_пользователя
$id_user = $member_id['id'];

// В зависимости от действия (нажатия на ссылку "Добавить" либо "Удалить" закладки), выводим необходимую функцию
switch($_GET['action']) {

	case "add_bookmark": {
		AddItem($_GET['id'], $id_user);
		break;
	}
	case "remove_bookmark": {
		RemoveItem($_GET['id']);
		break;
	}
}

// Функция AddItem добавляет выбранную статью в закладки
function AddItem($ItemId, $id_user) {
		// $dbcnx - результат соединения с базой данных
		global $dbcnx;
		// Выбираем все поля из таблицы закладок (bookmark)
		$sel_bookmarks = "SELECT * FROM bookmark WHERE id_new = '{$ItemId}' AND id_user = '{$id_user}'";
		$res_bookmarks = mysql_query($sel_bookmarks, $dbcnx);
		$rows_bookmarks = mysql_num_rows($res_bookmarks);
		$numRows = $rows_bookmarks;
		
		// Если, в таблице "bookmark" не существует строки, в поле "id_new" которой содержится id выбранной статьи - вносим id
		// выбранной статьи в таблицу "bookmark"
		if($numRows == 0) {
			$add_bookmark = "INSERT INTO bookmark (id_bookmark, id_user, id_new) VALUES (NULL, '{$id_user}', '{$ItemId}')";
			$res_add_bookmark = mysql_query($add_bookmark, $dbcnx);
			// Если не удалось внести статью в закладки - выводим ошибку, иначе редиректимся на предыдущую страницу
			// (в данном случае, "index.php")
			if(!$res_add_bookmark) {
				exit("ERROR!");
			} else {
				header("Location: index.php");
				exit();
			}
			// Если id выбранной статьи уже лежит в закладках (в поле "id_new"), редиректимся на предыдущую страницу
			// (в данном случае, "index.php")
		} else {
			header("Location: index.php");
			exit();
		}
	}
	
// Функция AddItem удаляет выбранную статью из закладок 
function RemoveItem($ItemId) {
	global $dbcnx;
	$remove_bookmark = "DELETE FROM bookmark WHERE id_new = '{$ItemId}'";
	$res_remove_bookmark = mysql_query($remove_bookmark, $dbcnx);
	// Если удаление статьи прошло успешно - редиректимся на предыдущую страницу (в данном случае, "index.php")
	if(isset($res_remove_bookmark)) {
		header("Location: index.php");
		exit();
	}
}
===================================================================================

Файл: my_bookmarks.php

===================================================================================

PHP:
// Получаем id пользователя
if(isset($_COOKIE['nickname'])) {
	$nickname = $_COOKIE['nickname'];
	$sel_members = "SELECT id FROM members WHERE name = '$nickname'";
	$res_members = mysql_query($sel_members, $dbcnx);
	$row = mysql_fetch_array($res_members);
	$id_user = $row['id'];
}
	
// Выбираем все, внесенные в закладки, статьи
$sel_bookmarks = "SELECT articles.name FROM articles,bookmark WHERE articles.id = bookmark.id_new AND id_user = '{$id_user}'";
$res_bookmarks = mysql_query($sel_bookmarks, $dbcnx);
while($row_bookmarks = mysql_fetch_array($res_bookmarks)) {
	echo $row_bookmarks['name'];
	echo "<br />";
}
Остается всего лишь одна загвоздка - это решить, что прописывать в условии if, в зависимости от которого выводить соответствующую ссылку: "Добавить в закладки" либо "Удалить из закладок". Двое суток уже ломаю голову, но так ни к чему и не пришел. Совершенно нет никаких идей...

Прошу помочь с рекомендациями, напутствиями, если есть таковая возможность. Заранее спасибо! )
 

soines

Новичок
Angelight, смотри данные у закладках у тебя хранятся в табличке bookmark. Для того чтобы узнать есть ли закладка или нет надо проверить есть строчка с указанными user_id, bookmark_id.
 

Angelight

Новичок
Автор оригинала: soines
Angelight, смотри данные у закладках у тебя хранятся в табличке bookmark. Для того чтобы узнать есть ли закладка или нет надо проверить есть строчка с указанными user_id, bookmark_id.
Не удалось мне сделать эту проверку. (( В итоге совсем запутался. Разные варианты перепробовал. Ничего не работает. Все выполняется (меняются ссылки на добавление/удаление закладок) лишь при этом способе:

PHP:
// Выбираем все поля из таблицы статей
$sel_art = "SELECT * FROM articles ORDER BY name DESC";
$res_art = mysql_query($sel_art, $dbcnx);
// Выводим краткое описание статей в цикле (в качестве примера, выводим лишь наименования)
while($row_art = mysql_fetch_array($res_art)) {
	echo "" . $row_art['name'] . "";
	echo "<br /><br />";
	// Если статьи просматривает зарегистрированный пользователь - выводим ссылки на добавления/удаления из закладок
	if(isset($id_user)) {
		$sel_bookmarks = "SELECT * FROM bookmark WHERE id_user = '{$id_user}' AND id_new = '{$row_art['id']}'";
		$res_bookmarks = mysql_query($sel_bookmarks, $dbcnx);
		$num_bookmarks = mysql_num_rows($res_bookmarks);
		if($num_bookmarks == 0) {
			echo "<a href=\"bookmark.php?action=add_bookmark&amp;id=" . $row_art['id'] . "\">Добавить в закладки</a>";
		} else {
			echo "<a href=\"bookmark.php?action=remove_bookmark&amp;id=" . $row_art['id'] . "\">Удалить из закладок</a>";
		}
	}
	echo "<br /><br />";
}
Но, как я понимаю, это совсем не вариант, т.к. запрос к базе идет при каждом выполнении цикла. Будут выбраны 100 статей - будет 100 раз выполняться один и тот же запрос. Но работает лишь этот способ. Или я смотрю совсем не в том направлении... :(
 

soines

Новичок
вытащи из базы все закладки для заданного пользователя в массив например. При выводе проверяй есть ли id статьи в этом массиве, если есть выводи "убрать из закладок", если нет - "добавить в закладки".

Можешь одним запросом вытаскивать информацию о статьях и закладком, использую JOIN.

Смотри сам как тебе удобнее.
 

Angelight

Новичок
Автор оригинала: soines
вытащи из базы все закладки для заданного пользователя в массив например. При выводе проверяй есть ли id статьи в этом массиве, если есть выводи "убрать из закладок", если нет - "добавить в закладки".

Можешь одним запросом вытаскивать информацию о статьях и закладком, использую JOIN.

Смотри сам как тебе удобнее.
Большое спасибо тебе за помощь! Наконец-то задача решена (эх, долго я над ней корпел)! :)

Вот окончательный вариант страницы "index.php":

PHP:
if( isset( $_COOKIE['nickname'] ) ) {
	$nickname = $_COOKIE['nickname'];
}

// Выбираем из таблицы с пользователями (members) id пользователя
$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'";
$res_member = mysql_query($sel_member, $dbcnx);
$member_id = mysql_fetch_array($res_member);
// Получаем id_пользователя
$id_user = $member_id['id'];

$sel_bookmarks = "SELECT * FROM bookmark WHERE id_user = '{$id_user}'";
$res_bookmarks = mysql_query($sel_bookmarks, $dbcnx);
$Nums = mysql_num_rows($res_bookmarks);
if($Nums != 0) {
	while($row = mysql_fetch_row($res_bookmarks)) {
		$list[] = $row;
	}
	
	$fav_arr = array();
	foreach($list as $bookmarks) {
		// В массив $fav_arr заносим лишь значения полей "id_new" (в них id выбранных статей)
		$fav_arr[] = $bookmarks['2'];
	}
}

// Выбираем все поля из таблицы статей
$sel_art = "SELECT * FROM articles ORDER BY id DESC";
$res_art = mysql_query($sel_art, $dbcnx);
// Выводим краткое описание статей в цикле (в качестве примера, выводим лишь наименования)
while($row_art = mysql_fetch_array($res_art)) {
	echo "" . $row_art['name'] . "";
	echo "<br /><br />";
	// Если статьи просматривает зарегистрированный пользователь - выводим ссылки на добавления/удаления из закладок
	if(isset($id_user)) {
		// Проверяем, если в массиве не существует id данной статьи - выводим ссылку "Удалить из закладок",
		// иначе "Добавить в закладки"
		if((!isset($fav_arr)) or (!in_array($row_news['id'], $fav_arr))) {
			echo "<a href=\"bookmark.php?action=add_bookmark&amp;id=" . $row_art['id'] . "\">Добавить в закладки</a>";
		} else {
			echo "<a href=\"bookmark.php?action=remove_bookmark&amp;id=" . $row_art['id'] . "\">Удалить из закладок</a>";
		}
	}
	echo "<br /><br />";
}
Теперь все работает отлично - ссылки успешно меняются в зависимости от добавления/удаления закладки... Еще раз спасибо!
 

soines

Новичок
Angelight, да ладно, просто подтолкнул в нужном направлении.
 
Сверху