Le module Bootstrap permet de générer les composants Bootstrap et leur fonctionnement par défaut à partir des contrôleurs Phalcon, pour ensuite les afficher dans les vues.
Il est nécessaire d'injecter le service JQuery au démarrage de l'application, et d'instancier Bootstrap :
$di->set("jquery",function(){ $jquery= new JsUtils(array("driver"=>"Jquery")); $jquery->bootstrap(new Bootstrap());//for Twitter Bootstrap return $jquery; });
Par défaut, les scripts insérés sont les dernières versions de Bootstrap disponibles sur MaxCDN
class IndexController extends ControllerBase{ public function indexAction(){ $this->view->setVar("cdn",$this->jquery->genCDNs()); ... } ...
<html> <head> {{cdn}} ... </head> ...
Si les fichiers sont situés localement (dans public/css et public/js), il est nécessaire d'instancier un objet CDN, initialisé avec les chemins locaux :
$di->set("jquery",function(){ $jquery= new JsUtils(array("driver"=>"Jquery")); $jquery->bootstrap(new Bootstrap());//for Twitter Bootstrap $cdn=new CDNBootstrap(""); $jquery->setCDNs($cdn->setJsUrl("js/bootstrap.min.js")->setcssUrl("css/bootstrap.min.css")); return $jquery; });
Il est également possible de changer de version Bootstrap :
$di->set("jquery",function(){ $jquery= new JsUtils(array("driver"=>"Jquery")); $jquery->bootstrap(new Bootstrap());//for Twitter Bootstrap $jquery->setCDNs(new CDNBootstrap("3.3.2")); return $jquery; });
Classe | HtmlButton |
---|---|
⇒Hérite de | HtmlDoubleElement |
Comportement attendu : Sur click du bouton Masquer, le bouton Okay est caché
class IndexController extends Phalcon\Mvc\Controller{ public function buttonsAction(){ $bootstrap=$this->jquery->bootstrap(); $bootstrap->htmlButton("btOkay","Okay"); $bootstrap->htmlButton("btMasquer","Masquer Bouton Okay","btn-primary",$this->jquery->hide("#btOkay")); $this->jquery->compile($this->view); } ... }
La compilation génère :
{{q['btOkay']}} {{q["btMasquer"]}} {{script_foot}}
class IndexController extends Phalcon\Mvc\Controller{ public function buttons2Action(){ $bt1=new HtmlButton("btOkay","Okay"); $bt2=new HtmlButton("btMasquer","Masquer Bouton Okay","btn-primary",$this->jquery->hide("#btOkay")); echo $bt1->compile($this->jquery); echo $bt2->compile($this->jquery); echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ...
Contrôleur :
class IndexController extends Phalcon\Mvc\Controller{ public function buttons3Action(){ $bt1=new HtmlButton("btOkay","Okay"); $bt2=new HtmlButton("btMasquer","Masquer Bouton Okay","btn-primary",$this->jquery->hide("#btOkay")); $this->view->setVars(array("bt1"=>$bt1->compile($this->jquery),"bt2"=>$bt2->compile($this->jquery)); $this->jquery->compile($this->view,"script"); } ...
Vue :
{{bt1}} {{bt2}} {{script}}
Une à une, par valeur :
$bt1=new HtmlButton("btOkay","Okay"); $bt1->setStyle("btn-primary");
Une à une, par index :
$bt1=new HtmlButton("btOkay","Okay"); $bt1->setStyle(0);0 ⇒ “btn-default”
A la chaîne :
$bt1=new HtmlButton("btOkay","Okay"); $bt1->setSize(0)->setStyle(2)->addBadge("A masquer...");
A partir d'un array :
$bt1=new HtmlButton("btOkay","Okay"); $bt1->fromArray(array("size"=>"btn-sm","style"=>4));
En spécifiant des propriétés inexistantes dans la classe HtmlButton :
$bt1=new HtmlButton("btOkay","Okay"); $bt1->setProperty("style","font-size:30px;font-family: Harabara");
Classe | HtmlGlyphButton |
---|---|
⇒Hérite de | HtmlButton |
Le GlyphButton posséde les mêmes propriétés et le même comportement que le bouton. Il possède juste la propriété supplémentaire glyph, permettant d'afficher un glyphIcon bootstrap
class IndexController extends Phalcon\Mvc\Controller{ public function glyphButtonAction(){ $bt=new HtmlGlyphButton("glButton1","glyphicon-equalizer","Equalizer"); echo $bt->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ... }
$bt=new HtmlGlyphButton("glButton1","glyphicon-equalizer","Equalizer");
$bt=new HtmlGlyphButton("glButton1"); $bt->setGlyph("glyphicon-equalizer");
$bt=new HtmlGlyphButton("glButton1"); $bt->setGlyph("equalizer");
$bt=new HtmlGlyphButton("glButton1"); $bt->setGlyph(208);
Le tableau CssRef::glyphIcons() donne la liste complète des icônes utilisables
Sur click… Affichage du panel
class IndexController extends Phalcon\Mvc\Controller{ public function glyphButtonAction(){ $bt=new HtmlGlyphButton("glButton1","glyphicon-equalizer","Equalizer"); $bt->onClick($this->jquery->show("#panel",2000)); echo $bt->compile($this->jquery); echo "<div id='panel' class='alert alert-info' style='display:none'>Equalizer panel</div>"; echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ... }
Autre évènements : sur entrée de la souris, affichage du panel ; masquage sur sortie…
class IndexController extends Phalcon\Mvc\Controller{ public function glyphButtonAction(){ $bt=new HtmlGlyphButton("glButton1","glyphicon-equalizer","Equalizer"); $bt->on("mouseenter",$this->jquery->show("#panel")); $bt->on("mouseleave",$this->jquery->hide("#panel")); echo $bt->compile($this->jquery); echo "<div id='panel' class='alert alert-info' style='display:none'>Equalizer panel</div>"; echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ... }
Comme sur la plupart des composants Bootstrap, il est possible d'ajouter un Badge à un bouton :
$bt->addBadge("Off");
Modification des événements : Le texte du badge est modifié sur entrée et sortie de la souris…
$bt->addBadge("Off"); $bt->on("mouseenter",$this->jquery->show("#panel").$this->jquery->html("#gl1 .badge","On")); $bt->on("mouseleave",$this->jquery->hide("#panel").$this->jquery->html("#gl1 .badge","Off"));
Comme sur la plupart des composants Bootstrap, il est possible d'ajouter un label à un bouton :
$bt->addLabel("New");
class IndexController extends Phalcon\Mvc\Controller{ ... public function dropdownAction(){ $bootstrap=$this->jquery->bootstrap(); $dropdown=$bootstrap->htmlDropdown("dd1","Accéder à...",array("Phalcon website","JQuery website")); $dropdown->asButton(); echo $dropdown->compile($this->jquery); echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ...
class IndexController extends Phalcon\Mvc\Controller{ ... public function dropdownAction(){ $bootstrap=$this->jquery->bootstrap(); $dropdown=$bootstrap->htmlDropdown("dd1","Accéder à...",array(array("caption"=>"Phalcon website","href"=>"http://www.phalconphp.com/","target"=>"_new"),"JQuery website")); $dropdown->asButton(); echo $dropdown->compile($this->jquery); echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ...
Un item est une instance de la classe HtmlMenuItem.
$dropdown->getItem(1)->setHref("http://jquery.com");
1 seul :
$dropdown->addItem("Javascript opération");
Ou plusieurs :
$dropdown->addItems(array("item1","item2"));
Sur click…
$dropdown->addItem("Javascript opération")->onClick($this->jquery->show("#panel"));
Pour prévenir le comportement par défaut et faire en sorte que le menu ne disparaisse pas sur click…
On utilise les derniers paramètres stopPropagation et preventDefault :
$dropdown->addItem("Javascript opération")->onClick($this->jquery->show("#panel"),true,true);
$item=dropdown->getItem(2)->addGlyph("star");
$item=dropdown->getItem(2)->addBadge("Badgé");
$item=dropdown->getItem(2)->addLabel("New");
$item=$dropdown->getItem(2)->addGlyph("star")->addBadge("Badgé")->addLabel("New");
Les 2 syntaxes sont équivalentes :
$dropdown->addItem("-");
$dropdown->addDivider();
Les 2 syntaxes sont équivalentes :
$dropdown->addItem("-Dropdown Header");
$dropdown->addHeader(Dropdown Header);
$dropdown->getItem(2)->disable();
Le composant HtmlDropdown accepte d'autres éléments en tant que DropdownItem : checkbox, radio, input, button…
//Case à cocher $ck=new HtmlInputCheckbox("ck","Elément cochable"); $dropdown->addItem("")->setContent($ck); //Bouton radio $op=new HtmlInputRadio("op","Elément radio"); $dropdown->addItem("")->setContent($op); //Zone de texte $input=new HtmlInput("text1"); $input->setProperty("placeholder", "Entrez une valeur"); $item=$dropdown->addItem("")->setContent($input); $item->onClick("",true,true);//trick pour faire en sorte que le menu ne disparaisse pas sur click //Bouton $bt=new HtmlButton("bt","Bouton","btn-info"); $item=$dropdown->addItem("Cliquez sur le bouton... "); $item->addContent($bt);
TODO
Classe | HtmlSplitbutton |
---|---|
Hérite de | HtmlDropdown |
L'évènement onButtonClick permet d'agir sur le bouton associé.
class IndexController extends Phalcon\Mvc\Controller{ public function splitAction(){ $split=new HtmlSplitbutton("split1","Split Button",array("Item1","Item2")); $split->onButtonClick($this->jquery->show("#panel")); $split->onClick($this->jquery->hide("#panel")); echo $split->compile($this->jquery); echo "<div id='panel' class='alert alert-info' style='display:none'>Split panel</div>"; echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ... }
Classe | HtmlButtongroups |
---|---|
⇒Hérite de | HtmlDoubleElement |
class IndexController extends Phalcon\Mvc\Controller{ public function buttonGroupsAction(){ $gr1=new HtmlButtongroups("gr1",array("Bouton1","Bouton2","Bouton3")); echo $gr1->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); } ...
class IndexController extends Phalcon\Mvc\Controller{ public function buttonGroupsAction(){ $bootstrap=$this->jquery->bootstrap(); $gr1=$bootstrap->htmlButtongroups("gr1",array("Bouton1","Bouton2","Bouton3")); $this->jquery->compile($this->view); } ...
{{q['gr1']}}
Le premier élément est à l'index 0, le second à l'index 1…
$gr1->getElement(1)->addLabel("New");
Contrôleur :
class IndexController extends Phalcon\Mvc\Controller{ public function buttonGroupsAction(){ $bootstrap=$this->jquery->bootstrap(); $gr1=$bootstrap->htmlButtongroups("gr1",array("Bouton1","Bouton2","Bouton3")); $elm1=$gr1->getElement(0)->addLabel("New"); $elm1->onClick($this->jquery->getDeferred("index/get","#panel")); $this->jquery->compile($this->view); } public function getAction($id){ echo "Réponse obtenue Sur click du bouton <b>#".$id."</b>"; $this->view->disable(); } ...Vue :
{{q['gr1']}} <div id='panel' class='alert alert-info'></div> {{script_foot}}
Chaque bouton du groupe est cette fois associé au même événement sur click. La requête ajax effectuée récupère comme paramètre l'id de l'élément HTML cliqué :
class IndexController extends Phalcon\Mvc\Controller{ public function buttonGroupsAction(){ $bootstrap=$this->jquery->bootstrap(); $gr1=$bootstrap->htmlButtongroups("gr1",array("Bouton1","Bouton2","Bouton3")); $elm1=$gr1->getElement(0)->addLabel("New"); $gr1->onClick($this->jquery->getDeferred("index/get","#panel")); $this->jquery->compile($this->view); } public function getAction($id){ echo "Réponse obtenue Sur click du bouton <b>#".$id."</b>"; $this->view->disable(); } ...
class IndexController extends Phalcon\Mvc\Controller{ public function buttonGroupsAction(){ $bootstrap=$this->jquery->bootstrap(); $gr1=$bootstrap->htmlButtongroups("gr1",array(array("value"=>"Bouton1","title"=>"success","data-target"=>1), array("value"=>"Bouton2","title"=>"warning","data-target"=>2), array("value"=>"Bouton3","title"=>"danger","data-target"=>3))); $gr1->getElement(0)->addLabel("New"); $gr1->onClick($this->jquery->getDeferred("testsbs/get","'#panel'+$(event.target).attr('data-target')")); $gr1->on("mouseover",$this->jquery->addClass("'#panel'+$(event.target).attr('data-target')","'alert-'+event.target.title")); $this->jquery->compile($this->view); } public function getAction($id){ echo "Réponse obtenue Sur click du bouton <b>#".$id."</b>"; $this->view->disable(); } ...
{{q['gr1']}} <div id='panel1' class='alert'>-</div> <div id='panel2' class='alert'>-</div> <div id='panel3' class='alert'>-</div> {{script_foot}}
On ajoute un SplitButton au Buttongroups :
... $split=$gr1->addElement(new HtmlSplitbutton("split","Afficher/masquer",array("Lancer les 3 requêtes"),"btn-primary")); $split->getItem(0)->onClick($this->jquery->trigger(".btn-default","click")); $split->onButtonClick($this->jquery->toggle(".alert")); ...
Classe | HtmlButtontoolbar |
---|---|
⇒Hérite de | HtmlButtongroups |
Le composant Buttontoolbar permet d'afficher plusieurs Buttongroups.
L'ajout de boutons crée par défaut un nouveau buttongroups dans le composant :
class IndexController extends Phalcon\Mvc\Controller{ public function buttonToolbarAction(){ $bootstrap=$this->jquery->bootstrap(); $toolbar=$bootstrap->htmlButtontoolbar("toolbar"); $toolbar->addElements(array("1","2")); $this->jquery->compile($this->view); } ...
{{q['toolbar']}}
Ajout de boutons dans un nouveau Buttongroups :
$toolbar->addElement(new HtmlButtongroups("gr2",array("3","4","5"),"btn-success"));
D'une autre façon :
$toolbar->addGroup()->addElements(array("6",array("glyph"=>"star")));
Accès aux buttonsgroup :
$buttonGroup1=$toolbar->getElement(0);
Accès aux buttonsgroup :
$button1=$toolbar->getElement(0)->getElement(0);
Sur click de tous les boutons de la toolbar :
$toolbar->onClick("console.log('click général')");
Sur click de tous les boutons d'un buttonsgroup :
$toolbar->getElement(0)->onClick("console.log('click buttonsGroup')");
Sur click de l'un des boutons d'un buttonsgroup :
$toolbar->getElement(0)->getElement(0)->onClick("console.log('click button')");
Classe | HtmlNavbar |
---|---|
⇒Hérite de | BaseHtml |
class IndexController extends Phalcon\Mvc\Controller{ public function navbarAction(){ $bootstrap=$this->jquery->bootstrap(); $nav=$bootstrap->htmlNavbar("navbar-1","Phalcon-JQuery","https://github.com/jcheron/phalcon-jquery"); $this->jquery->compile($this->view); } ... }
{{q["navbar-1"]}} {{script_foot}}
//Liens avec href à # $nav->addElements(array("Link 1","Link 2")); //Liens avec href renseigné $nav->addElement(array("http://www.google.com","Google")); //Plusieurs liens $nav->addElements(array(array("http://www.google.com","Google"),array("http://www.microsoft.com","Microsoft"))); //Dropdown $nav->addElements(array("Dropdown"=>array("Action","Another action","SomeThing else here","-","Separated link")));
.
... public function progressbarAction(){ $pb=$this->jquery->bootstrap()->htmlProgressbar("pb","danger",35); $this->jquery->compile($this->view); } ...
{{q["pb"]}}
... public function progressbarAction(){ $pb=$this->jquery->bootstrap()->htmlProgressbar("pb","danger",35); $this->jquery->compile($this->view); $pb->setStriped(true); $pb->setActive(true); $pb->showCaption(true); } ...
... public function progressbarAction(){ $pb=$this->jquery->bootstrap()->htmlProgressbar("pb"); $pb->showCaption(true); $pb->setActive(true); $pb->setStriped(true); $pb->stack(new HtmlProgressbar("pb-1","info",10)); $pb->stack(new HtmlProgressbar("pb-2","success",20)); $pb->stack(new HtmlProgressbar("pb-2","warning",15)); $pb->stack(new HtmlProgressbar("pb-2","danger",35)); $this->jquery->compile($this->view); } ...
public function panelAction(){ $pan=$this->jquery->bootstrap()->htmlPanel("pan1"); $pan->setContent("Lorem ipsum..."); $pan->addContent(new HtmlAlert("alert")); $pan->setStyle(CssRef::CSS_WARNING); $pan->addHeaderH("Titre","3"); $pan->addFooter("Panel exemple..."); $pan->setCollapsable(true); $pan->show(true); $this->jquery->compile($this->view); }
{{q["pan1"]}} {{script_foot}}
public function tabsAction(){ $tabs1=new HtmlTabs("tabs1"); $tabs1->addTab(array("content"=>"Elément 1","href"=>"#home")); $tabs1->addTabs(array(array("content"=>"Elément 2","href"=>"#elem2"),array("content"=>"Elément 3","href"=>"#elem3"))); $tabs1->setTabstype("pills"); $tabs1->run($this->jquery); $bt5=new HtmlSplitbutton("id5"); $bt5->setValue("Fichier"); $bt5->setTagName("button"); $bt5->setBtnClass("btn btn-primary dropdown-toggle"); $bt5->setItems(array(array("caption"=>"Joueurs","href"=>"#elem3"),array("caption"=>"Accordion","href"=>"#elem3"))); $bt5->setRole("nav"); $bt5->run($this->jquery); $tabs1->addTab($bt5); echo $tabs1->compile(); $tabs1->addTabContents(); $tabs1->setContentToTab(0, "aa"); $tabs1->setContentToTab(1, "bb"); $tabs1->fadeEffect(); echo $tabs1->getContent(); echo $tabs1->getBsComponent()->show(0); $tabs1->getBsComponent()->onShow(1, $this->jquery->get("exemple/form/1","#elem2")); $tabs1->getBsComponent()->onShow(2, $this->jquery->get("exemple/index/nom","#elem3")); echo $this->jquery->compile(); $this->view->disableLevel(View::LEVEL_ACTION_VIEW); }
{{q["tabs1"]}} {{script_foot}}
Affichage d'une boîte modale sur clic d'un bouton :
public function modalAction(){ $bs=$this->jquery->bootstrap(); $btn=$bs->htmlButton("btn1","Afficher la boîte modale"); $modal=$bs->htmlModal("modal1","Titre","Contenu<br>de la <strong>boîte de dialogue</strong>"); $modal->addCancelButton("Fermer"); $btn->onClick($modal->jsShow()); $this->jquery->compile($this->view); }
{{q["btn1"]}} {{q["modal1"]}} {{script_foot}}
public function modalAction(){ $bs=$this->jquery->bootstrap(); $btn=$bs->htmlButton("btn1","Afficher la boîte modale"); $modal=$bs->htmlModal("modal1","Titre"); $modal->renderContent($this->view, "exemple", "modalForm",array("mail"=>"admin@local.net","password"=>"xxxx")); $modal->addCancelButton("Fermer"); $btn->onClick($modal->jsShow()); $this->jquery->compile($this->view); }
La méthode renderContent charge une vue, mais ne change pas le contrôleur actif.
La vue correspondante :
<form> <div class="form-group"> <label for="exampleInputEmail1">Email address</label> <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email" value="{{mail}}"> </div> <div class="form-group"> <label for="exampleInputPassword1">Password</label> <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" value="{{password}}"> </div> </form>
Ajout d'un bouton Suivant :
public function modalAction(){ $bs=$this->jquery->bootstrap(); $btn=$bs->htmlButton("btn1","Afficher la boîte modale"); $modal=$bs->htmlModal("modal1","Titre"); $modal->renderContent($this->view, "exemple", "modalForm",array("mail"=>"admin@local.net","password"=>"xxxx")); $modal->addCancelButton("Fermer"); $bt=$modal->addButton("Suivant >>","success")->onClick($modal->jsGetContent($this->jquery, "exemple/modalForm2")); $bt->onClick($modal->jsSetTitle("Contenu chargé en Ajax")); $bt->onClick($modal->jsHideButton("Suivant")); $btn->onClick($modal->jsShow()); $this->jquery->compile($this->view); }
Le contrôleur correspondant à la vue sollicitée :
public function modalForm2Action(){ $this->view->disableLevel(View::LEVEL_MAIN_LAYOUT); }
La vue correspondante :
<form> <div class="form-group"> <label for="exampleInputFile">File input</label> <input type="file" id="exampleInputFile"> <p class="help-block">Example block-level help text here.</p> </div> <div class="checkbox"> <label> <input type="checkbox"> Check me out </label> </div> </form>
public function modalAction(){ $bs=$this->jquery->bootstrap(); //Ajout de 2 boutons à l'instanciation $modal=$bs->htmlModal("modal1","Titre du dialogue","Contenu",array("Ajouter","Retirer")); //Ajout d'un bouton Annuler $modal->addCancelButton("Fermer"); //Ajout d'un bouton Okay $modal->addOkayButton("Valider"); //Ajout d'un bouton classique $bt=$modal->addButton("Suivant >>","success")->onClick($modal->jsGetContent($this->jquery, "exemple/modalForm2")); $this->jquery->compile($this->view); }
Boutons spécifiques :
La condition par défaut est $('#identifier').prop('valid'), il est possible de la changer à tout moment :
Exemple : Vérification de la présence d'un élément d'id #ck dans la page :
$modal->setValidCondition("$('#ck').length>0");
Exemple : en rendant la sortie automatiquement valide :
$modal->setValid();
Il est possible d'accéder aux boutons déjà créés soit par leur identifier (attribut id du HTML), soit par leur index (à partir de 0 dans le tableau des boutons) :
public function modalAction(){ $bs=$this->jquery->bootstrap(); //Ajout de 2 boutons à l'instanciation $modal=$bs->htmlModal("modal1","Titre du dialogue",array("Ajouter","Retirer")); //Accès au bouton par son nom (identifier = nom corrigé) $modal->getButton("Ajouter")->setStyle("Success"); //Accès au bouton par son index $modal->getButton(1)->setStyle("Warning"); $this->jquery->compile($this->view); }