JS, PHP - terminarz Fullcalendar - nie wyświetla danych z tablicy w razorCMS

0

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ć?

0

Lektura starszego wątku natchnęła mnie myślą, że problem nie leży w rodzaju danych, lecz sposobie ich przekazywania:
https://tinyurl.com/yd9bdnak

Zrobiłem więc drugie podejście. Stworzyłem więc poza CMS-em kod ładujący dane do tablicy events z pliku tekstowego, na podstawie kodu wyświetlającego dane z MySQL'a, i tu o dziwo wszystko pięknie się wyświetliło - plik załącznika do testów na localhost: 4progr_src.zip

W podkatalogu blade_packs jest plik index.php, który uruchiamia wyświetlenie kalendarza, dane się przetwarzają z pliku tekstowego umieszczonego w podkatalogu datastore/fullcalendar/users_db.dat
Ładnie to działa, wyświetla terminarz spotkań - tak jak miało być.
W podkatalogu blade_packs/system_fullcalendar/assets/js/script.js plik konieczny do działania kalendarza, ma zdefiniowany adres url na który reaguje wyświetleniem danych w kalendarzu:

$(document).ready(function(){
        var calendar = $('#calendar').fullCalendar({
            header:{
                left: 'prev,next today',
                center: 'title',
                right: 'month,agendaWeek,agendaDay'
            },
            defaultView: 'month',
            editable: true,
            selectable: true,
            allDaySlot: false,
            	minTime: '8:00',
			maxTime: '24:00',   
			locale: 'pl',
			slotDuration: '00:15:00',
			snapDuration: '00:15:00',	  
            events: {
            url: 'index.php?view=1',           
            error: function() {
                alert('There was an error while fetching events.');
            }
	},

gdzie tym url'em na który skrypt odpowiada poprawnym wyświetleniem jest url: 'index.php?view=1',

Staram się więc w kolejnym etapie wykonać moduł do CMS'a/ - plik załącznika moduł + CMS: 4progr_razor.zip

Moduły są budowane w razorCMS w sposób prosty - w podkatalogu również blade_packs mam kod php, którego działanie polega na tym, że po włączeniu modułu, wykonuje on to co robić. Tutaj, moduł ten jest uwarunkowany na występowanie ostrza, czyli łańcucha znaków, że w tym miejscu na stronie ma być wyświetlany kalendarz, a łańcuch tego tekstu ostrza ma znikać, zastąpiony przez kod kalendarza.
W tym celu tworzę plik system_fullcalendar.php gdzie dodaję definicje, co ma robić moduł.
Funkcja PHP addScriptForfullcalendar() ma wyrzucić kod fullcalendar'a do strony html.
Funkcja PHP scanPageFullCalendar(&$slugOut) ma sprawdzić, czy na stronie jest kod ostrza in-page-blade(fullcalendar), a jeśli w tekscie strony znajdzie go, to ma przystąpić do działania zgodnie z wytycznymi w tej funkcji.
Poleceniem include_once('system_fullcalendar/terminarz.php'); ładuję plik dokonujący obliczeń tablicy spotkań oraz wyrzucający kod html by wyświetlić na stronie kalendarz. Na koniec, usuwany jest tekst ostrza z wyświetlania na stronie.

Plik wywoływany przez moduł, tj.: terminarz.php ma uzyskać dane z tekstowej bazy danych, uzyskuje je bez problemu, a następnie ma je wysłać do skryptu kalendarza - tu to jest realizowane w założeniach liniami:
// dodatkowy element tablicy dodany manualnie dla testu
$events[] = array('id'=>'9','title'=>'Maciej','start'=>'2018-04-21 0700','end'=>'2018-04-21 0600','uid'=>'aocvllmbd0d882pq17ksj8lc4h','owner'=>'Maciej','color'=>'red' );
echo json_encode($events);
echo displayfullcalendar();
exit;

Wszystko powinno ładnie zadziałać, problem jest w definicji w pliku script.js adresu url wyzwalającego kalendarz - ten plik nie jest znajdowany.
To jest adres strony http://localhost/4progr_razor/index.php?slab=terminarz mającej wyświetlić kalendarz.

Utworzyłem więc analogicznie wywołanie tego url'a jak mi się zdawało:
events: {
url: 'index.php?slab=terminarz',
error: function() {
alert('Wystąpił błąd!!!');
}
ale to jest właśnie mój problem - kod nie znajduje się - nie reaguje na wystąpienie index.php?slab=terminarz w adresie, bowiem index.php nie jest tutaj fizycznym plikiem z kodem kalendarza.

W załącznikach są spakowane moje pliki testowe: 4progr_src.zip - zwykły kod źródłowy w którym kalendarz działa, oraz próba przepisania tego kodu do modułu CMS'a, gdzie nie ma przekazywania danych tablicy events do skryptu kalendarza, bo kalendarz musi być powiązany z plikiem go wołającym i obliczającym, a tu mam CMS'a, mój adres strony na której chcę wyświetlić kalendarz to http://localhost/4progr_razor/index.php?slab=terminarz choć mogę go zamienić przez konwersję na "ładny", np. na http://localhost/4progr_razor/terminarz.htm

Jak w takim razie zmusić skrypt kalendarza, by chciał przyjąć podawane mu dane? Jaki to powinien być właściwy adres url?

Co pokazuje Firebug czy inne narzędzie, jaki adres jest wywoływany teraz przy takiej definicji, a jaki powinien być dla CMS'a - by wyświetlanie terminów zadziałało? W nowej wersji przeglądarki Firebug nie chce mi już działać, a konsola nic nie pokazuje. A źródłowy plik php ładnie działa i wyświetla prawidłowo dane w kalendarzu.

Czy może ktoś spojrzeć na te dwa pliki na swoim localhoscie i mi w tym jakoś pomóc?

1 użytkowników online, w tym zalogowanych: 0, gości: 1