自定义Joomla 3按钮任务未在我的控制器中执行

时间:2015-01-22 09:43:06

标签: php joomla joomla3.0 joomla-component

我正在尝试上传"群组的外部列表"添加到我的自定义Joomla 3组件。我已经创建了一个CSV文件,并编写了一些我希望能够实现的功能。我创建了一个自定义按钮来启动我的"组"视图。

当我按下按钮时,我得到一个SQL错误,其中absoloutle与函数无关,所以我尝试了调试,当按下按钮时,它甚至没有在sql错误之前进入我的控制器任务。我很困惑为什么。

这是我的代码

view.html.php TestViewGroups

JToolBarHelper::custom('group.uploadsave', '', '', 'Upload and Save', false);

TestControllerGroup

protected function uploadsave() {



    $detail_headers = array(                
            'agm_date',
            'preferred_media'
    );



    $rows = array_map('str_getcsv', file('groupdata.csv'));
    $header = array_shift($rows);

    foreach ($rows as $row) {
        $entry = array_combine($header, $row);
        foreach ($entry as $key => $value) {
            if(in_array($key, $detail_headers)){
                $details[$key]= $value;
                unset($entry[$key]);
            }
        }
        $entry['details'] = $details;

        $this->saveUploaded($entry);
    }

    // Redirect to the list screen.
    $this->setRedirect(
            JRoute::_(
                    'index.php?option=' . $this->option . '&view=' . $this->view_list
                    . $this->getRedirectToListAppend(), false
            )
    );

}

protected function saveUploaded($dataIn = array()) {

    $app   = JFactory::getApplication();
    $lang  = JFactory::getLanguage();
    $model = $this->getModel();
    $table = $model->getTable();
    $data  = $dataIn;

    $checkin = property_exists($table, 'checked_out');
    // Determine the name of the primary key for the data.
    if (empty($key))
    {
        $key = $table->getKeyName();
    }

    // To avoid data collisions the urlVar may be different from the primary key.
    if (empty($urlVar))
    {
        $urlVar = $key;
    }

    $recordId = $this->input->getInt($urlVar);

    // Populate the row id from the session.
    $data[$key] = $recordId;

    if (!$model->save($validData))
    {

        // Redirect back to the edit screen.
        $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
        $this->setMessage($this->getError(), 'error');  

    }
    if ($checkin && $model->checkin($validData[$key]) === false)
    {
        // Save the data in the session.
        $app->setUserState($context . '.data', $validData);

        // Check-in failed, so go back to the record and display a notice.
        $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()));
        $this->setMessage($this->getError(), 'error');      

    }
    $this->setMessage(
            JText::_(
                    ($lang->hasKey($this->text_prefix . ($recordId == 0 && $app->isSite() ? '_SUBMIT' : '') . '_SAVE_SUCCESS')
                            ? $this->text_prefix
                            : 'JLIB_APPLICATION') . ($recordId == 0 && $app->isSite() ? '_SUBMIT' : '') . '_SAVE_SUCCESS'
            )
    );
}

我不是将它用作常规功能,它只是一次性上传数据。

我得到的SQL错误就像它试图加载一个组列表?与保存功能无关。

saveUploaded与初始保存功能类似。

谢谢:-)

****编辑*****

我刚刚完成了调试任务,并且进入了JControllerLegacy的执行任务,因为任务图中没有定义任务默认显示,因此SQL错误尝试加载组时没有& #39; t有一个ID。现在我是否需要在任务地图中注册任务才能获取任务?

1 个答案:

答案 0 :(得分:1)

我是正式的白痴!当我刚刚重新登录以查看是否有人响应时,我看到我已将该功能声明为受保护功能! DIR!我刚从另一个函数复制并粘贴,忘了更改其访问权限。我还做了一些其他改动,现在效果很好!

public function uploadsave() {      
    // An array of headers that will need to be entered into a seperate array to allow entry as JSON
    $detail_headers = array(                
            'agm_date',
            'preferred_media'
    );

    $app   = JFactory::getApplication();
    $lang  = JFactory::getLanguage();
    $model = $this->getModel();     

    $path = JPATH_COMPONENT . '/controllers/groupdata.csv';     

    //Load the file and pass each line into an array.
    $rows = array_map('str_getcsv', file($path));
    //Take out the first line as it is the headers.
    $header = array_shift($rows);

    //turn each of the arrays into an entry
    foreach ($rows as $row) {
        $entry = array_combine($header, $row);
        foreach ($entry as $key => $value) {
            //separate each of the entries that need to be entered into an array to be stored as JSON
            if(in_array($key, $detail_headers)){
                $details[$key]= $value;
                unset($entry[$key]);
            }
        }
        $entry['details'] = $details;

        $recordId = 'id';

        // Populate the row id from the session.
        $entry[$key] = $recordId;

        //Save each one
        if (!$model->save($entry))
        {

            // Redirect back to the edit screen.
            $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
            $this->setMessage($this->getError(), 'error');

            return false;

        }           
        $this->setMessage(
                JText::_(
                        ($lang->hasKey($this->text_prefix . ($recordId == 0 && $app->isSite() ? '_SUBMIT' : '') . '_SAVE_SUCCESS')
                                ? $this->text_prefix
                                : 'JLIB_APPLICATION') . ($recordId == 0 && $app->isSite() ? '_SUBMIT' : '') . '_SAVE_SUCCESS'
                )
        );
        }

    // Redirect to the list screen.
    $this->setRedirect(
            JRoute::_(
                    'index.php?option=' . $this->option . '&view=' . $this->view_list
                    . $this->getRedirectToListAppend(), false
            )
    );

}