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

Seitentyp Dashboard Teil 9 (CMS)

Heute kommen wir vorerst zum Ende beim Thema Dashboard im CMS. Im nächsten Beitrag werden Beispieldaten erstellt und dann gibt es auch einen neuen Einstiegspunkt.

Im Dashboard wollten wir noch etwas Ordnung schaffen und einen Bug beheben. Die Dashboards waren am Anfang nicht als Seitentyp definiert, dass hat sich mitlerweile geändert. Aus diesem Grund möchte ich in der Datenbank auch nicht mehr eine ID Speichern, sondern den aktuellen Alias. Also muss in der Tabelle cms_dashboards die Spalte id in alias umbenannt werden und der Typ auf varchar(255) eingestellt werden (Änderung im Installer im nächsten Beitrag).

Da wir den Alias bereits im __construct benötigen, müssen wir diesen dort per Parameter übergeben. Die erfordert eine Änderung in allen Seitentypen! Als erstes die abstrakte Klasse /system/classes/editor.php:

<?PHP
  abstract class Editor{

    private $content = null;
    public $page     = null; 

    abstract function display();
    abstract function getEditableCode();
    abstract function save($newPage,$oldPage);
    abstract function getHeader();
    abstract function __construct($page);

    function displayEditable(){
      echo $this->getEditableCode();
    }

  }
?>

In der Klasse /system/classes/page.php müssen wir das Argument auch übergeben:

  function load($data){
    if($data){
      $this->id = $data->id;
      $this->title = $data->title;
      $this->ownerid = $data->owner;
      $this->menu = $data->menu;
      $this->alias = $data->alias;
      $this->meta  = new Meta();
      $this->meta->pageid = $this->id;
      $this->meta->load();
      $this->editor = new $data->editor($this);
    }
  }

Im Seitentyp /system/classes/wysiwyg.php muss die Page-Eigenschaft nun auch im Konstrukutor gesetzt werden:

<?PHP
  class WYSIWYG extends Editor{
    function __construct($page){
      $this->page = $page;
    }

Gleiches gilt für die /system/classes/login.php:

<?PHP
  class Login extends Editor{
    function __construct($page){
      $this->page = $page;
    }

Jetzt kommen wir aber zurück zum Dashboard. In der Klasse /system/classes/widgetbase.php müssen wir bei der dashboard-Tabelle die neue alias-Spalte benutzen:

    public function save($dashboard,$column,$row){
      $dashboard = $GLOBALS['db']->EscapeString($dashboard);
      $row       = $GLOBALS['db']->EscapeString($row);
      $column    = $GLOBALS['db']->EscapeString($column);
      $path      = $GLOBALS['db']->EscapeString($this->path);
      return $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}dashboards (alias, col, row, path) VALUES ('".$dashboard."','".$column."','".$row."','".$path."')");
    }

In der Klasse /system/classes/dashboard.php wurde auch überall das id durch den alias ersetzt und die Eigenschaft id entfernt. Außerdem werden die Widgets jetzt nicht mehr zu oft ausgelesen. Der neue Code sieht so aus:

<?PHP
  class Dashboard extends Editor{
    public $cols;
    public $usedwidgets = null;

    function getHeader(){
      return "<link href="/admin/style.css" rel="stylesheet" type="text/css" />
              <link href="/admin/inettuts.css" rel="stylesheet" type="text/css" />";
    }

    function __construct($page){
      $this->page = $page;
      $this->loadAllWidgets();
    }

    private function loadAllWidgets(){
      $this->cols = null;
      $this->cols[] = $this->loadWidgetsByColumn(0);
      $this->cols[] = $this->loadWidgetsByColumn(1);
      $this->cols[] = $this->loadWidgetsByColumn(2);
      $this->cols[] = $this->loadWidgetsByColumn(3);
    }

    function loadWidgetsByColumn($columnId){
      $columnId = $GLOBALS['db']->EscapeString($columnId);
      $alias = $GLOBALS['db']->EscapeString($this->page->alias);
      $rows = $GLOBALS['db']->ReadRows("SELECT path FROM {'dbprefix'}dashboards 
                                        WHERE col = '".$columnId."' AND alias = '".$alias."'
                                           ORDER BY row");
      if($rows){
        foreach($rows as $row){
          $widgetData = WidgetController::getWidgetData($row->path);
          $widget = WidgetController::getWidget($widgetData);
          $widget->load();
          $res[] = $widget;
        }
      }

      return $res;
    }

    function display(){
      echo "<div id="columns">";
      $this->displayColumn(1);
      $this->displayColumn(2);
      $this->displayColumn(3);
      ?>
        <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"></script>
        <script type="text/javascript" src="/admin/jquery-ui-personalized-1.6rc2.min.js"></script>
        <script type="text/javascript" src="/admin/inettuts.js"></script>
      <?PHP
      echo "</div>";
    }

    public function getEditableCode(){
      $template = new Template();
      $template->load("control_dashboardedit");
      $template->assign_var("URL",$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']);
      if($_POST['save']){
        $this->delete();
        $allwidgets = WidgetController::getAllWidgets();
        foreach($allwidgets as $widget){
          if(isset($_POST[str_replace(".","_",$widget->path)])){
            $widget->load();
            $parts = split("|",$_POST[str_replace(".","_",$widget->path)]);
            if($parts[0] == "HIDDENWIDGETS"){
              $widget->save($this->page->alias,0,$parts[1]);
            }
            else if($parts[0] == "COLUMN1WIDGETS"){
              $widget->save($this->page->alias,1,$parts[1]);
            }
            else if($parts[0] == "COLUMN2WIDGETS"){
              $widget->save($this->page->alias,2,$parts[1]);
            }
            else if($parts[0] == "COLUMN3WIDGETS"){
              $widget->save($this->page->alias,3,$parts[1]);
            }
          }
        }
        $this->loadAllWidgets();
      }
      foreach($allwidgets as $widget){
        $widget->load();
      }
      $i = 0;
      $pos = 0;
      foreach($this->cols as $col){
        if($col && $i != 0){
          foreach($col as $widget){
            $index = $template->add_loop_item("COLUMN".$i."WIDGETS");
            $this->addWidgetToEditable($template,"COLUMN".$i."WIDGETS",$widget,$index,$pos);
            $pos++;
          }
        }
        $i++;
      }
      $hiddenwidgets = $this->getHiddenWidgets();
      $i = 0;
      if($hiddenwidgets){
        foreach($hiddenwidgets as $widget){
            $index = $template->add_loop_item("HIDDENWIDGETS");
            $this->addWidgetToEditable($template,"HIDDENWIDGETS",$widget,$index,$i);
            $i++;
        }
      }
      $i = 0;
      if($allwidgets){
        foreach($allwidgets as $widget){
          $addItem = !$this->usedwidgets;
          if(!$addItem) $addItem = !in_array($widget->path,$this->usedwidgets);
          if($addItem){
            $widget->load();
            $index = $template->add_loop_item("DONTUSEDWIDGETS");
            $this->addWidgetToEditable($template,"DONTUSEDWIDGETS",$widget,$index,$i);
            $i++;
          }
        }
      }
      return $template->getCode();
    }

    private function addWidgetToEditable($template,$column,$widget,$index,$position){
      $template->assign_loop_var($column,$index,"WIDGETNAME",htmlentities($widget->headline));
      $template->assign_loop_var($column,$index,"WIDGETPATH",htmlentities(str_replace(".","_",$widget->path)));
      $template->assign_loop_var($column,$index,"PLACE",$column."|".$position);
      $this->usedwidgets[] = $widget->path;
      return $template;
    }

    public function save($newPage,$oldPage){
    }

    function displayColumn($id){
      ?>
        <ul id="column<?PHP echo $id - 1; ?>" class="column">
          <?PHP
            if($this->cols[$id]){
              foreach($this->cols[$id] as $widget){
                $widget->displayType = "dashboard";
                $widget->display();
              }
            }
          ?>
        </ul>
      <?PHP
    }

    function getHiddenWidgets(){
      $widgets = $GLOBALS['db']->ReadRows("SELECT class,{'dbprefix'}dashboards.path FROM {'dbprefix'}dashboards INNER JOIN {'dbprefix'}widgets ON {'dbprefix'}dashboards.path = {'dbprefix'}widgets.path WHERE alias = '".$GLOBALS['db']->EscapeString($this->page->alias)."' AND col = '0'");
      if($widgets){
        foreach($widgets as $widget){
          $widget = WidgetController::getWidget($widget);
          $widget->load();
          $res[] = $widget;
        }
      }
      return $res;
    }

    public function delete(){
      $dashboard = $GLOBALS['db']->EscapeString($this->page->alias);
      $GLOBALS['db']->Execute("DELETE FROM {'dbprefix'}dashboards WHERE alias = '".$dashboard."'");
    }
  }
?>

Wie bereits erwähnt kümmere ich mich nun um Beispieldaten. Ich werd die ganze Installation noch einmal testen udn dann den neuen Einstiegspunkt bereitsstellen, denn da das Subversion derzeit ein paar Probleme hat, sind wahtrscheinlich einige von euch nicht mehr ganz mitgekommen.