Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej Rozumiem

Dodawanie treści z poziomu użytkownika

Dzisiaj pokażę coś troszkę trudniejszego dla bardziej zaawansowanych użytkowników, a mianowicie formularz z dodawaniem własnych treści przez użytkowników. Wszystko w formie widgetu do WinduCMS oczywiście. Na początek musimy stowrzyć grupę elementów o nazwie przykładowo "Artykuły użytkowników". W niej właśnie będą umieszczane wszystkie treści. Musismy zapisać sobie id tej grupy (zakłada "info").

 

Teraz zaczynamy już tworzenie widget. Przechodzimy za zakładkę grafika, widgety i dodajemy nowy widget o nazwie "dodajArtykul". Poprawnie generują na się wszystkie potrzebne katalogi (css,js,lang,doc) i pliki(dodajArtykulView.tpl oraz dodajArtykulController.class.php).

Na początek przechodzimy do pliku php, w którym będzie znajdował się cały nasz formularz oraz logika działania.

Domyślnie kod w pliku dodajArtykulController.class.php jest następujący:

Class dodajArtykulController extends widgetMainController{
     public function run() {
         $data = "Example Content";
         return array("content" = $data);
                                     }
     }

Usuwamy wszystko i wklejamy tam kod (omówienie znajduje się poniżej):

Class dodajArtykulController extends widgetMainController{
     public function run() {
$form = new form('dodajArtykul','dodajArtykulSuccess',$_POST,'POST','form-horizontal',null,false,false,'dodajartykul.message.negative');

$form->add('title', 'input-text',lang::read('artykul.tytul'),null,array());

$form->addRule('title', 'required', null, lang::read('artykul.podajtytul'));

$form->add('HTML','input type="hidden" name="groupId" value="'.$this->params['groupId'].'"input type="hidden" name="visible" value="'.$this->params['visible'].'"');

$form->add('content','textarea',lang::read('artykuly.trescartykulu'),null,array('class'=>"ckeditor", 'id'=>'ckeditor1'));

$form->addRule('content', 'required', null, lang::read('artykul.podajtresc'));

$form->add('captcha', 'captcha',null,null,array("tooltip" => lang::read('admin.login.controller.autogener'),"class" => "input-medium","placeholder" => lang::read('admin.login.controller.password')));

$form->addButton('submit',lang::read('artykuly.dodajartykul'),'btn btn-success',null,null,'icon-plus icon-white');

$form->setHandler($this);
$form->handle();
return array("form" => $form);
 }

(tutaj wkleimy drugą część kodu, za chwilkę o tym powiem)
}

Teraz po kolei:

  • "$form = new form('dodajArtykul','dodajArtykulSuccess',$_POST,'POST','form-horizontal',null,false,false,'dodajartykul.message.negative'); " -> tworzymy formularz o nazwie "dodajArtykul", po uzupełnieniu wszystkich pól 'uruchamiamy' funkcję 'dodajArtykulSuccess', następnie określamy metodę - POST, na końcu powinno jeszcze nas interesować 'dodajartykul.message.negative', czyli tekst pobrany z szablonu językowego, jeśli coś zostanie źle wypełnione,

  • "$form->add('title', 'input-text',lang::read('artykul.tytul'),null,array());" -> tworzymy pole o nazwie 'title', nazwa wyświetlana obok to 'artykul.tytul', która jest pobierana również z szablonu językowego,

  • "$form->addRule('title', 'required', null, lang::read('artykul.podajtytul'));" -> dodajemy zasadę, że pole 'title' jest wymagane, jeśli będzie puste wyświetli nam się błąd z treścią 'artykul.podajtytul', pobieraną z szablony językowego,

  • "$form->add('HTML','input type="hidden" name="groupId" value="'.$this->params['groupId'].'"input type="hidden" name="visible" value="'.$this->params['visible'].'"'); " -> tworzymym dwa niewidoczne pola, których wartościami są nasze "groupId" oraz "visible", które dalej przekażemy poprzez ten formularz,

  • "$form->add('content','textarea',lang::read('artykuly.trescartykulu'),null,array('class'=>"ckeditor", 'id'=>'ckeditor1'));" -> dodajemy pole 'content' z treścią, nazwa wyświetlana obok to pola 'artykuly.trescartykulu', pobierana z szablonu językowego. Dodatkowo ustalamy klasę 'ckeditor' oraz id pola - 'ckeditor1' , tak aby wskoczył nam w tym miejscu CKeditor (o nim wspomnę jeszcze później),

  • $form->addRule('content', 'required', null, lang::read('artykul.podajtresc'));" -> dodajemy zasadę, iż pole 'content' jest wymagane. Analogicznie jak dla pola 'title'.

  • "$form->add('captcha', 'captcha',null,null,array("tooltip" => lang::read('admin.login.controller.autogener'),"class" => "input-medium","placeholder" => lang::read('admin.login.controller.password'))); " -> dodajemy zabezpiecznie przed botami,

  • "$form->addButton('submit',lang::read('artykuly.dodajartykul'),'btn btn-success',null,null,'icon-plus icon-white'); " -> na koniec tworzymy przycisk, na którym będzie znajdował się tekst 'artykuly.dodajartykul' (również pobierany z szablonu językowego).

  • " return array("form" => $form);" -> wszystko zwracamy w formie tablicy, którą potem odczytam w funkcji dodajArtykulSuccess.

To wszystko jeśli chodzi o funkcję run().

Teraz musimy uwtorzyć funkcję dodajArtykulSuccess(). W miejscu ("(tutaj wkleimy drugą część kodu, za chwilkę o tym powiem) ") poprzedniego kodu wklejamy:

 
public function dodajArtykulSuccess($data) {

$pagesDB = new pagesDB();
$usersDB = new usersDB();

$user = $usersDB->getLoggedIn();

if(!empty($user)){
$data = array_merge(array('parentId'=>$data['groupId'],'type'=> '1','status'=> $data['visible'],'name'=>$data['title'],'content'=>$data['content'], 'authorId'=> $user->id));

$page = $pagesDB->insert($data);

router::redirect('http://windu.org',array('mn'=> 'artykuly.dodanopomyslnie');
}
}

A teraz krótkie omówienie:

  • "$pagesDB = new pagesDB();" i "$usersDB = new usersDB();" -> tworzymy obiekty, dla których przypisujemy bazy stron i użytkowników "$user = $usersDB->getLoggedIn();" -> pobieramy informacje o zalogowaniu użytkownika,

  • "if(!empty($user)){ " -> sprawdzamy, czy użytkownik jest zalogowany,

  • "$data = array_merge(array('parentId'=>$data['groupId'],'type'=> '1','status'=> $data['visible'],'name'=>$data['title'],'content'=>$data['content'], 'authorId'=> $user->id )); " -> tworzymy tablicę z danymi do dodania do bazy,

  • "$page = $pagesDB->insert($data);" -> dodajemy wszystkie dane do bazy,

  • "router::redirect('http://windu.org',array('mp'=> 'artykul.dodanopomyslnie'));" -> przenosimy użytkownika na podaną stronę pod informacją 'artykuly.dodanopomyslnie', pobieraną z szablonów językowych.

Plik 'dodajArtykulView.tpl' nie będzie zawierał skomplikowanego kodu, jedynie generujemy w nim nasz formularz do html, czyli kod jest następujący:

{$data.form->toHtml()}

Teraz nadeszła pora na pliki językowe, jeśli ktoś pokolei wszystko robił, widzi, że wszędzie pojawiają mu się np.: ?????? artykul.dodanopomyslnie ??????. Przechodzimy w katalog lang i plik pl.txt. Kopiujemy tam poniższy tekst:

artykul.tytul = "Tytuł artykułu"
artykul.podajtytul = "Podaj tytuł!"
artykuly.trescartykulu = "Treść artykułu"
artykul.podajtresc = "Podaj treść!"
artykuly.dodajartykul = "Dodaj artykuł"
artykul.dodanopomyslnie = "Artykuł został dodany pomyślnie"
dodajartykul.message.negative = "Błąd! Nie można dodać artykułu!"

Oczywiście możemy zmienić wszystkie teksty dowolnie, według własnych upodobań :)

Przedostatnim elementem do zrobienia jest uruchomienie CKEditora. Mamy już pole tekstowe o id - "ckeditor1". Nie potrzebujemy wgrywać drugi raz CKEditora na serwer, ponieważ jest on już na nim dla panelu admina.

Wracamy się jeszcze na momencik do pliku *.tpl, do którego musimy dodać skrypt, kod końcowy pliku tpl jest następujący:

script type='text/javascript' src='./app/plugins/html/resources/ckeditor/ckeditor.js'
{$data.form->toHtml()}
(należy dopisać znaczniki '<' i '>' przed script i na po ckeditor.js' )

Jeszcze do katalogu ./js naszego widgetu dodajemy plik ckeditor.load.js (kod źródłowy jst dostępny na zakończenie tutoriala) oraz do pliku main.js dodajemy:

$(document).ready(function(){loadEditor('ckeditor1','minimal');})

Teraz CKEditor powinien wyświetlać się poprawnie w miejscu naszego pola. Zamiast 'minimal' możemy tam umieścić 'basic', 'normal' i 'full' dla odpowiednich wersji.

Na koniec musimy utworzyć pola do wstawiacza widgetów. Potrzebujemy pola dla groupId (tutaj przydałaby się np.: rozsuwana lista) oraz pole 'visible' (tutaj będzie lista do wyboru true/false). Tak więc przechodzimy do pliku helper.ini w katalogu "doc". I wklejamy tam kodzik:

visible.name = "visible"
visible.rule = ""
visible.inputType = "select"
visible.dateType = "commaArray"
visible.date = "true,false"

groupId.name = "groupId"
groupId.rule = ""
groupId.inputType = "select"
groupId.dateType = "php"
groupId.date = "$pagesDB=new pagesDB(); $pagesArray = $pagesDB->getGroupsArrayForWidgetInserter(); $inputData=array('option'=>$pagesArray);"
 

Teraz wystarczy nam utworzyć dowolną stronę np.: "Dodaj swój artykuł", gdzie za pomocą wstawiacz widgetów wybieramy dodajArtykul i wstawiamy wszystko.

 Pobierz ckeditor.js


  Pobierz gotowy widget *.zip