Как создать связанную запись один-к-одному в отдельной таблице во время обработки (save ()) формы? - PullRequest
0 голосов
/ 12 сентября 2011

Вот схема:

sf_guard_user
  columns:
    id              { type: integer, primary: true, notnull: true, autoincrement: true, unique: true }
    username            { type: string }
    firstname           { type: string }
    lastname            { type: string }
    password            { type: string }
    salt, algorith, etc...

sf_guard_user_profile
  columns:
    id      { type: integer, primary: true, notnull: true, autoincrement: true, unique: true }
    user_id     { type: integer }
    user_type   { type: integer }
  relations:
    User: { class: sfGuardUser, local: user_id, foreign: id, type: one, foreignType: one, foreignAlias: Profile }
    Type: { local: type_id, foreign

Вот что я пытаюсь сделать во внешнем интерфейсе: я пытаюсь разрешить внешнему пользователю создавать нового пользователя ... что я могу сделать, и всеидет хорошо.

Где я застрял: (1) во время процесса save () создания sf_guard_user, создания sf_guard_user_profile для нового пользователя и установки значения столбца user_id в первичный ключ вновь созданного sf_guard_user(столбец «id»).(2) Затем также установите для столбца user_type значение 4.

Я даже не знаю, с чего начать.Если бы кто-то мог указать мне правильное направление, я был бы очень признателен.

ОБНОВЛЕНИЕ:

Это мой файл actions.class.php (проект / Исходные файлы / приложения /модули / пользователи / действия):

protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $sf_guard_user = $form->save();      
      $this->redirect('users/edit?id='.$sf_guard_user->getId());
    }
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Похоже, вы не понимаете правильно. Когда вы правильно настроите sfGuardPlugin, он позаботится о создании профиля.

Давайте рассмотрим процесс шаг за шагом:

1) Во-первых, правильно настройте sfGuardPlugin, добавьте это в ваш app.yml

all:
  sf_guard_plugin:
    profile_class:      yourProfileClass
    profile_field_name: user_id

2) Сохраните пользователя, используя форму:

$form->save();

3) Получить вновь созданный профиль и изменить его:

$user = $form->getObject();
$profile = $user->getProfile();
$profile->setUserType(4);
$profile->save();

4) И все готово! Я использую этот же метод на одном из моих сайтов. Так что я и мои пользователи на 100% уверены, что этот метод работает. Не забудьте правильно настроить sfGuardPlugin, он создаст профиль, даже если вы не используете его генератор администратора;

0 голосов
/ 13 сентября 2011

sfGuardPlugin автоматически создает профиль для вас при правильной настройке.В ваш app.yml добавьте этот фрагмент кода:

all:
  sf_guard_plugin:
    profile_class:      sf_guard_user_profile
    profile_field_name: user_id

Это настроит плагин для создания нового профиля при каждом создании нового пользователя (действия по созданию нового профиля выполняются объектомЭто не видсделать это:

public function save(PropelCon $con = null)
{
  if ($this->isNew())
  {
    $this->setUserType(4);
  }
  parent::save();
}

Это установит для UserType значение 4 для любого нового профиля.

...