如何使用 xenforo 选项获取要重新填充的复选框
How to get checkboxes to repopulate using xenforo options
我在 XenForo 中使用以下函数,并为每个节点创建复选框,并将所选选项保存在数据库中,但是当重新加载选项时,保存的值不会重新填充到表单中。
选项:
<option option_id="hc_watched_forums_list" edit_format="callback" data_type="array" can_backup="1">
<default_value>a:6:{i:0;s:1:"4";i:1;s:1:"5";i:2;s:1:"6";i:3;s:1:"7";i:4;s:2:"36";i:5;s:2:"38";}</default_value>
<edit_format_params>HotCopper_Option_NodeChooser::renderCheckbox</edit_format_params>
<sub_options>*</sub_options>
<relation group_id="hc_misc_options" display_order="3306"/>
</option>
函数:(简化)
class HotCopper_Option_NodeChooser extends XenForo_Option_NodeChooser
{
public static function renderCheckBox(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
{
return self::_render('option_list_option_checkbox', $view, $fieldPrefix, $preparedOption, $canEdit);
}
}
您能否建议为什么它没有重新填充复选框以及我可以做些什么来修复它。
谢谢
XenForo_Option_NodeChooser
class 中的 _render
方法期望只有一个选定节点,因此它期望值是一个无符号整数 node_id
。
当你向它传递一个数组时,它不起作用。
您必须创建自己的独立方法才能添加此选项。
我覆盖了原来的 xenforo 节点模型和选项。
只需要更改该选项以调用新模型,并且需要选择该模型以检查 nodeid 是否在值数组中。
public static function getNodeOptions($selectedForum, $includeRoot = false, $filter = false)
{
/* @var $nodeModel HotCopper_Model_Node */
$nodeModel = XenForo_Model::create('HotCopper_Model_Node');
$options = $nodeModel->getNodeOptionsArraySelectedArray(
$nodeModel->getAllNodes(),
$selectedForum,
"Choose Required Forums"
);
if ($filter)
{
foreach ($options AS &$option)
{
if (!empty($option['node_type_id']) && $option['node_type_id'] != $filter)
{
$option['disabled'] = 'disabled';
}
unset($option['node_type_id']);
}
}
return $options;
}
public function getNodeOptionsArraySelectedArray(array $nodes, array $selectedNodes, $includeRoot = false)
{
$options = array();
foreach ($nodes AS $nodeId => $node)
{
$node['depth'] += (($includeRoot && $nodeId) ? 1 : 0);
$options[$nodeId] = array(
'value' => $nodeId,
'label' => $node['title'],
'selected' => (in_array($nodeId,$selectedNodes)),
'depth' => $node['depth'],
'node_type_id' => $node['node_type_id']
);
}
return $options;
}
我在 XenForo 中使用以下函数,并为每个节点创建复选框,并将所选选项保存在数据库中,但是当重新加载选项时,保存的值不会重新填充到表单中。
选项:
<option option_id="hc_watched_forums_list" edit_format="callback" data_type="array" can_backup="1">
<default_value>a:6:{i:0;s:1:"4";i:1;s:1:"5";i:2;s:1:"6";i:3;s:1:"7";i:4;s:2:"36";i:5;s:2:"38";}</default_value>
<edit_format_params>HotCopper_Option_NodeChooser::renderCheckbox</edit_format_params>
<sub_options>*</sub_options>
<relation group_id="hc_misc_options" display_order="3306"/>
</option>
函数:(简化)
class HotCopper_Option_NodeChooser extends XenForo_Option_NodeChooser
{
public static function renderCheckBox(XenForo_View $view, $fieldPrefix, array $preparedOption, $canEdit)
{
return self::_render('option_list_option_checkbox', $view, $fieldPrefix, $preparedOption, $canEdit);
}
}
您能否建议为什么它没有重新填充复选框以及我可以做些什么来修复它。 谢谢
XenForo_Option_NodeChooser
class 中的 _render
方法期望只有一个选定节点,因此它期望值是一个无符号整数 node_id
。
当你向它传递一个数组时,它不起作用。
您必须创建自己的独立方法才能添加此选项。
我覆盖了原来的 xenforo 节点模型和选项。 只需要更改该选项以调用新模型,并且需要选择该模型以检查 nodeid 是否在值数组中。
public static function getNodeOptions($selectedForum, $includeRoot = false, $filter = false)
{
/* @var $nodeModel HotCopper_Model_Node */
$nodeModel = XenForo_Model::create('HotCopper_Model_Node');
$options = $nodeModel->getNodeOptionsArraySelectedArray(
$nodeModel->getAllNodes(),
$selectedForum,
"Choose Required Forums"
);
if ($filter)
{
foreach ($options AS &$option)
{
if (!empty($option['node_type_id']) && $option['node_type_id'] != $filter)
{
$option['disabled'] = 'disabled';
}
unset($option['node_type_id']);
}
}
return $options;
}
public function getNodeOptionsArraySelectedArray(array $nodes, array $selectedNodes, $includeRoot = false)
{
$options = array();
foreach ($nodes AS $nodeId => $node)
{
$node['depth'] += (($includeRoot && $nodeId) ? 1 : 0);
$options[$nodeId] = array(
'value' => $nodeId,
'label' => $node['title'],
'selected' => (in_array($nodeId,$selectedNodes)),
'depth' => $node['depth'],
'node_type_id' => $node['node_type_id']
);
}
return $options;
}