Skip to Content Skip to Menu

CB AutoAction and data attributes

  • activha
  • activha
  • OFFLINE
  • Posts: 2280
  • Thanks: 113
  • Karma: 13
2 years 2 weeks ago #329439 by activha
Replied by activha on topic CB AutoAction and data attributes
Ok I see...

But has Cb the same functionalities as joomla to get the tasks that are sent by the js file and how ??
Or do I have to write one autoaction per task ?

For instance
Code:
const getAutocompleteLocation = async (sendObject) => { try { const response = await fetch ('index.php?option=com_comprofiler&view=pluginclass&plugin=cbautoactions&action=action&actions=296&format=raw', { method: 'POST', mode: 'same-origin', credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(sendObject) }) const data = await response.json(); console.log(data) console.log(typeof(data)) console.log(data.success) if (data.success === true) { console.log(data.data[0].views, 'views') const previewLocations = data.data[0].views const listItems = previewLocations.map(location => { console.log(location) return `<li data-location-id=${location.id}>${location.first}</li>` }) .join('') ul.innerHTML = listItems ul.removeAttribute('hidden') console.log('listItems', listItems) ul.addEventListener('click', e => { if (!event.target.matches('li')) return const li = e.target const locationName = li.textContent console.log('locationName', locationName) const locationId = li.dataset.locationId console.log('locationId', locationId) input.value = locationName input.setAttribute('data-location-id', locationId) ul.setAttribute('hidden', true) }) } } catch(e){ console.log(e) } }

Please Log in or Create an account to join the conversation.

  • krileon
  • krileon
  • ONLINE
  • Posts: 68625
  • Thanks: 9109
  • Karma: 1434
2 years 2 weeks ago #329442 by krileon
Replied by krileon on topic CB AutoAction and data attributes

But has Cb the same functionalities as joomla to get the tasks that are sent by the js file and how ??

Yes, use $input as noted in the Code parameter description. Example as follows.

From
Code:
if ($receivedData['task'] === 'getAutoCompleteLocationData') {
To
Code:
if ( $input->getCmd( 'task', '' ) === 'getAutoCompleteLocationData' ) {

From:
Code:
$query = $receivedData["query"]; $locationId = $receivedData["location_id"];
To:
Code:
$query = $input->getString( 'query', '' ); $locationId = $input->getString( 'location_id', '' );

I've no idea why you're using the following even in Joomla.

Code:
$content = trim(file_get_contents("php://input")); $receivedData = json_decode($content, true);

You had access to $app->input to get request data.


Kyle (Krileon)
Community Builder Team Member
Before posting on forums: Read FAQ thoroughly + Read our Documentation + Search the forums
CB links: Documentation - Localization - CB Quickstart - CB Paid Subscriptions - Add-Ons - Forge
--
If you are a Professional, Developer, or CB Paid Subscriptions subscriber and have a support issue please always post in your respective support forums for best results!
--
If I've missed your support post with a delay of 3 days or greater and are a Professional, Developer, or CBSubs subscriber please send me a private message with your thread and will reply when possible!
--
Please note I am available Monday - Friday from 8:00 AM CST to 4:00 PM CST. I am away on weekends (Saturday and Sunday) and if I've missed your post on or before a weekend after business hours please wait for the next following business day (Monday) and will get to your issue as soon as possible, thank you.
--
My role here is to provide guidance and assistance. I cannot provide custom code for each custom requirement. Please do not inquire me about custom development.

Please Log in or Create an account to join the conversation.

  • activha
  • activha
  • OFFLINE
  • Posts: 2280
  • Thanks: 113
  • Karma: 13
2 years 2 weeks ago - 2 years 1 week ago #329446 by activha
Replied by activha on topic CB AutoAction and data attributes

I've no idea why you're using the following even in Joomla.

$content = trim(file_get_contents("php://input"));
$receivedData = json_decode($content, true);

You had access to $app->input to get request data.


That's written by the dev that I hired for this job.... very difficult to find experts who knows CB... they write joomla only and I have to adapt each time :-(

Wish I could find a good dev team expert in CB and plugins...



if I add &format=raw at the end of the autoaction will it output a correct json or do I have to change it for &format=json at the end ?

I tried but the autoaction only sends back
Code:
<div class="cb_template cb_template_4d95f3"></div>
in this case

It seems like the js script sends requests looking like
Code:
{"task":"getAutoCompleteLocationData","query":"xxx"}
but the $input does not receive it in the autoaction when I try to
Code:
print_r($input);exit;

Any idea why ?
Last edit: 2 years 1 week ago by activha.

Please Log in or Create an account to join the conversation.

  • krileon
  • krileon
  • ONLINE
  • Posts: 68625
  • Thanks: 9109
  • Karma: 1434
2 years 1 week ago #329451 by krileon
Replied by krileon on topic CB AutoAction and data attributes

That's written by the dev that I hired for this job.... very difficult to find experts who knows CB... they write joomla only and I have to adapt each time :-(

Wish I could find a good dev team expert in CB and plugins...

They don't need to know CB or Joomla. It's all documented (and for what isn't they can just ask here how to do X in regards to CB) and has autocomplete. Any PHP dev with an IDE should be able to see that. You'd just need a quality developer experienced with PHP that's capable of learning, but don't expect much from a PHP developer if you're paying them less than $50 an hour.

if I add &format=raw at the end of the autoaction will it output a correct json or do I have to change it for &format=json at the end ?

Either should work fine. CB Auto Actions will force a JSON header when using JSON output.

It seems like the js script sends requests looking like

That's because you're converting the post body to a JSON string in your fetch. That explains why the PHP was so goofy accessing the request data. I've no idea what sendObject is in your JS, but it should either be a FormData object or a JS object. Example as follows.

Code:
const formData = new FormData(); formData.append( 'task', 'getAutoCompleteLocationData' ); formData.append( 'query', 'xxx' );

This shouldn't be a POST though. This really should be a GET, which the URL can be constructed with additional data using the below.

Code:
const url = new URL( 'index.php?option=com_comprofiler&view=pluginclass&plugin=cbautoactions&action=action&actions=296&format=raw' ); url.searchParams.set( 'task', 'getAutoCompleteLocationData' ); url.searchParams.set( 'query', 'xxx' );

There's also a bunch of debug code left in your JS. Specifically all the console.log calls.


Kyle (Krileon)
Community Builder Team Member
Before posting on forums: Read FAQ thoroughly + Read our Documentation + Search the forums
CB links: Documentation - Localization - CB Quickstart - CB Paid Subscriptions - Add-Ons - Forge
--
If you are a Professional, Developer, or CB Paid Subscriptions subscriber and have a support issue please always post in your respective support forums for best results!
--
If I've missed your support post with a delay of 3 days or greater and are a Professional, Developer, or CBSubs subscriber please send me a private message with your thread and will reply when possible!
--
Please note I am available Monday - Friday from 8:00 AM CST to 4:00 PM CST. I am away on weekends (Saturday and Sunday) and if I've missed your post on or before a weekend after business hours please wait for the next following business day (Monday) and will get to your issue as soon as possible, thank you.
--
My role here is to provide guidance and assistance. I cannot provide custom code for each custom requirement. Please do not inquire me about custom development.

Please Log in or Create an account to join the conversation.

  • activha
  • activha
  • OFFLINE
  • Posts: 2280
  • Thanks: 113
  • Karma: 13
2 years 1 week ago - 2 years 1 week ago #329487 by activha
Replied by activha on topic CB AutoAction and data attributes
Well I guess I chose the wrong developer and now I am just trying to correct things myself... :-)

if I correct his code as follows, is it ok to get CB to send the appropriate json ?
I cannot succeed in getting a return
Code:
document.addEventListener('DOMContentLoaded', e => { const options = { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 } function error(err) { console.warn(`ERROR(${err.code}): ${err.message}`); } const typeaheadLocation = document.querySelector('.typeahead__location') let input let ul if (typeaheadLocation) { input = typeaheadLocation.querySelector('input') ul = typeaheadLocation.querySelector('ul') } const getAutocompleteLocation = async (sendObject) => { try { const url = new URL( 'index.php?option=com_comprofiler&view=pluginclass&plugin=cbautoactions&action=action&actions=296&format=raw' ); url.searchParams.set( 'task', 'getAutoCompleteLocationData' ); url.searchParams.set( 'query', inputValue ); const response = await fetch ( url , { method: 'GET', mode: 'same-origin', credentials: 'include', headers: { 'Content-Type': 'application/json' } }) const data = await response.json(); console.log(data) console.log(typeof(data)) console.log(data.success) if (data.success === true) { console.log(data.data[0].views, 'views') const previewLocations = data.data[0].views const listItems = previewLocations.map(location => { console.log(location) return `<li data-location-id=${location.id}>${location.first}</li>` }) .join('') ul.innerHTML = listItems ul.removeAttribute('hidden') console.log('listItems', listItems) ul.addEventListener('click', e => { if (!event.target.matches('li')) return const li = e.target const locationName = li.textContent console.log('locationName', locationName) const locationId = li.dataset.locationId console.log('locationId', locationId) input.value = locationName input.setAttribute('data-location-id', locationId) ul.setAttribute('hidden', true) }) } } catch(e){ console.log(e) } } if (typeaheadLocation) { input.addEventListener('input', event => { const input = event.target const inputValue = input.value.trim() console.log(inputValue) const autoLocationObjectFormData = new FormData() autoLocationObjectFormData.append('task', 'getAutoCompleteLocationData') autoLocationObjectFormData.append('query', inputValue) getAutocompleteLocation(autoLocationObjectFormData) }) } document.addEventListener('click', e => { const typeaheadLocation = document.querySelector('.typeahead__location') if (!typeaheadLocation) return if (!e.target.closest('.typeahead__location')) { ul.setAttribute('hidden', true) } }) })

Thanks a lot for your help, I'm trying to find some other devs but am stuck on this bit

Also I have an issue with the php not returning the result in the autoaction.
for instance if I use :
Code:
if ( $input->get( 'task' ) === 'getAutoCompleteLocationData' ) { //print_r($input->getString( 'query' )); $curl = curl_init(); $query = $input->getString( 'query' ); curl_setopt_array($curl, array( CURLOPT_URL => "https://dev.societeinfo.com/app/rest/api/v2/places.json/autocomplete?query={$query}&key={$api_key}", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', )); $response_location = curl_exec($curl); curl_close($curl); //TODO: Split the company name if the result false $location = $response_location; // return json_decode($response_location); return $location; print_r( $location ); // Save the result }

The print_r displays the result but the return does not.
How can I get back the $location ?

I tried to look at the $action but did not see anything regarding the return.
My autoaction is only outputting json
Last edit: 2 years 1 week ago by activha.

Please Log in or Create an account to join the conversation.

  • krileon
  • krileon
  • ONLINE
  • Posts: 68625
  • Thanks: 9109
  • Karma: 1434
2 years 1 week ago - 2 years 1 week ago #329489 by krileon
Replied by krileon on topic CB AutoAction and data attributes
I cannot help you with custom coding. The issue is not with CB Auto Actions, but with your code. Both the JS and PHP have issues.

Your PHP also just looks like an HTTP request to an external service. You can probably use a Request action for that and eliminate the need for any custom PHP entirely. Example as follows.

Method: Get
URL:
Code:
https://dev.societeinfo.com/app/rest/api/v2/places.json/autocomplete
Body:
Key: key
Value: API_KEY_HERE
Key: query
Value: [get_query]

Note you'll need latest build released today as I removed the goofy response formatting in the Request action for JSON responses since that was added before Output parameters existed, but has no use now.


Kyle (Krileon)
Community Builder Team Member
Before posting on forums: Read FAQ thoroughly + Read our Documentation + Search the forums
CB links: Documentation - Localization - CB Quickstart - CB Paid Subscriptions - Add-Ons - Forge
--
If you are a Professional, Developer, or CB Paid Subscriptions subscriber and have a support issue please always post in your respective support forums for best results!
--
If I've missed your support post with a delay of 3 days or greater and are a Professional, Developer, or CBSubs subscriber please send me a private message with your thread and will reply when possible!
--
Please note I am available Monday - Friday from 8:00 AM CST to 4:00 PM CST. I am away on weekends (Saturday and Sunday) and if I've missed your post on or before a weekend after business hours please wait for the next following business day (Monday) and will get to your issue as soon as possible, thank you.
--
My role here is to provide guidance and assistance. I cannot provide custom code for each custom requirement. Please do not inquire me about custom development.
Last edit: 2 years 1 week ago by krileon.
The following user(s) said Thank You: activha

Please Log in or Create an account to join the conversation.

Moderators: beatnantkrileon
Powered by Kunena Forum

Facebook Twitter LinkedIn