Я довольно долго работал с простым бэкэндом (на основе Spagent - сценарием с плоскими файлами) для использования с удивительной библиотекой javascript treeaver.js. Моя проблема в том, что у меня есть недостаток в моем наборе навыков json, и я не могу понять, как добавить массивы в мой.json...
Мой файл выглядит следующим образом:
{
"contents": [
{
"url": "index.html",
"hidden": true
},
{
"url": "section1.html",
"title": "Section One",
"thumb": "openroad-thumb.jpg",
"byline": "John Doe"
},
{
"url": "one.html",
"title": "Article One",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "two.html",
"title": "Article Two",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "section2.html",
"title": "Section Two",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "three.html",
"title": "Article Three",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "four.html",
"title": "Article Four",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url":"five.html",
"title":"Article Five",
"thumb":"unknown-thumb.jpeg",
"byline":"John Doe"
}
]
}
И когда я использую эти скрипты: form.php
<!doctype html>
<html class="no-js no-treesaver">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,minimum-scale=1,maximum-scale=1">
<title>Treesaver - Article One</title>
</head>
<body>
<form name="postform" action="post.php" method="post" enctype="multipart/form-data">
<table class="postarea" id="postarea">
<tbody>
<tr> <td class="postblock">URL:</td><td><input type="text" name="url"></td></tr>
<tr> <td class="postblock">Titel:</td><td><input type="text" name="title"></td></tr>
<tr> <td class="postblock">Thumb:</td><td><textarea id="text" rows="5" cols="30" type="text" name="thumb"></textarea> </td> </tr>
<tr> <td class="postblock">Skribent:</td><td><input type="text" name="byline"></td></tr>
<tr> <td class="postblock"></td><td> <input type="submit" value="Submit Entry"> </td> </tr>
</tbody>
</table>
</form>
</form>
</body>
</html>
post.php
<?php
// check if a form was submitted
if( !empty( $_POST ) ){
// convert form data to json format
$postArray = array(
"url" => $_POST['url'],
"title" => $_POST['title'],
"thumb" => $_POST['thumb'],
"byline" => $_POST['byline']
);
//you might need to process any other post fields you have..
$json = json_encode( $postArray);
// make sure there were no problems
//if( json_last_error() != JSON_ERROR_NONE ){
//exit; // do your error handling here instead of exiting
// }
$file = 'entries.json';
// write to file
// note: _server_ path, NOT "web address (url)"!
file_put_contents( $file, $json, FILE_APPEND);
}
Мой добавленный массив создается следующим образом:
{
"url": "index.html",
"hidden": true
},
{
"url": "section1.html",
"title": "Section One",
"thumb": "openroad-thumb.jpg",
"byline": "John Doe"
},
{
"url": "one.html",
"title": "Article One",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "two.html",
"title": "Article Two",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "section2.html",
"title": "Section Two",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "three.html",
"title": "Article Three",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url": "four.html",
"title": "Article Four",
"thumb": "river-thumb.jpg",
"byline": "Jane Doe"
},
{
"url":"five.html",
"headline":"Article Five",
"thumb":"nagot.jpg",
"byline":"Gustaf"
}{"url":"six.html","title":"Article Six","thumb":"jasas.jpg","byline":"John Doe"}
Никакая запятая не генерируется после моего массива, и скрипт не работает. Как я могу это решить?
Вы добавляете новый объект JSON в файл, уже содержащий один. Возможно, вы сможете решить эту проблему, добавив запятую к данным, которые вы пишете, но я бы сказал, что это неправильный способ решить эту проблему. Вы пытаетесь писать в формате JSON напрямую, но вы должны заставить PHP делать это за вас - он делает это очень хорошо уже, и нет смысла повторно изобретать колесо.
Поэтому я прочитал бы содержимое файла, преобразовываю его в объект или массив, если это необходимо (с использованием json_decode
). Затем вы можете добавить вещи в эту структуру и перекодировать ее, прежде чем записывать все это в файл без флага append.
Если количество данных в этом файле велико, вы можете решить проблему по-другому: для каждой новой структуры, которую вы хотите написать, поместите ее в отдельный файл, а затем прочитайте в своем сценарии ведения блога по мере необходимости.
Вам было бы лучше всего прочитать существующие данные json и преобразовать их в свое условие PHP, которое является классом с содержимым "content", которое является массивом.
Затем вы нажимаете свой новый массив на этот существующий массив и затем кодируете его все как json снова и записываете все это обратно в свой json файл.
// check if a form was submitted
if( !empty( $_POST ) ){
$file = 'entries.json';
$json = file_get_contents($file);
// convert json back to a php stdClass
$phpClass = json_decode($json);
$postArray = array(
"url" => $_POST['url'],
"title" => $_POST['title'],
"thumb" => $_POST['thumb'],
"byline" => $_POST['byline']
);
// push the new $postArray onto the bottom of phpClass
array_push($phpClass->contents, $postArray);
// encode php class into json again
$new_json = json_encode($phpClass);
// write it out
file_put_contents( $file, $new_json);
}
change file_put_contents( $file, $json, FILE_APPEND);
to file_put_contents( $file, ",".$json, FILE_APPEND);
Вы можете поместить вышеуказанный оператор в некоторый оператор if, который проверяет, не является ли файл непустым, поскольку вам не нужна запятая, если вы делаете первую вставку.