2014-04-29 7 views
2

joomla 2.5를 사용하고 있는데, joomla의 사용자 지정 구성 요소에서 일하고 있습니다. 백엔드 관리 페이지에서 양식을 만들었습니다. 내가 원하는 것은, #_extensions의 데이타베이스에있는 해당 구성 요소의 params 행에 형태의 게시 데이터를 저장하고 싶습니다. 여기 내 테이블/component.php ('joomla.database.table')구성 요소 매개 변수 joomla에 양식 필드를 저장

<?php defined('_JEXEC') or die('Restricted access');

jimport이다;

클래스 componentTablecomponent이 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() { 

부모 : 저장 (NULL);

}

} 대신 해당 구성 요소의 $dataparams에 행을 저장하는

. 이 코드는 해당 테이블에서 빈 행을 새로 작성합니다 (데이터는 해당 params 필드에 저장됩니다). 다음은 컨트롤러 내 save() 기능/component.php

공공 저장 기능()

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

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



    // Initialise variables. 
    $app = JFactory::getApplication(); 
    $model = $this->getModel('component'); 
    $form = $model->getForm(); 
    $data = JRequest::getVar('jform', array(), 'post', 'array'); 
    print_r($data); 
    // 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'); 
      } 
     } 

     // Redirect back to the edit screen. 
$this->setRedirect(JRoute::_('somelink',false)); 

     return false; 
    } 

    // Attempt to save the configuration. 
    $data = $return; 
    $return = $model->save($data); 

    // Check the return value. 
    if ($return === false) 
    { 


     // Save failed, go back to the screen and display a notice. 
     $message = JText::sprintf('JERROR_SAVE_FAILED', $model->getError()); 
$this->setRedirect('index.php/somelink','error');  

     return false; 
    } 

    // Set the success message. 
    $message = JText::_('COM_CONFIG_SAVE_SUCCESS'); 

    // Set the redirect based on the task. 
    switch ($this->getTask()) 
    { 
     case 'apply': 
      $this->setRedirect('somelink',$message); 

      break; 
     case 'cancel': 
     case 'save': 

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

    return true; 
} 

모델/component.php

공공 기능 (데이터 $) 저장입니다 {

parent::save($data); 
    return true; 
} 

나는이 코드가 충분하다고 생각한다. 필요한 경우 더 많은 코드를 추가 할 수 있습니다.

답변

1

나는 해결책을 내놓았다. 그것은 나를 위해 작동합니다. 이 방법을 사용하면 save() 함수를 제어 할 수 있습니다. 즉, 저장시 사용자 정의 PHP 스크립트를 실행하고 툴바 버튼을 적용 할 수 있습니다.

com_config 구성 요소에서 save(), save ($ data), store ($ updateNulls = false) 함수를 복사 했으므로 구성 요소 뷰에서 레이아웃을 복사했습니다. 단추를 제거했습니다. .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'); 
    } 



} 

모델/mymodel.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; 
    } 




} 

테이블/mycomponent.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); 
    } 

} 

주 : config.xml 파일이 모델에 있어야합니다/폴더를 형성한다.

0

params를 확장 테이블에 저장하려면 com_config를 사용하지 않는 것이 어떻습니까?

http://docs.joomla.org/J2.5:Developing_a_MVC_Component/Adding_configuration

는 그런 다음 config.xml 파일을 생성하고 도구 모음의 구성 옵션에 대한 링크를 추가 외에 아무것도 할 필요가 없습니다를 참조하십시오.

+0

네, 닫기지만 위의 방법으로 할 수있는 '적용'및 '저장'도구 모음 단추에서 사용자 지정 PHP 코드를 실행하고 싶습니다. save(), save ($ 데이터), store() 함수. – NeiL