[D7] Module Form Register with custom fields

Post Reply
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

[D7] Module Form Register with custom fields

Post by tthlan »

Hướng dẫn tạo module cho Register form trên Drupal 7

Image

Part 1 : theme, menu definitions

- Define theme dùng trong module
- Define link url hay menu cho module

Code: Select all

<?php
/**
	* @file
	* form_register.module
*/

function form_register_theme() {
	return array(
		'form_register_form' => array(
			'render element' => 'form',
			'template' => 'form_register', // Lưu cùng cấp folder module : file form_register.tpl.php
		),
	);
}


function form_register_menu() { // Nếu không có function này thì sẽ không truy cập được module từ url hoặc menu
	$items = array();

	$items['form_register'] = array( //this creates a URL that will call this form at "form_register"
	'title' => 'New Member Resigtration', //page title
	'description' => 'A Member Register Form.',
	'type' =>MENU_NORMAL_ITEM,
	'page callback' => 'form_register_page',
	'page arguments' => array(),
	'access arguments' => array('access content'),
	'access callback' => TRUE,
  'expanded' => TRUE,
	);

	return $items;
}

function form_register_page()
{
	$form['form_register_form'] = (drupal_get_form('form_register_form')); // get form
	
	return $form;
}
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

Re: [D7] Module Form Register with custom fields

Post by tthlan »

Part 2: Định nghĩa những control fields dùng trên form

- Add các field control thông dụng
- Cách thêm thuộc tính, thay đổi class
- Tham khảo thêm Form API Reference | Drupal 7 | Drupal API

Code: Select all

function form_register_form($form, &$form_state) {

	$form['user'] = array(
	'#type' => 'textfield', //you can find a list of available types in the form api
	'#size' => 42,
	'#maxlength' => 10,
	'#attributes' => array(
		'placeholder' => array(t('ユーザー名')),// thêm thuộc placeholder html5
		'required' => array(t('required')), // thêm thuộc required html5
	),
	'#theme_wrappers' => array(),
	);

	$form['mail'] = array(
	'#type' => 'textfield', //you can find a list of available types in the form api
	'#size' => 42,
	'#maxlength' => 50,
	'#attributes' => array(
		'placeholder' => array(t('メールアドレス')), // thêm thuộc placeholder html5
		'required' => array(t('required')), // thêm thuộc required html5
	),
	'#required' => TRUE, //make this field required
	'#theme_wrappers' => array(),
	);

	$form['pass'] = array(
	'#type' => 'password', //you can find a list of available types in the form api
	'#size' => 42,
	'#maxlength' => 20,
	'#attributes' => array(
		'placeholder' => array(t('パスワード作成')), // thêm thuộc placeholder html5
		'required' => array(t('required')), // thêm thuộc required html5
	),
	'#required' => TRUE, //make this field required
	'#theme_wrappers' => array(),
	);

	$form['year'] = array(
	'#type' => 'textfield', //you can find a list of available types in the form api
	'#size' => 4,
	'#maxlength' => 4,
	'#attributes' => array(
			'class' => array(t('w100 first')),
			'required' => array(t('required')), // thêm thuộc required html5
		),
	'#theme_wrappers' => array(),
	);

	$form['month'] = array(
	'#type' => 'textfield', //you can find a list of available types in the form api
	'#size' => 2,
	'#maxlength' => 2,
	'#attributes' => array(
			'class' => array(t('w50')),
			'required' => array(t('required')), // thêm thuộc required html5
		),
	'#theme_wrappers' => array(),
	);

	$form['day'] = array(
	'#type' => 'textfield', //you can find a list of available types in the form api
	'#maxlength' => 2,
	'#attributes' => array(
			'class' => array('w50'), // thay đổi class dùng cho textfield
			'required' => array(t('required')), // thêm thuộc required html5
		),
	'#theme_wrappers' => array(),
	);

	$form['gender'] = array(
	'#type' => 'radios',
	'#options' => array( 1=>t('女性'),0=>t('男性'),),
	'#default_value' => isset($node->active) ? $node->active : 1,
	'#required' => TRUE, //make this field required
	'#theme_wrappers' => array(),
	);

	require_once DRUPAL_ROOT . '/includes/locale.inc';
	$options = country_get_list();
	$options = country_options();

	$form['country'] = array(
	'#type' => 'select', //you can find a list of available types in the form api
	'#default_value' => array('JP'), //make this field required
	'#maxlength' => 2,
	'#attributes' => array(
			'class' => array('w100'), // thay đổi class dùng cho select
		),
	'#options' => $options,
	'#theme_wrappers' => array(),
	);

	$prefecturals = prefectural_options();
	 $form['prefectural'] = array(
		'#type' => 'select', //you can find a list of available types in the form api
		'#default_value' => isset($_GET['name']) ? $_GET['name'] : '0',
		'#attributes' => array(
			'class' => array('w140'), // thay đổi class dùng cho select
		),
		'#options' => $prefecturals,
		'#theme_wrappers' => array(),
	);

	$form['submit'] = array(
		'#type' => 'submit',
		'#value' => t('この内容で会員登録'), //'この内容で会員登録',
		'#default_value' => isset($_GET['name']) ? $_GET['name'] : '0',
		'#attributes' => array(
			'class' => array( 'login03 w140' ), // Thay đổi class dùng cho button
		),
	);
//$form['#validate'][] = 'form_register_form_validate';
	return $form;
}
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

Re: [D7] Module Form Register with custom fields

Post by tthlan »

Part 3: Submit function và Validate Function

- Khai báo function Validate trước khi submit form
- Khai báo function khi submit form

Code: Select all

function form_register_form_validate($form, &$form_state) {
	
	$form_state['values']['gender'] = $_POST['gender'];
	
	if (!(is_numeric($form_state['values']['day']) xor
	is_numeric($form_state['values']['month']) xor
	is_numeric($form_state['values']['year'])))
		form_set_error('day', t('The specified date is invalid.'));
	else if (!checkdate($form_state['values']['month'], $form_state['values']['day'], $form_state['values']['year'])) {
    form_set_error('day', t('The specified date is invalid.'));
  }
	
	if ($error = user_validate_name($form_state['values']['user'])) {
		form_set_error('name', $error);
	}
	elseif ((bool) db_select('users')->
		fields('users', array('uid'))->

		condition('name', db_like($form_state['values']['user']), 'LIKE')->
		range(0, 1)->execute()->fetchField()) {
		form_set_error('name', t('The name %name is already taken.', array('%name' => $form_state['values']['user'])));
	}

	// Trim whitespace from mail, to prevent confusing 'e-mail not valid'
	// warnings often caused by cutting and pasting.
	$mail = trim($form_state['values']['mail']);

	// Validate the e-mail address, and check if it is taken by an existing user.
	if ($error = user_validate_mail($form_state['values']['mail'])) {
		form_set_error('mail', $error);
	}
	elseif ((bool) db_select('users')->fields('users', array('uid'))->condition('mail', db_like($form_state['values']['mail']), 'LIKE')->range(0, 1)->execute()->fetchField()) {
		// Format error message dependent on whether the user is logged in or not.
		if ($GLOBALS['user']->uid) {
			form_set_error('mail', t('The e-mail address %email is already taken.', array('%email' => $form_state['values']['mail'])));
		}
		else {
			form_set_error('mail', t('The e-mail address %email is already registered. <a href="@password">Have you forgotten your password?</a>', array('%email' => $form_state['values']['mail'], '@password' => url('user/password'))));
		}
	}

}
- Submit function sẽ tạo mới user với role 'kanranuser' với data chính như là name, mail, pass, status, init, roles và các custom fields như field_gender, field_country,field_birthday, field_prefecture
- Gọi hàm user_save của Core để tạo user.

Code: Select all

function form_register_form_submit($form, &$form_state) {

	// Remove unneeded values.
  form_state_values_clean($form_state);

	//var_dump($form_state);die;
	
	$pass = $form_state['values']['pass'];
	 $fields = array(
    'name' => trim($form_state['values']['user']),
    'mail' => trim($form_state['values']['mail']),
    'pass' => trim($pass),
    'status' => 1,
    'init' => trim($form_state['values']['mail']),
    'roles' => array(
      DRUPAL_AUTHENTICATED_RID => 'authenticated user',
			5 => 'kanranuser',
    ),
  );

  $fields['field_gender'][LANGUAGE_NONE][0]['value'] = $form_state['values']['gender'];
  $fields['field_country'][LANGUAGE_NONE][0]['value'] = $form_state['values']['country'];
	$birthday = new DateTime($form_state['values']['year'] . "-" . $form_state['values']['month'] . "-" . $form_state['values']['day']);
  $fields['field_birthday'][LANGUAGE_NONE][0]['value'] = $birthday->getTimestamp();
  $fields['field_prefecture'][LANGUAGE_NONE][0]['value'] = $form_state['values']['prefectural'];

	$account = user_save('', $fields);

	// Terminate if an error occurred during user_save().
	if (!$account) {
		drupal_set_message(t("Error saving user account."), 'error');
		$form_state['redirect'] = '';
		return;
	}
	$form_state['user'] = $account;
	$form_state['values']['uid'] = $account->uid;

	$form_state['uid'] = $account->uid;
	user_login_submit(array(), $form_state);
	drupal_goto('karanuser_setting'); // Redirect tới url
	drupal_set_message(t('Registration successful. You are now logged in.'));

}
Lưu ý:

- Nhớ tạo user Role và các custom fields chính xác
- Nhớ enable Module form_register và clear cache system để sử dụng

Chúc thành công!
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

Re: [D7] Module Form Register with custom fields

Post by tthlan »

Part 4: Template Module form_register.tpl.php

- Cách dùng form fields để khai báo trong function form_register_form
<?php print render($form['xxxxxx']); ?>
- Nếu dùng field thường thì khi validate phải thêm giá trị $_POST đó vào form_state value để sử dụng khi submit
$form_state['values']['gender'] = $_POST['gender'];
-Để form submit và drupal hiểu được form nào thì có cả form_id, form_build_id và form_token trên form và
<?php
print render($form['form_id']);
print render($form['form_build_id']);
print render($form['form_token']);
?>

Code: Select all

<?php

?>
<div class="login_box fl mr20">
		<div>
			<div class="inner cf">
				<p class="title">新規会員登録</p>
					<?php print render($form['user']); ?><!-- Dùng field form -->
					<?php print render($form['mail']); ?>
					<?php print render($form['pass']); ?>
				<div class="bd_select">
					<p>生年月日</p>
					<?php print render($form['year']); ?>年
					<?php print render($form['month']); ?>月
					<?php print render($form['day']); ?>
				</div>

				<div class="radiobox">
					<span>性別 :</span>
					<?php //print render($form['gender']); ?><!-- Không sử dụng field form -- dùng control thường, nên lúc ý lúc nhận và xử lý dữ liệu) -->
					<input type="radio" name="gender" value="1" id="women" tabindex="1" accesskey="A" checked="checked" />
					<label for="women">女性</label>
					<input type="radio" name="gender" value="0" id="men" tabindex="1" accesskey="A" />
					<label for="men">男性</label>
				</div>

				<div class="sel_addbox">
					<span>住まい</span>
					<?php print render($form['country']); ?>
					<?php print render($form['prefectural']); ?>

				</div>
				<span class="catxt"><a href="#">利用規約</a> |<a href="#"> 個人情報保護方針</a></span>
				<?php 
					print render($form['form_id']);
					print render($form['form_build_id']);
					print render($form['form_token']);
					print render($form['submit']);
				?>
			</div>
		</div><!--.login_box-->
</div>
Post Reply