コンポーネントを構築するために、このドキュメント (Web で見つけられる唯一のもの) を使用しています: http://docs.joomla.org/Developing_a_Model-View-Controller_Component/2.5/Introduction
ある程度は理解できますが、実際には定義がありません。私が作成したコンポーネントはある程度機能しますが、いくつかの問題があります。
基本的に、コンポーネントに必要なのは、いくつかの値を設定する設定領域をロードするだけで、それを通じてそれらの値を変更できるようになります。ここに私が持っているものの内訳があります:
データベースからフォーム データを読み込む、フォームのビュー。保存/適用およびキャンセル用のツールバーのセットアップ。
これはエラーなしでロードされ、私が見つけた joomla のすべてのドキュメントによると、モデルに接続された JTable で JControllerForm インスタンスを初期化することにより、フォームの単純な保存が自動的に機能するはずです。ただし、コードのどこにも最後に s があるビューへの参照がまったくないにもかかわらず (メイン ビューは Tireapi であり、フォームは常に Tireapis にリダイレクトされます)。
そのビューを持つプレース セットがないため、500 エラーが発生します。ドキュメントにはビューのリストが含まれていますが、編集する必要があるのは 1 行だけなので、リストは無意味です。データベース フィールドを作成するのではなく、コンポーネントにパラメータを設定できることは知っていますが、関連するドキュメントを見つけることができません。
私が探しているのは、コンポーネントが存在しないビューへのリダイレクトを停止し、データを適切に保存する方法に関する指示です。サンプルコードを示すだけでなく、関数とその動作方法を説明するドキュメントへのリンクが有益です。
ここにコードの一部を示します。完全に見落としている可能性があるものを自由に指摘してください (私はコンポーネントの作成に慣れていません)。
tireapi.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{}
?>
models/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ファイルを介してフォームを設定し、データベースから適切なデータを入力して、適切にロードします。ただし、「適用」をクリックすると、保存せずに上記のエラーが表示されたフォームに戻るだけです。