Comunidad de diseño web y desarrollo en internet online

YAP CMS (yet another personal content management system)

Citar            
MensajeEscrito el 24 Mar 2011 10:08 pm
Primero estableceré cuales son mis parámetros de diseño para un CMS de uso personal extendible (es decir que tal vez le sirvan a otras personas):
1) estructura de grafo, o en su defecto, de árbol. No es para un blog cronológico sino que el contenido se relaciona internamente como un arbol jerarquizado de relaciones.
2) soporte multilenguaje y, preferiblemente, multiformato (p. ej. pueda mostrarse como html, texto plano, o PDF)
3) facilidad del administrador de editar contenidos en línea.
4) principios de SEO
5) extendible con plantillas.
6) extendible con plugins.
7) facilidades para interactuar (básicamente enviar comentarios).
8) integración con acortador personalizado.

Supongo que en gran medida estaré reinventando la rueda pero, por el momento, ni los CMS que he visto se adaptan a lo que quiero, pero, principalmente, porque es un ejercicio académico.

Comparto, por ahora, el código básico de lo que tengo:

Código PHP :

<?php
# a couple of global variables:
$sitename = "My Site";
$shortsite = "sho.rt";

# mod_rewrite should give any of the following 
#   name   short and unique name for the content (note that multilanguage content might have different or same name for each language)
#   lang   indicated language.  If missing, deduce by `name`, user prefered language, site prefered language (in that order) 
#   seo      SEO name for the content - not really important for locate the content.
#   type   content type, i.e. txt, html, odf, pdf

include 'lib/db.php';
include 'lib/langs.php';
$db = new database('localhost','root','','mydb');

$name = mysql_real_escape_string(mb_strtolower($_GET['name']));
$lang = mysql_real_escape_string(mb_strtolower($_GET['lang']));
$seo  = mysql_real_escape_string(mb_strtolower($_GET['seo']));
$type = mysql_real_escape_string(mb_strtolower($_GET['type']));
if(!$type) $type="html";
$action = mb_strtolower($_GET['action']);

# PROCEDURE
# Locate `name`
$tdi = $db->query("SELECT * FROM `nameid` WHERE `name`='$name'")
   or die("404 - documento inexistente $name");
   
# Locate `docid`
$docid = $tdi[0]['docid'];
$dlang = $tdi[0]['deflang'];
$tsc = $db->query("SELECT * FROM `idname` WHERE `docid`='$docid'",'lang')
   or die("500 - database mismatch");

# Get requested language or, otherwise, guess best existing language
if (!$lang) $lang=$dlang ? $dlang : 'en';
if (array_key_exists($lang,$tsc)) {
   $tnod = $tsc[$lang];
} elseif(array_key_exists('',$tsc)) {
   $tnod = $tsc[''];
} elseif(array_key_exists($dlang,$tsc)) {
   $tnod = $tsc[$dlang];
} else foreach(array('en','es','sv','xb','xc','xi','xt') as $ll) {
   if (array_key_exists($ll,$tsc)) {
      $dlang = $ll;
      $tnod = $tsc[$ll];
      break;
   }
}

$dseo = $tnod['seo'];

# Construct canonical URL
$url = $tnod['name'] ? "/".$tnod['name'] : "";
if ($lang!=$dlang)
   $url .= "/".$lang;
if ($dseo)
   $url .= "/".$tnod['seo'].".".$type;
elseif($type!='html')
   $url .= "/.".$type;
else
   $url .= "/";

# Get Requested URI to compare with Canonical URL
$ruri = $_SERVER['REQUEST_URI'];
if (($i=strpos($ruri,'?'))!==false)
   $ruri = substr($ruri,0,$i);

# Get any other GET request that should not be mangled by mod_rewrite
$urla=array();
foreach($_GET as $key=>$val)
   if (!in_array($key,array('name','lang','seo','type')))
      $urla[] = urlencode($key)."=".urlencode($val);
$urla = implode('&',$urla);

# NOW We explore some actions.
# Action commit is the result of an update
if ($action=='commit') {
   # Incoming data as POST:
   #   title   -> should go to content db
   #   name   -> should go to idname and nameid dbs after checking inconsistencies
   #   seo      -> should go to idname db
   #   content   -> should go to content db
   $newtitle = mysql_real_escape_string($_POST['title']);
   $newname  = mysql_real_escape_string(mb_strtolower($_POST['name']));
   $newseo   = mysql_real_escape_string(mb_strtolower($_POST['seo']));
   $newcont  = mysql_real_escape_string($_POST['content']);
   $db->commit("UPDATE `content` SET `title`='$newtitle', `content`='$newcont' WHERE `docid`=$docid AND `lang`='$lang';");
}
# Any action but edit should redirect to canonical URL
if ($action!='edit') {
   if ($url != $ruri) {
      if($urla) $url .= "?" . $urla;
      header( "HTTP/1.1 301 Moved Permanently" );
//      header( "HTTP/1.1 307 Temporary Redirect" );
      header( "Location: http://org.local$url" );
   }
}

# So, now we are either in a redirected page, or an edition page.

# We get the content from the content DB.
$tco = $db->query("SELECT * FROM `content` WHERE `docid`='$docid';",'lang');
$title = $tco[$lang]['title'];
$content = $tco[$lang]['content'];
$headtit = $title? $title." | $sitename" : "$sitename";

$baseurl = "http://".$_SERVER['SERVER_NAME'];
$shorturl = "http://$shortsite/".$tnod['shortest'];

?>
<!DOCTYPE html>
<html lang="<?php echo $langs[$lang]['full']?>">
<head>
   <base href="<?php echo $baseurl?>/"/>
   <meta charset="utf-8">
   <title><?php echo $headtit?></title>
   <link rel="alternate" href="<?php echo $shorturl?>"/>
   <link rel="canonical" href="<?php echo $baseurl.$url?>"/>
</head>
<body>
   <h1><?php echo $title ? $title : $sitename?></h1>
<?php if($action=='edit') { ?>
   <form method="post" action="?name=<?php echo $name?>&lang=<?php echo $lang?>&action=commit"><table>
      <tr><td>Title</td><td><input name="title" value="<?php echo $title?>"/></td></tr>
      <tr><td>URL</td><td><?php echo $baseurl?>/<input name="name" value="<?php echo $tnod['name']?>"/>/<input name="seo" value="<?php echo $tnod['seo']?>"/>.html</td></tr>
      <tr><td colspan="2"><textarea name="content"><?php echo $content ?></textarea></td></tr>
      <tr><td colspan="2"><input type="submit"/></td></tr>
   </table></form>
<?php } else { ?>
   <div><?php echo $content ?></div>
   <div><a href="/?name=<?php echo $name?>&lang=<?php echo $lang?>&action=edit">edit</a></div>
<?php } ?>
</body>
</html>

recibo cualquier crítica despiadada sobre mis ideas y sobre mi código, entendiendo que por ahora es una prueba de concepto y que sé que carece de elementos de usabilidad, seguridad, robustez, etc.

Por chlewey

7 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Mar 2011 10:35 pm
Criticar un CMS basado en este código es bastante complicado puesto que tu mismo lo dices, carece de elementos de usabilidad, seguridad, robustez etc etc etc..

Pero lo que me llama la atención es que quieres desarrollar un CMS y no veo un diseño en tu codigo, no veo funciones no veo OOP, salvo la clase database.

No estoy muy seguro si la desarrollaste ya que es el único objeto en tu código, en caso de que tu desarrollaras dicha clase, deja mucho que desear ya que solo estas utilizando 1 metodo query, para que tu CMS sea robusto, necesitas crear en este ejemplo mas metodos, como estos ejemplos....

Código PHP :

$db->select("tabla","where");
$db->insert("tabla",array("campo 1" => "valor 1", "campo 2" => "valor 2"));
$db->delete("tabla","where");


solo por poner algunos ejemplos.

El resto del código debería ser igual, objetos con métodos que hagan funciones especificas.

De otra forma no veo como lo puedes hacer extensible, con plugins, etc etc etc..

También te haría bien dar una leída de OOP, MVC antes de continuar con la programación de tu CMS, para que entonces puedas darle un buen modelado.

Saludos

Por jOina

Claber

359 de clabLevel

2 tutoriales

 

Guadalajara, Mexico

chrome
Citar            
MensajeEscrito el 24 Mar 2011 10:39 pm
haber si te sirve esta sugerencia que adopte hace un par de años
para no hacer includes para acortar un poco el codigo

Código PHP :

<?php
include 'lib/db.php'; 
include 'lib/langs.php'; 

creas una funcion que php lo detecta el famoso

Código PHP :

function __autoload($clase)
{
     $path = "lib/{$clase}.php";
     if(file_exists($path))
    {
       include $path;
    }
    else
    {
         echo 'No existe la clase '.$clase.'en el archivo'.$path;
     }
}

asi te olvidarias de hacer los includes de clases que necesites talvez solo tendrias que hacer un require o include a un archivo principal
si te interesa podrias echarle un vistaso a un tutorial que estaba haciendo pero no si se terminare el trbajao no me deja el tiempo que necesito pero bueno te dejo el link del codigo
para la descarga
http://www.megaupload.com/?d=SI3N5TGV

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Mar 2011 11:59 pm

jOina escribió:

Criticar un CMS basado en este código es bastante complicado puesto que tu mismo lo dices, carece de elementos de usabilidad, seguridad, robustez etc etc etc..

Pero lo que me llama la atención es que quieres desarrollar un CMS y no veo un diseño en tu codigo, no veo funciones no veo OOP, salvo la clase database.

(...)

jOina escribió:

También te haría bien dar una leída de OOP, MVC antes de continuar con la programación de tu CMS, para que entonces puedas darle un buen modelado.


Sí, la idea es ir encapsulando poco a poco los diferentes elementos.

Actualmente mi sitio web, chlewey.net, usa un buen grado de encapsulación (casi todo lo que se me ocurrió que podría ser un objeto es un objeto). Pero está basado en archivos XML para la base de datos y archivos incluidos para el contenido. La idea comenzó por reescribir para usar un gestor de base de datos y por ahora eso es lo que se destaca en esta prueba de código.

Por chlewey

7 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Mar 2011 09:03 pm
Para que se vea más bonito:

Código PHP :

<?php

$docroot=$_SERVER['DOCUMENT_ROOT'];
# Load personalization file
if (file_exists("$docroot/locals.php"))
   include_once "$docroot/locals.php";

# Set parameters, global variables, etc.
# mod_rewrite should give any of the following 
#   name   short and unique name for the content (note that multilanguage content might have different or same name for each language)
#   lang   indicated language.  If missing, deduce by `name`, user prefered language, site prefered language (in that order) 
#   seo      SEO name for the content - not really important for locate the content.
#   type   content type, i.e. txt, html, odf, pdf
include_once "$docroot/lib/params.php";

# Open database
include_once "$docroot/lib/db.php";
$db = new database($param->dbargs);

# Create page
include_once "$docroot/lib/page.php";
$page = new _page($db,$param);
$page->make();

?>

Por chlewey

7 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Mar 2011 10:27 pm
Checa, te recomiendo leer este tutorial.

http://anantgarg.com/2009/03/13/write-your-own-php-mvc-framework-part-1/

Saludos

Por jOina

Claber

359 de clabLevel

2 tutoriales

 

Guadalajara, Mexico

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.