JM3.4を使用しています。カスタマイズしたユーザーグループをいくつか追加しました。登録時にユーザーグループを選択できるフィールドを追加しました。次のコードをハッキングします。
// Get the default new user group, Registered if not specified.
$system = $params->get('new_usertype', 2);
$this->data->groups[] = $system;
選択したユーザーを確認し、システム構成グループを上書きします。したがって、前の2行のコードの間に次のコードを追加しました。
if (!strcmp($this->data->role, "group0"))
{
$system = 10;
}
elseif (!strcmp($this->data->role, "group1"))
{
$system = 11;
}
私の質問は、10,11の代わりに、ここでグループIDをハードコーディングできないのです。それは、getGroupID('group0')
、getGroupID('group1')
のようになります。
Joomlaがこれを行うより良い方法があるかどうかはわかりませんが、独自の関数を作成してデータベースにクエリを実行できます。
function getGroupId($groupName){
$db = JFactory::getDBO();
$db->setQuery($db->getQuery(true)
->select('*')
->from("#__usergroups")
);
$groups = $db->loadRowList();
foreach ($groups as $group) {
if ($group[4] == $groupName) // $group[4] holds the name of current group
return $group[0]; // $group[0] holds group ID
}
return false; // return false if group name not found
}
次に、次を使用して、名前に基づいてグループのIDを取得します。
echo (getGroupId("Administrator"));
これにより、「Administrator」というグループのIDがエコーされます(存在する場合)。
$groups
は次のようになります。
Array
(
[0] => Array
(
[0] => 1
[1] => 0
[2] => 1
[3] => 22
[4] => Public
)
[1] => Array
(
[0] => 2
[1] => 1
[2] => 8
[3] => 19
[4] => Registered
)
...
追加情報
これはあなたの場合には役に立たないかもしれませんが、JUserHelper
にはgetUserGroups
というメソッドがあります( https://api.joomla.org/cms-3/classes/JUserHelper.html# method_getUserGroups )これは、ユーザーが属するすべてのグループをリストします。使用法:
getUserGroups(integer $userId) : array
フレームワークの変更は避けてください。これにより、更新後にシステム/機能が中断します。ユーザータイプのプラグインを作成し、onUserAfterSaveというイベントで作業します。これにより、更新が安全になります。適切なパラメーターフィールド(group0およびgroup1)をプラグインXMLファイルに追加します。プラグインには独自の構成があるため、必要になるたびにこれらのパラメーターを取得してUIで変更することはできません。
プラグインイベントの完全なガイドは次のとおりです。
ここにプラグインの例があります:
プラグイン構成のパラメーターとして使用するフィールドタイプを次に示します
グループIDを取得するために呼び出すことができる独自の関数を作成できます。
public function getGroupId($groupName)
{
$db = JFactory::getDbo();
$select = "select id from #__usergroups where title='".$groupName."'";
$db->setQuery($select);
$db->query();
$data = $db->loadObject();
$groupId = $data->id;
if(empty($groupId))
$groupId = 2;
return $groupId;
}
それを次のように呼び出します:
$system = $this->getGroupId($this->data->role);
Joomla 3.6.3以降( serGroupsHelper クラスを追加):
function getGroupId($groupName){
foreach (JHelperUsergroups::getInstance()->getAll() as $group) {
if ($group->title == $groupName) {
return $group->id;
}
}
}