如何使用xenforo选项重新填充复选框

时间:2015-03-16 10:56:54

标签: php checkbox admin option xenforo

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

你能说明为什么它不会重新填充复选框以及我可以做些什么来修复它。 感谢

2 个答案:

答案 0 :(得分:2)

_render类中的XenForo_Option_NodeChooser方法期望只有一个选定节点,因此它期望该值为单个无符号整数node_id

当你传递一个数组时,它不起作用。

您必须创建自己的独立方法才能添加此选项。

答案 1 :(得分:0)

我覆盖了原始的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;
    }