-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Core] New feature : User Interface to "Detect" Feed from an URL (#3436)
* [Core] New feature : User Interface to "Detect" Feed from an URL Detect Action has been expanded to support returning a Feed in a JSON format instead of a Redirect. Existing usage of the Detect action will keep working as usual. Frontpage template has now a section to display the Feed detection result, and a button to start the Feed Detection. A new JS file contains the necessary JS (Ajax and Event management) to fill the Feed Detection section. * Coding policy fixes * [Core] New feature : User Interface to "Detect" Feed from an URL - Switch from old school XMLHttpRequest to fetch - Enhance UX of search results - Revert to it's original content - Switch to a new Action : FindfeedAction.php - Switch to template literals instead of string concatenation - FindFeed action could retrun multiple feeds - Results are sent with an absolute URL - Switch to Json::encode() helper function * [Core] New feature : User Interface to "Detect" Feed from an URL - Move specific JS code to rss-bridge.js - Change HTML tag for the button to have a consistant style with th rest of the page * [Core] New feature : User Interface to "Detect" Feed from an URL - If no context is sent, assume there is only one unnamed context - Find parameter name in global and currect context * fix * remove typo --------- Co-authored-by: Dag <[email protected]>
- Loading branch information
1 parent
54045be
commit 7591b10
Showing
4 changed files
with
212 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
<?php | ||
|
||
/** | ||
* This action is used by the frontpage form search. | ||
* It finds a bridge based off of a user input url. | ||
* It uses bridges' detectParameters implementation. | ||
*/ | ||
class FindfeedAction implements ActionInterface | ||
{ | ||
public function execute(array $request) | ||
{ | ||
$targetURL = $request['url'] ?? null; | ||
$format = $request['format'] ?? null; | ||
|
||
if (!$targetURL) { | ||
return new Response('You must specify a url', 400); | ||
} | ||
if (!$format) { | ||
return new Response('You must specify a format', 400); | ||
} | ||
|
||
$bridgeFactory = new BridgeFactory(); | ||
|
||
$results = []; | ||
foreach ($bridgeFactory->getBridgeClassNames() as $bridgeClassName) { | ||
if (!$bridgeFactory->isEnabled($bridgeClassName)) { | ||
continue; | ||
} | ||
|
||
$bridge = $bridgeFactory->create($bridgeClassName); | ||
|
||
$bridgeParams = $bridge->detectParameters($targetURL); | ||
|
||
if ($bridgeParams === null) { | ||
continue; | ||
} | ||
|
||
// It's allowed to have no 'context' in a bridge (only a default context without any name) | ||
// In this case, the reference to the parameters are found in the first element of the PARAMETERS array | ||
|
||
$context = $bridgeParams['context'] ?? 0; | ||
|
||
$bridgeData = []; | ||
// Construct the array of parameters | ||
foreach ($bridgeParams as $key => $value) { | ||
// 'context' is a special case : it's a bridge parameters, there is no "name" for this parameter | ||
if ($key == 'context') { | ||
$bridgeData[$key]['name'] = 'Context'; | ||
$bridgeData[$key]['value'] = $value; | ||
} else { | ||
$bridgeData[$key]['name'] = $this->getParameterName($bridge, $context, $key); | ||
$bridgeData[$key]['value'] = $value; | ||
} | ||
} | ||
|
||
$bridgeParams['bridge'] = $bridgeClassName; | ||
$bridgeParams['format'] = $format; | ||
$content = [ | ||
'url' => get_home_page_url() . '?action=display&' . http_build_query($bridgeParams), | ||
'bridgeParams' => $bridgeParams, | ||
'bridgeData' => $bridgeData, | ||
'bridgeMeta' => [ | ||
'name' => $bridge::NAME, | ||
'description' => $bridge::DESCRIPTION, | ||
'parameters' => $bridge::PARAMETERS, | ||
'icon' => $bridge->getIcon(), | ||
], | ||
]; | ||
$results[] = $content; | ||
} | ||
if ($results === []) { | ||
return new Response(Json::encode(['message' => 'No bridge found for given url']), 404, ['content-type' => 'application/json']); | ||
} | ||
return new Response(Json::encode($results), 200, ['content-type' => 'application/json']); | ||
} | ||
|
||
// Get parameter name in the actual context, or in the global parameter | ||
private function getParameterName($bridge, $context, $key) | ||
{ | ||
if (isset($bridge::PARAMETERS[$context][$key]['name'])) { | ||
$name = $bridge::PARAMETERS[$context][$key]['name']; | ||
} else if (isset($bridge::PARAMETERS['global'][$key]['name'])) { | ||
$name = $bridge::PARAMETERS['global'][$key]['name']; | ||
} else { | ||
$name = 'Variable "' . $key . '" (No name provided)'; | ||
} | ||
return $name; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters