logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

dekRe 24 Mar 2018 19:58 1218 5
REKLAMA
  • #1 17125272
    dekRe
    Poziom 16  
    Posty: 205
    Pomógł: 12
    Ocena: 18
    Witam!

    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 taki moduł do razorCMS'a w oparciu o MYSQL i kod taki działa, kalendarz się w razorCMS wyświetla - ale korzysta z bazy MySQL.

    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:
    http://www.xeweb.net/2011/07/14/flintstone-a-...alue-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ę.

    
    // Filtruje elementy z nazwa //
    function scanPageFullCalendar(&$slugOut){
    global $razorArray, $sig; 
    	if (strpos($slugOut, 'in-page-blade(fullcalendar)') !== false) {
    		
    		$event = displayfullcalendar();
    		
    		// we have found pagination request, so we must remove this information from text
    		$slugOut = str_replace('in-page-blade(fullcalendar)', $event , $slugOut);
    		$slugOut = str_replace('<p>in-page-blade(fullcalendar)</p>', $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 woła on plik load.php, gdzie następuje połączenie z bazą MySQL, pobranie tabeli z eventami, a następnie przez polecenie:
    echo json_encode($data);
    dane te są ładnie wyświetlanie w terminarzu spotkań.

    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 inny kod php, np. require_once('flatdatabase.php');

    a chciałbym by działał z kodem bez MySQL'a:
    
    // 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);
    


    znika połączenie z MySQL, 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ę kalendarz już bez danych. Dane wyrzucane z tabelki są JSON moim zdaniem.

    Zrobiłem też inne podejście z innym podobnym skryptem do fullcalendar - w nim wyrzuca mi dane z tablicy nad kalendarzem, a kod kalendarza nie wyświetla ich.
    Czy ktoś może mi z tym pomóc?
    Podobne problemy zgłaszali ludzie walczący z MySQL:
    https://stackoverflow.com/questions/25410128/...ndar-using-a-json-php-page-as-an-event-source
    https://coderwall.com/p/tr64xg/fetch-and-render-events-from-mysql-to-fullcalendar-js
    http://www.j-cook.pro/index.php/forum/9-codin...add-fullcalendar-in-my-component?limitstart=0
    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 wystarczy rozpakować na localhost w swoich folderach - PHP wyżej od 5.3
    Załączniki:
    • razor22.zip (6.04 MB) Musisz być zalogowany, aby pobrać ten załącznik.
    • razor23.zip (5.87 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 17301774
    katakrowa
    Poziom 23  
    Posty: 902
    Pomógł: 9
    Ocena: 855
    dekRe napisał:
    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.

    Oczywiście każdy robi co lubi jednak w dzisiejszych czasach trochę to głupie i raczej niczym nie uzasadnione bo SQL'a możesz używać nawet na plikach typu CSV nie wspomnę, że istnieje SqlLite, który całą bazę trzyma w jednym pliku i nie wymaga instalacji niczego "extra" na serwerze a każdy PHP już od wielu lat go wspiera. Oczywiście są przypadki kiedy lepiej używać plików niż SQL[ ale raczej to nie ten przypadek.

    No ale skoro już wybrałeś metodę plikową narażoną na ( zakładam, że żadnych zabezpieczeń na poniższe okoliczności nie zaimplementowałeś):
    - nadmierne obciążenie IO ;
    - nadpisanie danych w przypadku kilku żądań w podobnym czasie;
    - coś w rodzaju "zakleszczenia" jeśli jeden z procesów się posypie ;
    - nawet całkowitą utratę danych jeśli źle zarządzasz plikiem ;

    Błędy jakie widzę w Twoim kodzie:

    1. zła pętla :
    for($i = 0; $i < $numRows; $i++)
    jeśli $numRows to ilość wierszy wówczas pętla musi być:
    for($i = 0; $i < $numRows-1; $i++)
    Być może to generuje jakiegoś notice lub warninga, który uniemożliwia odczytanie danych po stronie JS.

    2. Zobacz w przeglądarce co ci zwraca wywołanie tej funkcji czy same dane czy jednak jakieś błędy z PHP.

    3. Podczas testów na 100% powinienieś zakomentować : bdump($data, 'tabelka');

    Niestety framework po pobraniu i uruchomieniu zwraca error 500.
  • REKLAMA
  • #3 17302078
    dekRe
    Poziom 16  
    Posty: 205
    Pomógł: 12
    Ocena: 18
    Dziękuję za próbę podejścia do mojego tematu.

    Framework jest przetestowany i działa u mnie testowany na localhostach - przeważnie używam:
    EASYPHP DEVSERVER 17.0 z serwisu: http://www.easyphp.org/save-easyphp-devserver-latest.php
    UWAMP z serwisu: https://www.uwamp.com/en/?page=download

    Jedynym warunkiem uruchomienia frameworka na localhost jest wejście w konfigurację Apache i włączenie opcji:

    rewrite_module na on.

    Bez tego pokazuje się błąd 500 - ale prawdopodobnie usunięcie pliku .htaccess powinno uruchomić framework tylko dla testów lokalnych.

    Logowanie na zaplecze admina, gdyby ktoś chciał zapoznać się z zarządzaniem to na przykład w zależności od folderu testowego - tu razor21 - http://localhost/razor21/admin

    login to admin, hasło to test.

    Błędu w pętli nie ma - bo powinien pojawić się ekran jak w załączniku

    bdump() jest funkcją lokalnego debugera Tracy - pozwala zorientować się, co tkwi w zmiennych.


    W katalogu /datastore warto przeedytować plik danych users_db.dat z marca na czerwiec lub już lipiec, gdyby udało się uruchomić skrypt.
    Flinstone flat database zapobiega problemom z zapisem do plików - proste i efektywne rozwiązanie, gdy nie potrzebuję większego przetwarzania danych.

    Wersja danych z pliku: for($i = 0; $i < $numRows-1; $i++) {
    JS, PHP - terminarz Fullcalendar - nie wyświetla danych z tabeli w razorCMS
    daje jeden rekord z pliku mniej.

    Wersja danych z pliku: for($i = 0; $i < $numRows; $i++) {
    JS, PHP - terminarz Fullcalendar - nie wyświetla danych z tabeli w razorCMS

    Dane są uzyskiwane, ale nie potrafią być przekazane do skryptu kalendarza, bo ten "rysuje" się chyba przed ich uzyskaniem, ale mogę się mylić w swojej hipotezie, ale nie potrafiłem tego w żaden klasyczny sposób zmienić.

    Dziękuję za podejście do tematu i pozdrawiam
  • REKLAMA
  • #4 17302238
    katakrowa
    Poziom 23  
    Posty: 902
    Pomógł: 9
    Ocena: 855
    dekRe napisał:
    Błędu w pętli nie ma - bo powinien pojawić się ekran jak w załączniku

    OK. Rzeczywiście tam jest < a nie <= .

    A patrzałeś co zwraca Ci ajax w przeglądarce ?
  • REKLAMA
  • #5 17303050
    dekRe
    Poziom 16  
    Posty: 205
    Pomógł: 12
    Ocena: 18
    Niestety, nie wiem jak to sprawdzić. Próbowałem, ściągnąłem stary Firefox wersja 48 portable, dodałem do niego Firebug jedyny jaki jeszcze działa z tą wersją - ale nie bardzo sobie z nim jeszcze radzę.
  • #6 17303227
    katakrowa
    Poziom 23  
    Posty: 902
    Pomógł: 9
    Ocena: 855
    W każdym FF i Chrome możesz nacisnąć F12 i tam w zakładce sieć masz wszystkie żądania do serwera a po kliknięciu w szczegółach masz dane.
REKLAMA