api값을 wr_content에 등록할때 한줄만 등록되는데 전체값 등록 가능하게 하려면 어떻게 해야할까요ㅠㅠ
그누보드경로/nn 폴더안에 composer, GuzzleHttp\Client 설치 후
노션 api를 이용해서 특정 페이지의 하위 페이지들의 값을 가져와서
html태그로 wr_content로 등록을 하는데 페이지 첫번째줄의 값만 등록됩니다ㅠㅠ
이 문제가 일주일 넘게 해결이 안돼서 죽겠습니다ㅠㅠ 제가 php 초보라서 검색이랑 챗지피티로 코드를 만들었는데 값이 넘어가질 않네요ㅠㅠ
wr_content를 롱텍스트로도 변경해봤습니다ㅠㅠㅠ
제가 만든 코드는
<?php</p>
<pre>
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
date_default_timezone_set('Asia/Seoul');
$notionToken = 'api키값';
$client = new Client([
'base_uri' => '<a href="https://api.notion.com/v1/'," target="_blank" rel="noopener noreferrer">https://api.notion.com/v1/',</a>
'headers' => [
'Authorization' => 'Bearer ' . $notionToken,
'Notion-Version' => '2022-06-28',
'Content-Type' => 'application/json',
],
]);
function fetchContent($client, $blockId, $isToggleable = false) {
$content = [];
$nextCursor = null;
do {
try {
$response = $client->get("blocks/{$blockId}/children", [
'query' => [
'start_cursor' => $nextCursor,
'page_size' => 100,
],
]);
$data = json_decode($response->getBody()->getContents(), true);
if (isset($data['results'])) {
foreach ($data['results'] as $block) {
if ($isToggleable || !isset($block['is_toggleable']) || !$block['is_toggleable']) {
if (isset($block['has_children']) && $block['has_children']) {
$block['children'] = fetchContent($client, $block['id'], $isToggleable);
}
}
$content[] = $block;
}
}
$nextCursor = $data['next_cursor'] ?? null;
} catch (RequestException $e) {
logError($e);
return [];
}
} while ($nextCursor);
return $content;
}
function fetchSubPages($client, $pageId, $isToggleable = false) {
$subPages = [];
$nextCursor = null;
do {
try {
$response = $client->get("blocks/{$pageId}/children", [
'query' => [
'start_cursor' => $nextCursor,
'page_size' => 100,
],
]);
$data = json_decode($response->getBody()->getContents(), true);
if (isset($data['results'])) {
foreach ($data['results'] as $block) {
if (in_array($block['type'], ['child_page', 'child_database'])) {
$pageId = $block['id'];
$block['created_time'] = $block['created_time'];
$block['content'] = fetchContent($client, $block['id'], $isToggleable);
$pageResponse = $client->get("pages/{$pageId}");
$pageData = json_decode($pageResponse->getBody()->getContents(), true);
$block['cover'] = $pageData['cover'] ?? null;
$subPages[] = $block;
}
}
}
$nextCursor = $data['next_cursor'] ?? null;
} catch (RequestException $e) {
logError($e);
return [];
}
} while ($nextCursor);
return $subPages;
}
function logError($e) {
$logMessage = sprintf(
"[%s] %s: %s\n%s\n",
date('Y-m-d H:i:s'),
get_class($e),
$e->getMessage(),
$e->getTraceAsString()
);
file_put_contents('error_log.txt', $logMessage, FILE_APPEND);
}
function convertTextToHtml($annotations) {
$bold = isset($annotations['bold']) && $annotations['bold'] ? 'bold' : '';
$italic = isset($annotations['italic']) && $annotations['italic'] ? 'italic' : '';
$strikethrough = isset($annotations['strikethrough']) && $annotations['strikethrough'] ? 'strikethrough' : '';
$underline = isset($annotations['underline']) && $annotations['underline'] ? 'underline' : '';
$code = isset($annotations['code']) && $annotations['code'] ? 'code' : '';
$color1 = '';
$color2 = '';
if (isset($annotations['color']) && strpos($annotations['color'], '_background') !== false) {
$color1 = 'bg-' . str_replace('_background', '', $annotations['color']);
} elseif (isset($annotations['color'])) {
$color2 = $annotations['color'];
}
return [$bold, $italic, $strikethrough, $underline, $code, $color1, $color2];
}
function blockToHtml($block, &$counter = 1) {
$type = $block['type'];
$html = '';
$richText = [];
if (isset($block[$type]['rich_text'])) {
$richText = $block[$type]['rich_text'];
} elseif (isset($block[$type]['text'])) {
$richText = $block[$type]['text'];
}
$annotations = [];
foreach ($richText as $text) {
if (isset($text['annotations'])) {
$annotations = $text['annotations'];
break;
}
}
$annotationValues = array_map('htmlspecialchars', convertTextToHtml($annotations));
list($bold, $italic, $strikethrough, $underline, $code, $color1, $color2) = $annotationValues;
$blockcolor = '';
if (isset($block[$type]['color']) && $block[$type]['color'] !== 'default') {
if (strpos($block[$type]['color'], '_background') !== false) {
$blockcolor = 'bg-' . str_replace('_background', '', $block[$type]['color']);
} else {
$blockcolor = $block[$type]['color'];
}
}
$classAttributes = implode(' ', array_filter([$bold, $italic, $strikethrough, $underline, $code, $color1, $color2, $blockcolor]));
$classAttributeString = 'class="notion-' . htmlspecialchars($type ?? '') . ' ' . $classAttributes . '"';
switch ($type) {
case 'divider':
$html = '<div class="notion-divider"></div>';
break;
case 'bulleted_list_item':
$html = '<ul ' . $classAttributeString . '><li>' . getTextContent($block['bulleted_list_item']['rich_text'], $block) . '</li></ul>';
if (isset($block['children'])) {
foreach ($block['children'] as $child) {
$html .= '<ul>' . blockToHtml($child, $counter) . '</ul>';
}
}
break;
case 'callout':
$emoji = $block['callout']['icon']['emoji'] ?? '';
$html = '<div ' . $classAttributeString . '>' . $emoji . ' ' . getTextContent($block['callout']['rich_text'], $block) . '</div>';
if (isset($block['children'])) {
foreach ($block['children'] as $child) {
$html .= blockToHtml($child, $counter);
}
}
break;
case 'child_page':
$html = '<div ' . $classAttributeString . '>' . htmlspecialchars($block['child_page']['title']) . '</div>';
break;
case 'child_database':
$html = '<div ' . $classAttributeString . '>' . htmlspecialchars($block['child_database']['title']) . '</div>';
break;
case 'toggle':
$html = '<div class="notion-toggles">';
$html .= '<button type="button" class="notion-togglebtn">▶️</button>';
$html .= '<div ' . $classAttributeString . '>' . getTextContent($block['toggle']['rich_text'], $block) . '</div></div>';
if (isset($block['children'])) {
$html .= '<div class="notion-children notion-toggle-cont">';
foreach ($block['children'] as $child) {
$html .= blockToHtml($child, $counter);
}
$html .= '</div>';
}
break;
}
return $html;
}
function getTextContent($textArray, $block = null) {
$content = '';
foreach ($textArray as $text) {
$content .= htmlspecialchars($text['text']['content']);
}
return $content;
}
function getTableContent($table) {
$html = '';
foreach ($table['rows'] as $row) {
$html .= '<tr>';
foreach ($row['cells'] as $cell) {
$html .= '<td>' . getTextContent($cell['rich_text']) . '</td>';
}
$html .= '</tr>';
}
return $html;
}
function getTableRowContent($tableRow) {
$html = '';
foreach ($tableRow['cells'] as $cell) {
$html .= '<td>' . getTextContent($cell['rich_text']) . '</td>';
}
return $html;
}
$pageId = '페이지아이디';
$subPages = fetchSubPages($client, $pageId, true);
include_once('../common.php');
include_once('../_common.php');
$bo_table = "test";
$write_table = $g5['write_prefix'] . $bo_table;
if ($member['mb_id']) {
$mb_id = $member['mb_id'];
$wr_name = $member['mb_name'];
$wr_password = $member['mb_password'];
$wr_email = $member['mb_email'];
} else {
$mb_id = "test";
$wr_name = "test";
$wr_password = get_encrypt_string($wr_password);
$wr_email = "test이메일@aaaaaa.com";
}
$mode = 'html1';
$categorys = 'category1';
function escape_content($content) {
global $g5;
return mysqli_real_escape_string($g5['connect_db'], $content);
}
foreach ($subPages as $subPage) {
$counter = 1;
$sub_title = htmlspecialchars($subPage['child_page']['title']);
$sub_date = date('Y-m-d H:i:s', strtotime($subPage['created_time']));
$coverUrl = $subPage['cover']['external']['url'] ?? $subPage['cover']['file']['url'] ?? '';
$cover_url = htmlspecialchars($coverUrl);
$sub_contents = '';
foreach ($subPage['content'] as $block) {
$sub_contents .= blockToHtml($block, $counter);
}
echo $sub_title;
echo $sub_date;
echo $cover_url;
echo $sub_contents;
$wr_num = get_next_num($write_table);
$sql = "INSERT INTO $write_table
SET wr_id = '',
wr_num = '{$wr_num}',
wr_comment = 0,
ca_name = '{$categorys}',
wr_subject = '{$sub_title}',
wr_content = '{$sub_contents}',
mb_id = '{$mb_id}',
wr_password = '$wr_password',
wr_name = '$wr_name',
wr_email = '$wr_email',
wr_datetime = '{$sub_date}',
wr_last = '" . G5_TIME_YMDHIS . "',
wr_2 = '{$cover_url}',
wr_ip = '{$_SERVER['REMOTE_ADDR']}' ";
sql_query($sql);
$wr_id = sql_insert_id();
sql_query("UPDATE $write_table SET wr_parent = '$wr_id' WHERE wr_id = '$wr_id'");
sql_query("INSERT INTO {$g5['board_new_table']} (bo_table, wr_id, wr_parent, bn_datetime, mb_id) VALUES ('{$bo_table}', '{$wr_id}', '{$wr_id}', '" . G5_TIME_YMDHIS . "', '{$member['mb_id']}')");
}
sql_query("UPDATE {$g5['board_table']} SET bo_count_write = bo_count_write + " . count($subPages) . " WHERE bo_table = '{$bo_table}'");</pre>
<p>
입니다.
sub_contents의 값의 html코드가 200줄이라고 하면 첫번째 줄의 html값만 wr_content에 등록이 됩니다
이런식으로요ㅠㅠ 어떻게 하면 wr_content에 sub_contents의 전체 값이 넘어갈수있을까요..?
아무리 검색하고 챗지피티 돌려보고 해도 모르겠습니다 제발 도와주세요ㅠㅠ..
댓글을 작성하려면 로그인이 필요합니다.
답변 1개
Expert
1년 전
wr_content = '{addslashes($sub_contents)}', 이렇게 변경해보시겠어요 ?
로그인 후 평가할 수 있습니다
답변에 대한 댓글 3개
m
mnnight
1년 전
넵 해당 코드가 적용된 그누보드경로/nn/파일명.php파일을 실행했을때는 echo $sub_contents;했을때 모든 값이 정상적으로 보입니다ㅠㅠ
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인전체 질문 목록
답변대기
답변대기
답변대기
답변대기
답변대기
답변대기
답변대기
답변대기
채택
답변대기
답변대기
답변대기
답변대기
채택
채택
답변대기
답변대기
답변대기
채택