2024-02-19 12:25:53 +02:00

276 lines
8.6 KiB
PHP

<?php
namespace Drupal\endpoint_get_AAAAA\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\node\Entity\Node;
use Drupal\media\Plugin\media\Source;
use Drupal\media\Entity;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Url;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\TempStore;
class NodesController extends ControllerBase {
private const NODE_TYPE = 'AAAAA'; // Editable
/*
* Used for : Taxonomy reference field
* Value : single ID of field_article_category value
* Url : optional URL argument - single value
* Example : /api/en/articles/1234
*/
private const FIELD_CATEGORY = 'field_AAAAA_category'; // Editable
/* Used for : Taxonomy reference field
* Value : multiple ID's of field_article_subcategory values
* Url : optional URL query params - accept multiple values
* Example : /api/en/articles/1234?subcategory=55,66,77
*/
private const FIELD_SUBCATEGORY = 'field_AAAAA_subcategory'; // Editable
private const HTTP_BAD_REQUEST = 400;
private const HTTP_NOT_FOUND = 404;
private const HTTP_OK = 200;
private array $response = [];
private int $statusCode = self::HTTP_OK;
/*
*
* Main
*
*/
public function getNodes(Request $request, $lang, $category = 'all') {
$nodes = $this->loadNodes($request, $lang, $category);
$nodes_response = $this->buildNodes($nodes, $lang, $category);
$this->response = [
'code' => $this->statusCode,
'count' => count($nodes_response),
'nodes' => $nodes_response
];
return new JsonResponse($this->response, $this->statusCode);
}
/*
*
* Response List
*
*/
private function buildNodes(array $nodes, $lang): array {
$nodes_response = [];
foreach ($nodes as $node) {
/* don't show node if it hasn't translation */
if ( $node->hasTranslation($lang)) {
$node = $node->getTranslation($lang);
$published = $node->get('status')->value;
/* USER - get user name */
$uid = $node->getOwnerId();
$user = \Drupal\user\Entity\User::load($uid);
$name = $user->getDisplayName();
/* BODY Field - absolute urls for body inline images */
// $base_url = Url::fromRoute('<current>')->setAbsolute()->toString();
// $url_components = parse_url($base_url);
// $domain = $url_components['scheme'].'://'.$url_components['host'].':'.$url_components['port'];
// $body = str_replace(
// '/sites/default/',
// $domain.'/sites/default/',
// $node->get('body')->value
// );
/* LINK Field */
// $field_link = [];
// if ($node->hasField('field_link') && !$node->get('field_link')->isEmpty()) {
// $link_field = $node->get('field_link')->first();
// $url = $link_field->getUrl();
// $title = $link_field->getTitle();
// if ($url) {
// $field_link['url'] = $url->toString();
// }
// if ($title) {
// $field_link['title'] = $link_field->getTitle();
// } else {
// $field_link['title'] = $url->toString();;
// }
// }
/* GEOLOCATION Field */
// $field_geolocation = [];
// if ($node->hasField('field_geolocation') && !$node->get('field_geolocation')->isEmpty()) {
// $geolocation_field = $node->get('field_geolocation')->first();
// $latitude = $geolocation_field->lat;
// $longitude = $geolocation_field->lng;
// if ($latitude && $longitude) {
// $field_geolocation['lat'] = $latitude;
// $field_geolocation['lng'] = $longitude;
// }
// }
if ($published == 1) {
$nodes_response[] = [
'id' => intval($node->id()),
'title' => $node->getTitle(),
'lang' => $node->get('langcode')->value,
'alias' => $node->get('path')->alias,
'author' => $name,
// 'field_geolocation' => $field_geolocation,
// 'field_link' => $field_link,
// 'body' => $body,
// 'file' => $this->getFiles($node, 'field_file'),
// 'image' => $this->getImages($node, 'field_image'),
// 'category_id' => (
// $node
// ->get(self::FIELD_CATEGORY)
// ->entity)?\Drupal::service('entity.repository')
// ->getTranslationFromContext(
// $node->get(self::FIELD_CATEGORY)->entity,
// $node->currentTranslation
// )->id():'',
// 'category_label' => (
// $node
// ->get(self::FIELD_CATEGORY)
// ->entity)?\Drupal::service('entity.repository')
// ->getTranslationFromContext(
// $node->get(self::FIELD_CATEGORY)->entity,
// $node->currentTranslation
// )->getName():'',
// 'subcategory' => $this->getTerms($node, self::FIELD_SUBCATEGORY)
'created' => $node->get('created')->value
];
}
}
}
return $nodes_response;
}
/*
*
* Multivalue fields
*
*/
// private function getTerms(Node $node, string $field): array {
// $terms = $node->get($field)->referencedEntities();
// $response = [];
// foreach ($terms as $term) {
// $name = $term->getName();
// $tid = $term->id();
// $response[] = array(
// 'name' => $name,
// 'id' => $tid
// );
// }
// return $response;
// }
// private function getFiles(Node $node, string $field): array {
// $uris = [];
// foreach ($node->get($field) as $value) {
// $file = \Drupal::entityTypeManager()
// ->getStorage('file')
// ->load($value->getValue()['target_id']);
// $url = \Drupal::service('file_url_generator')
// ->generateAbsoluteString($file->getFileUri());
// $uris[] = array("url" => $url);
// }
// return $uris;
// }
// private function getImages(Node $node, string $field): array {
// $uris = [];
// foreach ($node->get($field)->getValue() as $value) {
// $file = \Drupal::entityTypeManager()
// ->getStorage('file')
// ->load($value['target_id']);
// $url = \Drupal::service('file_url_generator')
// ->generateAbsoluteString($file->getFileUri());
// $uris[] = array("url" => $url, "alt" => $value['alt']);
// }
// return $uris;
// }
/*
*
* get response nodes
*
*/
private function loadNodes($request, $lang, $category) {
/* build the query for nodes */
$query = \Drupal::entityTypeManager()
->getStorage('node')
->getQuery()
->accessCheck(false);
/* if category exist as URL parameter, create a query condition */
if ($category != 'all'){
$query->condition(self::FIELD_CATEGORY, $category);
}
/* if subcategory exist as URL query, create the query condition */
if ($request->query->get('subcategory')){
$or_group = $query->orConditionGroup();
$terms = explode(',', $request->query->get('subcategory'));
foreach ($terms as $term) {
$or_group->condition(self::FIELD_SUBCATEGORY.'.target_id', $term);
}
$query->condition($or_group);
}
/* add pager */
$query->range($request->get('start'), $request->get('length'));
/* sort results by DESC or ASC */
if ($request->get('sort')) {
$sort = $request->get('sort');
if(strcasecmp($sort, 'desc') == 0 || strcasecmp($sort, 'asc') == 0){
$sort = $request->get('sort');
}
else{
$sort = 'DESC';
}
}
else{
$sort = 'DESC';
}
/* sort results by field */
if ($request->get('sortby')) {
$sortby = $request->get('sortby');
if(strcasecmp($sortby, 'title') == 0 || strcasecmp($sortby, 'created') == 0){
$sortby = $request->get('sortby');
}
else{
$sortby = 'created';
}
}
else{
$sortby = 'created';
}
/* execute query to get node ids */
$nodeIds = $query
->condition('type', self::NODE_TYPE)
->sort($sortby, $sort, $lang)
->execute();
/* get nodes from ids */
$nodes=\Drupal::entityTypeManager()
->getStorage('node')
->loadMultiple($nodeIds);
/* Response List */
$nodeList=[];
foreach ($nodes as $node) {
$tid = $node->id();
$nodeList[$tid] = $node->hasTranslation($lang) ? $node->getTranslation($lang) : $node;
$node->currentTranslation = $lang;
}
return $nodeList;
}
// \Drupal::logger('Bundle AAAAA')->notice(''.$some_var);
}