Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions app/Models/Common/Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -714,4 +714,24 @@ private static function factorial($page, $ancestors, $page_roles, int &$active_p
}
return;
}

/**
* 継承元のメンバーシップのページを取得する。
* メンバーシップの設定を先祖ページから継承している場合は、直近の対象ページを返却する。
* 該当ページにも先祖にもメンバーシップの設定がなければ、null を返却する。
*
* @return Page|null
*/
public function getInheritMembershipPage(): ?Page
{
if ($this->membership_flag == 1) {
return $this;
}

if ($this->parent) {
return $this->parent->getInheritMembershipPage();
}

return null;
}
}
38 changes: 29 additions & 9 deletions app/Plugins/User/Learningtasks/LearningtasksPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -3323,15 +3323,7 @@ public function editUsers($request, $page_id, $frame_id, $post_id)
$post = $this->getPost($post_id);

// 配置されているページのメンバーシップの対象ユーザ取得
// 複数のページにプラグインは配置されている可能性を考慮
$pages = Page::select('pages.*')
->join('frames', function ($join) use ($post) {
$join->on('frames.page_id', '=', 'pages.id')
->where('frames.bucket_id', '=', $post->bucket_id);
})
->where('pages.membership_flag', 1)
->orderBy('pages._lft')
->get();
$pages = $this->getMembershipPages($post);

// グループID 取得のために、配置されているページRoleを取得
$page_roles = PageRole::select('group_id')->whereIn('page_id', $pages->pluck('id'))->groupBy('group_id')->get();
Expand Down Expand Up @@ -3397,6 +3389,34 @@ public function editUsers($request, $page_id, $frame_id, $post_id)
);
}

/**
* 課題管理プラグインが配置されているページに関するメンバーシップページを取得する。
*/
private function getMembershipPages($post)
{
// 課題管理プラグインが配置されているページを取得する
// 複数のページにプラグインは配置されている可能性を考慮
$bucket_pages = Page::select('pages.*')
->join('frames', function ($join) use ($post) {
$join->on('frames.page_id', '=', 'pages.id')
->where('frames.bucket_id', '=', $post->bucket_id);
})
->orderBy('pages._lft')
->get();

// 親ページの継承設定を考慮してメンバーシップのページを抽出する
$membership_pages = collect();
foreach ($bucket_pages as $page) {
$membership_page = $page->getInheritMembershipPage();
if (!empty($membership_page)) {
$membership_pages->push($membership_page);
}
}
$membership_pages = $membership_pages->unique('id');

return $membership_pages;
}

/**
* ユーザ関係保存画面
*/
Expand Down
10 changes: 9 additions & 1 deletion app/Plugins/User/Learningtasks/LearningtasksTool.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use App\Enums\DayOfWeek;
use App\Models\Common\PageRole;
use App\Models\Common\GroupUser;
use App\Models\Common\Page;
use App\Models\Core\UsersRoles;
use App\Models\User\Learningtasks\LearningtasksConfigs;
use App\Models\User\Learningtasks\LearningtasksUsers;
Expand Down Expand Up @@ -81,6 +82,11 @@
*/
class LearningtasksTool
{
/**
* ページ
*/
private $page = null;

/**
* 課題バケツ
*/
Expand Down Expand Up @@ -157,6 +163,7 @@ public function __construct($request, $page_id, $learningtask, $post = null, $fr
$this->examination_statuses = new Collection();
$this->evaluate_statuses = new Collection();

$this->page = Page::findOrFail($page_id);
$this->learningtask = $learningtask;
$this->post = $post;

Expand Down Expand Up @@ -249,8 +256,9 @@ public function __construct($request, $page_id, $learningtask, $post = null, $fr
if ($this->post->student_join_flag == 2) {
// 配置ページのメンバーシップユーザ全員
// ページから参加グループ取得
$membership_page = $this->page->getInheritMembershipPage();
$group_ids = PageRole::select('group_id')
->where('page_id', $page_id)
->where('page_id', optional($membership_page)->id)
->groupBy('group_id')
->orderBy('group_id')
->get();
Expand Down
55 changes: 55 additions & 0 deletions tests/Unit/Models/Common/PageTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

namespace Tests\Unit\Models\Common;

use App\Models\Common\Page;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class PageTest extends TestCase
{
use RefreshDatabase;

/**
* 初期設定
*/
protected function setUp(): void
{
parent::setUp();
}

/**
* getInheritMembershipPage()テスト
*/
public function testGetInheritMembershipPage()
{
$top_page = Page::factory()->create(['membership_flag' => 0]);
$child_page = Page::factory()->create(['membership_flag' => 0,'parent_id' => $top_page->id]);
$grand_child_page = Page::factory()->create(['membership_flag' => 0, 'parent_id' => $child_page->id]);
Page::fixTree();
$top_page->refresh();
$child_page->refresh();
$grand_child_page->refresh();

// 親ページをさかのぼってもメンバーシップページがない場合
$this->assertNull($grand_child_page->getInheritMembershipPage());

// 二階層上でメンバーシップページが設定されている場合、そのページを返す
$top_page->membership_flag = 1;
$top_page->save();
$grand_child_page->refresh();
$this->assertEquals($top_page->id, $grand_child_page->getInheritMembershipPage()->id);

// 一階層上でメンバーシップページが設定されている場合、そのページを返す
$child_page->membership_flag = 1;
$child_page->save();
$grand_child_page->refresh();
$this->assertEquals($child_page->id, $grand_child_page->getInheritMembershipPage()->id);

// 当該ページがメンバーシップページの場合、そのページを返す
$grand_child_page->membership_flag = 1;
$grand_child_page->save();
$grand_child_page->refresh();
$this->assertEquals($grand_child_page->id, $grand_child_page->getInheritMembershipPage()->id);
}
}