Skip to content
Open
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
60 changes: 41 additions & 19 deletions FieldtypeOembed.module
Original file line number Diff line number Diff line change
Expand Up @@ -112,61 +112,83 @@ class FieldtypeOembed extends FieldtypeURL implements Module, ConfigurableModule
* Given a raw value from DB
* @param Page $page
* @param Field $field
* @param array|int|string $value
* @param array $value
* @return string
*/
public function ___wakeupValue(Page $page, Field $field, $value): string {
public function ___wakeupValue(Page $page, Field $field, $value): Oembed {
$oembedObj = $this->getBlankValue($page, $field);
$oembedData = json_decode($value['oembed'],JSON_OBJECT_AS_ARRAY);
if(is_array($oembedData)) $oembedObj->setArray($oembedData);

$page->setQuietly('_oembedObj' . $field->name, $oembedObj);
$page->setQuietly('_oembedExpires' . $field->name, $this->datetime->date('ts', $value['expires']));
if(!empty($value['data']) && $oembedObj->get('empty')) {
$oembedObj->set('url', $value['data']);
}

return $value['data'];
return $oembedObj;
}

/**
* For storage in DB
* @param Page $page
* @param Field $field
* @param array|float|int|object|string $value
* @param Oembed $value
* @return array
*/
public function ___sleepValue(Page $page, Field $field, $value): array {

// get raw data
if($value instanceof Oembed) $value = $page->getUnformatted($field->name);

$oembedData = $this->fetch($value);
$oembedData = $this->fetch($value->url);
return [
'data' => $value,
'data' => $value->url,
'oembed' => json_encode($oembedData, JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
'expires' => $oembedData
? $this->datetime->date(self::MysqlDatetimeFormat, time() + $field->get('cacheTime'))
: 0
];
}

/**
* Given a value, make it clean and of the correct type for storage within a Page
*
* @param Page $page
* @param Field $field
* @param Oembed $value
* @return Oembed
*
*/
public function sanitizeValue(Page $page, Field $field, $value) {
if(!$value instanceof Oembed) {
$oembed = $this->getBlankValue($page, $field);
$value = $this->sanitizer->url($value, array(
'allowRelative' => false,
'allowIDN' => $field->get("allowIDN") ? true : false,
'stripQuotes' => $field->get("allowQuotes") ? false : true,
));
if(!empty($value)) {
$oembed->set("url", $value);
}
return $oembed;
}
return $value;
}

/**
* Format a value for front-end output
* @param Page $page
* @param Field $field
* @param string $value
* @param Oembed $value
* @return Oembed
*/
public function ___formatValue(Page $page, Field $field, $value) {
return $page->get('_oembedObj' . $field->name);
return $value;
}

/**
* @param Page $page
* @param Field $field
* @param $value
* @param Oembed $value
* @return bool
*/
public function isDeleteValue(Page $page, Field $field, $value): bool {
return empty($value);
return empty($value->url);
}

/**
Expand Down Expand Up @@ -400,18 +422,18 @@ class FieldtypeOembed extends FieldtypeURL implements Module, ConfigurableModule
* @return void
*/
public function refreshOembedData($event = null) {
foreach(wire()->fields->findByType($this) as $field) {
foreach($this->fields->findByType($this) as $field) {
$expiredPages = $this->pages->findMany("{$field->name}.expires<now,check_access=0,include=hidden");
foreach($expiredPages as $expiredPage) {
try {
$expiredPage->of(false);
$expiredPage->save($field->name);
wire()->log->save(
$this->log->save(
self::refreshLog,
'Refresh Oembed Data From URL ' . $expiredPage->getUnformatted($field->name)
);
} catch(\Exception $exception) {
wire()->log->save(
$this->log->save(
self::refreshLog,
'Error in field ' . $expiredPage->getUnformatted($field->name) . ': ' . $exception->getMessage()
);
Expand Down
2 changes: 1 addition & 1 deletion FieldtypeOembedConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public function getInputfields(): InputfieldWrapper {
if(!empty($this->customProviders)) {
$customProviders = json_decode($this->customProviders,JSON_OBJECT_AS_ARRAY);
if(!is_array($customProviders)) {
wire()->error('Invalid JSON in field Custom Providers (JSON)');
$this->error('Invalid JSON in field Custom Providers (JSON)');
}
}

Expand Down
15 changes: 12 additions & 3 deletions InputfieldOembed.module
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,15 @@ class InputfieldOembed extends InputfieldURL {

$this->config->styles->add($this->config->urls->InputfieldOembed . "InputfieldOembed.css");
$fieldtype = $this->get('hasField');
$oembed = $this->get('oembed');

if(
$fieldtype &&
$fieldtype->type instanceof FieldtypeOembed &&
!empty($this->get('value')) &&
$this->hasPage instanceof Page
!empty($oembed) &&
$oembed->url
) {
$preview = $this->oembedPreview($this->hasPage->getFormatted($fieldtype->name));
$preview = $this->oembedPreview($oembed);
if($preview) {
$this->appendMarkup($preview);
}
Expand All @@ -64,6 +65,14 @@ class InputfieldOembed extends InputfieldURL {
return parent::___render();
}

protected function setAttributeValue($value) {
if($value instanceof Oembed) {
$this->set('oembed', $value);
$value = $value->url;
}
return parent::setAttributeValue($value);
}

/**
* Build preview for inputfield
* @param ?Oembed $oembed
Expand Down
3 changes: 2 additions & 1 deletion Oembed.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public function __construct(Page $page, Field $field) {
$this->field = $field;

$this->set('empty', true);
$this->set('url', '');
}

/**
Expand All @@ -44,7 +45,7 @@ public function __construct(Page $page, Field $field) {
public function set($key, $value) {

// declare as valid
if($key !== 'empty') $this->set('empty', false);
if($key !== 'empty' && $key !== 'url') $this->set('empty', false);

// date
if($key === 'date') $value = $value ? wireDate('c', $value) : '';
Expand Down