0251 / 590 837 15
info@a-coding-project.de
;

Pagelist Widget (CMS)

In unserem CMS geht es heute um die Seitenauflistung im neuen Backend. Im alten Backend konnte man an der Stelle auch Ordner erstellen und bekam diese auch aufgelistet. Die Ordnerfunktionalität wird ja in Kürze vereinheitlicht, weshalb wir diese erst mal nicht benötigten.

Damit wir die Funktion nicht verlieren, bleibt sie zwar erst erhalten, wird aber in den nächsten Beiträgen entfernt. Da ContentLion sehr modular aufgebaut sein soll und derzeit auch Widgets nur aus Plugins unterstützt werden, ist die Seitenauflsistung ein eigenes Plugin. So können wir diese später auch Updaten ohne etwas am Core zu ändern.

Um das Plugin zu erstellen, müssen wir als erstes den Ordner /system/plugins/pagelistwidget anlegen. Selbstverständlich brauchen wir darin auch eine info.php, in welcher die Plugininfos gespeichert werden:

<?PHP
  $pluginInfo = new PluginInfo();
  $pluginInfo->path              = "pagelistwidget";
  $pluginInfo->name              = "PageList Widget";
  $pluginInfo->description       = "Listet die ContentLion Seiten auf";
  $pluginInfo->authorName        = "ContentLion";
  $pluginInfo->authorLink        = "http://contentlion.org";
  $pluginInfo->version           = "1.0.0";
  $this->Add($pluginInfo);
?>

Bei alle Plugins, die von ContentLion standardmäßig installiert werden, ist der Autor auch ContentLion. Das Widget selbst ist unter /system/plugins/pagelistwidget/pagelistwidget.php gespeichert. Es beiinhaltet den Code der alten Seitenauflistung. Dieser wird nun nur der Variablen content zugewiesen und außerdem wird die Überschrift gesetzt:

<?PHP
  class PageListWidget extends WidgetBase{
    public function load(){
      $this->headline = $GLOBALS['language']->getString("PAGES");
      $articlepath = getSetting("global","global","root")."content/articles/";
      $template = new Template();
      $template->load("plugin_pagelistwidget_pagelist");
      $template->assign_var("FORMURL","/admin/index.php?page=sites&dir=".urlencode($_GET['dir']));

      $dir = $_GET['dir'];

      if($_POST['newFolder']){
        FileServer::createFolder($articlepath.$dir,$_POST['name']);
      }
      if($_GET['rmdir']){
        rmdir($articlepath.$_GET['rmdir']);
        $template->assign_var("MESSAGE","Verzeichnis ".$_GET['rmdir']." wurde gel&ouml;scht!");
      }
      else{
        $template->assign_var("MESSAGE","");
      }

      $verzeichnis = openDir($articlepath.$dir);

      if($dir){
        $template->assign_var("NEWPAGELINK","<a href="/admin/index.php?page=site-new&dir=".substr($dir,1)."">Neue Seite</a>");
      }
      else{
        $template->assign_var("NEWPAGELINK"," <a href="/admin/index.php?page=site-new">Neue Seite</a>");
      }
      $pre = "";
      foreach(split("/",$dir) as $cDir){
        $index = $template->add_loop_item("PATH");
        $path .= "/".$cDir;
        if($path == "/"){
          $template->assign_loop_var("PATH", $index, "URL","/admin/index.php?page=sites");
          $template->assign_loop_var("PATH", $index, "LABEL","/");
          $path = "";
        }
        else{
          $template->assign_loop_var("PATH", $index, "URL","/admin/index.php?page=sites&dir=".$path);
          $template->assign_loop_var("PATH", $index, "LABEL",$cDir);
        }
      }
      $subFolders = FileServer::getFolders($articlepath.$dir);
      if($subFolders){
        foreach($subFolders as $folder){
          $index = $template->add_loop_item("DIRS");
          $template->assign_loop_var("DIRS",$index,"URL","/admin/index.php?page=sites&dir=".$dir."/".$folder);
          $template->assign_loop_var("DIRS",$index,"LABEL",$folder);
        }
      }
      if(trim($_GET['dir']) != "" & trim($_GET['dir']) != "/"){
        $template->assign_var("DELETEFOLDERLINK","<a href="/admin/index.php?page=sites&rmdir=".$_GET['dir']."">Ordner l&ouml;schen</a>");
      }
      else{
        $template->assign_var("DELETEFOLDERLINK","");
      }
      $pages = Page::getPagesByDir($dir);
      if(substr($dir,0,1) == "/"){
        $shortdir = substr($dir,1);
      }
      else{
        $shortdir = $dir;
      }
      if($pages){
        foreach($pages as $page){
          $shortalias = substr($page->alias,strlen($shortdir));
          if(substr($shortalias,0,1) == "/"){
            $shortalias = substr($shortalias,1);
          }
          else{
            $shortalias = $shortalias;
          }
          if(!strpos($shortalias,"/")){
            $index = $template->add_loop_item("PAGES");
            $template->assign_loop_var("PAGES",$index,"TITLE",$page->title);
            $template->assign_loop_var("PAGES",$index,"ALIAS",$shortalias);
            $template->assign_loop_var("PAGES",$index,"EDITURL","index.php?page=site-edit&site=".$page->alias);
            $template->assign_loop_var("PAGES",$index,"DELETEURL","index.php?page=site-delete&site=".$page->alias);
          }
        }
        $template->assign_var("NOPAGES","");
      }
      else{
       $template->assign_var("NOPAGES","Es sind keine Seiten vorhanden.");
      }
      $this->content = $template->getCode();
    }
  }
?>

Hier wird auch auf ein neues Template gesetzt: plugin_pagelistwidget_pagelist. Dies ist in /system/plugins/pagelistwidget/templates/pagelist.html gespeichert. Es ist mit kleinen veränderungen auch ähnlich wie das alte Template:

<table>
  <tbody>
    {LOOP:PAGES}
      <tr>
        <td>{VAR:TITLE}</td>
        <td>
          <a title="{LANG:EDIT}" href="{VAR:EDITURL}">
            <img src="{ICON:PAGE_EDIT}" />
          </a>
          <a title="{LANG:DELETE}" href="{VAR:DELETEURL}">
            <img src="{ICON:CROSS}" />
          </a>
        </td>
      </tr>
    {/LOOP:PAGES}
  </tbody>
</table>
{VAR:NOPAGES}

Jetzt wollt ihr das Widget natürlich auch sehen, oder? Dafür müssen wir 3 Datenbankänderungen machen. Zum einen müssen wir das Plugin in activated_plugins speichern, das Widget zu der widget-Tabelle hinzufügen und letztendlich das Widget zum Dashboard hinzufügen. Das geht so:

INSERT INTO `cl_activated_plugins` VALUES ('pagelistwidget');
INSERT INTO `cl_widgets` VALUES ('pagelistwidget/pagelistwidget.php', 'PageList', 'PageListWidget');
INSERT INTO `cl_dashboards` VALUES ('admin/home', 1, 1, 'pagelistwidget/pagelistwidget.php');

Das ganze muss selbstverständlich auch in den /installer/installer.php:

      mysql_query("INSERT INTO `".$this->params[3]['praefix']."dashboards` VALUES ('admin/home', 2, 1, 'lookaround/widget.php');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."dashboards` VALUES ('admin/home', 1, 1, 'pagelistwidget/pagelistwidget.php');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."widgets` VALUES ('lookaround/widget.php', 'LookAround', 'LookAround');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."widgets` VALUES ('pagelistwidget/pagelistwidget.php', 'PageList', 'PageListWidget');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (1,1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (1,2);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (1,3);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,2);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,3);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (3,1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (3,2);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (3,3);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,4);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,5);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,6);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,7);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,8);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,9);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,10);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."role_rights` VALUES (2,11);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."activated_plugins` VALUES ('lookaround');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."activated_plugins` VALUES ('pagelistwidget');");
    }

Wenn ihr das ganze jetzt ausgeführt habt, dürftet ihr auf dem Dashboard die Seiten aufgelistet bekommen. Allerdings sehen diese nicht wie gewünscht aus. Das liegt daran, dass unser Dashboard ein paar lustige CSS-Formatierungen macht, die wir noch herausnehmen müssen. Der neue Code der /admin/inettuts.css sieht so aus:

#columns a {color:white;}
#columns ul{list-style:none; border:none;}
#columns h3{margin:0; padding:0;}

/* Head section */
#head {
    background: #000 url(/admin/img/head-bg.png) repeat-x;
    height: 100px;
}
#head h1 {
    line-height: 100px;
    color: #FFF;
    text-align: center;
    background: url(/admin/img/inettuts.png) no-repeat center;
    text-indent: -9999em
}
/* End Head Section */

/* Columns section */
#columns .column {
    float: left;
    width: 32%;
    min-height: 400px;
    height: auto !important;
    height: 400px;
    padding:5px;
}

/* Column dividers (background-images) : */
#columns .widget {
    padding: 2px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    margin-bottom:5px;
    border: 1px solid #9f9f9f;
}
#columns .widget .widget-head {
    color: #000;
    overflow: hidden;
    width: 100%;
    height: 30px;
    line-height: 30px;
    border-bottom: 1px solid #9f9f9f;
    background-image: url('/system/skins/backenddefault/images/bg_miniheader.png');
}
#columns .widget .widget-head h3 {
    padding: 0 5px;
    float: left;
}
#columns .widget .widget-content {
    /*background: #333 url(/admin/img/widget-content-bg.png) repeat-x;*/
    background-color:#d4d4d4;
    padding: 0 5px;
    -moz-border-radius-bottomleft: 2px;
    -moz-border-radius-bottomright: 2px;
    -webkit-border-bottom-left-radius: 2px;
    -webkit-border-bottom-right-radius: 2px;
    line-height: 1.2em;
    overflow: hidden;
}

Jetzt soll man natürlich später mit admin/home.html?dir=/admin die Seiten das Backends aufgelistet bekommen. Leider können wir aber derzeit noch keine Parameter mit ? verarbeiten. Dies liegt am Mod-Rewrite, welches wir noch bearbeiten müssen. Und zwar werden in der /.htaccess nun die Parameter (%{QUERY_STRING}) an die Url gehängt. Das sieht dann so aus:

RewriteEngine on
RewriteRule ^(.+).html$ index.php?include=$1&%{QUERY_STRING} [L]

Das wars für heute, zu guter letzt noch ein neuer Einstiegspunkt:

http://blog.stevieswebsite.de/download/189.zip