Правильное завершение работы с формой

MiksIr

miksir@home:~$
в чем флуд, ну сам посуди ну интересно мне как пользователю увидеть сообщение "Выше сообщение отправлено!"? - мне интересно получить быстро ОТВЕТ на свой вопрос или отзыв или комментарий, я по умолчанию жду что зашел на нормальный сайт написанный без ошибок, и по умолчанию простая форма отправки сообщения на почту сайта должно отработать правильно.
И даже больше увидеть сообщение, что-то типа "Ваше сообщение не было отправлено потому, что [тут написан или косяк сайта или мой косяк]!" - оно просто меня пробесит и все
Не прав сто раз. Пользователь должен получить отклик на действие. Перебрасывание тупо на главную, к примеру, после нажатия сабмита, вызывает реакцию недоумения - а произошло ли что-то вообще.
 

Духовность™

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

shelestov

я тут часто
Не прав сто раз. Пользователь должен получить отклик на действие. Перебрасывание тупо на главную, к примеру, после нажатия сабмита, вызывает реакцию недоумения - а произошло ли что-то вообще.
Да кто говорит про ТУПО перебрасывать на главную? Посмотрите реализацию flash в ROR или на худой конец в cake, может поймете о чем говорят.
 

shelestov

я тут часто
Я думал что с самого начала спор шел лишь о методе хранения данных flash-ей.
Тупо перебрасывать само собой не правильно. Скрипт обязан сообщить пользователю результат выполнения операции.
 

A1x

Новичок
как раз на днях с этим заморачивался на kohana 3. хотелось сделать чтоб можно было создавать произвольные как вы говорите flash страницы
(я их почему-то называю splash страницы) - чтобы можно было добавлять их с минимумом усилий
вот что у меня получилось
PHP:
class Layout_Front extends Controller_Template {

    // .....
    
    /**
     * Redirects to splash page
     * 
     * @param string $code splash data code
     * @param array $params splash data parameters
     */
    protected function showSplash($code, array $params = NULL) {
        $uri = sprintf("splash/%s", str_replace(array('_', '.'), '/', $code));
        $code = str_replace(array('/', '.'), '_', $code);
        $this->sess->set('splash_code', $code);
        if (NULL !== $params && is_array($params)) {
            $this->sess->set('splash_params', $params);
        }
        $this->request->redirect($uri);
    }
}
теперь после успешной обработки формы (например сохранение профиля пользователя) я делаю просто:
PHP:
$this->showSplash('profile/saved');
перед этим добавив в конфиг соответствующее сообщение:

application/messages/splash.php
PHP:
<?php
return array(
    // .......
    'profile_saved' => array(
            'message' => 'Profile saved',
            'redirect' => 'home',
            'timeout' => 5,
        ),
);
метод showSplash записывает в сессию некий код (в данном случае profile_saved) и делает редирект на адрес /splash/profile/saved, где из сессиии извлекается код
и по этому коду извлекаются данные из application/messages/splash.php - в данном случае это сообщение, которое показывается пользователю,
адрес, на который надо перейти после показа сообщения и время показа сообщения (передается с header Refresh)
т.е. для новой Splash-страницы как правило достатосно добавить соответствующий код с сообщением и возможно другими данными

сам контроллер Splash-страниц
PHP:
class Controller_Splash extends Layout_Front {

    public function action_index() {
        if ($code = $this->sess->get('splash_code', FALSE)) {
            $params = $this->sess->get('splash_params', FALSE);
            $this->sess->delete('splash_code');
            $this->sess->delete('splash_params');
            
            // get the splash data by code
            $data = Kohana::message('splash', $code);
            if (empty($data)) {
                $data = array('message' => 'Unknown');
            }
            // possible to specify specific view in the splash data
            $_view = isset($data['view']) ? $data['view'] : 'front/splash/message';
            $content = View::factory($_view);
            if (isset($data['redirect'])) {
                // add Refresh header
                $_uri = $params ? strtr($data['redirect'], $params) : $data['redirect'];
                $_timeout = isset($data['timeout']) ? intval($data['timeout']) : 3;
                $this->request->refresh($_uri, $_timeout);
            }
            unset($data['view'], $data['timeout']);
            
            // pass rest data to the view
            foreach ($data as $var => $value) {
                $content->set($var, $params ? strtr($value, $params) : $value);
            }
            $this->template->set('content', $content);
        } else {
            $this->request->redirect('index');
        }
    }

}
 

zerkms

TDD infected
Команда форума
A1x
Чота у тебя какой-то омг :-S
PHP:
<?php
class Flash
{
  const SESSION_VAR = 'flash';
  const SESSION_TYPE = 'flashType';

  public static function set($value, $type = 'success')
  {
    Session::instance()->set(self::SESSION_VAR, $value);
    Session::instance()->set(self::SESSION_TYPE, $type);
  }

  public static function get()
  {
    $value = Session::instance()->get(self::SESSION_VAR);
    $type = Session::instance()->get(self::SESSION_TYPE, 'success');
    self::clean();
    return array($type, $value);
  }

  public static function clean()
  {
    Session::instance()->delete(self::SESSION_VAR);
    Session::instance()->delete(self::SESSION_TYPE);
  }
}
Пример использования:
PHP:
<?php
list($type, $value) = Flash::get();
?>
<div id="flash-messages" class="type-<?php echo $type?>">
  <?php echo $value?>
</div>
 

A1x

Новичок
zerkms
у меня может чуть сложнее но и гибче :)
1. все сообщения вынесены в отдельный файл
2. для всех splash страниц используется один controller/action
3. можно задать refresh с переходом на заданную страницу после показа сообщения
 

MiksIr

miksir@home:~$
Это как раз потому, что ты это называешь splash, а мы flash :) Разный образ мышления ;)
splash мышление - это как я понимаю такая фигня, которые форумы раньше любили, типа "вы добавили сообщение и сейчас будете перенаправлены", а flash мышление - это вывод сообщения на любой странице сайта, куда попал пользователь после редиректа ;)
 
Сверху