/** * Save widget * * @param $sidebar * @param integer $ordering * @param integer $id * @param mixed $newInstance * @param string $themeName * @return bool */ public final function save($sidebar, $ordering = null, $id = null, $newInstance = null, $themeName = null) { $ordering = intval($ordering); if ($this->validation) { if (!$themeName) { /** * @var CoreTemplates $CoreTemplates */ $CoreTemplates = CoreTemplates::findFirst("location = 'frontend' AND published = 1"); $themeName = $CoreTemplates->base_name; } /** * @var CoreWidgetValues $CoreWidgetValues */ if ((int) $id) { $CoreWidgetValues = CoreWidgetValues::findFirst($id); } else { $CoreWidgetValues = new CoreWidgetValues(); } $CoreWidgetValues->reOder('sidebar_base_name = ?0', [0 => $sidebar]); $queryUp = "UPDATE core_widget_values SET ordering = ordering + 1 WHERE ordering >= {$ordering} AND theme_name = '{$themeName}' AND sidebar_base_name = '{$sidebar}'"; $queryDown = "UPDATE core_widget_values SET ordering = ordering - 1 WHERE ordering < {$ordering} AND theme_name = '{$themeName}' AND sidebar_base_name = '{$sidebar}'"; $this->db->execute($queryDown); $this->db->execute($queryUp); $CoreWidgetValues->sidebar_base_name = $sidebar; $CoreWidgetValues->theme_name = $themeName; $CoreWidgetValues->class_name = $this->_widget_name . '_Widget'; $CoreWidgetValues->options = $this->_processOptions($id, $newInstance); $CoreWidgetValues->published = 1; $CoreWidgetValues->ordering = $ordering; $CoreWidgetValues->title = $this->_title; if ($CoreWidgetValues->save()) { //Do something } else { //Do something } $this->_id = $CoreWidgetValues->widget_value_id; $CoreWidgetValues->reOder('sidebar_base_name = ?0', [0 => $sidebar]); return true; } return false; }
/** * Update widget order * * @return PResponse * @throws Exception */ public function updateWidgetOrderAction() { $response = new PResponse(); $content = ''; $response->setHeader("Content-Type", "application/json"); if ($this->request->isAjax()) { $widget_id = $this->request->getPost('widget_id', 'int'); $newIndex = $this->request->getPost('index', 'int'); $sidebar = str_replace(' ', '', $this->request->getPost('sidebar_name', ['string', 'striptags'])); if ($widget_id && $newIndex && $sidebar) { /** * @var CoreWidgetValues $widget */ $widget = CoreWidgetValues::findFirst($widget_id); /** * @var CoreSidebars $CoreSidebars */ $CoreSidebars = CoreSidebars::findFirst(['conditions' => 'sidebar_base_name = ?1', 'bind' => [1 => $sidebar]]); if ($widget && $CoreSidebars) { /** * @var CoreTemplates $defaultFrontendTemplate */ $defaultFrontendTemplate = CoreTemplates::findFirst("location = 'frontend' AND published = 1"); $themeName = $defaultFrontendTemplate->base_name; $widget->reOder('sidebar_base_name = ?1', [1 => $CoreSidebars->sidebar_base_name]); $widget->reOder('sidebar_base_name = ?1', [1 => $widget->sidebar_base_name]); if ($widget->ordering > $newIndex) { $queryUp = "UPDATE core_widget_values SET ordering = ordering + 1 WHERE ordering >= {$newIndex} AND theme_name = '{$themeName}' AND sidebar_base_name = '{$sidebar}'"; $queryDown = "UPDATE core_widget_values SET ordering = ordering - 1 WHERE ordering < {$newIndex} AND theme_name = '{$themeName}' AND sidebar_base_name = '{$sidebar}'"; } elseif ($widget->ordering < $newIndex) { $queryUp = "UPDATE core_widget_values SET ordering = ordering + 1 WHERE ordering > {$newIndex} AND theme_name = '{$themeName}' AND sidebar_base_name = '{$sidebar}'"; $queryDown = "UPDATE core_widget_values SET ordering = ordering - 1 WHERE ordering <= {$newIndex} AND theme_name = '{$themeName}' AND sidebar_base_name = '{$sidebar}'"; } if (isset($queryUp) && isset($queryDown)) { $this->db->execute($queryUp); $this->db->execute($queryDown); } $widget->ordering = $newIndex; $widget->sidebar_base_name = $CoreSidebars->sidebar_base_name; if ($widget->save()) { $content = '1'; $widget->reOder('sidebar_base_name = ?1', [1 => $sidebar]); $widget->reOder('sidebar_base_name = ?1', [1 => $CoreSidebars->sidebar_base_name]); } else { //Do something } } } } $response->setJsonContent($content); return $response; }