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

Seitentyp Dashboard Teil 8 (CMS)

Heute machen wir mal was neues im CMS -> Kleiner Scherz, es geht mal wieder ums Dashboard. Und zwar werden wir heute die Widgets speichern. Im nächsten Artikel müssen wir noch einen Bug darin beheben und dann sind wir mit dem Seitentyp Dashboard erst mal durch 😉

Als erstes bekommt die Klasse /system/classes/widgetbase.phpdie Methode save, welches das Widget in die cms_dashbaords einträgt:

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 (id, col, row, path) VALUES ('".$dashboard."','".$column."','".$row."','".$path."')");
}

Dann gibt es noch die neue Funktion Delete der Klasse /system/classes/dashboard.php:

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

Zu guter letzt wurde die Methode getEditableCode der gleichen Klasse bearbeitet. Hier wird nun nachgesehen, ob der Post-Parameter Save verfügbar ist und dann wird das ganze gespeichert. Die ganze Funktionalität hat noch einen Bug, den ich noch beheben muss. Außerdem muss noch ein bisschen aufgeräumt werden:

<?PHP
  classDashboard extends Editor{
    public $id = 1;
    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(){
      $this->loadAllWidgets();
    }

    private function loadAllWidgets(){
      $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);
      $rows = $GLOBALS['db']->ReadRows("SELECT path FROM {'dbprefix'}dashboards 
WHERE col = '".$columnId."' AND id = '".$this->id."'
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(0);
      $this->displayColumn(1);
      $this->displayColumn(2);
      ?>
        <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();
        $widgets =WidgetController::getAllWidgets();
        foreach($widgets 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->id,0,$parts[1]);
            }
            else if($parts[0] == "COLUMN1WIDGETS"){
              $widget->save($this->id,1,$parts[1]);
            }
            else if($parts[0] == "COLUMN2WIDGETS"){
              $widget->save($this->id,2,$parts[1]);
            }
            else if($parts[0] == "COLUMN3WIDGETS"){
              $widget->save($this->id,3,$parts[1]);
            }
          }
        }
        $this->loadAllWidgets();
      }
      $widgets =WidgetController::getAllWidgets();
      foreach($widgets 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++;
      }
      $widgets = $this->getHiddenWidgets();
      $i = 0;
      if($hiddenwidgets){
        foreach($widgets as $widget){
          if(!$this->cols[0] || !in_array($widget,$this->cols[0])){
            $index = $template->add_loop_item("HIDDENWIDGETS");
            $this->addWidgetToEditable($template,"HIDDENWIDGETS",$widget,$index,$i);
            $i++;
          }
        }
      }
      $i = 0;
      if($widgets){
        foreach($widgets as $widget){
          $addItem = !$this->usedwidgets;
          if(!$addItem) $addItem = !in_array($widget->path,$this->usedwidgets);
          if($addItem){
            $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; ?>" 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 id = '".$GLOBALS['db']->EscapeString($this->id)."' AND col = '0'");
      if($widgets){
        foreach($widgets as $widget){
          echo "<pre>";
          print_r($widget);
          echo "</pre>";
          $res[] =WidgetController::getWidget($widget);
        }
      }
      return $res;
    }

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

Kommentare

Daniel schrieb am 10.06.2010:

Bin wieder zurück von der Dienstreise. Da habe ich aber ganze 4 Teile noch nicht gemacht. Ich habe mir die gestrige Version geladen und bekomme innerhalb des Adminmenüs haufenweise Fehlermeldungen (getHeader usw).

Stefan Wienströer schrieb am 11.06.2010:

Subversion zickt zur Zeit ein bisschen rum, im nächsten Beitrag ist der Seitentyp Dashboard (zumindest das bearbeiten) soweit fertig. Dann gibts nen neuen Einstiegspunkt.