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); } }
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); }