Пропустить

Модификация JNote для phpBB Gallery (nickvergessen)

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Свернуть Развернуть Правила форума Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).

Модификация JNote для phpBB Gallery (nickvergessen)

Сообщение loveorigami » 07.11.2011 15:44

Уважаемые гуру!
Вот решил к этой галерее "прикрутить" плагин JNote для создания заметок на изображениях.
Исходный скрипт находится на этой странице: http://jquery-notes.rydygel.de/samples.php. Все расположено в одной папке.
Я его адаптировал на страницу галереи согласно логической структуры форума.

Что сделал:
  1. Стили с изображениями перенес в файл theme/note.css, подключил в stylesheet.css: @import url("note.css");
  2. Скрипты расположил по адресу template/note/jquery-notes_js/jquery-notes_1.0.8.js, Jquery подключен был ранее.
  3. Исправил в созданных файлах note.css и jquery-notes_1.0.8.js конфликт с уже имеющимся на форуме CSS - классом "clearfix" - переименовал в "clearfix2".
  4. К ссылке изображения добавил класс 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.'" />';
  5. Внес изменения jquery-notes_1.0.8.js для id по "rel"
  6. Подключил необходимые скрипты и файлы на странице с изображением.
    Добавил следующие строки в файл 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>
    

  7. Переменная {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');
    ?>

  8. Исполнительные файлы php для обработки заметок расположил в папке gallery/notes. Там же расположена и папка с файлами самих заметок.

Вот в принципе и все. Почистил кеш, обновил - заметки создаются, редактируются и удаляются корректно.
Вот так это сейчас выглядит:
note1.jpg


И первый вопрос: заметил небольшой баг в опере: при создании новой заметки на "чистом" изображении сама форма не показывается до тех пор, пока снова не наведешь курсор мыши на кнопку создания (см. приложение 2). На изображении с уже имеющимися заметками такой баг отсутствует: форма появляется сразу.

Этот баг можно пронаблюдать и на авторской странице: удалить все заметки с фотографии (правой кнопкой мыши) и обновить страницу. При создании новой заметки форма появится только вышеописанным способом. Складывается впечатление, что z-index слоя с формой в опере скрыт под самим изображением и его необходимо дополнительно "активировать".

note2.jpg
Баг в опере


В 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, могу сделать тестовый аккаунт.
Аватара пользователя
loveorigami
phpBB 1.2.0
 
Сообщения: 15
Зарегистрирован: 14.12.2010 11:00
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.

Вернуться в Для авторов (phpBB 3.0.x)

 

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Бессрочный конкурс phpBB-ориентированных материалов
FastVPS — надёжный и доступный хостинг для phpBB
Место для вашей рекламы