forked from lino/radar-wp
WIP Now with some formatting.
This commit is contained in:
parent
649f84ad8c
commit
98872a46bc
3 changed files with 328 additions and 81 deletions
|
@ -57,11 +57,11 @@ class Squat_Radar_Connector {
|
|||
}
|
||||
|
||||
function events( $facets, $fields = [], $language = NULL, $limit = 10, $expiration = 10800, $reset = FALSE ) {
|
||||
$fields = array_merge($fields, ['uuid', 'url']);
|
||||
$transient_key = 'squat_radar_events_' . sha1(implode($facets) . implode($fields) . $language . $limit);
|
||||
if (! $reset && $data = get_transient( $transient_key )) {
|
||||
return $data;
|
||||
}
|
||||
|
||||
$query = $this->encode_api_query( $facets, $fields, $language, $limit );
|
||||
$events = $this->get_events($query);
|
||||
|
||||
|
|
|
@ -2,50 +2,318 @@
|
|||
|
||||
class Squat_Radar_Formatter {
|
||||
|
||||
static public function format_event($event, $fields) {
|
||||
foreach ($fields as $field) {
|
||||
$value = self::getValue($event, explode(':', $field));
|
||||
}
|
||||
static public function register() {
|
||||
// Filter to go through fields and then call filters to turn these into HTML.
|
||||
add_filter('squat_radar_format_event', [__CLASS__, 'format_event'], 10, 3);
|
||||
|
||||
// Filters to turn each individual field into HTML.
|
||||
//
|
||||
// $value is the data from the field and can be an array or string.
|
||||
// These filters extract data from arrays based on the field structure.
|
||||
add_filter('squat_radar_field_html', [__CLASS__, 'field_date_html'], 5, 4);
|
||||
add_filter('squat_radar_field_html', [__CLASS__, 'field_location_html'], 5, 4);
|
||||
add_filter('squat_radar_field_html', [__CLASS__, 'field_link_html'], 5, 4);
|
||||
// field 'url' was turned into a more link, example of an override with more specificity.
|
||||
add_filter('squat_radar_field_html', [__CLASS__, 'field_image_html'], 7, 4);
|
||||
// If $value is an array it is flattened into a string here.
|
||||
// If $value != $original it will _not_ be sanitized, assumption is that it has been already.
|
||||
add_filter('squat_radar_field_html', [__CLASS__, 'field_html'], 10, 4);
|
||||
// $value is always a string. These filters just add additional wrapper markup.
|
||||
add_filter('squat_radar_field_html', [__CLASS__, 'field_title_html'], 15, 4);
|
||||
}
|
||||
|
||||
static public function format_event($event, $fields, $context) {
|
||||
|
||||
$context['event'] = $event;
|
||||
$output = [];
|
||||
$output[] = '<div class="squat-radar radar-event">';
|
||||
foreach ($fields as $field) {
|
||||
$field_tree = explode(':', $field);
|
||||
$value = self::getValue($event, $field_tree);
|
||||
$field_tree = array_reverse($field_tree);
|
||||
$output[] = apply_filters('squat_radar_field_html', $value, $value, $field_tree, $context);
|
||||
}
|
||||
$output[] = '</div>';
|
||||
return $output;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Date field formatting implementation of 'squat_radar_field_html' filter.
|
||||
*/
|
||||
static public function field_date_html($value, $original, $field, $context) {
|
||||
|
||||
switch ($field[0]) {
|
||||
case 'created':
|
||||
case 'updated':
|
||||
$output = '';
|
||||
if ($value) {
|
||||
$output = date_i18n( get_option( 'date_format' ), $value );
|
||||
$placeholder = ($field[0] == 'created') ? __('Created: %s', 'squat-radar') : __('Updated: %s', 'squat-radar');
|
||||
$output = '<span class="squat-radar-meta-data squat-radar-' . $field[0] . '">' . sprintf($placeholder, $output) . '</span>';
|
||||
}
|
||||
return $output;
|
||||
|
||||
// "date_time": [
|
||||
// {
|
||||
// "value": "1556442000",
|
||||
// "value2": "1556442000",
|
||||
// "duration": 0,
|
||||
// "time_start": "2019-04-28T11:00:00+02:00",
|
||||
// "time_end": "2019-04-28T11:00:00+02:00",
|
||||
// "rrule": null
|
||||
// }
|
||||
// ],
|
||||
case 'date_time':
|
||||
|
||||
$output = '';
|
||||
// There can only be one date. With repeat etc. but just one.
|
||||
// Repeating events will appear as a new item for each repeat in the feed.
|
||||
$value = $value[0];
|
||||
$output = '<span class="squat-radar-event-start-end">';
|
||||
$output .= self::field_date_format($value['time_start'], 'start');
|
||||
if ($value['time_start'] != $value['time_end']) {
|
||||
$output .= self::field_date_format($value['time_end'], 'end');
|
||||
}
|
||||
$output .= '</span>';
|
||||
return $output;
|
||||
|
||||
case 'time_start':
|
||||
|
||||
$output = '<span class="squat-radar-event-start">';
|
||||
$output .= self::field_date_format($value, 'start');
|
||||
$output .= '</span>';
|
||||
return $output;
|
||||
|
||||
case 'time_end':
|
||||
|
||||
$output = '<span class="squat-radar-event-start">';
|
||||
$output .= self::field_date_format($value, 'start');
|
||||
$output .= '</span>';
|
||||
return $output;
|
||||
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
private static function field_date_format($time, $start_end) {
|
||||
|
||||
$date_format = get_option('squat_radar_date_format', 'j M Y');
|
||||
$time_format = get_option('squat_radar_time_format', 'H:i');
|
||||
|
||||
$output = '<span class="squat-radar-datetime squat-radar-datetime-' . $start_end .'">';
|
||||
$output .= '<span class="squat-radar-date">';
|
||||
$output .= date_i18n($date_format, strtotime($time));
|
||||
$output .= '</span> <span class="squat-radar-time">';
|
||||
$output .= date_i18n($time_format, strtotime($time));
|
||||
$output .= '</span></span>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Location field implementation of 'squat_radar_field_html' filter.
|
||||
*
|
||||
* "offline": [
|
||||
* {
|
||||
* "uri": "https://radar.squat.net/api/1.2/location/b5786379-da49-4026-8c4e-bcc1a1563284",
|
||||
* "id": "b5786379-da49-4026-8c4e-bcc1a1563284",
|
||||
* "resource": "location",
|
||||
* "title": "Yorck-Kino Yorckstr. 86 Berlin Deutschland",
|
||||
* "map": {
|
||||
* "geom": "POINT (13.3853499 52.4930248)",
|
||||
* "geo_type": "point",
|
||||
* "lat": "52.493024800000",
|
||||
* "lon": "13.385349900000",
|
||||
* "left": "13.385349900000",
|
||||
* "top": "52.493024800000",
|
||||
* "right": "13.385349900000",
|
||||
* "bottom": "52.493024800000",
|
||||
* "srid": null,
|
||||
* "latlon": "52.493024800000,13.385349900000",
|
||||
* "schemaorg_shape": ""
|
||||
* }
|
||||
* }
|
||||
* ]
|
||||
*/
|
||||
function field_location_html($value, $original, $field, $context) {
|
||||
switch ($field[0]) {
|
||||
case 'map':
|
||||
$output = [];
|
||||
foreach ($value as $map) {
|
||||
if ( is_array($value) && $value['lat'] !== NULL && $value['lon'] !== NULL ) {
|
||||
$this_output = '<span class="squat-radar-location squat-radar-location-map-link">';
|
||||
$lat = $value['lat'];
|
||||
$lon = $value['lon'];
|
||||
$this_output .= "<a href=\"https://www.openstreetmap.org/?mlat=$lat&mlon=$lon#map=12/$lat/$lon\">";
|
||||
$this_output .= __('[Map]', 'squat-radar');
|
||||
$this_output .= '</a></span>';
|
||||
$output[] = $this_output;
|
||||
}
|
||||
}
|
||||
return implode(', ', $output);
|
||||
|
||||
case 'address':
|
||||
$output = [];
|
||||
foreach ($value as $address) {
|
||||
if ( is_array($value) ) {
|
||||
$this_address = [];
|
||||
foreach (['name_line', 'thoroughfare', 'locality', 'postal_code', 'country'] as $field_name) {
|
||||
if (! empty($value[$field_name])) {
|
||||
$this_line = '<span class="squat-radar-location-' . $field_name . '">';
|
||||
$this_line .= sanitize_text_field($value[$field_name]);
|
||||
$this_line .= '</span>';
|
||||
$this_address[] = $this_line;
|
||||
}
|
||||
}
|
||||
|
||||
$this_output = '<span class="squat-radar-location squat-radar-location-address">';
|
||||
$this_output .= implode(' ,', $this_address);
|
||||
$this_output .= '</span>';
|
||||
$output[] = $this_output;
|
||||
}
|
||||
}
|
||||
return implode('; ', $output);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Item Radar links implementation of 'squat_radar_field_html' filter.
|
||||
*/
|
||||
function field_link_html($value, $original, $field, $context) {
|
||||
if ($field[0] == 'title' && ! empty($context['event']['url'])) {
|
||||
return '<a href="' . esc_url($context['event']['url']) . '" class="squat-radar-url squat-radar-url-title">' . sanitize_text_field( $value ) . '</a>';
|
||||
}
|
||||
|
||||
if ($field[0] == 'url' && count($field) == 1) {
|
||||
return '<a href="' . esc_url_raw($value) . '" class="squat-radar-url squat-radar-url-more">' . __('more…', 'squat-radar') . '</a>';
|
||||
}
|
||||
|
||||
if ($field[0] == 'url') {
|
||||
array_shift($field);
|
||||
$field_tree = array_reverse($field);
|
||||
$sibling_fields = self::getValue($event, $field_tree);
|
||||
$title = esc_url($value);
|
||||
$class = 'squat-radar-url-link';
|
||||
if (! empty($sibling_fields['title']) ) {
|
||||
$title = sanitize_text_field( $sibling_fields['title']);
|
||||
$class = 'squat-radar-url-title';
|
||||
}
|
||||
elseif ( ! empty($sibling_fields['name']) ) {
|
||||
$title = sanitize_text_field( $sibling_fields['name']);
|
||||
$class = 'squat-radar-url-name';
|
||||
}
|
||||
return '<a href="' . esc_url_raw($value) . '" class="squat-radar-url ' . $class . '">' . $title . '</a>';
|
||||
}
|
||||
|
||||
if ($field[0] == 'link') {
|
||||
return '<a href="' . esc_url_raw($value['url']) . '" class="squat-radar-url squat-radar-url-link">' . esc_url($value['url']) . '</a>';
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format image implementation of 'squat_radar_field_html' filter.
|
||||
*
|
||||
* Deliberatly run after field_link_html. Showing how to override an existing filter.
|
||||
* image:file:url
|
||||
*/
|
||||
function field_image_html($value, $original, $field, $context) {
|
||||
if ($field[0] == 'url' && $field[1] == 'file' && $field[2] == 'image') {
|
||||
return '<img src="'. esc_url_raw($original) .'" class="squat-radar-image" \>';
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Basic implementation of 'squat_radar_field_html' filter.
|
||||
*
|
||||
* Put the output into HTML.
|
||||
*
|
||||
* @param array|string $value
|
||||
* The field value being manipulated to become HTML to be displayed.
|
||||
* @param array|string $original
|
||||
* The original value of the field before any changes by filters.
|
||||
* @param array $field
|
||||
* The field tree. $field[0] being the name of the present field. $field[1]
|
||||
* being any parent etc.
|
||||
* @param array $context
|
||||
*
|
||||
* @return string
|
||||
* Flattend array with additional default classes.
|
||||
*/
|
||||
function field_html($value, $original, $field, $context) {
|
||||
if ($value != $original) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if (is_array($value)) {
|
||||
if ( ! empty($value['value']) ) {
|
||||
$value = $value['value'];
|
||||
}
|
||||
elseif ( ! empty($value['title']) ) {
|
||||
$value = $value['title'];
|
||||
}
|
||||
elseif ( ! empty($value['name']) ) {
|
||||
$value = $value['name'];
|
||||
}
|
||||
elseif ( ! empty($value[0]['value']) ) {
|
||||
foreach ($value as $row) {
|
||||
$values[] = $row['value'];
|
||||
}
|
||||
$value = $values;
|
||||
}
|
||||
elseif ( ! empty($value[0]['title']) ) {
|
||||
foreach ($value as $row) {
|
||||
$titles[] = $row['title'];
|
||||
}
|
||||
$value = $titles;
|
||||
}
|
||||
elseif ( ! empty($value[0]['name']) ) {
|
||||
foreach ($value as $row) {
|
||||
$names[] = $row['name'];
|
||||
}
|
||||
$value = $names;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_array($value)) {
|
||||
$output = '<ul class="squat-radar-' . sanitize_html_class($field[0]) . ' squat-radar-list">';
|
||||
foreach ($value as $row) {
|
||||
$output .= '<li class="squat-radar-item-' . sanitize_html_class($field[0]) . '">' . sanitize_text_field( $row ) . '</li>';
|
||||
}
|
||||
$output .= '</ul>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
else {
|
||||
$value = '<span class="squat-radar-' . sanitize_html_class($field[0]) . '">' . $value . '</span>';
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Title field HTML implentation of 'squat_radar_field_html' filter.
|
||||
*/
|
||||
function field_title_html($value, $original, $field, $context) {
|
||||
if ($field[0] == 'title' && count($field) == 1) {
|
||||
$value = '<h3 class="squat-radar-title">' . $value . '</h3>';
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a value from a nested array with variable depth.
|
||||
*
|
||||
* This helper function should be used when the depth of the array element
|
||||
* being retrieved may vary (that is, the number of parent keys is variable).
|
||||
* It is primarily used for form structures and renderable arrays.
|
||||
*
|
||||
* Without this helper function the only way to get a nested array value with
|
||||
* variable depth in one line would be using eval(), which should be avoided:
|
||||
* @code
|
||||
* // Do not do this! Avoid eval().
|
||||
* // May also throw a PHP notice, if the variable array keys do not exist.
|
||||
* eval('$value = $array[\'' . implode("']['", $parents) . "'];");
|
||||
* @endcode
|
||||
*
|
||||
* Instead, use this helper function:
|
||||
* @code
|
||||
* $value = NestedArray::getValue($form, $parents);
|
||||
* @endcode
|
||||
*
|
||||
* A return value of NULL is ambiguous, and can mean either that the requested
|
||||
* key does not exist, or that the actual value is NULL. If it is required to
|
||||
* know whether the nested array key actually exists, pass a third argument
|
||||
* that is altered by reference:
|
||||
* @code
|
||||
* $key_exists = NULL;
|
||||
* $value = NestedArray::getValue($form, $parents, $key_exists);
|
||||
* if ($key_exists) {
|
||||
* // Do something with $value.
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* However if the number of array parent keys is static, the value should
|
||||
* always be retrieved directly rather than calling this function.
|
||||
* For instance:
|
||||
* @code
|
||||
* $value = $form['signature_settings']['signature'];
|
||||
* @endcode
|
||||
* Handles on level of multiple[] values on a key.
|
||||
* It will work for deeper multiples, but return the top match.
|
||||
*
|
||||
* @param array $array
|
||||
* The array from which to get the value.
|
||||
|
@ -61,15 +329,28 @@ class Squat_Radar_Formatter {
|
|||
* Boolean that indicates whether all nested parent keys exist (TRUE) or not
|
||||
* (FALSE). This allows to distinguish between the two possibilities when
|
||||
* NULL is returned.
|
||||
*
|
||||
* @author drupal.org contributors
|
||||
*/
|
||||
public static function &getValue(array &$array, array $parents, &$key_exists = NULL) {
|
||||
$ref =& $array;
|
||||
foreach ($parents as $parent) {
|
||||
while ($parent = array_shift($parents)) {
|
||||
if (is_array($ref) && array_key_exists($parent, $ref)) {
|
||||
$ref =& $ref[$parent];
|
||||
}
|
||||
elseif (is_array($ref) && isset($ref[0])) {
|
||||
$multiple = [];
|
||||
array_unshift($parents, $parent);
|
||||
foreach ($ref as &$value) {
|
||||
$multiple[] = self::getValue($value, $parents, $key_exists);
|
||||
}
|
||||
if (!empty($multiple) ) {
|
||||
return $multiple;
|
||||
}
|
||||
else {
|
||||
$key_exists = FALSE;
|
||||
$null = NULL;
|
||||
return $null;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$key_exists = FALSE;
|
||||
$null = NULL;
|
||||
|
|
|
@ -76,46 +76,12 @@ class Squat_Radar_Widget extends WP_Widget {
|
|||
|
||||
$html = '';
|
||||
foreach ($data['result'] as $id => $event) {
|
||||
$html .= Squat_Radar_Formatter::format_event($event);
|
||||
$output = apply_filters( 'squat_radar_format_event', $event, $instance['fields'], ['instance' => $instance] );
|
||||
$html .= implode($output);
|
||||
}
|
||||
$data['html'] = $html;
|
||||
|
||||
wp_send_json($data);
|
||||
|
||||
$print.="<li class='squat-li'>";
|
||||
|
||||
if ($r->title) {
|
||||
$print.="<h3 class='squat-h3'>";
|
||||
$print.=strip_tags($r->title);
|
||||
$print.="</h3>";
|
||||
}
|
||||
|
||||
if ($r->date_time[0]) {
|
||||
$print.="<span class='squat-tijd'>";
|
||||
$print.=verwerk_datum($r->date_time[0]);
|
||||
$print.="</span>";
|
||||
}
|
||||
|
||||
if ($r->body and $r->body->value) {
|
||||
$print.="<p class='squat-p'>".limit_text(strip_tags($r->body->value), 40) . "</p>";
|
||||
}
|
||||
|
||||
if ($r->title and $r->date_time[0]) {
|
||||
|
||||
$radar_link = "https://radar.squat.net/en/node/$r_id";
|
||||
|
||||
if ( $squat_lang == "nl") {
|
||||
$nog_meer = "zie alles";
|
||||
$meer = "meer";
|
||||
} else {
|
||||
$nog_meer = "see all";
|
||||
$meer = "more";
|
||||
}
|
||||
|
||||
$print.= "<a class='squat-link button' target='_blank' href='#' data-link='$radar_link' data-nog-meer='$nog_meer'>$meer</a>";
|
||||
}
|
||||
|
||||
$print.="</li>";
|
||||
}
|
||||
|
||||
public function form( $instance ) {
|
||||
|
@ -179,7 +145,7 @@ class Squat_Radar_Widget extends WP_Widget {
|
|||
echo '<div class="description">' . __('Go to <a href="https://radar.squat.net/en/events" target="_blank">https://radar.squat.net/en/events</a> and filter for the events you want to show. Then copy the URL from your address bar into here. It will look similar to: https://radar.squat.net/en/events/city/City_Name/group/123', 'squat-radar') . '</div>';
|
||||
}
|
||||
|
||||
if ( ! $instance['url']['error'] && ! empty( $instance['url']['keys'] ) ) {
|
||||
if ( empty($instance['url']['error']) && ! empty( $instance['url']['keys'] ) ) {
|
||||
echo '<hr>';
|
||||
echo '<p>' . __('Currently selecting events:', 'squat-radar') . '</p>';
|
||||
echo '<dl>';
|
||||
|
@ -259,7 +225,7 @@ class Squat_Radar_Widget extends WP_Widget {
|
|||
|
||||
if ( ! empty($new_instance['fields']) ) {
|
||||
$matches = [];
|
||||
preg_match_all('/([a-zA-Z:]+)/', $new_instance['fields'], $matches);
|
||||
preg_match_all('/([a-zA-Z_:]+)/', $new_instance['fields'], $matches);
|
||||
$options['fields'] = $matches[0];
|
||||
}
|
||||
else {
|
||||
|
|
Loading…
Reference in a new issue