Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 29 мар 2024, 11:30

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 12 ноя 2012, 14:47 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
доброго времени суток.
форма содержит и обычные поля и поля селекты. все данные выбраны и введены. на сохранение данные уходят в базу, тут всё хорошо работает.

а как сделать так что бы данные раз: ушли в базу, два: и сразу открылась страница (тип как предварительный просмотр) с данными которые только что сохранились в базе.

чувствую что должно быть просто. суть ясна а как на практике это сделать?
вот как я это представляю (бред конечно, ну куда без него).
Код:
public function action_dogovor()
   {         
           
           if(isset($_POST))
      {
                $dogovor = Arr::extract($_GET, array('zakaz_id','data_in', 'customer_id', 'apparat_id', 'made_id', 'sn', 'model', 'broken', 'view'), 'нет данных для печати');
                }
               
               
            $content = View::factory('dogovor')
                               ->bind('dogovor', $dogovor)
                             ;
               
            $this->template->content = $content;
       }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2012, 17:55 
Не в сети
Бывалый

Зарегистрирован: 10 авг 2012, 15:51
Сообщения: 33
1. через модель сохраняете данные в базу
2. через модель получаете данные из базы и выводите на страницу
если хотите чтобы предварительный просмотр был, то просто редиректом перекиньте на роут соответствующий(предпросмотра)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2012, 18:02 
Не в сети
Бывалый

Зарегистрирован: 10 авг 2012, 15:51
Сообщения: 33
Код:
public function action_dogovor()
{     
     $dogovor = Model::factory('Dogovor');
   
      if(isset($_POST))
      {
           $data = Arr::extract($_GET, array('zakaz_id','data_in', 'customer_id',
           'apparat_id', 'made_id', 'sn', 'model', 'broken', 'view'), 'нет данных для печати');
      }
      $dogovor->write($data);
      $view = $dogovor->read();
               
            $content = View::factory('dogovor')
                               ->bind('dogovor', $view);
               
            $this->template->content = $content;
       }


как-то так примерно, только гетом такой объем данных передавать как то не очень красиво


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 ноя 2012, 10:21 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
радует что почти в правильную сторону думала. спасиб, буду пробовать. иных способ не знаю пока, кроме get'ом, а почему не красиво?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 ноя 2012, 12:11 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
хм....
естественно, я как "умная" хотела сделать всё красиво, вынесла действие на обработку страницы с предварительным просмотром акта приёма в отдельный экшн и естественно он не срабатывает т.к. роуты у меня привязаны к именам акшенов. спустя сутки меня осенило, что вообще-то так не делаю...
а вот теперь вопрос "на миллион" ) куда прикрутить эти действия в один экшн. я сделала через if,elseif,else ну естественно всё равно не срабатывает.

мои творения см. ниже:
(контроллер)
Код:
   public function action_form()
   {      
    $zakaz_id = $this->request->param('id');
   
         //обработка данных введённых в форму
        if($_POST)
   {
      $_POST = Arr::map('trim', $_POST);   
      
      $post = Validation::factory($_POST);
      $post -> rule('customer_id', 'not_empty')
                      -> rule('apparat_id', 'not_empty');
 
                if($post -> check())
                {
                            Model::factory('Getin')->create_zakaz(
                            $_POST['date_in'],
                            $_POST['customer_id'],
                            $_POST['apparat_id'],
                            $_POST['made_id'],
                            $_POST['sn'],
                            $_POST['model'],
                            $_POST['broken'],
                            $_POST['view']);
       
                    Session::instance()->set('message', 'Заказ добавлен в базу');
       
                    $uri = Request::detect_uri('/getin');
                    Request::initial()->redirect($uri);            
 
      }
      //elseif для предварительного просмотра перед печатью 
      //'btnd'-кнопка "печать акта приёма"       
       elseif(isset($_POST['btnd']))
            {
                $data = Arr::extract($_GET, array('zakaz_id','data_in', 'customer_id',
                'apparat_id', 'made_id', 'sn', 'model', 'broken', 'view'), 'нет данных для печати');
                     
                $this->request->redirect('/printd/dogovor/');
       
             }
       //обработка ошибок ввода данных
       else
            {
                Session::instance()->set('error', 'Ошибка!');
                $errors = $post -> errors('getin');
            }

   }
        $zakaz = Model::factory('Getin')->get_zakaz($zakaz_id);
       
        //!--start для предварительного просмотра
        $zakaz->write($data);
        $view = $zakaz->read();
        //!--end для предварительного просмотра
       
        //блок лбработки массивов данных для выпадающих списков
        $apparats = array();
        $mades = array();
        $masters = array();
        $customers = array();
       
        $content = View::factory('getinview') //вид формы
                    ->bind('zakaz', $zakaz) //переменная для принятия данных в основную таблицу
                    ->bind('errors', $errors) //ошибки валидации
                    ->bind('apparats', $apparats)   //переменная для работы с выпадающим списком
                    ->bind('mades', $mades)         //переменная для работы с выпадающим списком
                    ->bind('masters', $masters)     //переменная для работы с выпадающим списком
                    ->bind('customers', $customers) //переменная для работы с выпадающим списком
                    ->bind('zakaz', $view)//переменная для предварительного просмотра
                ;
       
        //блок обработки данных для работы с выпадающими списками
   $apparat = new Model_Getin();
        $apparats = $apparat->get_apparat();
        $made = new Model_Getin();
        $mades = $made->get_made();
        $master = new Model_Getin();
        $masters = $master->get_master();
        $customer = new Model_Getin();
        $customers = $customer->get_customer();
       
        $this->template->content = $content;
       }
     
       
       //А ВОТ ТАК Я СНЧАЛА ВИДЕЛА ОБРАБОТКУ ДАННЫХ ДЛЯ СТРАНИЦЫ ПРЕДВАРИТЕЛЬНОГО ПРОСМОТРА
      /* public function action_dogovor()
        {     
            $dogovor = Model::factory('Getin')->get_zakaz($zakaz_id);

            elseif(isset($_POST['btnd']))
            {
                $data = Arr::extract($_GET, array('zakaz_id','data_in', 'customer_id',
                'apparat_id', 'made_id', 'sn', 'model', 'broken', 'view'), 'нет данных для печати');
               
                 $this->request->redirect('/printd/dogovor/');
            }
            $dogovor->write($data);
            $view = $dogovor->read();

                    $content = View::factory('dogovor')
                                    ->bind('dogovor', $view);
       }*/

}


HELP!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 ноя 2012, 18:16 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 12 фев 2012, 01:02
Сообщения: 462
Если ввести данные, потом сохранить в базу и вывести страницу с уже сохраненными данными - то редирект.
А если форма из нескольких страниц или нужно перед сохранением в базу сделать типа превью (например, на проверку правильности заполнения), то я в сессию сохраняю.

_________________
kohanaframework.su - обучение фреймворку Kohana


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 ноя 2012, 21:47 
Не в сети
Бывалый

Зарегистрирован: 02 июн 2012, 07:14
Сообщения: 69
Ух, что-то в последнем примере совсем намудрили.
Думаю, стоит начать с простого, взять форму на пару полей, и поиграться с ней, без печатей и всякого такого, потом добавить остальное. (Кстати, не совсем понял что там происходит с этой печатью, зачем редирект, почему бы не сделать просто ссылку /printd/dogovor/, ну да ладно..)
В целом логика должна быть примерно такой:
Код:
$zakaz_id = $this->request->param('id', 0);
$error = 0;

if($_POST)
{
    // Пытаемся валидировать пришедшие данные

    if($post -> check())  //Прошли валидацию
    {
        // Сохраняем данные
        // Получаем $zakaz_id сохраненной записи
    }
    else    // Не прошли валидацию
    {
        $error = 1;
    }
}
elseif (!$zakaz_id)    // post пустой, id в урле тоже пустой
{
    $error = 2;
}

if (!$error)    // Если ошибок нет
{
    // Получаем данные по id
    // Выводим данные
}
else
{
    // Обрабатываем ошибки
}

В самом простом случае здесь не нужны никакие редиректы и сессии. Тут они могут понадобится только для избавления от повторной отправки post данных по нажатию F5, но добавить их труда не составит.
Если делать для отображения данных отдельный action, то:
Код:
if($_POST)
{
    // Пытаемся валидировать пришедшие данные

    if($post -> check())  //Прошли валидацию
    {
        // Сохраняем данные
        // Получаем $zakaz_id сохраненной записи
        // Редиректим на страницу просмотра, id передаём в урле (если очень нужно, то в сессии)
    }
    else    // Не прошли валидацию
    {
        // Ошибка
    }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 ноя 2012, 11:39 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 12 фев 2012, 01:02
Сообщения: 462
Цитата:
Тут они могут понадобится только

Ну я про второй вариант и говорил. Мне кажется он логичнее отображения на этой же странице.

А введенные данные в сессию записывать - это для варианта показа страницы предпросмотра ДО записи в базу. ТС это вроде как не надо, но мало ли.

_________________
kohanaframework.su - обучение фреймворку Kohana


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 ноя 2012, 22:05 
Не в сети
Бывалый

Зарегистрирован: 02 июн 2012, 07:14
Сообщения: 69
admin писал(а):
Ну я про второй вариант и говорил. Мне кажется он логичнее отображения на этой же странице.

Да, мне тоже так кажется. :)
А по поводу сессий и редиректов я говорил про последний пример от ТС, там были попытки записать что-то в сессию, но это никак не исполльзовалось.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 ноя 2012, 14:03 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
вы всё правильно поняли)
вот делаю действие на вторую кнопку в том же контроллере где обрабатываю ввод данных с формы.
Код:
       if(isset($_POST['btnd']))//кнопка на превью
            {
                $zakaz = Model::factory('Getin')->preview_d($zakaz_id);//запрос на выборку ПОСЛЕДНЕЙ сохранённой записи
                $this->request->redirect('/printd/dogovor/'.$zakaz_id);
             }

...

$content = View::factory('getinview') //вид с формой
                    ->bind('zakaz', $zakaz)//
                  ...и т.д. все переменные с которыми я работаю на форме
                 


естеССвенно ничего не работает. Конкретнее: переходит по редиректу на контроллер, который обрабатывает у меня вывод превью, но ошибка в том что он не понимает что я ему что-то передаю т.е. в виде превью у меня они обрабатываются вот так
Код:
 АКТ ПРИЁМА АППАРАТА № <?=$zakaz['zakaz_id']; ?> от <?=$zakaz['date_in']; ?> г.


ругается на переменную zakaz


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group