Вот решил к этой галерее "прикрутить" плагин JNote для создания заметок на изображениях.
Исходный скрипт находится на этой странице: http://jquery-notes.rydygel.de/samples.php. Все расположено в одной папке.
Я его адаптировал на страницу галереи согласно логической структуры форума.
Что сделал:
- Стили с изображениями перенес в файл theme/note.css, подключил в stylesheet.css: @import url("note.css");
- Скрипты расположил по адресу template/note/jquery-notes_js/jquery-notes_1.0.8.js, Jquery подключен был ранее.
- Исправил в созданных файлах note.css и jquery-notes_1.0.8.js конфликт с уже имеющимся на форуме CSS - классом "clearfix" - переименовал в "clearfix2".
- К ссылке изображения добавил класс jquery-note_1-1 и id изображния через атрибут "rel". Дописал в файле includes/gallery/image/image.php в строкеКод: Выделить всё
$content = '<img src="{U_MEDIUM}" alt="{IMAGE_NAME}" title="{IMAGE_NAME}" class="jquery-note_1-1" rel="'.$image_id.'" />'; - Внес изменения jquery-notes_1.0.8.js для id по "rel"
- Подключил необходимые скрипты и файлы на странице с изображением.
Добавил следующие строки в файл template/gallery/viewimage_body.htmlКод: Выделить всё<script type="text/javascript" src="{T_TEMPLATE_PATH}/note/jquery-notes_js/jquery-ui.js"></script> <script type="text/javascript" src="{T_TEMPLATE_PATH}/note/jquery-notes_js/jquery-notes_1.0.8.js"></script> <script type="text/javascript"> $(function() { $('.jquery-note_1-1').jQueryNotes({ operator: '{U_NEW_NOTE}', maxNotes: 20, allowDelete: true, allowLink: true, dateFormat: 'D.M.Y', aspectRatio: false, allowAuthor: false }); }); </script> - Переменная {U_NEW_NOTE}: Для нее создал hook (прочитал здесь на форуме, за что отдельное спасибо).
в папке hooks создал файл hook_gallery.php следующего содержимого:Код: Выделить всё<? function gen_notes() { global $phpbb_root_path, $phpEx, $template; $template->assign_vars(array( 'U_NEW_NOTE' => append_sid("{$phpbb_root_path}gallery/notes/notes.$phpEx") )); } $phpbb_hook->register(array('template', 'display'), 'gen_notes'); ?> - Исполнительные файлы php для обработки заметок расположил в папке gallery/notes. Там же расположена и папка с файлами самих заметок.
Вот в принципе и все. Почистил кеш, обновил - заметки создаются, редактируются и удаляются корректно.
Вот так это сейчас выглядит:
И первый вопрос: заметил небольшой баг в опере: при создании новой заметки на "чистом" изображении сама форма не показывается до тех пор, пока снова не наведешь курсор мыши на кнопку создания (см. приложение 2). На изображении с уже имеющимися заметками такой баг отсутствует: форма появляется сразу.
Этот баг можно пронаблюдать и на авторской странице: удалить все заметки с фотографии (правой кнопкой мыши) и обновить страницу. При создании новой заметки форма появится только вышеописанным способом. Складывается впечатление, что z-index слоя с формой в опере скрыт под самим изображением и его необходимо дополнительно "активировать".
В FireFox работает все хорошо, а вот в IE8 сама форма перетаскивается крайне медленно (в авторской версии быстро). Подозреваю, что это связано с наличием на странице большого количества других скриптов. Можно это как-то подправить?
Теперь к сути вопроса:
На данный момент все заметки записываются в файлы. В дальнейшем предполагается заметки разделить на три класса вместо экспериментального .jquery-note_1-1:
- note_guest: может видеть заметки
- note_user: может добавлять и редактировать свои заметки
- note_admin: может редактировать любые заметки
В связи с чем появилась необходимость хранить данные о заметках не в файлах (как сейчас), а в базе данных.
При создании новой заметки должно вносится в таблицу id пользователя.
На данный момент управление заметками осуществляется классом note, расположенным по адресу gallery/notes/notes.class.php
Листинг с моими изменениями:
Код: Выделить всё
<?php
class note {
/**
* path to the notes of the image
* @var string
* @access private
*/
private $path;
private $user_id='origamika';
/**
* @description
* class constructor
*
* @param required : string $folder // folder for notes
* @param required : string $prefix // prefix
* @param required : string $image // image
* @param required : string $extension // extension for notes file
*
* @return : none
*
* @access : public
*/
public function __construct($folder, $prefix, $image, $extension) {
$this->path = $folder.$prefix.md5($image).$extension;
}
/**
* @description
* gets the note of the choosen image
*
* @param required : none
*
* @return : array
*
* @access : public
*/
public function getNotes() {
if (file_exists($this->path)) {
$handle = fopen($this->path, 'r');
$notes = $this->grabNotes(json_decode(fgets($handle)));
fclose($handle);
if (count($notes) > 0)
$notes = $this->sortNotes($notes);
else
$notes = array();
} else
$notes = array();
return $notes;
}
/**
* @description
* sort notes
*
* @param required : array $notes // notes
*
* @return : array
*
* @access : private
*/
private function sortNotes($notes) {
foreach ($notes as $key => $row)
$x[$key] = sqrt($row['TOP']+$row['LEFT']);
array_multisort($x, SORT_ASC, $notes);
return $notes;
}
/**
* @description
* grabs and transforms notes
*
* @param required : array $notes // notes
*
* @return : array
*
* @access : private
*/
private function grabNotes($notes) {
foreach ($notes as $note) {
$newNotes[] = array(
'ID' => $note->ID,
'LEFT' => $note->LEFT,
'TOP' => $note->TOP,
'WIDTH' => $note->WIDTH,
'HEIGHT' => $note->HEIGHT,
'DATE' => $note->DATE,
'NOTE' => $note->NOTE,
'AUTHOR' => $note->AUTHOR,
'LINK' => $note->LINK
);
}
return $newNotes;
}
/**
* @description
* adds a note to the choosen image
*
* @param required : string $position // position of the note
* @param required : string $note // value of the note
* @param required : string $author // author of the note
* @param required : string $link // link of the note
*
* @return : none
*
* @access : public
*/
public function addNote($position, $note, $author, $link) {
$properties = $this->setNote($position, $note, $author, $link);
if (!$properties)
return false;
$notes = $this->getNotes();
$id = 0;
foreach ($notes as $note) {
if ($note['ID'] > $id)
$id = $note['ID'];
}
$id++;
$notes[] = array(
'ID' => $id,
'LEFT' => $properties['LEFT'],
'TOP' => $properties['TOP'],
'WIDTH' => $properties['WIDTH'],
'HEIGHT' => $properties['HEIGHT'],
'DATE' => $properties['DATE'],
'NOTE' => $properties['NOTE'],
'AUTHOR' => $this->user_id,
'LINK' => $properties['LINK']
);
$this->saveNotes($notes);
return true;
}
/**
* @description
* saves all notes to the *.note data
*
* @param required : array $notes // notes
*
* @return : none
*
* @access : private
*/
private function saveNotes($notes) {
$handle = fopen($this->path, 'w+');
fwrite($handle, json_encode($notes));
fclose($handle);
}
/**
* @description
* deletes a note from the list of notes of the choosen image
*
* @param required : int $id // id of the note
*
* @return : none
*
* @access : public
*/
public function deleteNote($id) {
$notes = $this->getNotes();
for ($i = 0; $i < count($notes); $i++) {
if ($notes[$i]['ID'] == $id)
unset($notes[$i]);
}
$this->saveNotes($notes);
return true;
}
/**
* @description
* edits the position and the value of a choosen note
*
* @param required : int $id // id of the note
* @param required : string $position // position of the note
* @param required : string $note // value of the note
* @param required : string $author // author of the note
* @param required : string $link // link of the note
*
* @return : none
*
* @access : public
*/
public function editNote($id, $position, $note, $author, $link) {
$properties = $this->setNote($position, $note, $author, $link);
if (!$properties)
return false;
$notes = $this->getNotes();
for ($i = 0; $i < count($notes); $i++) {
if ($notes[$i]['ID'] == $id) {
$notes[$i] = array(
'ID' => $id,
'LEFT' => $properties['LEFT'],
'TOP' => $properties['TOP'],
'WIDTH' => $properties['WIDTH'],
'HEIGHT' => $properties['HEIGHT'],
'DATE' => $properties['DATE'],
'NOTE' => $properties['NOTE'],
'AUTHOR' => $properties['AUTHOR'],
'LINK' => $properties['LINK']
);
break;
}
}
$this->saveNotes($notes);
return true;
}
/**
* @description
* sets the position and the value of a new or edited note
*
* @param required : string $position // position of the note
* @param required : string $note // value of the note
* @param required : string $author // value of the author
* @param required : string $link // link of the note
*
* @return : array
*
* @access : private
*/
private function setNote($position, $note, $author, $link) {
$position = explode(',', $position);
if (count($position) != 4)
return false;
if (empty($note))
$note = '';
$note = str_replace("\n", ' ', $note);
while(strstr($note, ' '))
$note = str_replace(' ', ' ', $note);
$note = trim($note, ' ');
if (empty($author))
$author = '';
if (empty($link) || !$this->isValidLink($link))
$link = '';
if (empty($note) && empty($link))
return false;
return array(
'LEFT' => $position[0],
'TOP' => $position[1],
'WIDTH' => $position[2],
'HEIGHT' => $position[3],
'DATE' => array(
'Y' => date('Y', time()),
'M' => date('m', time()),
'D' => date('d', time()),
'H' => date('H', time()),
'I' => date('i', time())
),
'NOTE' => $note,
'AUTHOR' => $author,
'LINK' => $link
);
}
/**
* @description
* check valid uri
*
* @param required : string $link // link of note
*
* @return : boolean
*
* @access : private
*/
private function isValidLink($link) {
return preg_match('/^(https?:\/\/){1}+[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,6})(.*?)$/i', $link);
}
}
?>Добавил private $user_id='origamika'; которая затем в функции addNote определяет имя автора 'AUTHOR' => $this->user_id,
Вот собственно на этом я и остановился.
Главный вопрос: как в файл notes.class.php передать переменную ID пользователя вместо 'origamika' и как подключить сюда функции по работе с базой данных?
Заранее благодарю.
p.s. Не размещаю здесь пока свои наработки, поскольку не уверен в правильности проделанных изменений. Да и сам мод еще не доведен до логического завершения.
Если с Вашей помощью удастся реализовать все задуманное, то готовое решение обязательно выложу в этой теме.
Если для отладки кода понадобится доступ к тестовой галерее через FTP, могу сделать тестовый аккаунт.






