Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Динамическая подгрузка данных по событию. Как реализовать?

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 830 раз

Re: Динамическая подгрузка данных по событию. Как реализовать?

Сообщение LavIgor »

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

P.S. Там речь шла про функцию, которой по сути не один год.

Отправлено спустя 12 минут 27 секунд:
KimIV писал(а): полный ноль в предмете
Могу примерно объяснить механизм, когда время появится.
Если нужно, конечно, поскольку разбираться в этом вопросе Вы уже начали.
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 8 месяцев
Откуда: Израиль
Благодарил (а): 73 раза
Поблагодарили: 248 раз

Re: Динамическая подгрузка данных по событию. Как реализовать?

Сообщение Алг »

KimIV писал(а): Изучаю внутренности jQuery...
Не стоит этого делать, гораздо эффективнее изучать интерфейс jQuery.
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 166 раз
Поблагодарили: 21 раз

Re: Динамическая подгрузка данных по событию. Как реализовать?

Сообщение KimIV »

Серверную часть завернуть в класс контроллера так и не получилось. Видимо, при обращении к любому из методов или свойств класса/объекта, формируется какое-то сообщение сервера. Сделал отдельный php-файл, как в примере KEMnEP и его вызов из скрипта. Работает!
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 830 раз

Re: Динамическая подгрузка данных по событию. Как реализовать?

Сообщение LavIgor »

KimIV, для работы Ajax-запросов в phpBB используется класс \phpbb\json_response(). Вы именно его использовали?
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 166 раз
Поблагодарили: 21 раз

Re: Динамическая подгрузка данных по событию. Как реализовать?

Сообщение KimIV »

LavIgor, я не знаю, что я использовал. Совершенно не владею терминами.

Вообщем, контроллер

Код: Выделить всё

<?php
/**
*
* @package phpBB Extension - fleaMarket
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace kimiv\fleaMarket\controller;

use Symfony\Component\HttpFoundation\Response;

class fm_register
{
   protected $config;
   protected $db;
   protected $auth;
   protected $template;
   protected $user;
   protected $helper;
   protected $phpbb_root_path;
   protected $php_ext;

	public function __construct(\phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\pagination $pagination, \phpbb\db\driver\driver_interface $db, \phpbb\auth\auth $auth, \phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, $phpbb_root_path, $php_ext, $table_prefix)
	{
		$this->config = $config;
		$this->request = $request;
		$this->pagination = $pagination;
		$this->db = $db;
		$this->auth = $auth;
		$this->template = $template;
		$this->user = $user;
		$this->helper = $helper;
		$this->phpbb_root_path = $phpbb_root_path;
		$this->php_ext = $php_ext;
		$this->table_prefix = $table_prefix;
		define(__NAMESPACE__ . '\FM_COUNTRY_TABLE', $this->table_prefix . 'fm_country');
		define(__NAMESPACE__ . '\FM_USERS_TABLE', $this->table_prefix . 'fm_users');
	}

	public function main()
	{
        //$start = $this->request->variable('start', 0);
        //$total_count    = 0;
        //$per_page        = 5;
        //$sql = 'SELECT COUNT(id) as total
        //    FROM ' . FM_USERS_TABLE . '';
        //$result = $this->db->sql_query($sql);
        //$row = $this->db->sql_fetchrow($result);
        //$total_count = $row['total'];
        //$this->db->sql_freeresult($result);

        //$pagination_url = append_sid("{$this->phpbb_root_path}mytest");
        //$this->pagination->generate_template_pagination($pagination_url, 'pagination', 'start', $total_count, $per_page, $start);

        // Подготовка списка стран
		$sql = 'SELECT *
            FROM ' . FM_COUNTRY_TABLE;
        $result = $this->db->sql_query($sql);
		$list_country = '<option value="0">' . $this->user->lang('FM_NOT_CHOSEN') . '</option>';
		while ($row = $this->db->sql_fetchrow($result))
		{
			$key = $row['country_id'];
			$value = $row['country_name'];
			$list_country .= '<option value="' . $key . '">' . $value . '</option>';
		}
		
		//Output the page
		$this->template->assign_vars(array(
			'S_FM_COUNTRY' => $list_country,
			'FM_REGISTER'  => $this->user->lang('FM_TEXT').' - '.$this->user->lang('REGISTER'),
		//	'PAGE_NUMBER'       => $this->pagination->on_page($total_count, $per_page, $start),
		));

		// Add to navlinks
		$this->template->assign_block_vars_array('navlinks', array(
			array(
				'FORUM_NAME'	=> $this->user->lang('FM_TEXT'),
				'U_VIEW_FORUM'	=> $this->helper->route('kimiv_fleaMarket_controller'),
			),
			array(
				'FORUM_NAME'	=> $this->user->lang('REGISTER'),
				'U_VIEW_FORUM'	=> $this->helper->route('kimiv_fm_register_controller'),
			),
		));

		page_header($this->user->lang('FM_TEXT').' - '.$this->user->lang('REGISTER'));
		$this->template->set_filenames(array('body' => 'fm_register.html'));
		page_footer();
		return new Response($this->template->return_display('body'), 200);
	}
}
Шаблон

Код: Выделить всё

<!-- INCLUDE overall_header.html -->
<!-- INCLUDEJS @kimiv_fleaMarket/fm_register.js -->
<form id="register" name="register" method="post" action="{S_UCP_ACTION}"{S_FORM_ENCTYPE}>

<div class="panel">
	<div class="inner">

	<h2>{SITENAME} - {L_FM_TEXT} - {L_REGISTER}</h2>

	<fieldset class="fields2">
		<div class="column1">
			<dl>
				<dt><label for="fm_country">{L_FM_COUNTRY}{L_COLON}</label></dt>
				<dd><select name="fm_country" id="fm_country" tabindex="1" title="{L_FM_COUNTRY}">{S_FM_COUNTRY}</select></dd>
			</dl>
			<dl>
				<dt><label for="fm_region">{L_FM_REGION}{L_COLON}</label></dt>
				<dd><select name="fm_region" id="fm_region" tabindex="2" onchange="change_fm_region(this.value); return false;" title="{L_FM_REGION}">{S_FM_REGION}</select></dd>
			</dl>
			<dl>
				<dt><label for="fm_city">{L_FM_CITY}{L_COLON}</label><br /><span>{L_FM_OFFICIAL_NAME}</span></dt>
				<dd><input name="fm_city" id="fm_city" tabindex="3" type="text" size="35" value="{FM_CITY}" class="inputbox autowidth" title="{L_FM_CITY}" /></dd>
			</dl>
			<dl>
				<dt><label for="fm_currency_view">{L_FM_CURRENCY_VIEW}{L_COLON}</label></dt>
				<dd><select name="fm_currency_view" id="fm_currency_view" tabindex="4" onchange="change_fm_currency_view(this.value); return false;" title="{L_FM_CURRENCY_VIEW}">{S_NOT_CHOSEN}</select></dd>
			</dl>
			<dl>
				<dt><label for="fm_currency_sale">{L_FM_CURRENCY_SALE}{L_COLON}</label></dt>
				<dd><select name="fm_currency_sale" id="fm_currency_sale" tabindex="5" onchange="change_fm_currency_sale(this.value); return false;" title="{L_FM_CURRENCY_SALE}">{S_NOT_CHOSEN}</select></dd>
			</dl>
			<dl>
				<dt><label for="fm_info_seller">{L_FM_INFO_SELLER}{L_COLON}</label><br /><span>{L_FM_INFO_EXPLAIN}</span></dt>
				<dd><textarea name="fm_info_seller" id="fm_info_seller" tabindex="6" cols="29" rows="4" value="{FM_INFO_SELLER}" class="inputbox autowidth" title="{L_FM_INFO_SELLER}"></textarea></dd>
			</dl>
			<dl>
				<dt><label for="fm_info_buyer">{L_FM_INFO_BUYER}{L_COLON}</label><br /><span>{L_FM_INFO_EXPLAIN}</span></dt>
				<dd><textarea name="fm_info_buyer" id="fm_info_buyer" tabindex="7" cols="29" rows="4" value="{FM_INFO_BUYER}" class="inputbox autowidth" title="{L_FM_INFO_BUYER}"></textarea></dd>
			</dl>
		</div>

		<div class="column2">
			<div class="navbar">
				<div class="inner">
					<div class="fm_options">
						<label for="fm_options_delivery">{L_FM_OPTIONS_DELIVERY}{L_COLON}</label>
					</div>
					<label for="fm_pickup"><input type="checkbox" name="fm_pickup" id="fm_pickup" tabindex="8">&nbsp;{L_FM_PICKUP}</label><br />
					<label for="fm_meeting"><input type="checkbox" name="fm_meeting" id="fm_meeting" tabindex="9">&nbsp;{L_FM_MEETING}</label><br />
					<label for="fm_mailing"><input type="checkbox" name="fm_mailing" id="fm_mailing" tabindex="10">&nbsp;{L_FM_MAILING}</label><br />
					<label for="fm_sending_tc_self"><input type="checkbox" name="fm_sending_tc_self" id="fm_sending_tc_self" tabindex="11">&nbsp;{L_FM_SENDING_TC_SELF}</label><br />
					<label for="fm_sending_tc_pickup"><input type="checkbox" name="fm_sending_tc_pickup" id="fm_sending_tc_pickup" tabindex="12">&nbsp;{L_FM_SENDING_TC_PICKUP}</label><br />
					<label for="fm_delivery_itself"><input type="checkbox" name="fm_delivery_itself" id="fm_delivery_itself" tabindex="13">&nbsp;{L_FM_DELIVERY_ITSELF}</label><br />
					<label for="fm_sending_courier"><input type="checkbox" name="fm_sending_courier" id="fm_sending_courier" tabindex="14">&nbsp;{L_FM_SENDING_COURIER}</label><br />
					<dl>
						<dt><label for="fm_add_delivery">{L_FM_ADDITIONAL_TERMS}{L_COLON}</label></dt>
						<dd><textarea name="fm_add_delivery" id="fm_add_delivery" tabindex="15" cols="29" rows="2" value="{FM_ADD_DELIVERY}" class="inputbox autowidth" title="{L_FM_ADDITIONAL_TERMS}"></textarea></dd>
					</dl>
				</div>
			</div><br>
			<div class="navbar">
				<div class="inner">
					<div class="fm_options">
						<label for="fm_options_payment">{L_FM_OPTIONS_PAYMENT}{L_COLON}</label>
					</div>
					<label for="fm_cash"><input type="checkbox" name="fm_cash" id="fm_cash" tabindex="16">&nbsp;{L_FM_CASH}</label><br />
					<label for="fm_on_mobile"><input type="checkbox" name="fm_on_mobile" id="fm_on_mobile" tabindex="17">&nbsp;{L_FM_ON_MOBILE}</label><br />
					<label for="fm_transfer"><input type="checkbox" name="fm_transfer" id="fm_transfer" tabindex="18">&nbsp;{L_FM_TRANSFER}</label><br />
					<label for="fm_transfer_card"><input type="checkbox" name="fm_transfer_card" id="fm_transfer_card" tabindex="19">&nbsp;{L_FM_TRANSFER_CARD}</label><br />
					<label for="fm_cashless_payment"><input type="checkbox" name="fm_cashless_payment" id="fm_cashless_payment" tabindex="20">&nbsp;{L_FM_CASHLESS_PAYMENT}</label><br />
					<label for="fm_imposed_payment"><input type="checkbox" name="fm_imposed_payment" id="fm_imposed_payment" tabindex="21">&nbsp;{L_FM_IMPOSED_PAYMENT}</label><br />
					<label for="fm_postal_transfer"><input type="checkbox" name="fm_postal_transfer" id="fm_postal_transfer" tabindex="22">&nbsp;{L_FM_POSTAL_TRANSFER}</label><br />
					<label for="fm_e_money"><input type="checkbox" name="fm_e_money" id="fm_e_money" tabindex="23">&nbsp;{L_FM_E_MONEY}</label><br />
					<dl>
						<dt><label for="fm_add_payment">{L_FM_ADDITIONAL_TERMS}{L_COLON}</label></dt>
						<dd><textarea name="fm_add_payment" id="fm_add_payment" tabindex="15" cols="29" rows="2" value="{FM_ADD_PAYMENT}" class="inputbox autowidth" title="{L_FM_ADDITIONAL_TERMS}"></textarea></dd>
					</dl>
				</div>
			</div>
		</div>
	</fieldset>
	</div>
</div>

<div class="panel">
	<div class="inner">
		<fieldset class="submit-buttons">
			{S_HIDDEN_FIELDS}
			<input type="reset" value="{L_RESET}" name="reset" class="button2" />&nbsp;
			<input type="submit" tabindex="9" name="submit" id="submit" value="{L_SUBMIT}" class="button1 default-submit-action" />
			{S_FORM_TOKEN}
		</fieldset>
	</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
Скрипт

Код: Выделить всё

// При полной загрузке документа мы начинаем определять события
$(document).ready(function ()
{
	// На выборе селекта страны — вешаем событие, функция будет брать значение этого селекта
	// и с помощью ajax запроса получать список регионов для вставки в следующий селект
    $('#fm_country').change(function ()
	{
		// В переменную country_id положим значение селекта (выбранная страна)
        var country_id = $(this).val();
		// Если значение селекта равно 0, т.е. не выбрана страна, то мы не будем ничего делать
        if (country_id == '0')
		{
            $('#fm_region').html('<option>- выберите регион -</option>');
            $('#fm_region').attr('disabled', true);
            return(false);
        }
		// Очищаем второй селект с регионами и блокируем его через атрибут disabled
		// туда мы будем класть результат запроса
        $('#fm_region').attr('disabled', true);
        $('#fm_region').html('<option>загрузка...</option>');
		// url запроса регионов
        var url = 'ext/kimiv/fleaMarket/controller/fm_Get_Regions.php';
		// GET'овый AJAX запрос. Данные будем кодировать с помощью JSON
        $.get(
            url,
            "id=" + country_id,
            function (result)
			{
                if (result.type == 'error')
				{
                    alert('error');
                    return(false);
                }
                else
				{
					// проходимся по пришедшему от бэк-энда массиву циклом
                    var options = '';
                    $(result.regions).each(function()
					{
						// * и добавляем в селект по региону
                        options += '<option value="' + $(this).attr('region_id') + '">' + $(this).attr('region_name') + '</option>';
                    });
 
                    $('#fm_region').html('<option value="0">- выберите регион -</option>'+options);
                    $('#fm_region').attr('disabled', false);
                }
            },
            "json"
        );
    });
});
Серверная часть выборки региона

Код: Выделить всё

<?php
include '../../../../config.php';
$link = mysql_connect($dbhost, $dbuser, $dbpasswd);
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
mysql_select_db($dbname, $link);
$country_id = @intval($_GET['id']);

$regs=mysql_query("SELECT region_name FROM ".$table_prefix."fm_region WHERE country_id=$country_id");
if ($regs)
{
	$num = mysql_num_rows($regs);     
	$i = 0;
	while ($i < $num)
	{
		$regions[$i] = mysql_fetch_assoc($regs);  
		$i++;
	}    
	$result = array('regions'=>$regions); 
}
else
{
	$result = array('type'=>'error');
}
print json_encode($result);
?>
Регионы подгружаются! Всё работает, как надо!
Image 5.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Вернуться в «Для разработчиков»