Exemplo n.º 1
0
 protected function _addWidgets_addWidgetToWidgetsByGroup(array &$newWidget, array &$widgets, $groupPrefix = '')
 {
     $group = '';
     if (!empty($newWidget['tab_group'])) {
         $group = $newWidget['tab_group'];
         foreach ($widgets as &$widgetRef) {
             if (empty($widgetRef['name']) or !isset($widgetRef['widgets'])) {
                 // not a group
                 continue;
             }
             if ($group === $widgetRef['name']) {
                 $widgetRef['widgets'][$newWidget['widget_id']] =& $newWidget;
                 return true;
             } elseif (strpos($group, $widgetRef['name']) === 0) {
                 $added = $this->_addWidgets_addWidgetToWidgetsByGroup($newWidget, $widgetRef['widgets'], $widgetRef['name']);
                 if ($added) {
                     return true;
                 }
             }
         }
     }
     $preparedWidget = array('widgets' => array(), 'widget_id' => $newWidget['widget_id'], 'position' => $newWidget['position'], 'widget_page_id' => $newWidget['widget_page_id'], 'tab_group' => $newWidget['tab_group'], 'display_order' => $newWidget['display_order']);
     $groupWithoutPrefix = substr($group, strlen($groupPrefix));
     $groupWithoutPrefix = trim($groupWithoutPrefix, '/');
     if (empty($groupWithoutPrefix)) {
         $preparedWidget['name'] = $newWidget['tab_group'];
         $preparedWidget['widgets'][$newWidget['widget_id']] = $newWidget;
     } else {
         $groupPrefixParts = WidgetFramework_Helper_LayoutEditor::splitGroupParts($groupPrefix);
         $groupWithoutPrefixParts = WidgetFramework_Helper_LayoutEditor::splitGroupParts($groupWithoutPrefix);
         $groupPrefixParts[] = array_shift($groupWithoutPrefixParts);
         $groupPrefixAppended = implode('/', $groupPrefixParts);
         $preparedWidget['name'] = $groupPrefixAppended;
         $preparedWidget['tab_group'] = $groupPrefixAppended;
     }
     $nameParts = WidgetFramework_Helper_LayoutEditor::splitGroupParts($preparedWidget['name']);
     $nameLastPart = array_pop($nameParts);
     $preparedWidget['isColumns'] = strpos($nameLastPart, 'column') === 0;
     $preparedWidget['isRows'] = strpos($nameLastPart, 'row') === 0;
     $preparedWidget['isRandom'] = strpos($nameLastPart, 'random') === 0;
     $preparedWidget['isTabs'] = !$preparedWidget['isColumns'] && !$preparedWidget['isRows'] && !$preparedWidget['isRandom'];
     $widgets[$newWidget['widget_id']] = $preparedWidget;
     if (!empty($preparedWidget['widgets'])) {
         return true;
     } else {
         return $this->_addWidgets_addWidgetToWidgetsByGroup($newWidget, $widgets, $groupPrefix);
     }
 }
Exemplo n.º 2
0
 public function actionSavePosition()
 {
     $this->_assertPostOnly();
     $changedRenderedId = array();
     $widgetId = $this->_input->filterSingle('widget_id', XenForo_Input::UINT);
     $widget = $this->_getWidgetOrError($widgetId);
     $globalWidgets = $this->_getWidgetModel()->getGlobalWidgets(false, false);
     $core = WidgetFramework_Core::getInstance();
     $core->addWidgets($globalWidgets);
     $positionWidgetId = $this->_input->filterSingle('position_widget', XenForo_Input::UINT);
     $positionWidget = null;
     if (!empty($positionWidgetId)) {
         $positionWidget = $this->_getWidgetOrError($positionWidgetId);
     }
     $widgetPageId = $this->_input->filterSingle('widget_page_id', XenForo_Input::UINT);
     if (!empty($widgetPageId)) {
         $widgetPage = $this->_getWidgetPageOrError($widgetPageId);
         $widgetPageWidgets = $this->_getWidgetModel()->getWidgetPageWidgets($widgetPage['node_id'], false);
         $core->addWidgets($widgetPageWidgets);
     }
     $dwInput = $this->_input->filter(array('position' => XenForo_Input::STRING, 'group' => XenForo_Input::STRING, 'display_order' => XenForo_Input::STRING, 'relative_display_order' => XenForo_Input::STRING, 'widget_page_id' => XenForo_Input::UINT, 'move_group' => XenForo_Input::STRING));
     $dwInputGroup = $dwInput['group'];
     /** @var WidgetFramework_DataWriter_Widget $dw */
     $dw = XenForo_DataWriter::create('WidgetFramework_DataWriter_Widget');
     $dw->setExistingData($widget, true);
     $widgetsNeedUpdate = array();
     $newGroupParts = WidgetFramework_Helper_LayoutEditor::splitGroupParts($dwInput['group']);
     if (!empty($positionWidget)) {
         if ($positionWidget['widget_id'] != $widget['widget_id']) {
             if (empty($dwInput['group'])) {
                 $newGroupParts[] = 'group-' . XenForo_Application::$time;
             }
             if (empty($positionWidget['options']['tab_group'])) {
                 // need to update group for the position widget too
                 $widgetsNeedUpdate[$positionWidget['widget_id']]['tab_group'] = implode('/', $newGroupParts);
             }
         }
     }
     if (!empty($dwInput['move_group'])) {
         if (!empty($widget['options']['tab_group'])) {
             $widgetGroupParts = WidgetFramework_Helper_LayoutEditor::splitGroupParts($widget['options']['tab_group']);
             $newGroupParts[] = array_pop($widgetGroupParts);
         }
     }
     $dwInput['group'] = implode('/', $newGroupParts);
     $dw->setWidgetOption('tab_group', $dwInput['group']);
     if (!empty($dwInput['widget_page_id'])) {
         $dw->set('widget_page_id', $dwInput['widget_page_id']);
     }
     if (!empty($dwInput['position'])) {
         $dw->set('position', $dwInput['position']);
     }
     if ($dwInput['display_order'] !== '') {
         $dw->set('display_order', $dwInput['display_order']);
     } elseif ($dwInput['relative_display_order'] !== '') {
         $dw->set('display_order', $this->_getWidgetModel()->getDisplayOrderFromRelative($dw->get('widget_id'), $dwInputGroup, intval($dwInput['relative_display_order']), $core->getWidgetGroupsByPosition($dw->get('position')), $positionWidget, $widgetsNeedUpdate));
     }
     if (!empty($dwInput['move_group'])) {
         $this->_getWidgetModel()->updatePositionGroupAndDisplayOrderForWidgets($widget['widget_id'], $dw->get('position'), $dwInput['group'], $dw->get('display_order'), $core->getWidgetGroupsByPosition($widget['position']), $widgetsNeedUpdate);
     }
     XenForo_Db::beginTransaction();
     $dw->save();
     foreach ($widgetsNeedUpdate as $needUpdateId => $needUpdateData) {
         /** @var WidgetFramework_DataWriter_Widget $needUpdateDw */
         $needUpdateDw = XenForo_DataWriter::create('WidgetFramework_DataWriter_Widget');
         $needUpdateDw->setExistingData($needUpdateId);
         $needUpdateDw->bulkSet($needUpdateData, array('ignoreInvalidFields' => true));
         if (isset($needUpdateData['tab_group'])) {
             $needUpdateDw->setWidgetOption('tab_group', $needUpdateData['tab_group']);
         }
         $needUpdateDw->save();
         $changedRenderedId = WidgetFramework_Helper_LayoutEditor::getChangedRenderedId($needUpdateDw, $changedRenderedId);
     }
     XenForo_Db::commit();
     $changedRenderedId = WidgetFramework_Helper_LayoutEditor::getChangedRenderedId($dw, $changedRenderedId);
     $viewParams = array('changedRenderedId' => $changedRenderedId);
     return $this->responseView('WidgetFramework_ViewAdmin_Widget_Save', '', $viewParams);
 }