1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* _ __ __ _____ _____ ___ ____ _____ |
5
|
|
|
* | | / // // ___//_ _// || __||_ _| |
6
|
|
|
* | |/ // /(__ ) / / / /| || | | | |
7
|
|
|
* |___//_//____/ /_/ /_/ |_||_| |_| |
8
|
|
|
* @link https://vistart.me/ |
9
|
|
|
* @copyright Copyright (c) 2016 - 2017 vistart |
10
|
|
|
* @license https://vistart.me/license/ |
11
|
|
|
*/ |
12
|
|
|
|
13
|
|
|
namespace rhosocial\organization\forms; |
14
|
|
|
|
15
|
|
|
use rhosocial\organization\Organization; |
16
|
|
|
use rhosocial\organization\OrganizationSetting; |
17
|
|
|
use Yii; |
18
|
|
|
use yii\base\InvalidConfigException; |
19
|
|
|
use yii\base\Model; |
20
|
|
|
use yii\helpers\Html; |
21
|
|
|
use yii\web\ServerErrorHttpException; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* Class SettingsForm |
25
|
|
|
* @package rhosocial\organization\forms |
26
|
|
|
* @version 1.0 |
27
|
|
|
* @author vistart <[email protected]> |
28
|
|
|
*/ |
29
|
|
|
class SettingsForm extends Model |
30
|
|
|
{ |
31
|
|
|
/** |
32
|
|
|
* @var string |
33
|
|
|
*/ |
34
|
|
|
public $exclude_other_members; |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* @var string |
38
|
|
|
*/ |
39
|
|
|
public $disallow_member_join_other; |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* @var string |
43
|
|
|
*/ |
44
|
|
|
public $only_accept_current_org_member; |
45
|
|
|
|
46
|
|
|
/** |
47
|
|
|
* @var string |
48
|
|
|
*/ |
49
|
|
|
public $only_accept_superior_org_member; |
50
|
|
|
|
51
|
|
|
/** |
52
|
|
|
* @var string |
53
|
|
|
*/ |
54
|
|
|
public $join_password; |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* @var string |
58
|
|
|
*/ |
59
|
|
|
public $join_ip_address; |
60
|
|
|
|
61
|
|
|
/** |
62
|
|
|
* @var string |
63
|
|
|
*/ |
64
|
|
|
public $join_entrance_url; |
65
|
|
|
|
66
|
|
|
/** |
67
|
|
|
* @var string |
68
|
|
|
*/ |
69
|
|
|
public $exit_allow_withdraw_actively; |
70
|
|
|
|
71
|
|
|
const SCENARIO_ORGANIZATION = 'organization'; |
72
|
|
|
const SCENARIO_DEPARTMENT = 'department'; |
73
|
|
|
|
74
|
|
|
/** |
75
|
|
|
* @var Organization |
76
|
|
|
*/ |
77
|
|
|
public $organization; |
78
|
|
|
|
79
|
|
|
/** |
80
|
|
|
* @inheritdoc |
81
|
|
|
*/ |
82
|
|
|
public function init() |
83
|
|
|
{ |
84
|
|
|
if (!$this->organization) { |
85
|
|
|
throw new InvalidConfigException('Invalid Organization Model.'); |
86
|
|
|
} |
87
|
|
|
$this->scenario = $this->organization->isOrganization() ? static::SCENARIO_ORGANIZATION : static::SCENARIO_DEPARTMENT; |
88
|
|
|
$this->loadSettings(); |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
/** |
92
|
|
|
* Load settings. |
93
|
|
|
*/ |
94
|
|
|
protected function loadSettings() |
95
|
|
|
{ |
96
|
|
|
if ($this->organization->isOrganization()) { |
97
|
|
|
$this->exclude_other_members = $this->organization->isExcludeOtherMembers ? '1' : '0'; |
98
|
|
|
$this->disallow_member_join_other = $this->organization->isDisallowMemberJoinOther ? '1' : '0'; |
99
|
|
|
} elseif ($this->organization->isDepartment()) { |
100
|
|
|
$this->only_accept_current_org_member = $this->organization->isOnlyAcceptCurrentOrgMember ? '1' : '0'; |
101
|
|
|
$this->only_accept_superior_org_member = $this->organization->isOnlyAcceptSuperiorOrgMember ? '1' : '0'; |
102
|
|
|
} |
103
|
|
|
$this->join_password = $this->organization->joinPassword; |
104
|
|
|
$this->join_ip_address = $this->organization->joinIpAddress; |
105
|
|
|
$this->join_entrance_url = $this->organization->joinEntranceUrl; |
106
|
|
|
$this->exit_allow_withdraw_actively = $this->organization->exitAllowWithdrawActively ? '1' : '0'; |
107
|
|
|
} |
108
|
|
|
|
109
|
|
|
/** |
110
|
|
|
* Submit settings. |
111
|
|
|
*/ |
112
|
|
|
public function submit() |
113
|
|
|
{ |
114
|
|
|
try { |
115
|
|
|
if ($this->organization->isOrganization()) { |
116
|
|
|
if ($this->exclude_other_members != ($this->organization->isExcludeOtherMembers ? '1' : '0')) { |
117
|
|
|
$this->organization->isExcludeOtherMembers = ($this->exclude_other_members == '1'); |
118
|
|
|
} |
119
|
|
|
if ($this->disallow_member_join_other != ($this->organization->isDisallowMemberJoinOther ? '1' : '0')) { |
120
|
|
|
$this->organization->isDisallowMemberJoinOther = ($this->disallow_member_join_other == '1'); |
121
|
|
|
} |
122
|
|
|
} elseif ($this->organization->isDepartment()) { |
123
|
|
|
if ($this->only_accept_current_org_member != ($this->organization->isOnlyAcceptCurrentOrgMember ? '1' : '0')) { |
124
|
|
|
$this->organization->isOnlyAcceptCurrentOrgMember = ($this->only_accept_current_org_member == '1'); |
125
|
|
|
} |
126
|
|
|
if ($this->only_accept_superior_org_member != ($this->organization->isOnlyAcceptSuperiorOrgMember ? '1' : '0')) { |
127
|
|
|
$this->organization->isOnlyAcceptSuperiorOrgMember = ($this->only_accept_superior_org_member == '1'); |
128
|
|
|
} |
129
|
|
|
} |
130
|
|
|
if ($this->join_password != $this->organization->joinPassword) { |
131
|
|
|
$this->organization->joinPassword = $this->join_password; |
132
|
|
|
} |
133
|
|
|
if ($this->join_ip_address != $this->organization->joinIpAddress) { |
134
|
|
|
$this->organization->joinIpAddress = $this->join_ip_address; |
135
|
|
|
} |
136
|
|
|
if ($this->join_entrance_url != $this->organization->joinEntranceUrl) { |
137
|
|
|
$this->organization->joinEntranceUrl = $this->join_entrance_url; |
138
|
|
|
} |
139
|
|
|
if ($this->exit_allow_withdraw_actively != ($this->organization->exitAllowWithdrawActively ? '1' : '0')) { |
140
|
|
|
$this->organization->exitAllowWithdrawActively = ($this->exit_allow_withdraw_actively == '1'); |
141
|
|
|
} |
142
|
|
|
} catch (\Exception $ex) { |
143
|
|
|
throw new ServerErrorHttpException($ex->getMessage()); |
144
|
|
|
} |
145
|
|
|
return true; |
146
|
|
|
} |
147
|
|
|
|
148
|
|
|
/** |
149
|
|
|
* @inheritdoc |
150
|
|
|
*/ |
151
|
|
|
public function attributeLabels() |
152
|
|
|
{ |
153
|
|
|
return [ |
154
|
|
|
'exclude_other_members' => Yii::t('organization', 'Exclude other members'), |
155
|
|
|
'disallow_member_join_other' => Yii::t('organization', 'Disallow members to join other'), |
156
|
|
|
'only_accept_current_org_member' => Yii::t('organization', 'Only accept organization members'), |
157
|
|
|
'only_accept_superior_org_member' => Yii::t('organization', 'Only accept superior members'), |
158
|
|
|
'join_password' => Yii::t('organization', 'Password'), |
159
|
|
|
'join_ip_address' => Yii::t('organization', 'IP Address'), |
160
|
|
|
'join_entrance_url' => Yii::t('organization', 'Entrance URL Code'), |
161
|
|
|
'exit_allow_withdraw_actively' => Yii::t('organization', 'Allow to Withdraw Actively'), |
162
|
|
|
]; |
163
|
|
|
} |
164
|
|
|
|
165
|
|
|
/** |
166
|
|
|
* @inheritdoc |
167
|
|
|
*/ |
168
|
|
|
public function attributeHints() |
169
|
|
|
{ |
170
|
|
|
$topName = $this->organization->isDepartment() ? $this->organization->topOrganization->profile->name . ' (' . $this->organization->topOrganization->getID() . ')' : ''; |
171
|
|
|
$parentName = $this->organization->isDepartment() ? $this->organization->parent->profile->name . ' (' . $this->organization->parent->getID() . ')' : ''; |
|
|
|
|
172
|
|
|
return [ |
173
|
|
|
'exclude_other_members' => |
174
|
|
|
Yii::t('organization', 'This organization does not allow other organizations and their subordinates\' members to join.') . "<br>" . |
175
|
|
|
Yii::t('organization', 'All members of the other organizations (including their subordinates) who have joined this organization (including subordinate departments) are not affected.'), |
176
|
|
|
'disallow_member_join_other' => |
177
|
|
|
Yii::t('organization', 'This organization does not allow the organization and its subordinates\' members to join other organizations or their subordinates.') . "<br>" . |
178
|
|
|
Yii::t('organization', 'All members of this organization (including subordinate departments) who have joined other organizations (including their subordinates) are not affected.') . "<br>" . |
179
|
|
|
Yii::t('organization', 'If this option is enabled, all members of the organization (including subordinate departments) who have the "Set Up Organization" permission will not be able to set up a new organization.'), |
180
|
|
|
'only_accept_current_org_member' => |
181
|
|
|
Yii::t('organization', 'This department is only accepted by members of the organization.') . "<br>" . |
182
|
|
|
Yii::t('organization', 'That is to say, only the members of {name} are accepted.', ['name' => $topName]), |
183
|
|
|
'only_accept_superior_org_member' => |
184
|
|
|
Yii::t('organization', 'This department only accepts members of the parent organization or department.') . "<br>" . |
185
|
|
|
Yii::t('organization', 'That is to say, only the members of {name} are accepted.', ['name' => $parentName]), |
186
|
|
|
'join_entrance_url' => Yii::t('organization', 'You can assign a unique code to the ' . ($this->organization->isOrganization() ? 'organization' : 'department') . ', and we will generate a unique entrance URL based on this code.') . "<br>" . |
187
|
|
|
Yii::t('organization', 'After you enter the code and submit it, the generated URL will appear below.') . "<br>" . |
188
|
|
|
Yii::t('organization', 'If you do not want users to join the ' . ($this->organization->isOrganization() ? 'organization' : 'department') . ', please leave blank.') . "<br>" . |
189
|
|
|
(empty($this->join_entrance_url) ? Yii::t('organization', 'No entrance URL is currently available.') : Html::a(Yii::t('organization', 'The entrance URL'), [ |
190
|
|
|
'/organization/join/index', |
191
|
|
|
'entrance' => $this->join_entrance_url, |
192
|
|
|
], [ |
193
|
|
|
'class' => 'btn btn-primary', |
194
|
|
|
'target' => '_blank', |
195
|
|
|
])), |
196
|
|
|
'join_password' => |
197
|
|
|
Yii::t('organization', 'If you specify a password, the user needs to provide the password to join.') . "<br>" . |
198
|
|
|
Yii::t('organization', 'If you do not need a user to enter a password, leave it blank.'), |
199
|
|
|
'join_ip_address' => |
200
|
|
|
Yii::t('organization', 'Only the users from the above IP address (segment) can join the organization / department proactively.'), |
201
|
|
|
]; |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
/** |
205
|
|
|
* @inheritdoc |
206
|
|
|
*/ |
207
|
|
|
public function rules() |
208
|
|
|
{ |
209
|
|
|
$orgClass = get_class($this->organization); |
210
|
|
|
return [ |
211
|
|
|
[['exclude_other_members', 'disallow_member_join_other', 'only_accept_current_org_member', 'only_accept_superior_org_member', 'exit_allow_withdraw_actively'], 'boolean', 'trueValue' => '1', 'falseValue' => '0'], |
212
|
|
|
[['join_password', 'join_entrance_url'], 'string', 'max' => 255], |
213
|
|
|
['join_ip_address', 'ip', 'subnet' => null, 'normalize' => true], |
214
|
|
|
['join_entrance_url', 'setting_unique', 'skipOnError' => false, 'params' => ['item' => $orgClass::SETTING_ITEM_JOIN_ENTRANCE_URL]], |
215
|
|
|
]; |
216
|
|
|
} |
217
|
|
|
|
218
|
|
|
/** |
219
|
|
|
* Check whether the setting is unique. |
220
|
|
|
* @param string $attribute the attribute currently being validated |
221
|
|
|
* @param mixed $params the value of the "params" given in the rule |
222
|
|
|
* @param \yii\validators\InlineValidator related InlineValidator instance. |
223
|
|
|
*/ |
224
|
|
|
public function setting_unique($attribute, $params, $validator) |
|
|
|
|
225
|
|
|
{ |
226
|
|
|
$value = (string)$this->$attribute; |
227
|
|
|
if (empty($value)) { |
228
|
|
|
return; |
229
|
|
|
} |
230
|
|
|
|
231
|
|
|
$class = $this->organization->organizationSettingClass; |
232
|
|
|
if (empty($class) || !is_string($class)) { |
233
|
|
|
return; |
234
|
|
|
} |
235
|
|
|
|
236
|
|
|
$setting = $class::find()->andWhere([ |
237
|
|
|
$this->organization->getNoInitOrganizationSetting()->idAttribute => $params['item'], |
238
|
|
|
$this->organization->getNoInitOrganizationSetting()->contentAttribute => $value, |
239
|
|
|
])->one(); |
240
|
|
|
/* @var $setting OrganizationSetting */ |
241
|
|
|
if ($setting && !$setting->host->equals($this->organization)) { |
242
|
|
|
$this->addError($attribute, Yii::t('organization', "{value} already exists.", ['value' => $value])); |
243
|
|
|
} |
244
|
|
|
} |
245
|
|
|
|
246
|
|
|
/** |
247
|
|
|
* @inheritdoc |
248
|
|
|
*/ |
249
|
|
|
public function scenarios() |
250
|
|
|
{ |
251
|
|
|
return [ |
252
|
|
|
static::SCENARIO_ORGANIZATION => ['exclude_other_members', 'disallow_member_join_other', 'join_password', 'join_entrance_url', 'join_ip_address', 'exit_allow_withdraw_actively'], |
253
|
|
|
static::SCENARIO_DEPARTMENT => ['only_accept_current_org_member', 'only_accept_superior_org_member', 'join_password', 'join_entrance_url', 'join_ip_address', 'exit_allow_withdraw_actively'], |
254
|
|
|
]; |
255
|
|
|
} |
256
|
|
|
} |
257
|
|
|
|
An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.
If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.