Плагин музыка — копирование музыки у друзей в SocialEngine Excalibur

30 августа 2009

В этой статье поговорим о плагине “Музыка”, а именно о копировании музыки у друзей. А что тут говорить, такой возможности в плагине “Музыка” нет, так вот я покажу, как в несколько шагов реализовать такую возможность. Так сказать модифицируем плагин Музыка такие образом, чтобы он поддерживал возможность Копирование музыки у друзей.

Копирование музыки у друзей

Сначала необходимо добавить еще одно поле в таблицу «se_music», где хранятся записи о добавленным песнях. Выполним sql-запрос:

ALTER TABLE `se_music` ADD `owner_user_id` text AFTER `music_user_id`

Для работы функции «is_already_music()», которая возвращает логическую ложь в том случае, если у участника нет данной песни в его коллекции, пропишем ее в класс «user».

  1. Открыть: class_user.php
    Подсказка: Данный файл находится в папке include.
    Найти
    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть. Данная часть кода находится внутри функции user_message_view ().

    return array
        (
          'collaborators' => &$collaborators,
          'pms'           => &$pms
        );
      }
    

    Добавить после

    Подсказка: Добавьте эти строки на новой строке после ранее найденных строк.

    function is_already_music($music_id)
    {
    	global $database;
    
    	$music_tb = $database->database_fetch_assoc($database->database_query("SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1"));
    	$owner_user_id = $music_tb[owner_user_id];
    
    	if(substr_count($owner_user_id, $this->user_info['user_id']) == 0)
    		return 0;
    	else
    		return 1;
    	return 1;
    }
    

    Далее уже будем работать с файлами, отвечающими за вывод и добавление музыки.

  2. Открыть: class_music.php
    Найти
    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть. Данная часть кода находится внутри функции music_list ().

    if( $this->user_id ) $sql .= "
          WHERE
            se_music.music_user_id='{$this->user_id}'
        ";
    

    Заменить

    Подсказка: Произведите замену ранее найденных строк.

    if( $this->user_id ) $sql .= "
          WHERE
            se_music.music_user_id='{$this->user_id}' OR FIND_IN_SET('{$this->user_id}', owner_user_id)";
  3. Открыть: browse_music.php
    Найти
    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    $music_object = new se_music();

    Добавить

    Подсказка: Добавьте эти строки на новой строке перед ранее найденными строками.

    $music_id = $_GET['music_id'];
    if( $_GET['task'] == "copy" && $music_id > 0)
    {
    	ob_end_clean();
    
    	$music_tb = $database->database_fetch_assoc($database->database_query("SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1"));
    	$owner_user_id = trim($music_tb[owner_user_id]);
    
    	if(strrchr($owner_user_id, ','))
    	{
    		$owner_user_id_text = explode(',', $owner_user_id);
    		$owner_user_id_update = "";
    		foreach($owner_user_id_text as $owner_user_id)
    		{
    			if($owner_user_id != $user->user_info['user_id'])
    				$owner_user_id_update = $owner_user_id_update . "" . $owner_user_id . ",";
    		}
    		$owner_user_id_update = $owner_user_id_update . "" . $user->user_info['user_id'];
    	}
    	else
    	{
    		if($owner_user_id == $user->user_info['user_id'] || strlen($owner_user_id) == 0)
    			$owner_user_id_update = $user->user_info['user_id'];
    		if( strlen($owner_user_id) > 0 )
    			$owner_user_id_update = $owner_user_id . "," . $user->user_info['user_id'];
    	}
    	$database->database_query("UPDATE `se_music` SET `owner_user_id` = '{$owner_user_id_update}' WHERE `music_id` = '{$music_id}' LIMIT 1");
    }
  4. Открыть: user_music.php
    Найти
    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    $musiclist = $music->music_list();

    Добавить

    Подсказка: Добавьте эти строки на новой строке перед ранее найденными строками.

    if( $task == "removesong" && $music_id > 0)
    {
    	ob_end_clean();
    
    	$music_tb = $database->database_fetch_assoc($database->database_query("SELECT owner_user_id FROM se_music WHERE music_id='{$music_id}' LIMIT 1"));
    	$owner_user_id = $music_tb[owner_user_id];
    
    	if(strrchr($owner_user_id, ','))
    	{
    		$owner_user_id_text = explode(',', $owner_user_id);
    		$owner_user_id_db = "";
    		foreach($owner_user_id_text as $owner_user_id)
    		{
    			if($owner_user_id != $user->user_info['user_id'])
    				$owner_user_id_db = $owner_user_id_db . "" . $owner_user_id . ",";
    		}
    		$owner_user_id_db = trim(substr_replace($owner_user_id_db, "", strlen($owner_user_id_db) - 1));
    	}
    	else
    	{
    		if($owner_user_id == $user->user_info['user_id'])
    			$owner_user_id_text = '';
    	}
    	$database->database_query("UPDATE `se_music` SET `owner_user_id` = '{$owner_user_id_db}' WHERE `music_id` = '{$music_id}' LIMIT 1");
    }
    
  5. Открыть: browse_music.tpl
    Найти
    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    {if $user->user_exists && $user->level_info.level_music_allow_downloads}</pre>
    <div style="margin-top: 4px;"><a type="application/force-download" href="{$media_path}">{lang_print id=4000095}</a></div>
    <pre>
            {/if}
    
    
    

    Добавить после
    Подсказка: Добавьте эти строки на новой строке после ранее найденных строк.

    {if $user->user_friended($browse_music_list[browse_music_list_loop].user_id, 1) && $user->is_already_music($browse_music_list[browse_music_list_loop].music_id) == 0}</pre>
    <div style="font-weight: bold; font-size: 8pt; text-align: right;"><a title="Скопировать музыку к себе" href="browse_music.php?task=copy&music_id={$browse_music_list[browse_music_list_loop].music_id}">Копировать</a></div>
    <pre>
     {/if}
    
  6. Открыть: user_music.tpl
    Найти
    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    {assign var='media_dir' value=$url->url_userdir($user->user_info.user_id)}
    {section name=music_loop loop=$musiclist}
    

    Заменить

    Подсказка: Произведите замену ранее найденных строк.

    {section name=music_loop loop=$musiclist}
          {assign var='media_dir' value=$url->url_userdir($musiclist[music_loop].music_user_id)}
    

    Найти

    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    <input type="checkbox" name="delete_music_{$musiclist[music_loop].music_id}" value="1" />

    Заменить

    Подсказка: Произведите замену ранее найденных строк.

    {if $musiclist[music_loop].music_user_id == $user->user_info.user_id}<input type="checkbox" name="delete_music_{$musiclist[music_loop].music_id}" value="1" />{/if}

    Найти

    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    <span class="seMusicTitleEdit"> (<a onclick="SocialEngine.Music.editMusicTitle({$musiclist[music_loop].music_id});" href="javascript:void(0);">{lang_print id=187}</a>)</span>

    Заменить

    Подсказка: Произведите замену ранее найденных строк.

    {if $musiclist[music_loop].music_user_id == $user->user_info.user_id}<span class="seMusicTitleEdit"> (<a onclick="SocialEngine.Music.editMusicTitle({$musiclist[music_loop].music_id});" href="javascript:void(0);">{lang_print id=187}</a>)</span>{/if}

     

    Найти

    Подсказка: Возможно, здесь приведена не вся строка, а лишь ее часть.

    <span class="seMusicDelete"><a onclick="SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});" href="javascript:void(0);">{lang_print id=155}</a> </span>

    Заменить

    Подсказка: Произведите замену ранее найденных строк.

    {if $musiclist[music_loop].music_user_id == $user->user_info.user_id}
    <span class="seMusicDelete"><a onclick="SocialEngine.Music.deleteMusic({$musiclist[music_loop].music_id});" href="javascript:void(0);">{lang_print id=155}</a> </span>
    {else}
    <span class="seMusicDelete"><a href=" user_music.php?task=removesong&music_id={$musiclist[music_loop].music_id}">{lang_print id=155}</a> </span>
    {/if}
    

Готово! Теперь на странице «browse_music.php» напротив музыки будет показана ссылка «Копировать» в том случае, если ее нет у участника. На странице «user_music.php» можно будет удалить музыку, которую скопировали от друзей.

Если удобнее читать данную статью в программе Word, можно скачать по ссылке Плагин музыка – копирование музыки у друзей в SocialEngine Excalibur

Автор: Евтеев Евгений Александрович