Google+

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rezolvat Optiune de ascundere a campurilor custom
#1
Cum as putea sa introduc o optiune prin care utilizatorul sa decida daca un camp custom apare sau nu in profilul lui de utilizator.

De exemplu campul location, in pagina de editare a profilului as vrea sa introduc doua butoane radio unul cu optiunea da si celalalt cu optiunea nu, daca utilizatorul selecteaza optiunea da atunci campul location va fi afisat in profilul sau, daca alege nu atunci acel camp nu apare in pagina sa profil si asa mai departe pentru restul campurilor custom pe care le adaug din control panel.

Ceva sfaturi cum as putea sa implementez ceva de genul asta?

linkul catre mybb-ul meu se afla in semnatura.
#2
Am încercat să realizez o modificare care face ceea ce dorești tu, doar că am folosit checkbox-uri. Din păcate, am rămas blocat la o parte foarte importantă, cea de afișare a valorii checkbox-urilor în UserCP. Următorul este codul sursă:

PHP Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
 
if(!defined("IN_MYBB"))
{
	die("Direct initialization of this file is not allowed.");
}

function pftoggle_info()
{
	return array(
		'name'			=> 'Profile Fields Toggle',
		'description'		=> 'Gives users the possibility to display or not the profile fields on their profile.',
		'website'		=> 'http://mybb.ro/',
		'author'		=> 'Harald R.',
		'authorsite'		=> 'http://mybb.ro/',
		'version'		=> '1.0',
		'guid' 			=> '',
		'compatibility'		=> '16*'
	);
}

function pftoggle_activate()
{
	global $db;
	
	$query = $db->query("SHOW COLUMNS FROM ".TABLE_PREFIX."userfields");
	while($row = $db->fetch_array($query)) {
		$column = $row['Field'];
		if($column != 'ufid')
			$db->query("ALTER TABLE ".TABLE_PREFIX."userfields ADD ".$column."_toggle TINYINT(1) NOT NULL DEFAULT 1"); // Se adauga pentru fiecare camp de profil o coloana aditionala in baza de date, care determina daca e vizibil sau nu
	}
	
	$insert = array(
		'title' => 'pftoggle_usercp',
		'template' => '<form action="usercp.php" method="post" style="display: inline;">
<input type="checkbox" name="pftoggle[]" value="1" {$pftogglecheck[$i]}>Visible?
</form>',
		'sid' => '-1',
		'version' => '1600',
		'dateline' => TIME_NOW
	);
	$db->insert_query('templates', $insert); // Se adauga un sablon global care contine checkbox
	
	require_once MYBB_ROOT.'inc/adminfunctions_templates.php';
	find_replace_templatesets('usercp_profile_customfield', '#'.preg_quote('</a>').'#', '</a>: {$pftoggle_usercp}'); // Sablonul va fi folosit de catre fiecare camp de profil
}

function pftoggle_deactivate()
{
	global $db;
	
	$query = $db->query("SHOW COLUMNS FROM ".TABLE_PREFIX."userfields");
	while($row = $db->fetch_array($query)) {
		$column = $row['Field'];
		if(strpos($column, '_toggle') !== false)
			$db->query("ALTER TABLE ".TABLE_PREFIX."userfields DROP ".$column.""); // Se sterg coloanele aditionale
	}
	
	$db->delete_query('templates', "title LIKE 'pftoggle_%'"); // Se sterge sablonul creat la activare
	
	require_once MYBB_ROOT.'inc/adminfunctions_templates.php';
	find_replace_templatesets('usercp_profile_customfield', '#'.preg_quote('</a>: {$pftoggle_usercp}').'#', '</a>'); // Se sterge si variabila care "apela" sablonul creat la activare
}

$plugins->add_hook('usercp_profile_start', 'pftoggle_editprofile');

function pftoggle_editprofile()
{
	global $db, $mybb, $templates, $pftoggle_usercp, $pftogglecheck;
	
	$query = $db->query("SELECT *
						FROM `".TABLE_PREFIX."userfields`
						WHERE ufid=".$mybb->user['uid'].""); // Extragem toate campurile din tabelul _userfields
	$check = $db->fetch_array($query);

	foreach($check as $key => $value) {
		if(strpos($key, '_toggle') == false) unset($check[$key]); // Le pastram doar pe cele a caror denumire se termina in _toggle (cele folosite pentru determinarea vizibilitatii campurilor)
	}															  // Am folosit aceasta metoda deoarece s-ar putea sa existe si campuri create de admin in afara celor default




	eval("\$pftoggle_usercp = \"".$templates->get("pftoggle_usercp")."\";"); // Evaluam variabila pentru a o putea folosi in sabloane
}

$plugins->add_hook('member_profile_pftoggle', 'pftoggle_hide');
/*
Este necesara inlocuirea urmatoarei linii in member.php (~1982):
		eval("\$customfields .= \"".$templates->get("member_profile_customfields_field")."\";");
Cu:
		$plugins->run_hooks("member_profile_pftoggle");
		if($visible == 1) {
			eval("\$customfields .= \"".$templates->get("member_profile_customfields_field")."\";");
		}
*/
function pftoggle_hide()
{
	global $db, $memprofile, $customfield, $visible;

	$query = $db->query("SELECT `fid".$customfield['fid']."_toggle`
						FROM `".TABLE_PREFIX."userfields`
						WHERE ufid=".$memprofile['uid']."");
	$check = $db->fetch_array($query);
	$visible = $check["fid".$customfield['fid']."_toggle"]; // Determinam daca campul e vizibil sau nu pe profil
}
?>

Am reușit să ascund câmpul în profil dacă valoarea din coloana _toggle a campului este 0, chiar dacă este necesara înlocuirea urmatoărei linii în member.php (~1982):

PHP Code:
eval("\$customfields .= \"".$templates->get("member_profile_customfields_field")."\";");

Cu:

PHP Code:
$plugins->run_hooks("member_profile_pftoggle");
if($visible == 1) {
	eval("\$customfields .= \"".$templates->get("member_profile_customfields_field")."\";");
}


Ceea ce nu am reușit este să determin dacă în UserCP este bifat sau nu checkbox-ul. După cum știi, ca un checkbox să fie bifat trebuie să aibă parametrul checked="checked". Partea proastă e că nu se pot folosi vectori în șabloane sau cel puțin așa știu eu. Variabila pe care am folosit-o eu în șablon ($pftogglecheck[$i]), chiar dacă are tot o variabilă drept cheie pentru valoare, va atribui aceeași valoare pentru toate câmpurile. O altă problemă este și faptul că acele câmpuri nu sunt afișate în ordinea ID-urilor, ci 3, 1, 2 iar apoi cele create de admin.

La trimiterea valorilor în baza de date nu m-am aventurat din moment ce nu a funcționat afișarea stării checkbox-urilor. Poate vei reuși tu să finalizezi modificarea.



Forum Jump:


Users browsing this thread: 1 Guest(s)