Zend Framework одностраничная форма, имеющая дело со многими отношениями - PullRequest
1 голос
/ 09 сентября 2011

У меня есть база данных, в которой есть сценарий, в котором между двумя таблицами существует отношение многие ко многим (с третьей «ассоциативной» таблицей между ними):

Например:

Table 1 : user (primary key id)
Table 2 : contact_info (primary key id)
Associative table: user_has_contact_info (primary key id, foreign keys: user_id and contact_info_id)

Теперь требования к приложению должны иметь возможность добавлять несколько записей contact_info на одной странице при создании записи пользователя:

Например: (Форма)

UserName: ___________

Contact Type    Contact Detail
Phone           123-4567
Email           me@here.com

_________V      _______________ [Add Contact Button]

... plus more fields for the user table ...

Таким образом, в моем примере выше, у меня есть поле имени пользователя (которое будет указано в таблице пользователя), таблица всех записей контактной информации, которые относятся к пользователю (в поле имени пользователя), которые будут включены в таблицу contact_info. и затем элементы формы для contact_type и contact_details (под соответствующими столбцами под таблицей) (с кнопкой добавления?), которые добавят контактную информацию в контактную «таблицу». Тогда ниже всего этого, больше полей, которые принадлежат пользовательской таблице.

Если вы следите за мной до сих пор, проблема, с которой я сталкиваюсь, заключается в том, что клиент хочет, чтобы это отображалось на одной форме, а не на нескольких страницах или в двух формах, поток должен «выглядеть» как одна форма (даже если элементы будут принадлежать разным таблицам базы данных.

Во-вторых, достаточно просто поместить данные в таблицу contact_info, однако фактический user_id не генерируется до тех пор, пока не будут заполнены остальные поля 'user' и не обновлена ​​запись пользователя, и поэтому я не в состоянии увидеть, как добавить ассоциативную запись в user_has_contact_info, не сохранив сначала запись пользователя и не добавив контактную информацию второй.

Наконец, предпочтение состоит в том, чтобы избегать javascript (хотя это не исключено полностью, потому что практически любое решение будет требовать либо обновления javascript, либо страницы с частичным сохранением данных поля формы и, возможно, даже проблем с проверкой и фильтрацией, еще не зашел так далеко)

Итак, мой последний вопрос: каков наилучший способ обработки отношений таблицы базы данных «многие ко многим» с использованием Zend_Form в приведенном выше сценарии. Я мог бы переосмыслить эту проблему и упустить простое решение здесь, и с нетерпением жду разных перспектив.

Обратите внимание, что это не вопрос о том, как проектировать базу данных, а о том, как создать Zend-форму для обработки базы данных так, как она спроектирована.

1 Ответ

1 голос
/ 09 сентября 2011

Здесь, похоже, есть две проблемы:

  1. Вставка в таблицу пользователей и в таблицу контактов и в таблицу контактов пользователя.

  2. Работа с динамическим, то есть определяемым на стороне клиента, количеством записей контактов на пользователя.

Вторую часть см. В превосходной статье Джереми Кендалла о работе с полем, определяемым на стороне клиента, с Zend_Form. В результате получается клиентский javascript, который отслеживает количество новых полей в сочетании с методом preValidation() в форме, которая считывает эту информацию и изменяет объект формы перед вызовом isValid() и getValue().

Что касается первой части, то, похоже, вы, по сути, все правильно поняли.

  1. Создать запись пользователя и получить идентификатор пользователя.

  2. Для каждого блока контактов в вашей форме создайте запись контакта и получите идентификатор контакта; и создайте соответствующую запись контакта пользователя с двумя вставленными идентификаторами.

Возможно, вам захочется обернуть некоторые из них в транзакцию, чтобы в случае сбоя одной из частей, скажем, сбоя вставки контакта с пользователем, вы не потеряли запись о потерянном контакте, не связанную с каким-либо пользователем.

...