Как обновить основную регистрационную таблицу и вторичную таблицу, заполненную мультичекбоксом? - PullRequest
0 голосов
/ 23 мая 2011

У меня есть форма регистрации с различными полями ввода, одно из которых является мульти-флажком, чтобы пользователь мог решать, из каких стран он хочет получать информацию.Этот последний создан следующим образом:

$pais = $this->createElement('multiCheckbox', 'pais');
$pais->setLabel('Pais\es: ');
$pais->addMultioption('1', 'Argentina');
$pais->addMultioption('2', 'Espa?a');
$pais->addMultioption('3', 'Brasil');
$pais->addMultioption('4', 'USA');
$pais->addMultioption('5', 'Italia');
$this->addElement($pais);

В моем UserController у меня есть следующее действие для обновления таблицы 'users':

public function createAction()
{
    $this->view->pageTitle = 'Create User';
    require_once APPLICATION_PATH . '/models/Users.php';
    $userForm = new Form_User();
    if ($this->_request->isPost()) {
        if ($userForm->isValid($_POST)) {
            $userModel = new Model_User();
            $userMode->createUser(
                $userForm->getValue('email'),
                $userForm->getValue('password'),
                $userForm->getValue('url'),
                $userForm->getValue('responsable'),
                $userForm->getValue('role')
            );
        return $this->_forward('list');
        }
    }
$userForm->setAction('/user/create');
$this->view->form = $userForm;
}

, что, конечно, сейчас нерассматривая переменную multicheckbox populatedn $ pais, ни здесь, ни в модели:

class Model_User extends Zend_Db_Table_Abstract 
{

protected $_name = 'users';

public function createUser($email, $password, $url, $responsable, $role)
{
    // create a new row
        $rowUser = $this->createRow();
        if($rowUser) {
            // update the row values
            $rowUser->email = $email;
            $rowUser->password = md5($password);
            $rowUser->url = $url;
            $rowUser->responsable = $responsable;
            $rowUser->role = $role;
            $rowUser->save();
            //return the new user
            return $rowUser;
        } else {
        throw new Zend_Exception("El usuario no se ha podido crear!");
            }
    }
}

У меня также есть таблица 'pais', которая содержит 5 разных стран, и я работаю над отдельной моделью для'users_has_pais' - таблица, которую я создал в рабочей среде для этой цели ... но я не получаю никаких результатов с тем, что я делаю сейчас.Может ли кто-нибудь указать мне правильный путь, чтобы я мог обновить 'users_has_pais' в то же время, когда я обновляю таблицу 'users'?

Заранее большое спасибо всем, у кого есть хороший совет по этому вопросу.

РЕДАКТИРОВАТЬ: это модель дБ на случай, если кому-то понадобится выяснить, о чем я говорю

EDIT2:

    public function createAction()
{
    $this->view->pageTitle = 'Create User';
    require_once APPLICATION_PATH . '/models/Users.php';
    $userForm = new Form_User();
    if ($this->_request->isPost()) {
        if ($userForm->isValid($_POST)) {
            $userModel = new Model_User();
            $user = $userModel->createUser(
                    $userForm->getValue('email'),
                    $userForm->getValue('password'),
                    $userForm->getValue('url'),
                    $userForm->getValue('responsable'),
                    $userForm->getValue('role')
            );
            $paises = $this->getRequest()->getParam('pais');
            $userId = intval($user['id']);

            require_once APPLICATION_PATH . '/models/UserHasPais.php';
            $paisesModel = new Model_UsersHasPais();
            $paisesModel->updateUserPais($userId, $paises);

            return $this->_forward('index');
        }
    }

и модель users_has_pais:

class Model_UsersHasPais extends Zend_Db_Table_Abstract 

{protected $ _name = 'users_has_pais';

public function updateUserPais($id, array $paises)
{
    $row = ($r = $this->fetchRow(array('users_id = ?' => $id))) ? $r : $this->createRow();

    foreach($paises as $pais){
        $row->users_id = $id;
        $row->pais_id = $pais;
        $row->save();
    }

}

}

1 Ответ

1 голос
/ 23 мая 2011

Один из способов заключается в том, чтобы сначала создать пользовательскую строку и использовать ее идентификатор при создании строк для 'user_has_pais'. Псевдокод ниже:

public function createAction()
{
    $this->view->pageTitle = 'Create User';
    require_once APPLICATION_PATH . '/models/Users.php';
    $userForm = new Form_User();
    if ($this->_request->isPost()) {
        if ($userForm->isValid($_POST)) {
            $userModel = new Model_User();
           $newUserRow = $userMode->createUser(
                $userForm->getValue('email'),
                $userForm->getValue('password'),
                $userForm->getValue('url'),
                $userForm->getValue('responsable'),
                $userForm->getValue('role')
            );

           $user_id = newUserRow->id;

           $checkBoxValues = $userForm->getValue('pais');
           // $checkBoxValues should be an array where keys are option names and
           // values are values. If checkbox is not checked, than the value = 0;
           // At this moment I'm not 100% sure of the real nature of the 'pais' value,
           // but this is only an example. 

           // I also assume that the values of the checkboxfields correspond to IDs in 
           // 'pais'.

           foreach ($checkBoxValues as $key => $pais_id) {
                    if (intval(pais_id) > 0) {
                        // if language was checked

                        // do insert into user_has_pais having $pais_id and $user_id.   

                    }
           }

        return $this->_forward('list');
        }
    }
$userForm->setAction('/user/create');
$this->view->form = $userForm;
}

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

...