Надо глянуть что за птица этот ларавель.
Много вкусностей в нем, по мимо официальных доков есть и посторонние + книга
http://daylerees.com/category/laravel-tutorials/
Форум → Программирование → PHP для идиотов → Пишу ли я правильно Controller ? (MVC путь)
Страницы: ← Предыдущая страница • Следующая страница →
Июнь 28, 2012, 10:44 д.п., спустя 20 минут 5 секунд
Надо глянуть что за птица этот ларавель.
Июнь 28, 2012, 2:48 п.п., спустя 4 часа 4 минуты
adw0rdНо я вижу приведенный код и меня в пот бросает, видимо технологии ушли далеко вперед и мне их не догнать
Я не пойму, это сарказм или нет? :D
Если да, то поставьте на путь истинный. Мне важен ответ на вопросы:
Правильно ли спроектирована часть контроллера в моем примере?
Есть ли в нем некие моменты которые должны были быть в Модели а не в Контролере?
пиши на питоне
Его сейчас изучаю, но знания пока не позволяют переписать на нем проекты.
Июнь 28, 2012, 4:14 п.п., спустя 1 час 25 минут 34 секунды
Июнь 28, 2012, 4:56 п.п., спустя 41 минуту 58 секунд
# coding: utf-8
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.views.generic import TemplateView
from django.core.mail import send_mail
from django.conf import settings
class ActionConfirm(TemplateView):
"""
1) Подтверждение запроса на восстановления пароля
2) Генерация и изменение старого пароля на новый
3) Отправка письма пользователю
"""
def dispatch(self, request, passkey):
try:
user = User.objects.get(passkey=passkey)
except User.DoesNotExist:
return self.render_to_response('registration/empty_passkey.html')
# Пользователь подтвердил свой email, обновляем его пароль
new_password = User.objects.make_random_password()
user.set_password(new_password)
if user.check_password(new_password):
# Возникла ошибка во время обновления данных
# НЕЗНАЮ ЗАЧЕМ ЭТО ЗДЕСЬ, НО В ОРИГИНАЛЕ БЫЛО, ПОЭТОМУ ПЕРЕНОШУ
return self.render_to_response('authorization/password_updating_failed.html')
else:
# Пароль пользователя успешно изменен
site = Site.objects.get_current()
# Отправляем пользователю письмо с его новым паролем
message = self.render_to_response("emails/successful_password_updating.txt", {
'login': user.username,
'password': new_password,
'domain': site.domain,
'ip': request.META.
})
# Вообще я бы это выделил в другое место и под Сelery (defferd)
send_mail("Subject", message, settings.DEFAULT_FROM_EMAIL, [user.email])
# Рисуем ответ. Вообще, я бы использовал "Django messages framework":
# > messages.add_message(request, messages.INFO, 'Successful password updating!')
# А в base.html шаблоне бы выводил в нужном месте эти messages, я так делаю у себя,
# так как событийным сообщениям не надо иметь свои шаблоны - они однотипны.
self.render_to_response('authorization/successful_password_updating.html', {
'login': user.username,
'email': user.email,
})
# return View::make('template')->with('header', Template::seo_header() );
# А это надо передавать в CONTEXT_PROCESSORS, если оно глобально, если локально, то юзать Mixins
def render_to_response(self, template_name, context={}):
self.template_name = template_name
return self.render_to_response(context)
Июнь 28, 2012, 5:07 п.п., спустя 11 минут 26 секунд
# coding: utf-8
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.core.mail import send_mail
from django.views.generic import TemplateView
class ActionConfirm(TemplateView):
template_name = "auth/confirm.html"
def dispatch(self, request, confirm_key):
try:
user = User.objects.get(confirm_key=confirm_key)
except User.DoesNotExist:
messages.add_message(request, messages.INFO, _('Failed ….'))
else:
new_password = User.objects.make_random_password()
user.set_password(new_password)
user.save()
messages.add_message(request, messages.INFO, _('Successful password updating!'))
self.send_email(user=user, password=new_password)
return self.render_to_response()
def send_email(self, user, password):
site = Site.objects.get_current()
message = self.render_to_response("emails/successful_password_updating.txt", {
'login': user.username,
'password': password,
'domain': site.domain,
'ip': request.META.
})
return send_mail("Subject", message, settings.DEFAULT_FROM_EMAIL, [user.email])
Июнь 28, 2012, 5:16 п.п., спустя 8 минут 30 секунд
uidb36 = int_to_base36(user.id)
token = token_generator.make_token(user=user)
confirm_url = "confirm/{}/{}/".format(uidb36, token)
# urls
url(r'^confirm/(?P<uidb36>.+)/(?P<token>.+)/$', ConfirmView.as_view(), name='auth-confirm'),
# views
class ConfirmView(View):
def dispatch(self, request, uidb36, token):
assert None not in (uidb36, token)
try:
uid_int = base36_to_int(uidb36)
user = User.objects.get(id=uid_int)
except User.DoesNotExist:
user = None
if user is not None and token_generator.check_token(user, token):
messages.add_message(request, messages.INFO, 'Successful')
Июнь 28, 2012, 5:23 п.п., спустя 7 минут 1 секунду
Вопрос:
1) Правильно ли я делаю структуру контролера?
т.е. я знаю, что контроллер только получает данные и проверяет их с помощью моделей. Контроллер не в коем случае не должен выполнять какие либо модификации, как я понял он манипулирует результатами из методов Model и в зависимости от них открывает те или иные данные в View.
2) Правильно я делаю, что полученный результат от методов Моделей я проверяю в Контроллере и выдаю сообщение об ошибке или успехе(т.е. сама структура)?
Июнь 28, 2012, 7:44 п.п., спустя 2 часа 21 минуту 10 секунд
1. Раздели свой контроллер на стадии через методы контроллера, например "Проверка ключа", "Неуспешноая проверка", "Успешная проверка" и "Отпрвка письма"
2. Зачем генерировать $Content? Почему сразу не рисовать в шаблон?
3. Что такое "lang"? В Template::lang()
4. Для чего в DisplayResponse 'error' и 'success'?
5. Что делает иньекция? Section::inject('content', $Content);
6. $UserRowsValueByPasskey = User::UserRowsValueByPasskey($Passkey); - ты сам создал User::UserRowsValueByPasskey?
return self.render_to_response('registration/empty_passkey.html')
static function lang($line, $options=array() ) {
return Lang::line($line, $options)->get( Template::CurrentLanguage() );
}
Lang::line( "Название_файла_из_папки_languages . ключ массива " )->get( папка языка - ru, en )
static function DisplayResponse($Response, $type='info') {
$Message = '';
if(!$Response) {return;}
if(is_array($Response)) {
foreach($Response as $line) {
$Message .= $line.'<br />';
}
}
return View::make('display_message', array(
'type' => $type,
'message' => $Message
));
}
public static function UserRowsValueByPasskey($passkey) {
/*
* Данные о пользователе по его Passkey
*/
return Registration::where('passkey', '=', $passkey)
->first();
}
Июнь 29, 2012, 2:05 д.п., спустя 6 часов 20 минут 40 секунд
<?php
class AuthorizationController extends BaseController
{
/**
* Подтверждение запроа на восстановление пароля
*/
public function actionConfirm($paskey)
{
$user = User::model()->findByAttributes(array('paskey' => $paskey));
if ($user == null)
{
$this->render('confirm', array(
'msg' => Yii::t('users', 'Empty paskey.')
));
}
else
{
$newPassword = $user->updatePassword();
if ($newPassword === false)
{
$this->render('confirm', array(
'msg' => Yii::t('users', 'Error updating password.')
));
}
else
{
$this->render('confirm', array(
'msg' => Yii::t('users', 'Password for {email} successful updated.', array('email' => $user->email))
));
$user->sendMail($this->renderPartial('successful_password_updating', array(
'login' => $user->login,
'password' => $newPassword,
'ip' => Yii::app()->request->userHostAddress,
'domain' => Yii::app()->request->baseUrl,
), true));
}
}
}
}
Июнь 29, 2012, 8:13 п.п., спустя 1 час 6 минут 45 секунд
Июнь 29, 2012, 8:40 п.п., спустя 26 минут 59 секунд
class AuthorizationController(YiiTemplateMixin, TemplateView):
"""Подтверждение запроа на восстановление пароля
"""
def dispatch(self, request, paskey):
try:
user = User.objects.get(paskey=paskey)
except User.DoesNotExist:
return self.render_to_response("confirm", msg='Empty paskey.')
else:
new_password = user.update_password()
if not new_password:
return self.render_to_response("confirm", msg='Error updating password.')
else:
user.send_mail('successful_password_updating', dict(
login=user.username,
password=new_password,
ip=request.META['REMOTE_ADDR'],
domain=Site.objects.get_current().domain))
return self.render_to_response("confirm",
msg='Password for {email} successful updated.'.format(email=user.email))
class YiiTemplateMixin(object):
"""Для того чтобы выглядило также как в Yii
"""
def render_to_response(template_name, **context):
self.template_name = template_name.replace('.html', '') + '.html'
return super(YiiTemplateMixin, self).render_to_response(context)
'Password for {email} successful updated.'.format(email=user.email)
'Password for %(email)s successful updated.' % dict(email=user.email)
User.DoesNotExist
Site.objects.get_current().domain
Июнь 29, 2012, 9:46 п.п., спустя 1 час 6 минут 17 секунд
<?php
class AuthorizationController extends BaseController
{
/**
* Подтверждение запроа на восстановление пароля
*/
public function actionConfirm($paskey)
{
$user = User::model()->findByAttributes(array('paskey' => $paskey));
if ($user == null)
throw new CExeption(Yii::t('users', 'Empty paskey.'));
$newPassword = $user->updatePassword();
if ($newPassword === false)
throw new CExeption(Yii::t('users', 'Error updating password.'));
$user->sendMail($this->renderPartial('successful_password_updating', array(
'login' => $user->login,
'password' => $newPassword,
'ip' => Yii::app()->request->userHostAddress,
'domain' => Yii::app()->request->baseUrl,
), true));
Yii::app()->user->setFlash('success', Yii::t('users', 'Password successful updated.'));
$this->redirect(array('profile'));
}
}
Июнь 29, 2012, 10:37 п.п., спустя 51 минуту 8 секунд
Июнь 30, 2012, 1:07 д.п., спустя 2 часа 29 минут 48 секунд
В Yii тоже даже в примерах используются исключения, как более правильное решение.
adw0rd, Yii::t() это перевод строки на другой язык.
from django.utils.translation import ugettext as _
_("Translated text")
{% load i18n %}
{% trans "Translated text" %}
или
{% blocktrans %}Hello {{ username }}!{% endblocktrans %}
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!