Добавление полей страна, регион и город в SocialEngine Excalibur

12 августа 2009

Мне и моему другу захотелось создать свою социальную сеть, перебрали множество движков и остановились на SocialEngine Excalibur 3.15. По нашему мнению, SocialEngine Excalibur - это отличный движок для создания своей социальной сети, множество настроек, плагинов, но самое главное - серьезно мощный и простой в понимании код скриптов. Если имеются знания в таких языках как html, php и JavaScript, можно с легкостью переписать код скриптов SocialEngine под свои нужды.

У нас возникла проблема, когда необходимо было добавить новые поля в профиль участника: страну, регион и город. В скрипте SocialEngine Excalibur, который имеется у нас, была база с этими данными, в файлах присутствовал код, ответственен за работу с данными полями. Но возник вопрос, почему при редактировании профиля не было этих полей?

Сначала искали ответ на этот вопрос на форуме SocialEngine Excalibur, даже создали свою тему, но ответа так и не получили. Я решил, что ответ мы не получим и если получим, то не скоро. Было принято решение сделать все своими руками, применив знания программирования.

SocialEngine Excalibur

Для того чтобы поля «Страна», «Регион» и «Город» появились в SocialEngine Excalibur в разделе «Редактировать профиль» необходимо:

  1. Импортировать данные из файла cities.sql в Вашу базу данных, выполнив запрос SQL или импорт файла целиком в phpmyadmin.
  2. Открыть: user_editprofile.tpl

    Найти

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

    <div class='form_desc'>
      {lang_print id=$fields[field_loop].field_desc}
    </div>
     
    {capture assign='current_subnet'}
      {lang_print id=$user->subnet_info.subnet_name}
    {/capture}
     
    {if $fields[field_loop].field_id == $setting.setting_subnet_field1_id || $fields[field_loop].field_id == $setting.setting_subnet_field2_id}
      {lang_sprintf id=766 1=$current_subnet}
    {/if}
     
    {capture assign='field_error'}
      {lang_print id=$fields[field_loop].field_error}
    {/capture}
     
    {if $field_error != ''}
      <div class='form_error'><img src='./images/icons/error16.gif' border='0' class='icon'> {$field_error}</div>
    {/if}
    </td>
    </tr>
    {/section}

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

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

    {if $cat_id == 3}
    <tr>
    <td class='form1' width='150'>Страна</td>
    <td class='form2'>
      <div>
        <select name='dhtmlgoodies_country' id='dhtmlgoodies_country' onchange='getRegionList(this.value);'>
          <option id='op' value='-1'></option>
          {$country}
        </select>
      </div>
      <div id='dhtmlgoodies_country'>
        Страна, в которой Вы в текущий момент проживаете.
      </div>
     
      <div class='form_desc'></div>
    </td>
    </tr>
    <tr>
      <td class='form1' width='150'>Регион</td>
      <td class='form2'>
        <div>
          <select name='dhtmlgoodies_region' id='dhtmlgoodies_region' onchange='getCityList(this.value);'>
            <option id='op' value='-1'></option>
            {$region}
          </select>
     
        </div>
        <div id='dhtmlgoodies_region'>
          Регион, в котором Вы в текущий момент проживаете.
        </div>
     
        <div class='form_desc'></div>
      </td>
    </tr>
    <tr>
      <td class='form1' width='150'>Город</td>
      <td class='form2'>
      <div>
        <select name='dhtmlgoodies_city' id='dhtmlgoodies_city'>
          <option id='op' value='-1'></option>
          {$city}
        </select>
      </div>
      <div id='dhtmlgoodies_city'>
        Город, в котором Вы в текущий момент проживаете.
      </div>
     
      <div class='form_desc'></div>
      </td>
    </tr>
    {/if}

    Условие {if $cat_id == 3} отвечает за отображение полей только в подкатегории «Персональная информация», это нужно если Вы собираетесь создавать дополнительные подкатегории, как, например, у нас создана {$country}, {$region} и {$city} - данные, которые формируются php-скриптом в файле user_editprofile.php

  3. Открыть: header_global.tpl

    Найти

    var countryCode = sel.options[sel.selectedIndex].value;

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

    var countryCode = sel;

    Найти

    var regionCode = sel.options[sel.selectedIndex].value;

    Заменить

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

    var regionCode = sel;

Открыть: user_editprofile.php

Найти

if( isset($_POST['dhtmlgoodies_country']) ) {
 
  $country = $_POST['dhtmlgoodies_country'];
  $sql = "SELECT profilevalue_7 FROM cites_profilevalues WHERE profilevalue_id=$id_ex LIMIT 1";
  if( !$database->database_query($sql) ) {
    $query = "INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_7) VALUES ($id_ex, '$country')";
    $database->database_query($query);
  }
  else {
    $query = "UPDATE cites_profilevalues SET profilevalue_7 = '$country' WHERE cites_profilevalues.profilevalue_id = $id_ex";
    $database->database_query($query);
  }
}
 
if( isset($_POST['dhtmlgoodies_region']) ) {
  $region = $_POST['dhtmlgoodies_region'];
 
  $sql = "SELECT profilevalue_8 FROM cites_profilevalues WHERE profilevalue_id=$id_ex LIMIT 1";
  if( !$database->database_query($sql) ) {
    $query = "INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_8) VALUES ($id_ex, '$region')";
    $database->database_query($query);
  }
  else {
    $query = "UPDATE cites_profilevalues SET profilevalue_8 = '$region' WHERE cites_profilevalues.profilevalue_id = $id_ex";
    $database->database_query($query);
  }
}
 
if( isset($_POST['dhtmlgoodies_city']) ) {
  $city = $_POST['dhtmlgoodies_city'];
 
  $sql = "SELECT profilevalue_9 FROM cites_profilevalues WHERE profilevalue_id = $id_ex LIMIT 1";
  if( !$database->database_query($sql) ) {
    $query = "INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_9) VALUES ($id_ex, '$city')";
    $database->database_query($query);
  }
  else {
    $query = "UPDATE cites_profilevalues SET profilevalue_9 = '$city' WHERE cites_profilevalues.profilevalue_id = $id_ex";
    $database->database_query($query);
  }
}

Заменить

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

if( isset($_POST['dhtmlgoodies_country']) ) {
 
  $country = $_POST['dhtmlgoodies_country'];
 
  $country_tb = $database->database_fetch_assoc($database->database_query("SELECT profilevalue_id FROM cites_profilevalues WHERE profilevalue_id='" . $user->user_info['user_id'] . "' LIMIT 1"));
 
  $country_id = $country_tb[profilevalue_id];
 
  if($country_id <= 0) {
    $query = "INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_7) VALUES ($id_ex, '$country')";
    $database->database_query($query);
  }
  else {
    $query = "UPDATE cites_profilevalues SET profilevalue_7 = '$country' WHERE cites_profilevalues.profilevalue_id = '" . $user->user_info['user_id'] . "'";
    $database->database_query($query);
  }
}
 
if( isset($_POST['dhtmlgoodies_region']) ) {
  $region = $_POST['dhtmlgoodies_region'];
  $region_tb = $database->database_fetch_assoc($database->database_query("SELECT profilevalue_id FROM cites_profilevalues WHERE profilevalue_id='" . $user->user_info['user_id'] . "' LIMIT 1"));
  $region_id = $region_tb[profilevalue_id];
 
  if($region_id <= 0)  {
    $query = "INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_8) VALUES ($id_ex, '$region')";
    $database->database_query($query);
  }
  else {
    $query = "UPDATE cites_profilevalues SET profilevalue_8 = '$region' WHERE cites_profilevalues.profilevalue_id = '" . $user->user_info['user_id'] . "'";
    $database->database_query($query);
  }
}
 
if( isset($_POST['dhtmlgoodies_city']) ) {
  $city = $_POST['dhtmlgoodies_city'];
  $city_tb = $database->database_fetch_assoc($database->database_query("SELECT profilevalue_id FROM cites_profilevalues WHERE profilevalue_id='" . $user->user_info['user_id'] . "' LIMIT 1"));
  $city_id = $city_tb[profilevalue_id];
 
  if($city_id <= 0) {
    $query = "INSERT INTO cites_profilevalues (profilevalue_id, profilevalue_9) VALUES ($id_ex, '$city')";
    $database->database_query($query);
  }
  else {
    $query = "UPDATE cites_profilevalues SET profilevalue_9 = '$city' WHERE cites_profilevalues.profilevalue_id = '" . $user->user_info['user_id'] . "'";
    $database->database_query($query);
  }
}

Найти

$sql = $database->database_query ("SELECT * FROM country");
$countries = array();
 
while ($country = $database->database_fetch_assoc ($sql)) {
  $countries[] = $country;
}
 
$smarty->assign('countries', $countries);

Заменить

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

$country_tb = $database->database_fetch_assoc($database->database_query("SELECT profilevalue_7 FROM cites_profilevalues WHERE profilevalue_id='" . $user->user_info['user_id'] . "' LIMIT 1"));
$country_id = $country_tb[profilevalue_7];

$sql = $database->database_query ("SELECT * FROM country");
while ($country_bd = $database->database_fetch_assoc ($sql)) {

	if($country_id == $country_bd[country_id])
		$country_sel = ' SELECTED';
	else
		$country_sel = '';

	$country .= "<option value='" . $country_bd[country_id] . "'" . $country_sel . ">" . $country_bd[name] . "</option>\n";

}

$region_tb = $database->database_fetch_assoc($database->database_query("SELECT profilevalue_8 FROM cites_profilevalues WHERE profilevalue_id='" . $user->user_info['user_id'] . "' LIMIT 1?));
$region_id = $region_tb[profilevalue_8];

if($region_id > 0) {
	$region_tb = $database->database_fetch_assoc($database->database_query("SELECT region_id, name FROM region WHERE region_id='" . $region_id . "' LIMIT 1"));
	$region .= "<option value='" . $region_tb[region_id] . "' SELECTED>" . $region_tb[name] . "</option>\n";
}
else {
	$sql = $database->database_query ("SELECT * FROM region");
	while ($region_bd = $database->database_fetch_assoc ($sql)) {

		if($region_id == $region_bd[region_id])
			$region_sel = ' SELECTED';
		else
			$region_sel = '';

		$region .= "<option value='" . $region_bd[region_id] . "'" . $region_sel . ">" . $region_bd[name] . "</option>\n";
	}
}

$city_tb = $database->database_fetch_assoc($database->database_query("SELECT profilevalue_9 FROM cites_profilevalues WHERE profilevalue_id='" . $user->user_info['user_id'] . "' LIMIT 1"));
$city_id = $city_tb[profilevalue_9];
if($city_id > 0) {
	$city_tb = $database->database_fetch_assoc($database->database_query("SELECT city_id, name FROM city WHERE city_id='" . $city_id . "' LIMIT 1"));
	$city .= "<option value='" . $city_tb[city_id] . "' SELECTED>" . $city_tb[name] . "</option>\n";
}

else {
	$sql = $database->database_query ("SELECT * FROM city ORDER BY name ASC");
	while ($city_bd = $database->database_fetch_assoc($sql)) {

		if($city_id == $city_bd[city_id])
			$city_sel = ' SELECTED';
		else
			$city_sel = '';

		$city .= "<option value='" . $city_bd[city_id] . "'" . $city_sel . ">" . $city_bd[name] . "</option>\n";
	}
}

$smarty->assign('country', $country);
$smarty->assign('region', $region);
$smarty->assign('city', $city);

Если Вы выполнили все действия правильно, то теперь участники Вашей социальной сети SocialEngine Excalibur могут указать в профиле страну, регион и город проживания.

Также данную статью можно скачать в формате doc.

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