我一直在使用这个文档(我可以在网上找到的唯一一个)来构建一个组件: http ://docs.joomla.org/Developing_a_Model-View-Controller_Component/2.5/Introduction
我可以在一定程度上理解它,但它确实缺乏任何定义。我创建的组件在一定程度上可以工作,尽管我遇到了一些更奇怪的问题。
基本上我需要组件做的只是加载一个设置区域来设置一些值,并通过它能够更改这些值。以下是我所拥有的细分:
表单视图,从数据库加载表单数据。用于保存/应用和取消的工具栏设置。
这加载没有错误,并且根据我发现的 joomla 上的所有文档,通过使用模型中连接的 JTable 初始化 JControllerForm 实例,简单的表单保存应该会自动工作。然而,即使代码中的任何地方都绝对没有引用以 s 结尾的视图(主视图是tireapi,表单总是重定向到tireapis)。
这会引发 500 错误,因为没有具有该视图的地点集。该文档确实包含一个视图列表,但是我只有一行需要编辑,因此列表毫无意义。我知道可以将参数设置为组件,而不是创建一个数据库字段,但是我找不到任何与之相关的文档。
我正在寻找的是有关如何阻止组件重定向到不存在的视图并正确保存数据的方向。链接到不仅显示示例代码,而且描述功能及其工作方式的文档将是有益的。
这是一些代码,请随时指出我可能完全忽略的任何内容(我是创建组件的新手):
轮胎api.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import joomla controller library
jimport('joomla.application.component.controller');
// Get an instance of the controller prefixed by TireAPI
$controller = JController::getInstance('TireAPI');
// Get the task
$jinput = JFactory::getApplication()->input;
$task = $jinput->get('task', "", 'STR' );
// Perform the Request task
$controller->execute($task);
// Redirect if set by the controller
$controller->redirect();
?>
控制器.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controller library
jimport('joomla.application.component.controller');
class TireAPIController extends JController{
function display($cachable = false){
// set default view if not set
$input = JFactory::getApplication()->input;
$input->set('view', $input->getCmd('view', 'TireAPI'));
// call parent behavior
parent::display($cachable);
}
}
?>
控制器/tireapi.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controllerform library
jimport('joomla.application.component.controllerform');
class TireAPIControllerTireAPI extends JControllerForm{}
?>
模型/tireapi.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import the Joomla modellist library
jimport('joomla.application.component.modeladmin');
class TireAPIModelTireAPI extends JModelAdmin{
protected $settings; //define settings
public function getTable($type = 'TireAPI', $prefix = 'TireAPITable', $config = array()){
return JTable::getInstance($type, $prefix, $config);
}
public function getSettings(){ //grab settings from database
if(!isset($this->settings)){
$table = $this->getTable();
$table->load(1);
$this->settings = $table;
}
return $this->settings;
}
public function getForm($data = array(), $loadData = true){
// Get the form.
$form = $this->loadForm('com_tireapi.tireapi', 'tireapi',
array('control' => 'jform', 'load_data' => $loadData));
if (empty($form)){
return false;
}
return $form;
}
protected function loadFormData(){
// Check the session for previously entered form data.
$data = JFactory::getApplication()->getUserState('com_tireapi.edit.tireapi.data', array());
if (empty($data)){
$data = $this->getSettings();
}
return $data;
}
}
?>
表/tireapi.php:
<?php
// No direct access
defined('_JEXEC') or die('Restricted access');
// import Joomla table library
jimport('joomla.database.table');
class TireAPITableTireAPI extends JTable
{
function __construct( &$db ) {
parent::__construct('#__tireapi', 'id', $db);
}
}
?>
意见/tireapi/view.html.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla view library
jimport('joomla.application.component.view');
class TireAPIViewTireAPI extends JView{
function display($tpl = null){
$form = $this->get('Form');
$item = $this->get('Settings');
// Check for errors.
if(count($errors = $this->get('Errors'))){
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Assign data to the view
$this->item = $item;
$this->form = $form;
$this->addToolBar();
// Display the template
parent::display($tpl);
}
protected function addToolBar() {
$input = JFactory::getApplication()->input;
JToolBarHelper::title(JText::_('COM_TIREAPI_MANAGER_TIREAPIS'));
JToolBarHelper::apply('tireapi.apply');
JToolBarHelper::save('tireapi.save');
JToolBarHelper::cancel('tireapi.cancel');
}
}
?>
意见/tireapi/tmpl/default.php:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted Access');
// load tooltip behavior
JHtml::_('behavior.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_tireapi&layout=edit&id='.(int) $this->item->id); ?>"
method="post" name="adminForm" id="tireapi-form">
<fieldset class="adminform">
<legend><?php echo JText::_( 'COM_TIREAPI_DETAILS' ); ?></legend>
<ul class="adminformlist">
<?php foreach($this->form->getFieldset() as $field): ?>
<li><?php echo $field->label;echo $field->input;?></li>
<?php endforeach; ?>
</ul>
</fieldset>
<div>
<input type="hidden" name="task" value="tireapi.edit" />
<?php echo JHtml::_('form.token'); ?>
</div>
</form>
这些是我能想到的所有可能很重要的文件,让我知道是否应该再包含。
更新:现在我可以停止重定向问题,但它不会保存数据。我收到此错误:不允许您使用该链接直接访问该页面 (#1)。
这是让这个极其基本的管理功能发挥作用的最后一个障碍。有任何想法吗?为了澄清,我通过一个 xml 文件设置表单并且正确加载,甚至用数据库中的正确数据填充它们。但是,当我单击“应用”时,它只会将我引导回带有上面列出的错误的表单,而不会保存。