Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 组件参数joomla中的保存表单字段_Php_Joomla_Joomla2.5_Joomla Extensions_Custom Component - Fatal编程技术网

Php 组件参数joomla中的保存表单字段

Php 组件参数joomla中的保存表单字段,php,joomla,joomla2.5,joomla-extensions,custom-component,Php,Joomla,Joomla2.5,Joomla Extensions,Custom Component,我正在使用joomla 2.5,我正在开发joomla的定制组件。我已经在后端管理页面创建了表单。我需要的是,我想将表单的post数据保存在#u extensions数据库中该组件的params行中。 这是我的tables/component.php <?php defined('_JEXEC') or die; class componentControllermycomponent extends JControllerLegacy { function __

我正在使用joomla 2.5,我正在开发joomla的定制组件。我已经在后端管理页面创建了表单。我需要的是,我想将表单的post数据保存在
#u extensions
数据库中该组件的
params
行中。 这是我的tables/component.php

<?php


defined('_JEXEC') or die;



class componentControllermycomponent extends JControllerLegacy {




    function __construct($config = array())
    {
        parent::__construct($config);

        // Map the apply task to the save method.
        $this->registerTask('apply', 'save');
    }


    function save()
    {


        // Check for request forgeries.
        JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

        // Set FTP credentials, if given.
        JClientHelper::setCredentialsFromRequest('ftp');

        // Initialise variables.
        $app    = JFactory::getApplication();
        $model  = $this->getModel('mymodel');
        $form   = $model->getForm();
        $data   = JRequest::getVar('jform', array(), 'post', 'array');
        $id     = JRequest::getInt('id');
        $option = 'com_mycomponent';


        // Check if the user is authorized to do this.
        if (!JFactory::getUser()->authorise('core.admin', $option))
        {
            JFactory::getApplication()->redirect('index.php', JText::_('JERROR_ALERTNOAUTHOR'));
            return;
        }

        // Validate the posted data.
        $return = $model->validate($form, $data);

        // Check for validation errors.
        if ($return === false) {
            // Get the validation messages.
            $errors = $model->getErrors();

            // Push up to three validation messages out to the user.
            for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) {
                if ($errors[$i] instanceof Exception) {
                    $app->enqueueMessage($errors[$i]->getMessage(), 'warning');
                } else {
                    $app->enqueueMessage($errors[$i], 'warning');
                }
            }

            // Save the data in the session.
            $app->setUserState('com_iflychat.config.global.data', $data);

            // Redirect back to the edit screen.
            $this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=component&component='.$option.'&tmpl=component', false));
            return false;
        }

        // Attempt to save the configuration.
        $data   = array(
            'params'    => $return,
            'id'        => $id,
            'option'    => $option
        );
       // print_r($data);
        $return = $model->save($data);

        // Check the return value.
        if ($return === false)
        {
            // Save the data in the session.
            $app->setUserState('com_config.config.global.data', $data);

            // Save failed, go back to the screen and display a notice.
            $message = JText::sprintf('JERROR_SAVE_FAILED', $model->getError());
            $this->setRedirect('index.php?option=com_mycomponent&view=component&component='.$option.'&tmpl=component', $message, 'error');
            return false;
        }

        // Set the redirect based on the task.
        switch ($this->getTask())
        {
            case 'apply':
                $message = JText::_('COM_MYCOMPONENT_SAVE_SUCCESS');
print_r($data);
                $this->setRedirect('index.php?option=com_mycomponent&view=myview&layout=edit', $message);
                break;

            case 'save':
            default:
                $this->setRedirect('index.php');
                break;
        }

        return true;
    }





    function cancel()
    {
        $this->setRedirect('index.php');
    }



}
<?php
// No direct access
defined('_JEXEC') or die('Restricted access');

// import Joomla table library
jimport('joomla.database.table');

/**
 * Hello Table class
 */
class componentTableMycomponent extends JTable
{

    function __construct(&$db)
    {
        parent::__construct('#__extensions', 'extension_id', $db);
    }

    public function bind($array, $ignore = '')
    {
        if (isset($array['params']) && is_array($array['params']))
        {
            // Convert the params field to a string.
            $parameter = new JRegistry;
            $parameter->loadArray($array['params']);
            $array['params'] = (string)$parameter;
        }
        return parent::bind($array, $ignore);
    }



    public function load($pk = null, $reset = true)
    {
        if (parent::load($pk, $reset))
        {
            // Convert the params field to a registry.
            $params = new JRegistry;
            $params->loadJSON($this->params);
            $this->params = $params;
            return true;
        }
        else
        {
            return false;
        }
    }
    public function store($updateNulls = false)
    {
        // Transform the params field
        if (is_array($this->params)) {
            $registry = new JRegistry();
            $registry->loadArray($this->params);
            $this->params = (string)$registry;
        }

        $date   = JFactory::getDate();
        $user   = JFactory::getUser();
        if ($this->id) {
            // Existing item
            $this->modified     = $date->toSql();
            $this->modified_by  = $user->get('id');
        } else {
            // New newsfeed. A feed created and created_by field can be set by the user,
            // so we don't touch either of these if they are set.
            if (!intval($this->created)) {
                $this->created = $date->toSql();
            }
            if (empty($this->created_by)) {
                $this->created_by = $user->get('id');
            }
        }
        // Verify that the alias is unique
        $table = JTable::getInstance('Yourinstance', 'mycomponentTable');
        if ($table->load(array('alias'=>$this->alias, 'catid'=>$this->catid)) && ($table->id != $this->id || $this->id==0)) {
            $this->setError(JText::_('COM_CONTACT_ERROR_UNIQUE_ALIAS'));
            return false;
        }

        // Attempt to store the data.
        return parent::store($updateNulls);
    }

}

如果要在扩展表中存储参数,为什么不直接使用com_config呢


然后,除了创建config.xml和在工具栏中添加到配置选项的链接之外,您不必做任何事情。

我想出了一个解决方案。它对我有用。通过使用此方法,您可以控制save()函数,即,您可以在save、apply工具栏按钮上运行自定义php脚本

我从
com\u config
component复制了save()、save($data)、store($updateNulls=false)函数,我从component视图复制了布局。卸下按钮。在.html.php文件中添加了工具栏按钮

控制器/mycomponent.php

<?php


defined('_JEXEC') or die;



class componentControllermycomponent extends JControllerLegacy {




    function __construct($config = array())
    {
        parent::__construct($config);

        // Map the apply task to the save method.
        $this->registerTask('apply', 'save');
    }


    function save()
    {


        // Check for request forgeries.
        JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

        // Set FTP credentials, if given.
        JClientHelper::setCredentialsFromRequest('ftp');

        // Initialise variables.
        $app    = JFactory::getApplication();
        $model  = $this->getModel('mymodel');
        $form   = $model->getForm();
        $data   = JRequest::getVar('jform', array(), 'post', 'array');
        $id     = JRequest::getInt('id');
        $option = 'com_mycomponent';


        // Check if the user is authorized to do this.
        if (!JFactory::getUser()->authorise('core.admin', $option))
        {
            JFactory::getApplication()->redirect('index.php', JText::_('JERROR_ALERTNOAUTHOR'));
            return;
        }

        // Validate the posted data.
        $return = $model->validate($form, $data);

        // Check for validation errors.
        if ($return === false) {
            // Get the validation messages.
            $errors = $model->getErrors();

            // Push up to three validation messages out to the user.
            for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) {
                if ($errors[$i] instanceof Exception) {
                    $app->enqueueMessage($errors[$i]->getMessage(), 'warning');
                } else {
                    $app->enqueueMessage($errors[$i], 'warning');
                }
            }

            // Save the data in the session.
            $app->setUserState('com_iflychat.config.global.data', $data);

            // Redirect back to the edit screen.
            $this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=component&component='.$option.'&tmpl=component', false));
            return false;
        }

        // Attempt to save the configuration.
        $data   = array(
            'params'    => $return,
            'id'        => $id,
            'option'    => $option
        );
       // print_r($data);
        $return = $model->save($data);

        // Check the return value.
        if ($return === false)
        {
            // Save the data in the session.
            $app->setUserState('com_config.config.global.data', $data);

            // Save failed, go back to the screen and display a notice.
            $message = JText::sprintf('JERROR_SAVE_FAILED', $model->getError());
            $this->setRedirect('index.php?option=com_mycomponent&view=component&component='.$option.'&tmpl=component', $message, 'error');
            return false;
        }

        // Set the redirect based on the task.
        switch ($this->getTask())
        {
            case 'apply':
                $message = JText::_('COM_MYCOMPONENT_SAVE_SUCCESS');
print_r($data);
                $this->setRedirect('index.php?option=com_mycomponent&view=myview&layout=edit', $message);
                break;

            case 'save':
            default:
                $this->setRedirect('index.php');
                break;
        }

        return true;
    }





    function cancel()
    {
        $this->setRedirect('index.php');
    }



}
<?php
// No direct access
defined('_JEXEC') or die('Restricted access');

// import Joomla table library
jimport('joomla.database.table');

/**
 * Hello Table class
 */
class componentTableMycomponent extends JTable
{

    function __construct(&$db)
    {
        parent::__construct('#__extensions', 'extension_id', $db);
    }

    public function bind($array, $ignore = '')
    {
        if (isset($array['params']) && is_array($array['params']))
        {
            // Convert the params field to a string.
            $parameter = new JRegistry;
            $parameter->loadArray($array['params']);
            $array['params'] = (string)$parameter;
        }
        return parent::bind($array, $ignore);
    }



    public function load($pk = null, $reset = true)
    {
        if (parent::load($pk, $reset))
        {
            // Convert the params field to a registry.
            $params = new JRegistry;
            $params->loadJSON($this->params);
            $this->params = $params;
            return true;
        }
        else
        {
            return false;
        }
    }
    public function store($updateNulls = false)
    {
        // Transform the params field
        if (is_array($this->params)) {
            $registry = new JRegistry();
            $registry->loadArray($this->params);
            $this->params = (string)$registry;
        }

        $date   = JFactory::getDate();
        $user   = JFactory::getUser();
        if ($this->id) {
            // Existing item
            $this->modified     = $date->toSql();
            $this->modified_by  = $user->get('id');
        } else {
            // New newsfeed. A feed created and created_by field can be set by the user,
            // so we don't touch either of these if they are set.
            if (!intval($this->created)) {
                $this->created = $date->toSql();
            }
            if (empty($this->created_by)) {
                $this->created_by = $user->get('id');
            }
        }
        // Verify that the alias is unique
        $table = JTable::getInstance('Yourinstance', 'mycomponentTable');
        if ($table->load(array('alias'=>$this->alias, 'catid'=>$this->catid)) && ($table->id != $this->id || $this->id==0)) {
            $this->setError(JText::_('COM_CONTACT_ERROR_UNIQUE_ALIAS'));
            return false;
        }

        // Attempt to store the data.
        return parent::store($updateNulls);
    }

}

是的,很接近,但我想在“应用”和“保存”工具栏按钮上运行自定义php代码,这是我用上述方法无法做到的,因为我无法控制save()、save($data)、store()函数。
<?php


defined('_JEXEC') or die;



class componentControllermycomponent extends JControllerLegacy {




    function __construct($config = array())
    {
        parent::__construct($config);

        // Map the apply task to the save method.
        $this->registerTask('apply', 'save');
    }


    function save()
    {


        // Check for request forgeries.
        JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

        // Set FTP credentials, if given.
        JClientHelper::setCredentialsFromRequest('ftp');

        // Initialise variables.
        $app    = JFactory::getApplication();
        $model  = $this->getModel('mymodel');
        $form   = $model->getForm();
        $data   = JRequest::getVar('jform', array(), 'post', 'array');
        $id     = JRequest::getInt('id');
        $option = 'com_mycomponent';


        // Check if the user is authorized to do this.
        if (!JFactory::getUser()->authorise('core.admin', $option))
        {
            JFactory::getApplication()->redirect('index.php', JText::_('JERROR_ALERTNOAUTHOR'));
            return;
        }

        // Validate the posted data.
        $return = $model->validate($form, $data);

        // Check for validation errors.
        if ($return === false) {
            // Get the validation messages.
            $errors = $model->getErrors();

            // Push up to three validation messages out to the user.
            for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) {
                if ($errors[$i] instanceof Exception) {
                    $app->enqueueMessage($errors[$i]->getMessage(), 'warning');
                } else {
                    $app->enqueueMessage($errors[$i], 'warning');
                }
            }

            // Save the data in the session.
            $app->setUserState('com_iflychat.config.global.data', $data);

            // Redirect back to the edit screen.
            $this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=component&component='.$option.'&tmpl=component', false));
            return false;
        }

        // Attempt to save the configuration.
        $data   = array(
            'params'    => $return,
            'id'        => $id,
            'option'    => $option
        );
       // print_r($data);
        $return = $model->save($data);

        // Check the return value.
        if ($return === false)
        {
            // Save the data in the session.
            $app->setUserState('com_config.config.global.data', $data);

            // Save failed, go back to the screen and display a notice.
            $message = JText::sprintf('JERROR_SAVE_FAILED', $model->getError());
            $this->setRedirect('index.php?option=com_mycomponent&view=component&component='.$option.'&tmpl=component', $message, 'error');
            return false;
        }

        // Set the redirect based on the task.
        switch ($this->getTask())
        {
            case 'apply':
                $message = JText::_('COM_MYCOMPONENT_SAVE_SUCCESS');
print_r($data);
                $this->setRedirect('index.php?option=com_mycomponent&view=myview&layout=edit', $message);
                break;

            case 'save':
            default:
                $this->setRedirect('index.php');
                break;
        }

        return true;
    }





    function cancel()
    {
        $this->setRedirect('index.php');
    }



}
<?php


defined('_JEXEC') or die;

jimport('joomla.application.component.modelform');


class componentModelmymodel extends JModelForm  {


    protected $event_before_save = 'onConfigurationBeforeSave';

    protected $event_after_save = 'onConfigurationAfterSave';


    public function getForm($data = array(), $loadData = true){
        // Get the form.
        $form = $this->loadForm('com_mycomponent.form', 'config',
            array('control' => 'jform', 'load_data' => $loadData));

        if (empty($form)){
            return false;
        }
        return $form;
    }


    public function save($data)
    {
        $dispatcher = JDispatcher::getInstance();
        $table  = JTable::getInstance('extension');
        $isNew = true;

        // Save the rules.
        if (isset($data['params']) && isset($data['params']['rules']))
        {
            $rules  = new JAccessRules($data['params']['rules']);
            $asset  = JTable::getInstance('asset');

            if (!$asset->loadByName($data['option']))
            {
                $root   = JTable::getInstance('asset');
                $root->loadByName('root.1');
                $asset->name = $data['option'];
                $asset->title = $data['option'];
                $asset->setLocation($root->id, 'last-child');
            }
            $asset->rules = (string) $rules;

            if (!$asset->check() || !$asset->store())
            {
                $this->setError($asset->getError());
                return false;
            }

            // We don't need this anymore
            unset($data['option']);
            unset($data['params']['rules']);
        }

        // Load the previous Data
        if (!$table->load($data['id']))
        {
            $this->setError($table->getError());
            return false;
        }

        unset($data['id']);

        // Bind the data.
        if (!$table->bind($data))
        {
            $this->setError($table->getError());
            return false;
        }

        // Check the data.
        if (!$table->check())
        {
            $this->setError($table->getError());
            return false;
        }

        // Trigger the oonConfigurationBeforeSave event.
        $result = $dispatcher->trigger($this->event_before_save, array($this->option . '.' . $this->name, $table, $isNew));

        if (in_array(false, $result, true))
        {
            $this->setError($table->getError());
            return false;
        }

        // Store the data.
        if (!$table->store())
        {
            $this->setError($table->getError());
            return false;
        }

        // Clean the component cache.
        $this->cleanCache('_system');

        // Trigger the onConfigurationAfterSave event.
        $dispatcher->trigger($this->event_after_save, array($this->option . '.' . $this->name, $table, $isNew));


        return true;
    }

    function getComponent()
    {


        $result = JComponentHelper::getComponent('com_mycomponent');

        return $result;
    }




}
<?php
// No direct access
defined('_JEXEC') or die('Restricted access');

// import Joomla table library
jimport('joomla.database.table');

/**
 * Hello Table class
 */
class componentTableMycomponent extends JTable
{

    function __construct(&$db)
    {
        parent::__construct('#__extensions', 'extension_id', $db);
    }

    public function bind($array, $ignore = '')
    {
        if (isset($array['params']) && is_array($array['params']))
        {
            // Convert the params field to a string.
            $parameter = new JRegistry;
            $parameter->loadArray($array['params']);
            $array['params'] = (string)$parameter;
        }
        return parent::bind($array, $ignore);
    }



    public function load($pk = null, $reset = true)
    {
        if (parent::load($pk, $reset))
        {
            // Convert the params field to a registry.
            $params = new JRegistry;
            $params->loadJSON($this->params);
            $this->params = $params;
            return true;
        }
        else
        {
            return false;
        }
    }
    public function store($updateNulls = false)
    {
        // Transform the params field
        if (is_array($this->params)) {
            $registry = new JRegistry();
            $registry->loadArray($this->params);
            $this->params = (string)$registry;
        }

        $date   = JFactory::getDate();
        $user   = JFactory::getUser();
        if ($this->id) {
            // Existing item
            $this->modified     = $date->toSql();
            $this->modified_by  = $user->get('id');
        } else {
            // New newsfeed. A feed created and created_by field can be set by the user,
            // so we don't touch either of these if they are set.
            if (!intval($this->created)) {
                $this->created = $date->toSql();
            }
            if (empty($this->created_by)) {
                $this->created_by = $user->get('id');
            }
        }
        // Verify that the alias is unique
        $table = JTable::getInstance('Yourinstance', 'mycomponentTable');
        if ($table->load(array('alias'=>$this->alias, 'catid'=>$this->catid)) && ($table->id != $this->id || $this->id==0)) {
            $this->setError(JText::_('COM_CONTACT_ERROR_UNIQUE_ALIAS'));
            return false;
        }

        // Attempt to store the data.
        return parent::store($updateNulls);
    }

}