Я строю чат-бота с диалоговым потоком с php и json. В последнее время я борюсь в Интернете, пытаясь понять, как динамически изменять насыщенные ответы. Например, если пользователь заинтересован в ТОП-10, мне нужен расширенный ресоп с десятью элементами, вместо этого, если пользователю требуются топ-5, мне нужен ответ из 5 пунктов. Кто-нибудь из вас знает, как этого добиться? большое спасибо
Индекс выглядит так:
<?php
function prepareResponse($incoming)
{
$data = $incoming;
header('Content-Type: application/json');
$json_data = json_decode($data);
echo json_encode($json_data);
}
$method = $_SERVER['REQUEST_METHOD'];
//
// Process only when request method is POST
//
if($method == 'POST')
{
$requestBody = file_get_contents('php://input');
$json = json_decode($requestBody);
$querytype = $json->originalDetectIntentRequest->payload->inputs[0]->rawInputs[0]->query;
$countryname =$json->queryResult->parameters->{'geo-country'};
$materialname =$json->queryResult->parameters->material;
$topwhat=$json->queryResult->parameters->topnumber;
//topnumber stores the number of the top ten wanted by the user
$intentname=$json->queryResult->intent->displayName;
$touchoption=$json->queryResult->queryText;
$email =$json->queryResult->parameters->emailadress;
//vardump($json);
//print_r($json);
$myfile = fopen("newfile.txt", "w+") or die("Unable to open file!");
$txt = print_r($json,true);
//$txt = $json->originalDetectIntentRequest->payload->inputs[0]->rawInputs[0]->query;
fwrite($myfile, $txt);
fclose($myfile);
if (strcasecmp($querytype, "Top number of sold commodities") == 0)
{
$outgoing = include 'top.php';
prepareResponse($outgoing);
}
}
?>
Тогда файл top.php должен быть таким json-файлом, как этот
<?php
$db = new PDO('mysql:host=160.153.147.21;dbname=****', '****', '***');
$sqlplantshortname="Select SUBSTRING_INDEX(materialdescription, ' -', 1) as newcategory ,SUM(stock) AS 'STOCKS' from tempcommodityinventoryview where sapname like '$countryname' and wbselementsapname like '$countryname' and SUBSTRING_INDEX(materialdescription, ' -', 1) goup by'$materialname' order by 'STOCKS' limit '$topwhat' ";
$resultplantshortname= $db->prepare($sqlplantshortname);
$resultplantshortname->execute();
$rowplantshortname = $resultplantshortname->fetch(PDO::FETCH_ASSOC);
$data = <<<DATA
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": " Top sold commodities of $countryname is $nameplantshortname bla bla"}
}
]
}
}
}
}
DATA;
return $data;
?>
Теперь файл top.php является простым ответом, в то время как я хотел бы, чтобы он представлял собой богатый ответ типа list, показывающий либо 10, либо 5 наиболее продаваемых товаров.
Задача ещё не решена.
Других решений пока нет …