blocchi configurabili o "intelligenti"

17 views
Skip to first unread message

John D'Orazio

unread,
Feb 7, 2011, 4:58:42 AM2/7/11
to fla...@googlegroups.com
Altra idea che si potrebbe implementare è "blocchi configurabili". Ho cominciato a sperimentare con buona riuscita nel mio temo open-social. Ecco un esempio di come ho fatto:

1. Nella cartella blocks/dx (per fare un esempio), per ogni blocco che vorrei diventi configurabile creo una cartella apposita con lo stesso nome del blocco. Per esempio, ho blocks/dx/01_NewsTitles.php, allora creo cartella blocks/dx/NewsTitles. Al interno di questa cartella creo un file config.php con le opzioni di configurazione.

2. All'inizio del codice del blocco 01_NewsTitles.php inserisco il codice: 
require_once("NewsTitles/config.php");
e in questo modo ho a disposizione le variabili di configurazione per il blocco, che posso usare per adattare alcuni aspetti del blocco.

3. Nel file theme.php dove definisco le funzioni di creazione dei blocchi, modifico così la funzione "create_blocks()" (in rosso le righe aggiunte / modificate):
function create_blocks($edge)
{
global $_FN;
$handle = opendir ( 'blocks/' . $edge );
$modlist = array ();
while ( false !== ($file = readdir ( $handle )) )
{
if (! is_dir ( "blocks/$edge/$file" ) and ! preg_match ( "/^\\./s", $file ) and ! stristr ( $file, "none_" ) and ! stristr ( $file, ".xml" ) and ! preg_match ( "/~$/s", $file ))
{
array_push ( $modlist, $file );
}
}
closedir ( $handle );
fn_natsort ( $modlist );
foreach ( $modlist as $kk => $mod )
{
$ext = get_file_extension ( $mod );
$tmp = preg_replace ( '/\.' . $ext . '$/s', '', $mod );
$tmp = preg_replace ( "/^[0-9]+_|^none_/i", "", $tmp );
$title = str_replace ( "_", " ", $tmp );
$filelang = "blocks/$edge/" . preg_replace ( "/^[0-9]+_|^none_/si", "", $mod ) . ".xml";
$cfgfile = "blocks/$edge/" . $tmp . "/config.php";
if (file_exists ( $filelang ))
{
$title = getLang ( $filelang, $title );
}
if(ob_start()){
fn_include ( "blocks/$edge/$mod" );
$string = ob_get_contents ();
ob_end_clean ();
      }
// se il blocco e' vuoto esco
if ($string != "")
{
OpenBlock ( "{$_FN['siteurl']}images/block.png", $title, $cfgfile );
echo "$string";
//ripristino mod nel caso venga cambiato dal blocco
$mod = $modlist[$kk];
//dprint_r($mod);
if (isadmin () && $_FN['fneditmode'] != 0)
echo "<br /><span class=\"flatnukeadmin\"><a href=\"index.php?opindex=modcont&amp;file=blocks/$edge/$mod&amp;from={$_FN['vmod']}\">" . _MODIFICA . "</a></span>";
CloseBlock ();
}
}
}
In questo modo per ogni blocco che ha un file di configurazione, ci saranno anche opzioni di configurazione nella modalità modifica ON.

4. Poi scrivo così la funzione "OpenBlock()" (ci sono anche elementi specifici del tema in questo esempio, per esempio le classi css):
function OpenBlock($img, $title, $cfgfile="")
{
  echo "<div class=\"ui-widget ui-widget-content ui-corner-all ui-helper-clearfix flatnux-block\">";
$cfgbtn = "";
  if( file_exists($cfgfile) && isadmin() ){ $cfgbtn = "<span class=\"ui-icon ui-icon-wrench flatnux-block-cfg\" onclick=\"opencfg('$cfgfile','$title')\"></span>"; }
  echo "<div class=\"ui-widget-header ui-corner-all flatnux-block-header\"><span class=\"ui-icon ui-icon-minusthick collapsable\"></span>{$cfgbtn}<img src=\"$img\" alt=\"$title\" />&nbsp;$title</div>";
echo "<div class=\"flatnux-block-content\">";
}
Così si crea nel titolo del blocco un'icona di configurazione del blocco, quando cliccato viene chiamata la funzione javascript "opencfg()".

5. E infine tra le mie funzioni javascript ho la funzione "opencfg()", che utilizza ajax, l'ho scritta utilizzando jquery e la utilizzo anche per la configurazione del tema:
/* OPEN CONFIGURATION FILES IN A JQUERY-UI DIALOG */
function opencfg(cfgfile,cfgtitle){
  if($.jPicker===undefined){
    var jpck_css = document.createElement('link'),
        jpck = document.createElement('script'),
        headel = document.getElementsByTagName('head')[0];     
    jpck_css.rel = 'stylesheet';
    jpck_css.type = 'text/css';
    jpck_css.href = 'themes/glorioso/css/jPicker.css';
    headel.appendChild(jpck_css);
    jpck_css.href = 'themes/glorioso/css/jPicker-1.1.5.min.css';
    headel.appendChild(jpck_css);
    jpck.type = 'text/javascript';
    jpck.src = 'themes/glorioso/javascripts/jpicker-1.1.5.min.js';
    headel.appendChild(jpck);
  }
  $.get("themes/glorioso/ajax/flopt.php",{opindex:"true",file:cfgfile},function(data){
     $("div#theme_edit_dialog").html(data).dialog({
modal: true,
autoOpen: true,
show: {effect:'explode',speed:1000},
hide: {effect:'explode',speed:1000},
      width:'98%',
      title:'Configurazione ' + cfgtitle,
      position:[5,5]
      });
     $("input.cfg_colorpicker").jPicker({images:{clientPath:'themes/glorioso/images/jPicker/'},color:{alphaSupport:true}}).attr("size","8"); 
  });
}

Questa funzione di configurazione dà anche la possibilità di avere un colorpicker, se tra le opzioni di configurazione c'è anche quella di scegliere colori... Ho attivato questa funzione anche per la configurazione del tema, se qualcuno vuole personalizzare i colori avrà per i campi "colore" un colorpicker.

Utilizza una chiamata ajax per aprire il contenuto del file di configurazione in un dialogo (in questo caso, creato con jquery-ui), utilizzando le stesse funzioni di flatnux per la configurazione dei temi o delle sezioni (infatti quando "opindex" è "true" flopt.php attiva la modalità configurazione).

John D'Orazio

unread,
Feb 7, 2011, 1:45:23 PM2/7/11
to fla...@googlegroups.com
Da notare anche che per poter realizzare le chiamate ajax, ho creato un file "flopt.php" che contiene il codice della funzione "flopt()" (che si trova in index.php). Ho anche ri-definito la funzione "editconffile()" per offrire qualche opzione in più nella schermata di configurazione. Ecco il mio codice in flopt.php (trovandosi, nel mio caso, nella cartella "themes/glorioso/ajax", sono costretto a fare tre volte chdir(".."), in altri casi sarà diverso):

<?php
global $_FN,$_FB;
chdir("..");
chdir("..");
chdir("..");
include_once("include/flatnux.php");
if(isset($_POST['vmod'])){ $_FN['vmod'] = $_POST['vmod']; }

$opindex = getparam("opindex",PAR_GET,SAN_FLAT);
if ( $_FN['mod'] == "modcont" )
$opindex = "modcont";
if ( $opindex )
{
$filetomodify = getparam("file",PAR_GET,SAN_FLAT);
if ( $filetomodify != "" && can_modify_file($_FN['user'],$filetomodify) )
{
if ( fn_erg('config.php$',$filetomodify) )
gl_editconffile($filetomodify);
else
edit_content($filetomodify);
}
}
else
{
$sectionborders = true;
if ( $_FN['show_welcome_message'] !== 0 && $_FN['vmod'] == $_FN['home_section'] )
if (  !isset($_GET['op']) &&  !isset($_GET['opindex']) )
{
$sectionborders = false; //non visualizzo footer sezione e bordi
showmotd();
}
if ( $_FN['vmod'] != "" ) //se esiste la sezione di default
{
if ( ($_FN['show_welcome_message'] === 0) )
$sectionborders = true;
view_section($_FN['vmod'],$sectionborders);
}
ShowAdminOptions();
}

/**
 * Estrae i file di configurazione e li stampa a video per la modifica.
 *
 * Esempio formattazione:
 * #[it]Titolo in italiano {opzione1=1,opzione2=2}
 * #[en]Title 2 in english 
 * $nomevariabile // {string}
 * #[it]Titolo 2 in italiano 
 * #[en]Title 2 in english 
 * $nomevariabile2 // {color}
 *
 * @param   string  $file      nome del file
 */
/**
 * Edit config file
 * 
 * Sample:
 * #[it]Titolo in italiano {opzione1=1,opzione2=2}
 * #[en]Title 2 in english 
 * $nomevariabile // {string}
 * #[it]Titolo 2 in italiano 
 * #[en]Title 2 in english 
 * $nomevariabile2 // {color}
 * 
 * 
 * @param string $file
 * @param string $from
 */
function gl_editconffile($file, $from = false)
{
global $_FN;
$lang = $_FN['lang'];
if (  !file_exists($file) ) // controllo che il file esista prima di fare qualsiasi operazione
return;
if ( $from == false )
{
$from = isset($_GET['from']) ? $_GET['from'] : getparam("HTTP_REFERER",PAR_SERVER,SAN_FLAT);
if ( $from == "" )
$from = "index.php";
}
echo "
<!-- lista dei campi da modificare in textfields -->
<form action=\"verify.php\" method=\"post\"><input type=\"hidden\" name=\"mod\"
value=\"modconfig\" /> <input type=\"hidden\" name=\"conf_file\"
value=\"$file\"> <!-- nome file di configurazione da modificare --> <input
type=\"hidden\" name=\"from\" value=\"$from\" />
<table border=\"0\" cellpadding=\"1\" cellspacing=\"0\">
<tbody>
";
$ffile = $file;
$fg = file($file);
$j = 0;
// scansione file alla ricerca delle variabili
for ( $i = 0;$i < count($fg);$i++  )
{
if ( preg_match('/^\$./s',$fg[$i]) && strpos($fg[$i],"Array();")===false ) // prende solo le righe che iniziano col carattere "$" e che non sia una variabile dichiarata come array
{
$line_tmp1 = explode("=",$fg[$i]); // get variable and it's value
unset($line_tmp1[0]);
$line_tmp1 = implode("=",$line_tmp1);
$varvalue = "";
eval('$varvalue=' . $line_tmp1);
$line_tmp = explode(";",$fg[$i]); // cancella eventuali commenti a dx della variabile
$type = "";
$onchange = "";
$class = "";
//ricavo il tipo di campo -->
if ( isset($line_tmp[1]) )
preg_match('/[\{].+[\}]/i',$line_tmp[1],$type);
if ( isset($type[0]) )
$type = trim($type[0]);
else
$type = "";
switch ( $type )
{
 case "{color}":
    $class = "cfg_colorpicker";
           break;
        case "{slider}":
            $class = "cfg_slider";
            break;
        case "{image}":
            $class = "cfg_image";
            $onchange = "onchange=\"$(this).next('img').attr( 'src', this.value )\""; 
      }
//ricavo il tipo di campo <--
$line = explode("=",$line_tmp[0]); // separa variabile e valorizzazione
$title = "";
$options = false;
// cerca il titolo tradotto, se non esiste usa il primo oppure il nome della variabile 
$find = 1;
$exists = false;
while (preg_match('/^#./s',$fg[$i - $find]) &&  !($exists = preg_match('/^#\[' . $lang . '\]./s',$fg[$i - $find])))
{
$find++ ;
}
if ( !$exists )
$find = 1;
if ( preg_match('/^#./s',$fg[$i - $find]) )
{
$title = preg_replace('/^#/s',"",$fg[$i - $find]);
$t = "";
preg_match('/[\{].+[\}]/i',$title,$t);
if ( isset($t[0]) )
{
$options = explode(',',str_replace("{","",str_replace("}","",$t[0])));
}
}
if ( preg_match('/^\\/\\/./s',$fg[$i - 1]) )
{
$title = preg_replace('/^\\/\\//s',"",$fg[$i - 1]);
}
$title = preg_replace('/\{.+\}/s','',$title);
$title = preg_replace('/\[' . $lang . ']/s','',$title);
$title = htmlentities(trim($title));
$varname = htmlentities(ucfirst(str_replace("_"," ",trim(preg_replace('/^\$/s','',$line[0])))));
if ( $title == "" )
$title = $varname;
echo "<tr><td style=\"border-bottom:1px dotted #dadada;text-align:left;\">";
echo "\n<i>$title:</i><input type=\"hidden\" name=\"conf_field$j\" value=\"{$line[0]}\" />";
echo "</td><td style=\"border-bottom:1px dotted #dadada;text-align:left;\">";
if (  !$options )
{
        echo ( $class == "cfg_image" ) ? "<textarea title=\"$varname\" $onchange class=\"$class\" name=\"conf_value$j\" id=\"conf_value$j\" cols=\"30\">" . htmlentities($varvalue) . "</textarea><img height=32 style='border:inset 1px White;padding:2px;margin-left:10px;' src='".$varvalue."' alt='no image' /><button type='button' onclick=\"window.open('glorioso_filemanager.php?opener=conf_value$j&filemanager_editor=yup&onchange=1&dir=themes/glorioso/images/','filemanager','toolbar=1,location=1,directories=0,status=0 ,menubar=0,scrollbars=1,resizable=1,width=640,height=480');\">Scegli altro file</button>" : "<input title=\"$varname\" $onchange class=\"$class\" type=\"text\" name=\"conf_value$j\" size=\"50\" maxlength=\"1200\" value=\"" . htmlentities($varvalue) . "\" />"; 
      }
else
{
//---------checkbox----------------------->
if ( $options[0][0] == "+" )
{
}
//---------checkbox-----------------------<
else
{
$onchange = "";
$divid = "conf_$i";
echo "<select name=\"conf_value$j\"  >";
foreach ( $options as $val )
{
$valdesc = trim($val);
if ( preg_match("/=/s",$valdesc) )
{
$t = explode("=",$valdesc);
$val = trim($t[0]);
$valdesc = trim($t[1]);
$s = ($val == trim($line[1],"\" ")) ? "selected=\"selected\"" : "";
echo "<option $s value=\"$val\">$valdesc</option>";
}
}
echo "</select>";
}
}
$v = trim($line[1],"\" ");
?>
<input type="hidden" name="conf_value_old<?php
echo $j?>"
value="<?php
echo htmlentities($varvalue)?>" />
</td>
</tr>
<?php
$j++ ;
}
}
?>
<tr>
<td colspan="2"><input type="button" class="button" name="prev"
onclick='window.location=("<?php
echo $from?>")'
value="<?php
echo fn_i18n("_CANCEL")?>" />
<?php
if ( is_writable($ffile) )
{
?>
<input type="submit" class="submit" name="save"
value="<?php
echo fn_i18n("_SAVE")?>" />
<?php
}
else
{
echo fn_i18n("_READONLY");
}
?>
</td>
  </tr>
</tbody>
</table>
<br />
<input type="hidden" name="conf_num" value="<?php
echo $j?>">
<!-- numero di campi totali da modificare -->
</form>
<?php

}


?>
Reply all
Reply to author
Forward
0 new messages