Problema degli anchor-link in sito con home-page OnePage

Un problema che mi si è posto durante la realizzazione di un sito in WordPress è stato il seguente:

1) L’Home-Page era in stile sito One-Page, quindi ogni voce del menu principale era un anchor-link strutturato come nell’esempio qui di seguito

<a href="#nameSection"></a>

ognuno dei quali rimandava all’elemento html con

<div id="nameSection">

2) Nelle pagine interne del sito il menu con gli anchor-link naturalmente non funzionava, facendo essi riferimento alle sezioni della Home.

3) Utilizzare l’url completo del sito unito all’anchor link bypassava si il problema, ma così scritti i link del menu avevano come effetto collaterale di ricaricare la pagina senza più scrolling.

La soluzione trovata alla fine è stata la seguente


jQuery( document ).ready(function() {
	var url = window.location.href;
	var sensor = url.indexOf("#");
	if(!((url == "http://www.feedback.it/") || (sensor > 0))) {
		var links = jQuery("#menu-primary-1 a");
		jQuery.each(links, function( index, value ) {
			jQuery("#menu-primary-1 a:nth-child(" + index + ")").attr("href", function() {
				console.log("href: " + this.href);
				var link = this.href;
				return "http://www.feedback.it/" + link.substr(link.indexOf('#'));
			});;
		});			
	}
});

Spiegazione:

Alla fine del caricamento della pagina (riga 1) assegno alla variabile “url” l’url della pagina corrente (riga 2) e alla variabile “sensor” l’esito della funzione “indexOf” alla stringa ottenuta nella variabile “url” sul carattere “#” (riga 3). Così facendo posso eseguire un controllo accurato sulla pagina attualmente caricata verificando se si tratti della home page contenente gli anchor-link o di una pagina interna (riga 4). Nel caso la pagina attuale sia una pagina interna procedo a cambiare i link nell’attributo href dei tag anchor di ogni voce del menu principale (riga 5-13). Alla variabie “links” assegno il numero di link da modificare (riga 5), tramite ciclo “each” (riga 6) cambio in progressione l’href di ogni link del menu (riga 7) assegnandogliene uno riferito all’home page seguito dall’anchor-link della relativa sezione.

Utilizzare Ajax in WordPress

Per la recente creazione di un gestionale ho utilizzato come piattaforma di base WordPress in sinergia con un nuovo framework CRUD chiamato XCRUD. In fase di sviluppo ad un certo punto ho avuto la necessità di implementare un interfaccia grafica che generasse dei box interattivi. Al trascinamento di un box all’interno di un altro box principale, l’azione avrebbe dovuto essere memorizzata al volo nel database MySql, per tenere traccia di quale box “figlio” era stato spostato in quale box “padre”. Sapendo di dover utilizzare Ajax ma non sapendo bene come utilizzarlo in WordPress mi sono documentato un pò in rete. Le guide trovate non sono state il massimo della chiarezza, con la conseguenza che alcune cose ho dovuto intuirle da me. Scrivo quindi questo articolo per guidarvi (e ricordarmi) il procedimento da seguire.


PHP Basic – Lez.10 < Arrays >

Un array memorizza valori multipli in una singola variabile:

Esempio

<?php
 $cars=array("Volvo","BMW","Toyota");
 echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

Cos’è un array ?

Un array è una speciale variabile che può contenere più di una variabile alla volta (sotto quindi un singolo nome), a cui è possibile accedere utilizzando un indice numerico.

Creare un array

In PHP, la funzione array() è usata per creare un array.

Abbiamo tre tipi di arrays:

  • Arrays indicizzati – Arrays con indice numerico
  • Array associativi – Arrays con chiave nominativa
  • Array Multidimensionali – Arrays contenenti uno o più arrays

Indexed Arrays

Ci sono due modi per creare array indicizzati:

L’indice può essere assegnato automaticamente (parte sempre da 0):

$cars=array(“Volvo”,”BMW”,”Toyota”);

o assegnato manualmente:

$cars[0]=”Volvo”;
$cars[1]=”BMW”;
$cars[2]=”Toyota”;

Esempio

<?php
 $cars=array("Volvo","BMW","Toyota");
 echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

Ottenere la lunghezza di un array

La funzione count() è usata per ritornare la lunghezza (il numero di elementi) di un array:

Esempio

<?php
 $cars=array("Volvo","BMW","Toyota");
 echo count($cars);
?>

Ciclo di un Indexed Array

Per ciclare e visualizzare tutti i valori di un array indicizzato, si può usare un for in questo modo:

Esempio

<?php
 $cars=array("Volvo","BMW","Toyota");
 $arrlength=count($cars);
 
 for($x=0;$x<$arrlength;$x++)
 {
  echo $cars[$x];
  echo "<br>";
 }
?>

Arrays associativi

Gli arrays associativi sono arrays che usano chiavi nominali assegnabili liberamente.

Ci sono due modi per creare un array associativo:

  • $age=array(“Peter”=>”35″,”Ben”=>”37″,”Joe”=>”43”);
  • $age[‘Peter’]=”35″;
    $age[‘Ben’]=”37″;
    $age[‘Joe’]=”43″;

Esempio

<?php
 $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
 echo "Peter is " . $age['Peter'] . " years old.";
?>

Ciclo di un Array Associativo

Per ciclare e visualizzare tutti i valori di un array associativo, può essere utilizzato un foreach in questo modo:

Esempio

<?php
 $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
 
 foreach($age as $x=>$x_value)
 {
  echo "Key=" . $x . ", Value=" . $x_value;
  echo "<br>";
 }
?>

Array Multidimensionali

Multidimensional arrays will be explained in the PHP advanced section.

PHP Basic – Lez.9 < Funzioni >

PHP User Defined Functions

Oltre alle funzioni interne di PHP, possiamo creare le nostre funzioni personalizzate.

Una funzione è un blocco di istruzioni che possono essere usate ripetutamente in un programma.

Una funzione non sarà eseguita immediatamente al caricamento della pagina, ma solo se richiamata.

Create a User Defined Function in PHP

La dichiarazione di una funzione comincia con la parola “function”:
Sintassi

function functionName()
{
 code da eseguire;
}

(Ricorda: i nomi delle funzioni sono case-insensitive.)

Per richiamare la funzione, basta scrivere il suo nome.

Esempio

<?php
 function writeMsg()
 {
  echo "Hello world!";
 }
 
 writeMsg(); // call the function
?>

Argomenti della funzione

Informazioni che possono essere passate alla funzione attraverso argomenti. Un argomento è come una variabile.

Gli argomenti sono specificati dopo il nome della funzione, tra parentesi. Se ne possono aggiungere quanti necessari, separati da una virgola.

Esempio

<?php
 function familyName($fname,$year)
 {
  echo "$fname Refsnes. Born in $year <br>";
 }
 
 familyName("Hege","1975");
 familyName("Stle","1978");
 familyName("Kai Jim","1983");
?>

Valore di dafualt di un argomento

Esempio

<?php
 function setHeight($minheight=50)
 {
  echo "The height is : $minheight <br>";
 }
 
 setHeight(350);
 setHeight(); // will use the default value of 50
 setHeight(135);
 setHeight(80);
?>

Valori di ritorno

Per consentire ad una funzione di restituisce un valore, utilizzare l’istruzione return.

Esempio

<?php
 function sum($x,$y)
 {
  $z=$x+$y;
  return $z;
 }
 
 echo "5 + 10 = " . sum(5,10) . "<br>";
 echo "7 + 13 = " . sum(7,13) . "<br>";
 echo "2 + 4 = " . sum(2,4);
?>

PHP Basic – Lez.8 < Iterazioni >

In PHP, abbiamo le seguenti istruzioni di iterazione:

  • while – cicla il blocco di codice fichè la condizione specificata è vera
  • do…while – esegue il blocco di codice una prima volta, e succesivamente ripete l’esecuzione finchè la condizione specificata è vera
  • for – cicla il blocco di codice un numero specifico di volte
  • foreach – cicla il blocco di codice per ogni elemento di un array

Ciclo while

Sintassi

while (condizione è vera)
{
 code da eseguire;
}

Esempio

<?php
 $x=1;
 while($x<=5)
 {
  echo "The number is: $x <br>";
  $x++;
 }
?>

Ciclo do…while

Sintassi

do
{
 code da eseguire;
}
while (condizione è vera);

Esempio

<?php
 $x=6;
 do
 {
  echo "The number is: $x <br>";
  $x++;
 }
 while ($x<=5)
?>

Ciclo for

Sintassi

for (init counter; test counter; increment counter)
{
 code da eseguire;
}

Parameters:

  • init counter: Inizializza il valore del contatore del ciclo
  • test counter: Controllo. Se la verifica è TRUE, il ciclo continua. Se è FALSE, il ciclo finisce.
  • increment counter: Incrementa il valore del contatore del ciclo

Esempio

<?php
 for ($x=0; $x<=10; $x++)
 {
  echo "The number is: $x <br>";
 }
?>

Ciclo foreach

Sintassi

foreach ($array as $value)
{
 code da eseguire;
}

Ad ogi ciclo, il valore corrente dell’array è assegnato al $value e il puntatore dell’array è spostato di uno, fino a raggiungere l’ultimo elemento dell’array.

Esempio

<?php
 $colors = array("red","green","blue","yellow");
 foreach ($colors as $value)
 {
  echo "$value <br>";
 }
?>

PHP Basic – Lez.7 < Istruzioni Condizionali >

Le istruzioni condizionali sono usate per eseguire differenti azioni in base a differenti condizioni.

In PHP si hanno le seguenti istruzioni condizionali:

  • if – esegue del codice solo se la condizione specificata è vera
  • if…else – esegue del codice se la condizione è vera e un altro codice se invece è falsa
  • if…elseif….else – seleziona uno dei blocchi di codice da eseguire
  • switch – seleziona uno dei blocchi di codice da eseguire

PHP – Istruzione If

Sintassi

if (condizione)
 {
  code da eseguire se la condizione è true;
 }

Esempio

<?php
 $t=date("H");
 if ($t<"20")
  {
   echo "Have a good day!";
  }
?>

PHP – Istruzione if…else

Sintassi

if (condizione)
 {
  code da eseguire se la condizione è true;
 }
else
 {
  code da eseguire se la condizione è false;
 }

Example

<?php
 $t=date("H");
 if ($t<"20")
  {
   echo "Have a good day!";
  }
 else
  {
   echo "Have a good night!";
  }
?>

PHP – Istruzione if…elseif….else

Sintassi

if (condizione)
 {
  code da eseguire se la condizione è true;
 }
elseif (condition)
 {
  code da eseguire se la condizione è true;
 }
else
 {
  code da eseguire se la condizione è false;
 }

Esempio

<?php
 $t=date("H");
 if ($t<"10")
  {
   echo "Have a good morning!";
  }
 elseif ($t<"20")
  {
   echo "Have a good day!";
  }
 else
  {
   echo "Have a good night!";
  }
?>

PHP – Istruzione switch

Sintassi

switch (n)
 {
  case label1:
   codice da eseguire se n=label1;
   break;
  case label2:
   codice da eseguire se n=label2;
   break;
  case label3:
   codice da eseguire se n=label3;
   break;

  default:
   codice da eseguire se n è diverso da tutte le labels;
 }

Ecco come funziona: Inizialmente si ha una singola espressione n (più spesso una variabile), che viene valutata una volta. Il valore dell’espressione è successivamente confrontato con i valori di ogni case nella struttura. Se c’è un riscontro, il blocco di codice associato con il case viene eseguito. Il break serve per far sì che l’esecuzione del codice venga fermata prima del prossimo case. L’istruzione di default è usata se non viene trovato nessun riscontro.

Esempio

<?php
 $favcolor="red";
 switch ($favcolor)
  {
   case "red":
    echo "Your favorite color is red!";
    break;
   case "blue":
    echo "Your favorite color is blue!";
    break;
   case "green":
    echo "Your favorite color is green!";
    break;
   default:
    echo "Your favorite color is neither red, blue, or green!";
  }
?>

PHP Basic – Lez.6 < Operatori >

Operatori Aritmetici

Operatore Nome
+ Addizione
Sottrazione
* Moltiplicazione
/ Divisione
% Modulo

Operatori di assegnazione

Gli operatori di assegnazione sono usati per scrivere un valore in una variabile.

Assegnazione Equivalente a Descrizione
x = y x = y L’operatore di sinistra acquisisce il valore dell’espressione alla destra
x += y x = x + y Addizione
x -= y x = x – y Sottrazione
x *= y x = x * y Moltiplicazione
x /= y x = x / y Divisione
x %= y x = x % y Modulo

Esempio

<?php
 $x=10;
 echo $x; // outputs 10
 
 $y=20;
 $y += 100;
 echo $y; // outputs 120
 
 $z=50;
 $z -= 25;
 echo $z; // outputs 25
 
 $i=5;
 $i *= 6;
 echo $i; // outputs 30
 
 $j=10;
 $j /= 5;
 echo $j; // outputs 2
 
 $k=15;
 $k %= 4;
 echo $k; // outputs 3
?>

Operatori Stringhe

Operatore Nome Esempio Risultato
. Concatenazione $txt1 = “Hello”
$txt2 = $txt1 . ” world!”
Ora $txt2 contiene “Hello world!”
.= Assegnazione concatenazione $txt1 = “Hello”
$txt1 .= ” world!”
Ora $txt1 contiene “Hello world!”

Esempio

<?php
 $a = "Hello";
 $b = $a . " world!";
 echo $b; // outputs Hello world!
 
 $x="Hello";
 $x .= " world!";
 echo $x; // outputs Hello world!
?>

Operatori di Incremento/Decremento

Operatore Nome Descrizione
++$x Pre-incremento Incrementa $x di uno, successivamente ritorna $x
$x++ Post-incremento Ritorna $x, successivamente incrementa $x di uno
–$x Pre-decremento Decrementa $x di uno, successivamente ritorna $x
$x– Post-decremento Ritorna $x, successivamente decrementa $x di uno

Esempio

<?php
 $x=10;
 echo ++$x; // outputs 11
 
 $y=10;
 echo $y++; // outputs 10
 
 $z=5;
 echo --$z; // outputs 4
 
 $i=5;
 echo $i--; // outputs 5
?>

Operatori di comparazione

Gli operatori di comparazione sono usati per confrontare due valori (numeri o stringhe).

Operatore Nome Esempio Risultato
== Uguale $x == $y True se $x è uguale a $y
=== Identico $x === $y True se $x è uguale a $y e sono dello stesso tipo
!= Diverso $x != $y True se $x è diverso da $y
<> Diverso $x <> $y True se $x è diverso da $y
!== Non identici $x !== $y True se $x è diverso da $y, o se non sono dello stesso tipo
> Maggiore di $x > $y True se $x è maggiore di $y
< Minore di $x < $y True se $x è minore di $y
>= Maggiore di o uguale a $x >= $y True se $x è maggiore di o uguale a $y
<= Minore di o uguale a $x <= $y True se $x è minore di o uguale a $y

Esempio

<?php
 $x=100;
 $y="100";
 
 var_dump($x == $y); // true
 echo "<br>";
 var_dump($x === $y); // false
 echo "<br>";
 var_dump($x != $y); // false
 echo "<br>";
 var_dump($x !== $y); // true
 echo "<br>";
 
 $a=50;
 $b=90;
 
 var_dump($a > $b);
 echo "<br>";
 var_dump($a <  $b);
?>

Operatori Logici

Operatore Nome Esempio Risultato
and And $x and $y True se entrambi $x e $y sono true
or Or $x or $y True se $x o $y è true
xor Xor $x xor $y True se $x o $y è true, ma non entrambi
&& And $x && $y True se entrambi $x e $y sono true
|| Or $x || $y True se $x o $y è true
! Not !$x True se $x è false (e viceversa)

Opertori Array

Gli operatori per array sono usati per comparare array.

Operatore Nome Esempio Risultato
+ Unione $x + $y Unione of $x and $y
== Uguaglianza $x == $y True se $x e $y hanno la stessa coppia chiave/valore
=== Identità $x === $y True se $x e $y hanno la stessa coppia chiave/valore nello stesso ordine e dello stesso tipo
!= Disuguaglianza $x != $y True se $x è diverso da $y
<> Disuguaglianza $x <> $y True se $x è diverso da $y
!== Non-identico $x !== $y True se $x è non identico a $y

Esempio

<?php
 $x = array("a" => "red", "b" => "green");
 $y = array("c" => "blue", "d" => "yellow");
 $z = $x + $y; // union of $x and $y
 var_dump($z);
 var_dump($x == $y);
 var_dump($x === $y);
 var_dump($x != $y);
 var_dump($x <> $y);
 var_dump($x !== $y);
?>

PHP Basic – Lez.5 < Costanti >

Le costanti sono come le variabili eccetto che una volta che sono definite non possono essere cambiate.

Una costante è un identificatore (nome) per un semplce valore. Il valore non può cambiare durante l’esecuzione dello script.

Un nome di costante per essere valido deve cominciare con una lettera o underscore (nessun segno $ prima del nome della costante).

Nota: Diversamente dalle variabili, le costanti sono automaticamente impostate come globali per l’intero script.

Per settare una costante, usare la funzione define() – essa prevede tre parametri:

  1. Nome della costante
  2. Valore della costante
  3. Valore true o false che indica rispettivamente se il nome della costante dev’essere case-insensitive (di default è false)

Esempio 1

<?php
 define("GREETING", "Welcome to W3Schools.com!");
 echo GREETING;
?>

Esempio 2

<?php
 define("GREETING", "Welcome to W3Schools.com!", true);
 echo greeting;
?>

PHP Basic – Lez.4 < PHP Data Types >

In PHP abbiamo i seguenti tipi di dato:

  • String (stringhe)
  • Integer (numeri interi)
  • Floating point numbers (numeri decimali)
  • Boolean (booleani)
  • Array
  • Object (Oggetti)
  • NULL

La funzione PHP var_dump() restituisce il data type e il valore delle variabili

PHP Integers

Un intero è un numero senza decimali.

Regole per gli interi:

  • Devono avere almeno una cifra (0-9)
  • Non possono contenere virgole e spazi e il punto decimale
  • Possono essere positivi o negativi
  • Possono essere specificati in tre formati: decimal (10-based), hexadecimal (16-based – viene anteposto 0x) o octal (8-based – viene anteposto 0)

Esempio

<?php
 $x = 5985;
 var_dump($x);
 echo "<br>";
 $x = -345; // negative number
 var_dump($x);
 echo "<br>";
 $x = 0x8C; // hexadecimal number
 var_dump($x);
 echo "<br>";
 $x = 047; // octal number
 var_dump($x);
?>

PHP Booleans

Booleans possono assumere valore TRUE o FALSE.

Esempio

<?php
 $x=true;
 $y=false;
?>

PHP Arrays

Un array memorizza valori multipli in una singola variabile.

Esempio

<?php
 $cars=array("Volvo","BMW","Toyota");
 var_dump($cars);
?>

PHP Objects

Un oggetto è un tipo di dato che fornisce dati e informazioni su come processare quei dati.

In PHP, un oggetto dev’essere dichiarato esplicitamente.

Prima si dichiara una classe di oggetti. Per questo, si usa la keyword “class”. Una classe è una struttura che può contenere proprietà e metodi.

Successivamente si definisce il tipo di dato nella classe dell’oggetto, fatto questo si può istanziare l’oggetto.

Esempio

<?php
 class Car
 {
  var $color;
  function Car($color="green")
  {
   $this->color = $color;
  }
  function what_color()
  {
   return $this->color;
  }
 }
?>

Valore NULL

Il valore speciale NULL indica una variabile senza valore. NULL è il solo possibile valore del tipo di dato NULL.

Il valore NULL riconosce se una variabile è vuota o no. Utile per distinguere tra stringhe vuote e valori nulli di un database.

Una variabile può essere svuotata settando il valore come NULL.

Esempio

<?php
 $x="Hello world!";
 $x=null;
 var_dump($x);
?>

PHP Basic – Lez.3.1 < PHP Variables Scope >

In PHP, le variabili possono essere dichiarate in qualsiasi parte nello script.

La portata di una variabile (scope) è la parte dello script dove la variabile può essere referenziata/usata.

PHP ha tre differenti “variable scopes”:

  • local (locale)
  • global (globale)
  • static (statico)

Local e Global Scope

Una variabile dichiarata fuori una funzione ha un GLOBAL SCOPE e può essere utilizzata solo fuori dalle funzioni.

Una variabile dichiarata all’interno di una funzione ha un LOCAL SCOPE e può essere utilizzata solo all’interno di quella funzione.

Esempio

<?php
 $x = 5;
 function local() {
  $x = 10;
  return $x;
 }
 echo "Variabile globale : $x <br />"; // Output 5
 echo 'Variabile locale : ' . local1() . '<br /><br />'; // Output 10
?>

La keyword “global”

La keyword “global” è usata per accedere ad una variabile globale all’interno di una funzione.

Per fare questo, basta usare tae keyword prima della variabile (dentro la funzione).

Esempio

<?php
 $x = 5;
 function local() {
  global $x;
  $x = 10;
  return $x;
 }
 local();
 echo "Variabile globale modificata da funzione : $x"; //Output 10
?>

La keyword “static”

Normalmente, quando una funzione è completata/eseguita, tutte le sue variabili sono cancellate. Tuttavia, qualche volta potremmo volere che una variabile locale non sia eliminata perchè necessaria per future operazioni.

Per fare questo, basta usare la keyword “static” nel momento in cui si dichiara la variabile.

Esempio

<?php
 
 function myTest()
 {
  static $x=0;
  echo $x;
  $x++;
 }
 
 myTest();
 myTest();
 myTest();
 
?>

Nell’esempio ogni volta che la funzione viene chiamata, la variabile statica conterrà come valore iniziale l’ultima informazione assegnata o elaborata nella chiamata precedente.