Создание динамического toc.json для использования с treesaver.js

0

Я довольно долго работал с простым бэкэндом (на основе 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"}

Никакая запятая не генерируется после моего массива, и скрипт не работает. Как я могу это решить?

3 ответа

0

Вы добавляете новый объект JSON в файл, уже содержащий один. Возможно, вы сможете решить эту проблему, добавив запятую к данным, которые вы пишете, но я бы сказал, что это неправильный способ решить эту проблему. Вы пытаетесь писать в формате JSON напрямую, но вы должны заставить PHP делать это за вас - он делает это очень хорошо уже, и нет смысла повторно изобретать колесо.

Поэтому я прочитал бы содержимое файла, преобразовываю его в объект или массив, если это необходимо (с использованием json_decode). Затем вы можете добавить вещи в эту структуру и перекодировать ее, прежде чем записывать все это в файл без флага append.

Если количество данных в этом файле велико, вы можете решить проблему по-другому: для каждой новой структуры, которую вы хотите написать, поместите ее в отдельный файл, а затем прочитайте в своем сценарии ведения блога по мере необходимости.

0

Вам было бы лучше всего прочитать существующие данные 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);
}
  • 0
    Таким образом, я должен заменить свой контент в файле post.php этим?
  • 0
    Это пример, я не использовал реальные данные постов, прочитал их, посмотрел, что было сделано, и изменил ваш код, используя эту идею, а не этот точный код.
Показать ещё 6 комментариев
0

change file_put_contents( $file, $json, FILE_APPEND);

to file_put_contents( $file, ",".$json, FILE_APPEND);

Вы можете поместить вышеуказанный оператор в некоторый оператор if, который проверяет, не является ли файл непустым, поскольку вам не нужна запятая, если вы делаете первую вставку.

  • 0
    Спасибо за быстрый ответ! Можно ли поставить массив первым, а не последним, поскольку я хотел бы, чтобы мои главы сортировались от «последних» к «самым старым»?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню