SchoolSerializer::__call()   B
last analyzed

Complexity

Conditions 5
Paths 1

Size

Total Lines 35
Code Lines 17

Duplication

Lines 35
Ratio 100 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 35
loc 35
rs 8.439
cc 5
eloc 17
nc 1
nop 2
1
<?php
2
3
/**
4
 * @file
5
 * Contains Drupal\esdportal_api\Serializers\SchoolSerializer.
6
 */
7
8
namespace Drupal\esdportal_api\Serializers;
9
10
use Tobscure\JsonApi\SerializerAbstract;
11
use Tobscure\JsonApi\Link;
12
use Drupal\esdportal_api\Serializers\SchoolProfileSerializer;
13
use Drupal\esdportal_api\EcDataUtils;
14
15
// Data serializers...
16
use Drupal\esdportal_api\Serializers\act_2011Serializer;
17
use Drupal\esdportal_api\Serializers\act_2012Serializer;
18
use Drupal\esdportal_api\Serializers\act_2013Serializer;
19
use Drupal\esdportal_api\Serializers\act_2014Serializer;
20
use Drupal\esdportal_api\Serializers\esd_hs_2013Serializer;
21
use Drupal\esdportal_api\Serializers\esd_hs_2014Serializer;
22
use Drupal\esdportal_api\Serializers\esd_hs_2015Serializer;
23
use Drupal\esdportal_api\Serializers\esd_k8_2013_r1Serializer;
24
use Drupal\esdportal_api\Serializers\esd_k8_2013Serializer;
25
use Drupal\esdportal_api\Serializers\esd_k8_2014Serializer;
26
use Drupal\esdportal_api\Serializers\esd_k8_2015Serializer;
27
use Drupal\esdportal_api\Serializers\fiveessentials_2013Serializer;
28
use Drupal\esdportal_api\Serializers\fiveessentials_2014Serializer;
29
use Drupal\esdportal_api\Serializers\fiveessentials_2015Serializer;
30
use Drupal\esdportal_api\Serializers\meap_2009Serializer;
31
use Drupal\esdportal_api\Serializers\meap_2010Serializer;
32
use Drupal\esdportal_api\Serializers\meap_2011Serializer;
33
use Drupal\esdportal_api\Serializers\meap_2012Serializer;
34
use Drupal\esdportal_api\Serializers\meap_2013Serializer;
35
use Drupal\esdportal_api\Serializers\meap_2014Serializer;
36
37
/**
38
 * Serializes early childhood taxonomy terms.
39
 */
40
class SchoolSerializer extends SerializerAbstract {
41
  protected $type = 'schools';
42
  protected $link = ['school_profile'];
43
  protected $include = NULL;
44
45
  protected static $potentialDataTables;
46
  protected static $potentialDataTableNames;
47
48
  /**
49
   * Unsets any included data.
50
   */
51 View Code Duplication
  protected function attributes($school_term) {
52
    self::$potentialDataTables = \Drupal\esdportal_api\EcDataUtils::getDataTablesWithBcodes();
53
    self::$potentialDataTableNames = \Drupal\esdportal_api\EcDataUtils::extractDataTableNames(self::$potentialDataTables);
54
55
    // These turn into linkages:
56
    unset($school_term->school_profile);
57
    unset($school_term->school_profile_id);
58
59
    // These fields are private:
60
    unset($school_term->field_files);
61
62
    foreach (self::$potentialDataTableNames as $name) {
63
      unset($school_term->{$name});
64
    }
65
66
    return $school_term;
67
  }
68
69
  /**
70
   * Provides taxonomy term id as id.
71
   */
72
  protected function id($school_term) {
73
    return entity_extract_ids('taxonomy_term', $school_term)[0];
74
  }
75
76
  /**
77
   * Backwards compatibility with bnchdrff/json-api fork.
78
   */
79
  protected function getId($school_term) {
80
    return entity_extract_ids('taxonomy_term', $school_term)[0];
81
  }
82
83
  /**
84
   * Handles inclusion of school_profiles.
85
   */
86 View Code Duplication
  protected function school_profile() {
87
    return function ($school, $include, $included) {
88
      $serializer = new SchoolProfileSerializer($included);
89
90
      if (!$school->school_profile_id) {
91
        return NULL;
92
      }
93
94
      $school_profile = $serializer->resource($include ? $school->school_profile : $school->school_profile_id);
95
96
      $link = new Link($school_profile);
97
98
      return $link;
99
    };
100
  }
101
102
  /**
103
   * Dynamically construct methods for data tables with bcodes.
104
   *
105
   * @param string $method
106
   *   Should be a table_name, and will be converted to camelCase.
107
   */
108 View Code Duplication
  public function __call($method, $args) {
109
    self::$potentialDataTables = \Drupal\esdportal_api\EcDataUtils::getDataTablesWithBcodes();
110
    self::$potentialDataTableNames = \Drupal\esdportal_api\EcDataUtils::extractDataTableNames(self::$potentialDataTables);
111
112
    return function ($school, $include, $included) use ($method) {
113
      // The actual called method is underscore-separated...
114
      $table_name = $method;
115
116
      // ... But we want a method that is camelCased.
117
      $camelized_method = \Drupal\esdportal_api\EcDataUtils::underscoreToCamel($table_name);
118
119
      $class_name = 'Drupal\\esdportal_api\\Serializers\\' . $camelized_method . 'Serializer';
120
121
      // Legit data table name?
122
      if (!in_array($table_name, self::$potentialDataTableNames)) {
123
        return NULL;
124
      }
125
126
      $serializer = new $class_name($included);
127
128
      if (!$school->bcode) {
129
        return NULL;
130
      }
131
132
      if (!$school->{$table_name}) {
133
        return NULL;
134
      }
135
136
      $datum = $serializer->resource($include ? $school->{$table_name} : $school->bcode);
137
138
      $link = new Link($datum);
139
140
      return $link;
141
    };
142
  }
143
144
}
145