2013-02-13 2 views
0

Я использую Kohana 3.3 в своем проекте, и я пытаюсь получить регистрацию пользователя и вход в систему. Я использую ORM Auth и Kostache для управления моим макетом/шаблонами.Kohana ORM Проверьте, существует ли пользователь и возвращает сообщения для просмотра?

Как сделать I:

  • Проверьте, Имя пользователя уже существует? Если он возвращает в error_msg.mustache сообщение «Пользователь уже существует»
  • Проверьте, соответствуют ли имя пользователя и адрес электронной почты в соответствии с моими правилами модели? Если не возвращает сообщение об ошибке error_msg.mustache с указанием того, что проверка не удалось

В мой контроллер у меня есть:

class Controller_User extends Controller { 

public function action_signup() 
    { 
     $renderer = Kostache_Layout::factory(); 
     $this->response->body($renderer->render(new View_FrontEnd_User, 'frontend/signup')); 
    } 

    public function action_createuser() 
    { 
     try { 
      $user = ORM::factory('User'); 
      $user->username = $this->request->post('username'); 
      $user->password = $this->request->post('password'); 
      $user->email = $this->request->post('email'); 

      // How do I: 
      // Check if Username already exists? If it does return to error_msg.mustache a message "User already Exists" 
      // Check if email is valid? If not return error message to error_msg.mustache indicating "email is not valid" 

      $user->save(); 
     } 
     catch (ORM_Validation_Exception $e) 
     { 
      $errors = $e->errors(); 
     } 
    } 
} 

В моей модели:

<?php 

class Model_User extends Model_Auth_User 
{ 
    public function rules() 
    { 
     return array(
      'username' => array(
       array('not_empty'), 
       array('min_length', array(':value', 4)), 
       array('max_length', array(':value', 32)), 
       array('regex', array(':value', '/^[-\pL\pN_.]++$/uD')), 
      ), 
      'email' => array(
       array('not_empty'), 
       array('min_length', array(':value', 4)), 
       array('max_length', array(':value', 127)), 
       array('email'), 
      ), 
     ); 
    } 
} 

Спасибо большое заранее!

ответ

2

Вы можете выполнить проверку уникальности с помощью Validation и уже написанного обратного вызова. Это имеет преимущество, заключающееся в том, чтобы держать вашу логику проверки вместе и быть очень кратким:

public function rules() 
{ 
    return array(
     'username' => array(
      array(array($this, 'unique'), array(':field', ':value')), 
     // ... 

Как просто!

Первоначально я ответил на этот вопрос с моим собственным решением, которое немного отличается от предопределенных версий, но теперь, когда я знаю о том, что, очевидно, я буду использовать его вместо этого:

public function rules() 
{ 
    return array(
     'username' => array(
     // ... 
      array('Model_User::unique_field', array(':field', ':value', $this->pk())), 
     ), 
     // ... 
    ); 
} 

public static function unique_field($field, $value, $user_id = NULL) 
{ 
    return (ORM::factory('User')->where($field, '=', $value)->find()->pk() === $user_id); 
} 
+0

Правило, которое я внедрил выше, говорит: «Если в базе данных есть пользователь с таким-то именем пользователя, то он должен быть вами». Теперь я объясню, почему эта логика правильная. Предположим, что вы создали пользователя с именем пользователя 'bob'. Затем предположим, что вы хотите отредактировать какое-то поле 'bob'. Нотабене Теперь пользователь с именем пользователя «Боб», поэтому, если ваша проверка сделала наивную проверку на существование такого пользователя, он потерпит неудачу, даже если все, что вы пытались сделать, - это увеличить количество логинов пользователя 'bob'. – Jonathan

+0

отлично! теперь мой вопрос заключается в том, как показать пользовательское сообщение об ошибке, когда это произойдет, и отправить его обратно в

, используя kostache – user1155413

1

К сожалению, я не могу помочь вам с Kostache, но для того, чтобы проверить уже существует ли имя пользователя вы должны фактически попытаться загрузить его:

$user = ORM::factory('User')->where('username', '=', $this->request->post('username')); 

if ($user->loaded()) 
{ 
    // The username already exists 
} 

Вы, вероятно, хотите, чтобы это сделать, прежде чем на самом деле открытия блок try/catch.

Чтобы использовать правильные сообщения об ошибках, их необходимо определить в папке /application/messages, как описано в ORM Validation guide.

+0

Отлично! Спасибо!!! – user1155413