Проведя изыскания по теме, пришел отчасти к философским выводам.
Прошу прощения за "лекцию" ниже. Кому интересно только решение - читайте начиная со строки **************************
Таблицы мы приводим к НФ именно для того чтобы устранить возможные коллизии, а все остальное - вторично. Поэтому мешать в одну кучу несколько таблиц может быть чревато, а в некоторых случаях доводит до того что нам нужна не 3я, а 1я нормальная форма для реализации задуманного.
Проще объяснить на примере:
У нас есть 4ре таблицы. Запишу в виде Название_таблицы(названия_полей)
Город(id_города; название_города)
Улица(id_улицы; названия_улицы)
Адрес(id_адреса; id_города; id_улицы; номер_дома; номер_квартиры)
Собственник(id_собственника; id_адреса; ФИО)
Т.е. по связи таблиц получаем цепочку: Город/Улицы -> Адрес -> Собственник
Причем заметим что таблицы Город и Улицы друг с другом напрямую не связаны.
Такую форму мы делаем для того чтобы делать исправления улицы или города только в одном единственном месте, а не в 100 или 1000 местах если бы у нас была только одна таблица и оказалось бы что какое либо название города нудно исправить.
Вывести все таблицы по отдельности на одну страницу проблем не составляет.
Но тут возникает первое философское отступление:
- для нас как для пользователя интересна не каждая таблица в отдельности, а результирующая таблица: Информация_о_собственнике(Город, Улица, Номер_дома, номер_квартиры, ФИО).
- но как для человека который будет вносить данные в эти таблицы, интересны именно отдельные таблицы.
Теперь о главном.
Что значит "редактировать материал на одной странице" !?
Из приведенного примера видно, что редактировать на одной странице таблицы Город и Улица теоретически можно, потому что эти таблицы не связаны. И для нас как для пользователя понятно что мы можем менять названия в ячейках этих таблиц произвольно и независимо друг от друга.
Но как это Вы представляете себе в реальности.
Для того чтобы редактировать запись в таблице, необходимо выбрать какую конкретно запись мы хотим редактировать. Если мы выберем конкретную запись из таблицы Город, то таблица Улица здесь уже не к месту будет.
Т.е. прихожу к выводу что в этом случае редактировать нужно одну таблицу, а не две или больше.
Таблица Собственник - другое дело. Тут можно предположить что при выводе этой таблицы и выборе конкретной ее записи для редактирования нам должна открываться форма редактирования в которой помимо поля ФИО, вместо поля id_адреса нам выводились бы отдельно Город, Улица, Номер_дома. И каждое из этих полей мы бы тоже могли редактировать прямо в этой единой форме.
И тут возникает второе философское отступление: Но позвольте! Мы выбрали для редактирования конкретную запись таблицы Собственник.
Далее если мы хотим изменить город, заменив его на другой - то это будет означать что мы хотим внести изменения на самом деле в таблицу Адреса. Но кто сказал что в таблице Собственник только одна запись с этим адресом. И если их несколько, то город будет заменен и в других записях, так как изменения коснуться таблицы Адрес.
Будет путаница. Мы вошли в редактирование конкретной записи, а с какого то после ее изменения поменялись данные и у других
Другими словами. Если дому будет присвоен другой номер, то Вы должны зайти в таблицу Адрес и исправить в ней номер дома.
А если собственник стал собственником по другому адресу, то должны зайти в таблицу Собственник и выбрать там другой адрес, предварительно его создав.
Т.е. получаем что не стоит мешать каким либо образом несколько таблиц для редактирования на одну форму. Только путаница будет.
**********************************************************
Как же все же сделать так чтобы можно было сохранить данные в несколько таблиц (для тех кто в танке
). Предположим что таблицы описанные выше: Город, Улица и т.д.
В mycomponent/view/view.hml.php
function display($tpl = null)
{
.....
$this->cityitems = $this->get('CityItems');
$this->streetitems = $this->get('StreetItems');
.....
В mycomponent/models/myname.php
class TSJModelTSJs extends JModelList
{
var $_city;
var $_street;
var $_address;
....
function getCityItems()
{
// Загружаем данные, если они еще не загружены
if (empty( $this->_city ))
{
$query = 'SELECT * FROM #__my_city ORDER BY city' . ' ' . 'asc';
$this->_city = $this->_getList( $query );
}
return $this->_city;
}
function getStreetItems()
{
// Загружаем данные, если они еще не загружены
if (empty( $this->_street ))
{
//$orderDir = $this->state->get('list.direction','asc');
$query = 'SELECT * FROM #__my_street ORDER BY street' . ' ' . 'asc';
$this->_street = $this->_getList( $query );
}
return $this->_street;
}
.......
Теперь данные из двух таблиц готовы для вывода в форму.
В форме XML myname.xml делаем необходимые нам поля типа:
<field
name="city"
type="City"
label="city"
description="city"
size="1"
default=""
/>
<field
name="street"
type="Street"
label="street"
description="street"
size="1"
default=""
/>
Типы полей либо свои делаем либо используем готовые - в зависимости от задачи.
Теперь сохранение данных в несколько таблиц.
Для этого в tables/myname.php (по названию таблицы - проще запомнить так, что файл должен называться так же как и XML файл формы)
переписываем метод store()
class TSJTableAccount extends JTable
{
var $street_id = null;
var $street = null;
var $city_id = null;
var $city = null;
function __construct(&$db)
{
// В конструкторе действительно можно указать только одну таблицу
parent::__construct('#_название_таблицы', 'основной_ключ_таблицы', $db);
}
// Но кто сказал что данные полученные из формы мы не модем записывать и в другие таблицы
public function store($updateNulls)
{
// В этом месте пишем запись данных в нужные нам таблицы, хоть две, хоть десять.
// А этот метод нам сохранит данные автоматом в таблицу указанную в конструкторе
return parent::store($updateNulls);
}