Skip to content

Commit 1df1247

Browse files
committed
Add support for new Member fieldtype
1 parent 166e39a commit 1df1247

File tree

9 files changed

+189
-53
lines changed

9 files changed

+189
-53
lines changed

src/Api/Graph/Support/FieldtypeRegistrar.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class FieldtypeRegistrar
2121

2222
protected $booted = false;
2323

24+
protected $fieldtypeManager;
25+
2426
public function __construct(FieldtypeManager $manager)
2527
{
2628
$this->fieldtypeManager = $manager;

src/Fieldtypes/Member.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Expressionengine\Coilpack\Fieldtypes;
4+
5+
use Expressionengine\Coilpack\Contracts\Field;
6+
use Expressionengine\Coilpack\Contracts\ListsGraphType;
7+
use Expressionengine\Coilpack\FieldtypeOutput;
8+
use Expressionengine\Coilpack\Fieldtypes\Presenters\MemberPresenter;
9+
use Expressionengine\Coilpack\Models\FieldContent;
10+
11+
class Member extends Fieldtype implements ListsGraphType
12+
{
13+
protected $presenter;
14+
15+
public function __construct(string $name, $id = null)
16+
{
17+
parent::__construct($name, $id);
18+
$this->presenter = new MemberPresenter;
19+
}
20+
21+
public function apply(FieldContent $content, $parameters = [])
22+
{
23+
$data = $this->presenter->present($content, $parameters);
24+
25+
return FieldtypeOutput::for($this)->value($data);
26+
}
27+
28+
public function parametersForField(Field $field = null): array
29+
{
30+
return $this->presenter->defineParameters();
31+
}
32+
33+
public function graphType()
34+
{
35+
return 'Member';
36+
}
37+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Expressionengine\Coilpack\Fieldtypes\Presenters;
4+
5+
use Expressionengine\Coilpack\Models\FieldContent;
6+
use Expressionengine\Coilpack\Models\Member\Member;
7+
use Expressionengine\Coilpack\Traits\HasArgumentsAndParameters;
8+
9+
class MemberPresenter extends Presenter
10+
{
11+
use HasArgumentsAndParameters, Traits\QueriesRelationships;
12+
13+
public function present(FieldContent $content, $arguments)
14+
{
15+
$query = $this->buildRelationshipQuery($content, new Member);
16+
17+
return $query->get();
18+
}
19+
}

src/Fieldtypes/Presenters/RelationshipPresenter.php

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33
namespace Expressionengine\Coilpack\Fieldtypes\Presenters;
44

55
use Expressionengine\Coilpack\FieldtypeManager;
6+
use ExpressionEngine\Coilpack\Models\Category\Category;
67
use ExpressionEngine\Coilpack\Models\Channel\ChannelEntry;
8+
use ExpressionEngine\Coilpack\Models\Channel\Scopes;
79
use Expressionengine\Coilpack\Models\FieldContent;
810
use Expressionengine\Coilpack\Support\Arguments\FilterArgument;
911
use Expressionengine\Coilpack\Support\Arguments\ListArgument;
1012
use Expressionengine\Coilpack\Support\Arguments\SearchArgument;
13+
use Expressionengine\Coilpack\Support\Arguments\Term;
1114
use Expressionengine\Coilpack\Support\Parameter;
1215
use Expressionengine\Coilpack\Traits\HasArgumentsAndParameters;
1316

1417
class RelationshipPresenter extends Presenter
1518
{
16-
use HasArgumentsAndParameters;
19+
use HasArgumentsAndParameters, Traits\QueriesRelationships;
1720

1821
private $fieldtypeManager;
1922

@@ -24,34 +27,7 @@ public function __construct()
2427

2528
public function present(FieldContent $content, $arguments)
2629
{
27-
$isGrid = $content->field->field_type === 'grid';
28-
$isFluid = $content->hasAttribute('fluid_field');
29-
$fluidFieldId = ($isFluid) ? $content->fluid_field_data_id : 0;
30-
$this->arguments($arguments);
31-
32-
$query = ChannelEntry::query();
33-
34-
if ($content->entry->isPreview()) {
35-
$query->whereIn('entry_id', $content->data['data'] ?? [0]);
36-
} else {
37-
$query->select('channel_titles.*')
38-
->join('relationships', 'entry_id', '=', 'child_id')
39-
->when($isFluid, function ($query) use ($fluidFieldId) {
40-
$query->where('relationships.fluid_field_data_id', $fluidFieldId);
41-
}, function ($query) {
42-
$query->where('relationships.fluid_field_data_id', 0);
43-
})
44-
->when($isGrid, function ($query) use ($content) {
45-
$query->where('relationships.grid_field_id', $content->field->field_id)
46-
->where('relationships.grid_row_id', $content->grid_row_id)
47-
->where('relationships.grid_col_id', $content->grid_col_id);
48-
}, function ($query) use ($content) {
49-
$query->where('relationships.field_id', $content->field->field_id)
50-
->where('relationships.grid_field_id', 0);
51-
})
52-
->where('relationships.parent_id', $content->entry_id)
53-
->orderBy('order');
54-
}
30+
$query = $this->buildRelationshipQuery($content, new ChannelEntry, 'relationships');
5531

5632
// Author
5733
$query->when($this->hasArgument('author'), function ($query) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Expressionengine\Coilpack\Fieldtypes\Presenters\Traits;
4+
5+
use Expressionengine\Coilpack\Model;
6+
use Expressionengine\Coilpack\Models\FieldContent;
7+
use Illuminate\Support\Str;
8+
9+
trait QueriesRelationships
10+
{
11+
public function buildRelationshipQuery(FieldContent $content, Model $model, $tableName = null)
12+
{
13+
$isGrid = $content->field->field_type === 'grid';
14+
$isFluid = $content->hasAttribute('fluid_field');
15+
$fluidFieldId = ($isFluid) ? $content->fluid_field_data_id : 0;
16+
17+
$query = $model::query();
18+
$tableName = $tableName ?: Str::singular($model->getTable()).'_relationships';
19+
20+
if ($content->entry->isPreview()) {
21+
$query->whereIn('member_id', $content->data['data'] ?? [0]);
22+
} else {
23+
$query->select("{$model->getTable()}.*")
24+
->join($tableName, $model->getKeyName(), '=', 'child_id')
25+
->when($isFluid, function ($query) use ($fluidFieldId, $tableName) {
26+
$query->where("$tableName.fluid_field_data_id", $fluidFieldId);
27+
}, function ($query) use ($tableName) {
28+
$query->where("$tableName.fluid_field_data_id", 0);
29+
})
30+
->when($isGrid, function ($query) use ($content, $tableName) {
31+
$query->where("$tableName.grid_field_id", $content->field->field_id)
32+
->where("$tableName.grid_row_id", $content->grid_row_id)
33+
->where("$tableName.grid_col_id", $content->grid_col_id);
34+
}, function ($query) use ($content, $tableName) {
35+
$query->where("$tableName.field_id", $content->field->field_id)
36+
->where("$tableName.grid_field_id", 0);
37+
})
38+
->where("$tableName.parent_id", $content->entry_id)
39+
->orderBy('order');
40+
}
41+
42+
return $query;
43+
}
44+
}

src/Support/Parameter.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public function __get($key)
3232
return $this->attributes[$key];
3333
}
3434

35+
public function __set($key, $value)
36+
{
37+
return $this->attributes[$key] = $value;
38+
}
39+
3540
public function __isset($key)
3641
{
3742
return array_key_exists($key, $this->attributes);

tests/Fieldtype/MemberTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Tests\Fieldtype;
4+
5+
use Expressionengine\Coilpack\Models\Channel\ChannelEntry;
6+
use Tests\TestCase;
7+
8+
class MemberTest extends TestCase
9+
{
10+
public function test_member()
11+
{
12+
$entry = ChannelEntry::where('title', 'Test Fieldtypes')->first();
13+
14+
$output = $entry->test_members->value();
15+
16+
$this->assertEquals('admin', $output->toArray()[0]['username']);
17+
}
18+
}

tests/Graphql/ChannelEntriesTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,25 @@ public function test_entries_relationship()
175175
->assertJsonFragment(['type' => ['value' => 'soundcloud']]);
176176
}
177177

178+
public function test_entries_member()
179+
{
180+
$this->postJson('graphql', [
181+
'query' => <<<'GQL'
182+
{
183+
exp_channel_entries(search: {title:"Test Fieldtypes"} limit:1){
184+
data {
185+
entry_id
186+
test_members {
187+
screen_name
188+
}
189+
}
190+
}
191+
}
192+
GQL
193+
])
194+
->assertJsonFragment(['screen_name' => 'admin']);
195+
}
196+
178197
public function test_entries_fluid()
179198
{
180199
/**

0 commit comments

Comments
 (0)