Muszę się zwrócić o pomoc do forumowiczów zaawansowanych w JS i PHP. Używam razorCMS opartego na plikach tekstowych, lubię to dla zasady, nie stosując nigdzie gdzie nie trzeba MySQL.
Ostatnio chciałem dodać do tego CMS'a moduł z rezerwacją spotkań, w oparciu o kod Fullcalendar:
https://fullcalendar.io/docs
Mój problem polega na tym, że bardziej zaawansowani programiści tworzą połączenie MYSQL dla tabelki z danymi, kodu JS i PHP.
Adaptowałem takie udostępnione w necie moduły MySQL+Fullcalendar, do działania w razorCMS'a w oparciu o MYSQL i kod taki działa, kalendarz się w razorCMS wyświetla - ale korzysta z bazy MySQL - którą chcę wyeliminować ze skryptu - tak dla zasady razorCMS 2.1 ma nie dotykać MySQL'a i proszę nie pytać dlaczego :-), traktuje to jako ćwiczenie adaptacyjne do minimalizmu.
Jednak w ramach pasji unikania MySQL'a postanowiłem zmienić tabelę danych, by te pochodziły z plikowej bazy danych - krótko mówiąc, z pliku tekstowego. W tym celu używam z powodzeniem Flat File Database o nazwie Flinstone - opisanej tutaj, aczkolwiek z wcześniejszej wersji, by mieć kompatybilność z PHP od 5.3:
http://www.xeweb.net/2011/07/14/flintstone-a-keyvalue-database-store-using-flat-files-for-php/
Stworzyłem więc moduł do razroCMS'a, gdzie w ścieżce:
blade_packs/system_fullcalendar.php uruchamia się mój moduł.
Działanie modułu polega na tym, że gdy w tekscie na stronie przeznaczonej na terminarz, znajdzie łańcuch znaków:
in-page-blade(fullcalendar)
to usuwa ten łańcuch i zastępuje go tym co chcę - tu: kalendarzem.
// Filtruje elementy z nazwa //
function scanPageFullCalendar(&$slugOut){
global $razorArray, $sig;
if (strpos($slugOut, 'in-page-blade(fullcalendar)') !== false) {
$event = displayfullcalendar(); // kod html kalendarza
// we have found pagination request, so we must remove this information from text
$slugOut = str_replace('in-page-blade(fullcalendar)', $event , $slugOut);
}
}
// end /////////////////////////////
Linia $event = displayfullcalendar(); to wywołanie funkcji rysującej kalendarz na stronie.
Problem mój dotyczy tego, że gdy działa MySQL i przekazywany jest kod wywołujący kalendarz:
$(document).ready(function() {
var initialLocaleCode = 'pl';
var calendar = $('#calendar').fullCalendar({
contentHeight: 1340,
minTime: '8:00',
maxTime: '24:00',
slotDuration: '00:15:00',
snapDuration: '00:15:00',
locale: initialLocaleCode,
timezone: 'Europe/Warsaw',
editable:true,
header:{
left:'prev,next today',
center:'title',
right:'month,agendaWeek,agendaDay'
},
events: 'blade_packs/system_fullcalendar/load.php',
selectable:true,
selectHelper:true,
to w linii
events: 'blade_packs/system_fullcalendar/load.php',
woła on plik load.php, gdzie następuje połączenie z bazą MySQL, pobranie tabeli z terminami spotkań, a następnie przez polecenie:
echo json_encode($data);
dane te są ładnie wyświetlanie w terminarzu spotkań. To ładnie działa z tabelą z MySQL.
Plik load.php wołany ze skryptu wygląda tak:
$connect = new PDO('mysql:host=localhost;dbname=testing', 'root', '');
$data = array();
$query = "SELECT * FROM events ORDER BY id";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();
foreach($result as $row)
{
$data[] = array(
'id' => $row["id"],
'title' => $row["title"],
'start' => $row["start_event"],
'end' => $row["end_event"]
);
}
echo json_encode($data);
Jeśli jednak tylko dopiszę z przodu inną linijkę z funkcją php, np. require_once('flatdatabase.php'); by pobrać dane z uprzednio przygotowanego pliku tekstowego
ze ścieżki datastore/fullcalendar/users_db.dat
to automatycznie kod fullcalendar przestaje działać - zagadką dla mnie jest to, że działa on tylko z wywołaniem danych z MySQL'a, a chciałbym by działał ze zwykłym kodem bez MySQL'a, który chcę zastąpić tak działającym kodem, dającym tabelę z identyczną zawartością jaką mam z bazy w MySQL - tu zwykła tabelka z PHP nie chce dać się wyświetlić jako dane eventu:
// flat file database
require_once('flatdatabase.php');
$data = array();
$all_keys_id = $users_db->getKeys(); // zwraca wszystkie klucze z tablicy - np. 1, 2, itd jako właścicieli linijek zapisu lekcji
$numRows = count($all_keys_id); // ile mamy linii danych w pliku, czyli ilość wpisów zanotowanych w bazie = ilość dostępnych kluczy w pliku/tabelce
for($i = 0; $i < $numRows; $i++) {
$rows = $users_db->get($all_keys_id[$i]);
$data[] = array(
'id' => $all_keys_id[$i],
'title' => $rows['title'],
'start' => $rows['start'],
'end' => $rows['end']
);
}
// co w tabelce w debugerze
bdump($data, 'tabelka');
echo json_encode($data);
Dane się nie wyświetlają - kalendarz jest pusty i nie wiem, jaka to przyczyna. Dodanie tego pełnego kodu PHP by utworzyć tablicę z danymi również nie skutkuje jej wyświetleniem - rysuje się pusty kalendarz, już bez danych.
Pytanie brzmi, dlaczego moduł fullcalendar działa z kodem PHP odwołującym się do danych pozyskiwanych z MYSQL, a blokuje się, gdy identyczne dane (tabela json) pochodzą z pliku tekstowego i jak to zmienić?
Zrobiłem też inne podejście z innym podobnym skryptem do fullcalendar - w nim wyrzuca mi dane z tablicy json nad kalendarzem, a kod kalendarza nie wyświetla ich. Niestety, nie znam JS, więc proszę o pomoc z tą adaptacją i odpowiedzią, dlaczego ta sama tabela z danymi w przypadku MySQL działa, a w przypadku pobrania danych przez funkcję PHP - już nie.
Czy ktoś może mi z tym pomóc?
Podobne problemy były z połączeniem Fullcalendar z MySQL:
https://stackoverflow.com/questions/25410128/fullcalendar-using-a-json-php-page-as-an-event-source
https://coderwall.com/p/tr64xg/fetch-and-render-events-from-mysql-to-fullcalendar-js
https://processwire.com/talk/topic/17804-connect-fullcalendar-to-database/
http://fajitanachos.com/Fullcalendar-and-recurring-events/
https://www.silverstripe.org/community/forums/general-questions/show/7860
Pliki z kompletnym razorCMS - dwie wersje 22 i 23 z kolejnymi próbami adaptacji - wystarczy rozpakować na localhost w swoich folderach - PHP wyżej od 5.3
Logowanie do zaplecza localhost/razorcms22/admin, login admin, password: test, link terminarz - dla ciekawych zaplecza admina CMS'a, jakby ktoś chciał się nad nim pochylić, a potem mi pomóc.
Pytanie zasadnicze jest takie: dlaczego skrypt kalendarza działa tylko z danymi pochodzącymi z MYSQL? Jak to zmienić?