php, Senza categoria

Ma è difficile implementare bootsrap in Codeigniter?

Come fare a implementare bootstrap in codeigniter? E’ difficile, complicato, devo fare un corso alla NASA? Nulla di trascendentale, anche se prima bisognerebbe partire da come mostrare una pagina a piacere al posto della consueta Welcome.php che genera un saluto gratificante all’ utente, ma dando per scontato che l’utente sappia risolvere questo facile dilemma (che comunque verrà visto alla fine in questo tutorial, basta avere un pò di pazienza e sapere quello che si deve fare, per cui il primo passo è andare su https://www.codeigniter.com/download e scaricare il famoso framework che una il paradigma Model-View-Control ossia il model e le viste mandano i dati al controller che li rielabora e per quanto riguarda le viste rispedisce tutto alla VIEW per rilanciare indietro il codice al browser, più difficle da raccontare che da capire in pratica con un editor sotto mano. Scompattata la cartella mettiamo in XAMPP, rinominiamola in bootstrap e inseriamola dentro la cartella CODEIGNITER (è una scelta personale per visualizzare i progetti). A questo punto andiamo a collegarci con https://getbootstrap.com/docs/4.1/getting-started/download/ e scarichiamo dalla prima sezione quella del Compiled CSS and JS e scompattiamo nella cartella download. Andiamo poi su https://jquery.com/download/ e scarichiamo il file https://code.jquery.com/jquery-3.3.1.min.js che una volta salvato possiamo andare a inserire nella cartella js di bootstrap, dove andremo a creare una cartella ASSETS che tradotto sta per risorse. Questa cartella andrà inserita nella root del framework scaricato. A questo punto le nostre risorse ci sono e serve lincarle ma come? Nella vista andiamo a spezzare una pagina HTML che è composta da tre parti, quindi HEAD, BODY e FOOTER. Scomposta in tre file la nostra pagina web conterrà al suo interno i tag utili per la parte interessata di quella sezione, più le risorse per andare a lincare le nostre risorse. Ad esempio nella pagina head dovremmo linkare quello che ci interessa. Nell’ inclusione del file head.php metteremo

<html>

<head>

<title>inclusione di bootsrap in codeigniter</title>

<link rel=”stylesheet” href=”<?php base_url();?>assets/css/bootstrap.min.css”>

</head>

<body>

mentre nel file di inclusione footer.php inseriamo

<script src=”<?php base_url();?>assets/js/jquery-3.3.1.min.js”>

<script src=”<?php base_url();?>assets/js/bootstrap.min.js”>

</body>

</html>

a questo punto prendiamo il codice di una pagina web responsiva fatta con bootstrap, oppure uno sei suoi componenti, andando a recuperarlo o dal sito bootsrap menzionato sopra o da siti didattici come https://www.w3schools.com/bootstrap4/default.asp, prendiamo il codice del componente o della pagina che ci interessa e incolliamolo nel file body.php e siamo già a buon punto ma attenzione perchè adesso dobbiamo configurare il nostro framework che è settato per vedere di default la pagina di benvenuto. Quindi andiamo sul file di configurazione autoload.php e andiamo a inserire il parametro URL tra virgolette $autoload[‘helper’] = array(‘url’); Ora si va a cercare il file di configurazione routes.php e si imposta il parametro $route[‘default_controller’] = ‘home’; questo significa che devo creare un file nell’ Application controller che si chiamerà Main.php che conterrà al suo interno le seguenti istruzioni:

<?php

defined(‘BASEPATH’) OR exit(‘No direct script access allowed’);

class Home extends CI_Controller {

public function index()

{

$this->load->view(‘head’);

$this->load->view(‘body’);

$this->load->view(‘footer’);

}

in cui si evince che le viste vengono caricate sostanzialmente e dove si nota il nome della classe in maiuscolo che é uguale al nome del file e anche al richiamo che abbiamo nel file di instramento nella cartella config; tutto quello che bisogna fare ora è visualizzare il risultato ottenuto all’ indirizzo http://www.farwebdesign.com/codeigniter/bootstrap/ .Complesso? Complicato? Può darsi, ma il vantaggio di lavorare in questo modo è quella di avere alle spalle una applicazione solida e robusta che oltre a garantire maggiori margini di sicurezza semplifica e riduce all’ osso il codice nelle parti che vanno controllate, quindi maggior ordine e chiarezza su dove intervenire dopo una prima fase di inevitabile sbandamento! A questo punto complichiamoci la vita. Nella navbar in alto ci sono tre link, mentre con il classico html sarebbe facili riempirli magari con tre url del tipo https://www.umbriaway.eu/ o https://www.umbriashop.eu/ o http://www.umbriaway.it/ in codeigniter come si riesce a ottenere lo stesso risultato? Semplice si va sul file body e si completano i link vuoti trasformando la navbar in questo modo:

<nav class=”navbar navbar-expand-sm bg-dark navbar-dark”>

<a class=”navbar-brand” href=”#”>Navbar</a>

<button class=”navbar-toggler” type=”button” data-toggle=”collapse” data-target=”#collapsibleNavbar”>

<span class=”navbar-toggler-icon”></span>

</button>

</nav>

e funziona se spedisco i file via FTP su server? Certo che si perché sono file esterni ma se ci aggiungo un link che punta a un file tipo

<li class=”nav-item”>

<a class=”nav-link” href=”mission.php” target=”_blank”>Mission</a>

</li>

come faccio a vederlo? Lo inserisco con gli altri e visualizzo ma cosa ottengo? Qualcosa del tipo: The requested URL /codeigniter/bootstrap/mission.php was not found on this server. E allora che fare? Occorre andare sul controller e aggiungere la nuova vista con: $this->load->view(‘mission.php’); a questo punto ricarico e…..riottengo lo stesso risultato come mai?! Per questo dilemma lasciamo la soluzione a una delle prossime puntate! Che codeigniter sia con voi nei secoli dei secoli!

Annunci
social media marketing Umbria
chess, formazione, social media marketing Umbria

Problem Solving: e adesso come applico la paginazione su un modello scacchiera MVC?!

social media marketing UmbriaPrima di affrontare questa spinosa questione con social media marketing Umbria torniamo al tema delle mosse impossibili che scaturiscono dalla trasgressione dei principi generali, in questo caso lo sviluppo. All’ indirizzo http://www.chessgames.com/perl/chessgame?gid=1102375 abbiamo un bianco in forma che alla domanda mi sta attaccando il cavallo sulla casa d4 che si fa? Risponde e chi se ne! La partita finisce con il consueto tiro al piccione sul povero re nero rimasto IMPALATO al centro della scacchiera sulle colonne D ed E! Il problema della paginazione in MVC é simile ai geroglifici dell’ antico egizio, o hai studiato Champollion oppure brancoli nel buio. Lo si sa la paginazione essere anche in assenza di MVC già molto scorbutica e dove mettere in mano per risolvere una visualizzazione funzionale di record nella pagina non lo si sa bene, per cui ci si muove come un dinosauro cieco in una notte insonne dentro un gran canyon. Vediamo un pò di suggerimenti cercati in rete. Tizio suggerisce: creare una classe che calcoli il limite e l’offset corretti in base alla pagina. L’impaginazione è un gioco di numeri basato sulla quantità totale di record, record per pagina e pagina corrente. Merita una classe separata. Quindi puoi anche posizionare alcune logiche di visualizzazione in quella classe per creare dropdown di paginazione, nav e / o il javascript a discesa se odi anche ripetere tutte queste cose. Potresti persino renderlo una classe separata che richiede un oggetto di impaginazione:

controller

$pagination = new Pagination(10,1200,3);
$offset = $pagination->getOffset();
$limit = $pagination->getLimit();

view

$pages = $pagination->getPages();
$page = $pagination->getPage();
$total = $pagination->getTotal();
$pagination->makeMenu();

Qualcun altro suggerisce un approccio con Zend Paginator. C’è anche Sempronio che suggerisce di definire una classe per passarla alla vista:

<!–
<?
// IN CONTROLLER
$dataSet = array(1,2,3,4,5,6,7,8,9,10);

$currPage = ($_GET[“pg”])?$_GET[“pg”]:1;

$pagination = new Pagination(sizeof($dataSet), 2, $currPage);

// IN VIEW

// Use default styling/automatic generation
echo $pagination->getLinksHtml(“http://localhost/paginationtest.php&#8221;, “pg”);

// custom styling
for($i=1; $i<=$pagination->getNumPages(); $i++) {
//etc etc
}
?>

<?
class Pagination
{
private $totalItems;
private $itemsPerPage;
private $currPage;

public function __construct($totalItems, $itemsPerPage, $currPage)
{
$this->totalItems = $totalItems;
$this->itemsPerPage = $itemsPerPage;
$this->currPage = $currPage;
}

public function getLinksHtml($baseUrl, $pageVar)
{
$html = “”;

if ($this->hasPrev()) {
$html .= ‘<a href=”‘.$baseUrl.’?’.$pageVar.’=’.($this->currPage-1).'”>’;
$html .= ‘Previous’;
$html .= ‘</a> ‘;
}

for($i=1; $i<=$this->getNumPages(); $i++) {
if ($i != $this->currPage) {
$html .= ‘ <a href=”‘.$baseUrl.’?’.$pageVar.’=’.$i.'”>’.$i.'</a> ‘;
} else {
$html .= ‘ ‘.$i.’ ‘;
}
}

if ($this->hasNext()) {
$html .= ‘ <a href=”‘.$baseUrl.’?’.$pageVar.’=’.($this->currPage+1).'”>’;
$html .= ‘Next’;
$html .= ‘</a>’;
}

return $html;
}

public function hasPrev()
{
if ($this->currPage > 1) {
return true;
} else {
return false;
}
}

public function hasNext()
{

if ($this->currPage < $this->getNumPages()) {
return true;
} else {
return false;
}
}

public function getNumPages()
{
$numPages = ceil($this->totalItems/$this->itemsPerPage);

return $numPages;
}
}
?>

–>

approfondire tali problematiche all’ indirizzo: https://www.sitepoint.com/. Altri contributi si possono trovare su GIT:

<!–

<?php
/**
* MVC core class
* @category MVC
* @package Pagination
* @author Ross Masters <ross@php.net>
* @copyright Copyright (c) 2009 Ross Masters.
* @license http://wiki.github.com/rmasters/php-mvc/license New BSD License
* @version 0.1
*/
namespace MVC;
/**
* Pagination class
* Provides a simple pagination interface for selecting groups of records.
* @category MVC
* @package Pagination
* @copyright Copyright (c) 2009 Ross Masters.
* @license http://wiki.github.com/rmasters/php-mvc/license New BSD License
*/
class Pagination
{
/**
* Total records available in the table
* @var int
*/
private $total;
/**
* Records to return per set (or page)
* @var int
*/
private $perSet;
/**
* Number of the current set (1+) (or page)
* @var int
*/
private $setNumber;
/**
* Sets available based on total and perSet
* @var int
*/
private $sets;
/**
* Constructor
* @param int $setNumber Current set number (or page)
* @param int $perSet Number of records to return per set
* @param int $total Total records in table
*/
public function __construct($setNumber, $perSet, $total) {
$this->perSet = (int) $perSet;
$this->total = (int) $total;
$this->sets = (int) ceil($this->total / $perSet);
$this->setNumber = $this->changeSet((int) $setNumber);
}
/**
* Change the set to another number
* @param int $setNumber New set number
*/
public function changeSet($setNumber) {
// Minimum set number
if ($setNumber < 0) {
$setNumber = 1;
}
// Maximum set number
if ($setNumber > $this->sets) {
$setNumber = $this->sets;
}
return $setNumber;
}
/**
* Return the number of records to return
* If there are more than Pagination::perSet records return
* maximum per set otherwise return the amount of records
* left to fetch.
* @return int Number of records
*/
public function getCount() {
// Remainder of records
$rem = $this->total – ($this->perSet * ($this->setNumber – 1));
// Return maximum number of records if greater than perSet
if ($rem > $this->perSet) {
return $this->perSet;
}
// Otherwise return number of records (lt perSet)
return $rem;
}
/**
* Get the offset (records onwards from 0)
* @return int Offset
*/
public function getOffset() {
$offset = ($this->perSet * ($this->setNumber – 1));
return ($offset < 1) ? 0 : $offset;
}
/**
* Get the current set number
* @return int Current set number
*/
public function getSetNumber() {
return $this->setNumber;
}
/**
* Get total number of sets available
* return int Sets available
*/
public function getSets() {
return $this->sets;
}
}

–>

Anche su You Tube alla voce paginazion class saltano fuori cose interessanti tipo https://youtu.be/1SB0k3a3rNc e https://youtu.be/u-9jqRyWjvk per esempio mentre all’ indirizzo https://www.startutorial.com/articles/view/php-pagination-tutorial ci viene offerta anche la possibilità di scaricare lo zip da git hub con il file paginator.php:

<!–
<?php
/**
*@author The-Di-Lab
*@email thedilab@gmail.com
*@website http://www.the-di-lab.com
*@version 1.0
**/
class Paginator {
public $itemsPerPage;
public $range;
public $currentPage;
public $total;
public $textNav;
private $_navigation;
private $_link;
private $_pageNumHtml;
private $_itemHtml;
/**
* Constructor
*/
public function __construct()
{
//set default values
$this->itemsPerPage = 5;
$this->range = 5;
$this->currentPage = 1;
$this->total = 0;
$this->textNav = false;
$this->itemSelect = array(5,25,50,100,’All’);
//private values
$this->_navigation = array(
‘next’=>’Next’,
‘pre’ =>’Pre’,
‘ipp’ =>’Item per page’
);
$this->_link = filter_var($_SERVER[‘PHP_SELF’], FILTER_SANITIZE_STRING);
$this->_pageNumHtml = ”;
$this->_itemHtml = ”;
}

/**
* paginate main function
*
* @author The-Di-Lab <thedilab@gmail.com>
* @access public
* @return type
*/
public function paginate()
{
//get current page
if(isset($_GET[‘current’])){
$this->currentPage = $_GET[‘current’];
}
//get item per page
if(isset($_GET[‘item’])){
$this->itemsPerPage = $_GET[‘item’];
}
//get page numbers
$this->_pageNumHtml = $this->_getPageNumbers();
//get item per page select box
$this->_itemHtml = $this->_getItemSelect();
}

/**
* return pagination numbers in a format of UL list
*
* @author The-Di-Lab <thedilab@gmail.com>
* @access public
* @param type $parameter
* @return string
*/
public function pageNumbers()
{
if(empty($this->_pageNumHtml)){
exit(‘Please call function paginate() first.’);
}
return $this->_pageNumHtml;
}

/**
* return jump menu in a format of select box
*
* @author The-Di-Lab <thedilab@gmail.com>
* @access public
* @return string
*/
public function itemsPerPage()
{
if(empty($this->_itemHtml)){
exit(‘Please call function paginate() first.’);
}
return $this->_itemHtml;
}

/**
* return page numbers html formats
*
* @author The-Di-Lab <thedilab@gmail.com>
* @access public
* @return string
*/
private function _getPageNumbers()
{
$html = ‘<ul>’;
//previous link button
if($this->textNav&&($this->currentPage>1)){
echo ‘<li><a href=”‘.$this->_link .’?current=’.($this->currentPage-1).'”‘;
echo ‘>’.$this->_navigation[‘pre’].'</a></li>’;
}
//do ranged pagination only when total pages is greater than the range
if($this->total > $this->range){
$start = ($this->currentPage <= $this->range)?1:($this->currentPage – $this->range);
$end = ($this->total – $this->currentPage >= $this->range)?($this->currentPage+$this->range): $this->total;
}else{
$start = 1;
$end = $this->total;
}
//loop through page numbers
for($i = $start; $i <= $end; $i++){
echo ‘<li><a href=”‘.$this->_link .’?current=’.$i.'”‘;
if($i==$this->currentPage) echo “class=’current'”;
echo ‘>’.$i.'</a></li>’;
}
//next link button
if($this->textNav&&($this->currentPage<$this->total)){
echo ‘<li><a href=”‘.$this->_link .’?current=’.($this->currentPage+1).'”‘;
echo ‘>’.$this->_navigation[‘next’].'</a></li>’;
}
$html .= ‘</ul>’;
return $html;
}

/**
* return item select box
*
* @author The-Di-Lab <thedilab@gmail.com>
* @access public
* @return string
*/
private function _getItemSelect()
{
$items = ”;
$ippArray = $this->itemSelect;
foreach($ippArray as $ippOpt){
$items .= ($ippOpt == $this->itemsPerPage) ? “<option selected value=\”$ippOpt\”>$ippOpt</option>\n”:”<option value=\”$ippOpt\”>$ippOpt</option>\n”;
}
return “<span class=\”paginate\”>”.$this->_navigation[‘ipp’].”</span>
<select class=\”paginate\” onchange=\”window.location=’$this->_link?current=1&item=’+this[this.selectedIndex].value;return false\”>$items</select>\n”;
}
}
–>

A questo punto pensavamo di esserci chiariti le idee con social media marketing Umbria e invece no, siamo punto e da capo. Si vabbé adesso che ho tutte queste belle informazioni come le applico nella pratica di un cms mvc tipo http://www.farwebdesign.com/aforismimvc ? La risposta é dentro di te ma é sbagliata !