Проблема с сохранением записи в БД (не все поля сохраняются)

  • 42 Ответов
  • 711 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн GuDeVic

Здравствуйте!
У меня возникла проблема с сохранением информации, введённой пользователем в виде заявки. Сохраняются только сведения, явно указанные в форме, а то что дополнительно вставляется в данные перед операцией store - не сохраняются в БД.
site:
site/com_order/controllers/registartion.php:
[spoiler]
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_users
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
// Include dependancy of the main controllerform class
jimport('joomla.application.component.controllerform');
//JLoader::register('OrderController', JPATH_COMPONENT . '/controller.php');

/**
 * Registration controller class for Order.
 *
 * @since  1.6
 */
class OrderControllerRegistration extends JControllerForm
{
   
   /**
    * Method to register a order.
    *
    * @return  boolean  True on success, false on failure.
    *
    * @since   1.6
    */
   public function register()
   {
      // Check for request forgeries.
      JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
      
   
      
      $app   = JFactory::getApplication();
      $model = $this->getModel('Registration', 'OrderModel');

      // Get the order data.
      $requestData = $this->input->post->get('jform', array(), 'array');

      // Validate the posted data.
      $form = $model->getForm();
      
      // Validate the posted data.
      $form = $model->getForm();

      if (!$form)
      {
         JError::raiseError(500, $model->getError());

         return false;
      }

      $data = $model->validate($form, $requestData);

      // Check for validation errors.
      if ($data === false)
      {
         // Get the validation messages.
         $errors = $model->getErrors();

         // Push up to three validation messages out to the order.
         for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
         {
            if ($errors[$i] instanceof Exception)
            {
               $app->enqueueMessage($errors[$i]->getMessage(), 'warning');
            }
            else
            {
               $app->enqueueMessage($errors[$i], 'warning');
            }
         }

                  
         // Save the data in the session.
         $app->setUserState('com_order.registration.data', $requestData);

         // Redirect back to the registration screen.
         $this->setRedirect(JRoute::_('index.php?option=com_order&view=registration', false));

         return false;
      }

      // Attempt to save the data.
      $return = $model->register($data);

      // Check for errors.
      if ($return === false)
      {
            // Save the data in the session.
         $app->setUserState('com_order.registration.data', $data);

         // Redirect back to the edit screen.
         $this->setMessage($model->getError(), 'warning');
         $this->setRedirect(JRoute::_('index.php?option=com_order&view=registration', false));

         return false;
      }

      // Flush the data from the session.
      $app->setUserState('com_order.registration.data', null);


      $this->setMessage(JText::_('COM_ORDER_REGISTRATION_SAVE_SUCCESS'));
      $this->setRedirect(JRoute::_('index.php?option=com_order&view=registration&layout=complete', false));

      return true;
   }
   
}

[/spoiler]
модель
site/com_order/models/registartion.php:
[spoiler]
<?php

// No direct access
defined( '_JEXEC' ) or die;

/**
 * Model for edit/create current element
 * @author Tamara Guseva
 */
class OrderModelRegistration extends JModelAdmin
{
   /**
    * Method of loading the current form
    * @param Array $data
    * @param Boolean $loadData
    * @return Object form data
    */
   public function getForm( $data = array(), $loadData = true )
   {
      $form = $this->loadForm( '', 'registration', array( 'control' => 'jform', 'load_data' => $loadData ) );
      if ( empty( $form ) ) {
         return false;
      }
      return $form;
   }

   /**
    * Method of loading table for current item
    * @param Sting $type (name table)
    * @param String $prefix (prefix table)
    * @param Array $config
    * @return Tableform_messages
    */
   public function getTable( $type = 'Order', $prefix = 'OrderTable', $config = array() )
   {
      return JTable::getInstance( $type, $prefix, $config );
   }

   /**
    * Method of loading data to form
    * @return Object
    */
   protected function loadFormData()
   {
      $data = JFactory::getApplication()->getUserState( 'com_order.edit.registration.data', array() );
      if ( empty( $data ) ) {
         $data = $this->getItem();
      }
      return $data;
   }

   /**
    * save data
    * @param array $data
    * @return bool
    */
   public function register( $data )
   {
   
  
    //Получаем экземпляр таблицы order
    
      $table = $this->getTable( 'order' );
   //дополнительная информация, которую нужно вставить в поля записи
   $user      = JFactory::getUser();
   $userId      = $user->get('id');

    //Данные которые запишем в базу данных
    
   $data->user_id = $userId ;
jimport('joomla.utilities.date');
// получаем текущую дату и время
$myDate = gmdate();
$data->date_order=$myDate;
$data->state=1;
$data->state_order=1;
    //Заносим данные в таблицу
   $table->bind( $data ); //устанавливаем данные в поля

    //если удалось сохранить запись в базу данных то ...
    if ( $table->store() ) {

        $order_id=$table->id; //id новой записи
        return true;
    }
    //Не удалось по какой то причине отправить сообщение
    return false;
   }

}
[/spoiler]
Всё, что добавлено ($user_id, $state_order, $state, $date_order) при store() в БД  не сохраняются. Запись создается только с теми полями, которые были заполнены в форме.

форма [spoiler]
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;

// Загружаем тултипы.
JHtml::_('bootstrap.tooltip');

// Загружаем проверку формы.
JHtml::_('behavior.formvalidation');

// Загружаем украшательства формы.
JHtml::_('formbehavior.chosen', 'select');

// Получаем параметры из формы.
$params = $this->form->getFieldsets('params');
?>

<div class="item-page">
    <h1>Форма обратной связи!</h1>
 <?php //echo "var_dump_this form=".var_dump($this->form); ?>
    <form id="order-registration" action="<?php echo JRoute::_('index.php?option=com_order&task=registration.register'); ?>" method="post" class="form-validate form-horizontal well" enctype="multipart/form-data">
<h3>форма обратной связи</h3>
   <div class="row-fluid">
      <div class="span12 form-horizontal">
         <div class="tab-content">
            <div class="tab-pane active" id="general">
               <fieldset class="adminform">
                  <div class="row-fluid">
                     <?php foreach ($this->form->getFieldset('details') as $field): ?>
                        <div class="control-group form-inline">
                           <div class="control-label">
                              <?php echo $field->label; ?>
                           </div>   
                           <div class="controls">
                              <?php echo $field->input; ?>
                           </div>   
                        </div>   
                     <?php endforeach; ?>
                  </div>
               </fieldset>
            </div>
         </div>
      </div>
   </div>
      <div class="control-group">
         <div class="controls">
            <button type="submit" class="btn btn-primary validate"><?php echo JText::_('JREGISTER');?></button>
            <a class="btn" href="<?php echo JRoute::_('');?>" title="<?php echo JText::_('JCANCEL');?>"><?php echo JText::_('JCANCEL');?></a>
            
            <input type="hidden" name="task" value="registration.register" />
            
         </div>
      </div>
      <?php echo JHtml::_('form.token');?>
    </form>
</div>[/spoiler]

*

Оффлайн SmokerMan

ну судя по этому
Цитировать
* @param array $data
я так понимаю там должен быть массив, а не объект и странно что это не вызывает ошибки

*

Оффлайн Septdir

table бы тоже глянуть не мешало.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты: Сайт | skype:septdir | Telegram | VK | Facebook | Twiter | Все контакты

*

Оффлайн GuDeVic

ну судя по этомуя так понимаю там должен быть массив, а не объект и странно что это не вызывает ошибки
Спасибо! Переделала:[spoiler]
//Заносим данные в таблицу
   $table->bind( $data ); //устанавливаем данные в поля
   $table->state=1;
   $table->state_order=1;
   $table->user_id=$userId ;
   $table->date_order=$myDate;
[/spoiler]
Сохранилось все, кроме даты.
Неправильно так текущую дату-время задавать?
[spoiler]
jimport('joomla.utilities.date');
// получаем текущую дату и время
$myDate = gmdate();
$table->date_order=$myDate;
[/spoiler]

*

Оффлайн SmokerMan

Неправильно так текущую дату-время задавать?
ну смотря какой тип поля стоит в базе если datetime, то так
$date = JFactory::getDate()->toSql();

*

Оффлайн GuDeVic

ну смотря какой тип поля стоит в базе если datetime, то так
$date = JFactory::getDate()->toSql();
Именно datetime. Спасибо.
Если все в store() сохранилось, то можно прочесть id созданной записи? И возвращать в контроллер     if ( $table->store() ) {

        //возвращаем id созданной записи
$order_id=$table->id;
                //return true;
return $order_id;
    }
а в контроллере переход на просмотр введённой записи по возвращённому $order_id
// Flush the data from the session.
$app->setUserState('com_order.registration.data', null);

$this->setMessage(JText::_('COM_ORDER_REGISTRATION_SAVE_SUCCESS'));
//$this->setRedirect(JRoute::_('index.php?option=com_order&view=registration&layout=complete', false));
$this->setRedirect(JRoute::_('index.php?option=com_order&view=profile&id='.$order_id, false));
return true;
Но что-то как-то не получается.

*

Оффлайн SmokerMan

Но что-то как-то не получается.
нам видно стоит гадать из этого куска кода, откуда в контроллере взялась переменная $order_id


*

Оффлайн Septdir

Я думаю проще будет если ts кинет компонент целиком, чтобы поставить да пощупать. Частенько бывает что ошибки в самых неожиданных местах
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты: Сайт | skype:septdir | Telegram | VK | Facebook | Twiter | Все контакты

*

Оффлайн GuDeVic

нам видно стоит гадать из этого куска кода, откуда в контроллере взялась переменная $order_id
Э-э, виновата...
Это в контроллере
[spoiler]<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_users
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
// Include dependancy of the main controllerform class
jimport('joomla.application.component.controllerform');
//JLoader::register('OrderController', JPATH_COMPONENT . '/controller.php');

/**
 * Registration controller class for Order.
 *
 * @since  1.6
 */
class OrderControllerRegistration extends JControllerForm
{
   /**
    * Method to activate a order.
    *
    * @return  boolean  True on success, false on failure.
    *
    * @since   1.6
    */
   public function activate()
   {
      $user      = JFactory::getUser();
      $input     = JFactory::getApplication()->input;
      $uParams = JComponentHelper::getParams('com_order');


      $model = $this->getModel('Registration', 'OrderModel');
      $token = $input->getAlnum('token');

      // Check that the token is in a valid format.
      if ($token === null || strlen($token)!== 32)
      {
         JError::raiseError(403, JText::_('JINVALID_TOKEN'));

         return false;
      }

      // Attempt to activate the user.
      $return = $model->activate($token);

      // Check for errors.
      if ($return === false)
      {
         // Redirect back to the home page.
         $this->setMessage(JText::sprintf('COM_ORDER_REGISTRATION_SAVE_FAILED', $model->getError()), 'warning');
         $this->setRedirect('index.php');

         return false;
      }


      return true;
   }

   /**
    * Method to register a order.
    *
    * @return  boolean  True on success, false on failure.
    *
    * @since   1.6
    */
   public function register()
   {
      // Check for request forgeries.
      JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
      
   
      
      $app   = JFactory::getApplication();
      $model = $this->getModel('Registration', 'OrderModel');

      // Get the order data.
      $requestData = $this->input->post->get('jform', array(), 'array');

      // Validate the posted data.
      $form = $model->getForm();
      
      // Validate the posted data.
      $form = $model->getForm();

      if (!$form)
      {
         JError::raiseError(500, $model->getError());

         return false;
      }

      $data = $model->validate($form, $requestData);

      // Check for validation errors.
      if ($data === false)
      {
         // Get the validation messages.
         $errors = $model->getErrors();

         // Push up to three validation messages out to the order.
         for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
         {
            if ($errors[$i] instanceof Exception)
            {
               $app->enqueueMessage($errors[$i]->getMessage(), 'warning');
            }
            else
            {
               $app->enqueueMessage($errors[$i], 'warning');
            }
         }

                  
         // Save the data in the session.
         $app->setUserState('com_order.registration.data', $requestData);

         // Redirect back to the registration screen.
         $this->setRedirect(JRoute::_('index.php?option=com_order&view=registration', false));

         return false;
      }

      // Attempt to save the data.
      $return = $model->register($data);

      // Check for errors.
      if ($return === false)
      {
            // Save the data in the session.
         $app->setUserState('com_order.registration.data', $data);

         // Redirect back to the edit screen.
         $this->setMessage($model->getError(), 'warning');
         $this->setRedirect(JRoute::_('index.php?option=com_order&view=registration', false));

         return false;
      }

      // Flush the data from the session.
      $app->setUserState('com_order.registration.data', null);


      $this->setMessage(JText::_('COM_ORDER_REGISTRATION_SAVE_SUCCESS'));
      //$this->setRedirect(JRoute::_('index.php?option=com_order&view=registration&layout=complete', false));
   $this->setRedirect(JRoute::_('index.php?option=com_order&view=profile&id='.$order_id, false));


      return true;
   }
   

   
} [/spoiler]
Т.е. из модели, если всё благополучно сохранилось, возвращается $order_id (id сохранённой записи), и -> редирект на просмотр сохранённой записи $this->setRedirect(JRoute::_('index.php?option=com_order&view=profile&id='.$order_id, false));На всякий слйчай и модель с register($data)[spoiler]<?php

// No direct access
defined( '_JEXEC' ) or die;

/**
 * Model for edit/create current element
 * @author Tamara Guseva
 */
class OrderModelRegistration extends JModelAdmin
{
   /**
    * Method of loading the current form
    * @param Array $data
    * @param Boolean $loadData
    * @return Object form data
    */
   public function getForm( $data = array(), $loadData = true )
   {
      $form = $this->loadForm( '', 'registration', array( 'control' => 'jform', 'load_data' => $loadData ) );
      if ( empty( $form ) ) {
         return false;
      }
      return $form;
   }

   /**
    * Method of loading table for current item
    * @param Sting $type (name table)
    * @param String $prefix (prefix table)
    * @param Array $config
    * @return Tableform_messages
    */
   public function getTable( $type = 'Order', $prefix = 'OrderTable', $config = array() )
   {
      return JTable::getInstance( $type, $prefix, $config );
   }

   /**
    * Method of loading data to form
    * @return Object
    */
   protected function loadFormData()
   {
      $data = JFactory::getApplication()->getUserState( 'com_order.edit.registration.data', array() );
      if ( empty( $data ) ) {
         $data = $this->getItem();
      }
      return $data;
   }

   /**
    * save data
    * @param array $data
    * @return bool
    */
   public function register( $data )
   
   {
   
   
    //Получаем экземпляр таблицы order
    $table = $this->getTable( 'order' );
   $user      = JFactory::getUser();
   $userId      = $user->get('id');

    //Данные которые запишем в базу данных
   

    //Заносим данные в таблицу
   $table->bind( $data ); //устанавливаем данные в поля
// добавляем
   $table->state=1;
   $table->state_order=1;
   $table->user_id=$userId ;
   $date = JFactory::getDate()->toSql();
   $table->date_order=$date;
    //если удалось сохранить запись в базу данных то отправляем E-mail
    if ( $table->store() ) {

        //возвращаем id сохранённой записи
      $order_id=$table->id;
        //return true;
      return $order_id;
    }
    //Не удалось по какой то причине отправить сообщение
    return false;
   }

}[/spoiler]
Вообще-то возвращается * @return bool, а я  пытаюсь вернуть id. Как быть?

*

Оффлайн SmokerMan

Вообще-то возвращается * @return bool, а я  пытаюсь вернуть id. Как быть?
откуда там $order_id возьмется не известно, когда вместо нее видимо надо ставить $return
Цитировать
$return = $model->register($data);

*

Оффлайн GuDeVic

Странно, что не получается. $table->id как раз содержит ID созданной записи.
ID, скорее всего, и получается, но как его вернуть из функции, которая возвращает в контроллер bool?

*

Оффлайн GuDeVic

откуда там $order_id возьмется не известно, когда вместо нее видимо надо ставить $return
$return = $model->register($data);Это в котроллере надо, или в register в модели? Извините, конечно.

*

Оффлайн b2z

  • *****
  • 7740
  • [+]739 / [-]0
  • Пол: Мужской
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
ID, скорее всего, и получается, но как его вернуть из функции, которая возвращает в контроллер bool?
В модели перед return true;

Код: (php) [Выделить]
$this->setState($this->getName(). '.id', $table->$key);
В контроллере:
Код: (php) [Выделить]
$id = $model->getState($this->context . '.id');

*

Оффлайн SmokerMan

ID, скорее всего, и получается, но как его вернуть из функции, которая возвращает в контроллер bool?
Цитировать
    if ( $table->store() ) {

        //возвращаем id сохранённой записи
      $order_id=$table->id;
        //return true;
      return $order_id;
    }
где здесь boolean?
я выше дал ответ, в контроллере вместо $order_id надо ставить $return
$order_id - в контроллере вообще неопределенная переменная и должна вызывать предупреждение notice

*

Оффлайн GuDeVic

В модели перед return true;

Код: (php) [Выделить]
$this->setState($this->getName(). '.id', $table->$key);
В контроллере:
Код: (php) [Выделить]
$id = $model->getState($this->context . '.id');
Вот что в итоге:
Duplicate entry '454' for key 2 SQL=INSERT INTO `#__order` (`id`,`user_id`,`user_cod`,`tip`,`shifr`,`date_order`,`state_order`,`state`) VALUES ('','526','454','1','454','2016-12-05 15:01:21','1','1')

*

Оффлайн GuDeVic

А, дубль возник при повторном сохранении записи, там shifr д.б. уникальным

*

Оффлайн GuDeVic

где здесь boolean?
я выше дал ответ, в контроллере вместо $order_id надо ставить $return
$order_id - в контроллере вообще неопределенная переменная и должна вызывать предупреждение notice
я уже по совету b2z сделала исправления:
в модели    if ( $table->store() ) {

        //возвращаем true тем самым говоря что сообщение успешно отправлено
//$order_id=$table->id;
//return $order_id;
$this->setState($this->getName(). '.id', $table->$key);
return true;

    }
в контроллере:// Attempt to save the data.
$return = $model->register($data);

// Check for errors.
if ($return === false)
{
// Save the data in the session.
$app->setUserState('com_order.registration.data', $data);

// Redirect back to the edit screen.
$this->setMessage($model->getError(), 'warning');
$this->setRedirect(JRoute::_('index.php?option=com_order&view=registration', false));

return false;
}
$id = $model->getState($this->context . '.id');
// Flush the data from the session.
$app->setUserState('com_order.registration.data', null);


$this->setMessage(JText::_('COM_ORDER_REGISTRATION_SAVE_SUCCESS'));
$this->setRedirect(JRoute::_('index.php?option=com_order&view=profile&id='.$id, false));
return true;
запись сохраняется, но редиректа на profile нет : index.php?option=com_order&view=registration&Itemid=236 -
Сайт xxx.ru пока не может обработать этот запрос.
HTTP ERROR 500


*

Оффлайн GuDeVic

Ну почему $return приходит как false. Отладка, отладка и ещё раз отладка.
Вот закомментировала в модели перед return true;
$this->setState($this->getName(). '.id', $table->$key);и все худо-бедно заработало, т.е. нет перехода по id в profile.
Что-то неправильно в закомментированной команде? Я её просто скопировала из Вашего поста.


*

Оффлайн GuDeVic

$table->$key заменить на $table->id
Спасибо большое! Теперь все работает.
У меня ещё вопрос.
У меня десять типов записей (заявок). Когда я обращаюсь к конкретной записи (для просмотра или редактирования) из списка записей, то я знаю тип этой записи, и в модели подставляю нужную форму.
Но когда надо создать новую запись - как это лучше сделать? В рамках компонента я сделала ещё одно представление, которое, никак не связано ни с какими таблицами - просто выводится
форма с селектом
[spoiler]
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_order
 */

defined('_JEXEC') or die;
JHtml::_('bootstrap.tooltip');

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidator');
?>
<div class="registration<?php echo $this->pageclass_sfx?>">
<form id="select-registration" action="<?php echo JRoute::_('index.php?option=com_order&view=registration'); ?>" method="post" class="form-validate form-horizontal well" enctype="multipart/form-data">
   <div class="js-stools-container-filters hidden-phone clearfix shown" style="display: block;" >
      <div class="js-stools-field-filter" >
            <select name="filter_tip" id="filter_tip" class="inputbox" style="width: 400px;" >
         
<option value=””>-укажите тип заявки-</option>
<option value=”1”>Заявка на измерение методом ЯМР</option>
<option value=”2”>Заявка на масс-спектроскопию высокого разрешения</option>
<option value=”3”>Заявка на ИК-спектроскопию</option>
<option value=”4”>Заявка на масс-спектроскопию высокого разрешения</option>
<option value=”5”>Заявка на электронный микроскоп</option>
<option value=”6”>Заявка на поляриметр</option>
<option value=”7”>Заявка на флуориметр</option>
<option value=”8”>Заявка на микроанализ</option>
<option value=”9”>Заявка на ВЭЖХ-МСД анализ</option>
<option value=”10”>Заявка на газовую хромато-масс-спектрометрию</option>

            </select>
         </div>
      </div>
   
      <div style="clear:both;"></div>
      
      <br /><br />
      
      <div class="control-group">
         <div class="controls">
            <button type="submit" class="btn btn-primary validate"><?php echo JText::_('JREGISTER');?></button>
            <a class="btn" href="<?php echo JRoute::_('');?>" title="<?php echo JText::_('JCANCEL');?>"><?php echo JText::_('JCANCEL');?></a>
            <input type="hidden" name="option" value="com_order" />
            <input type="hidden" name="task" value="registration" />
         </div>
      </div>
      <?php echo JHtml::_('form.token');?>
</form>
[/spoiler]
Как получить значение выбранного типа заявки (filter_tip) в модели registration при выборе формы для метода getForm?
Когда известен тип записи, то getForm такой[spoiler]   public function getForm($data = array(), $loadData = true)
   {
        $input = JFactory::getApplication()->input;
        // Устанавливаем форму в зависимости от типа заявки.
      $this->form = $this->getItem( $input->getInt('id', 0))->tip;
      // Get the form.
      $form = $this->loadForm(
        'com_order.' . $this->form, $this->form, array('control' => 'jform', 'load_data' => $loadData)
      );
       if (empty($form))
      {
         return false;
      }
      return $form;
   }[/spoiler]

*

Оффлайн b2z

  • *****
  • 7740
  • [+]739 / [-]0
  • Пол: Мужской
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Тип заявки - это составляющая часть самой заявки? Если так, то лучше сделать своё поле "Тип заявки" и выводить его в форме заявки.

*

Оффлайн GuDeVic

Тип заявки - это составляющая часть самой заявки? Если так, то лучше сделать своё поле "Тип заявки" и выводить его в форме заявки.
Тип заявки - составляющая часть заявки (по ней я и ориентируюсь, выводя конкретную запись для просмотра и редактирования) и поле тип заявки, разумеется, есть. Но этот тип заявки и определяет форму самой заявки. При этом в некоторых заявках разного типа некоторые поля могут быть одинаковыми, а есть специфические. Т.е. нельзя в в одном xml-файле сделать fieldset's для каждого типа заявки и выводить из после выбора типа заявки. Вернее, можно, но, практически вручную, а полей довольно много. Поэтому лучше просто создать 10 XML файлов и подставлять в соответствии с типом заявки. Что я и делаю, когда имею дело (пардон за тавтологию) с конкретной записью с конкретным типом. Хотелось бы и при создании новых записей иметь такой же механизм - из независимой формы из списка типов заявок получить значение  выбранного типа и подставлять нужную форму (xml-файл). Из этой формы (id=select-registratio) посылаю методом post значение filter_tip, а как его прочесть в модели для registration в getForm?


*

Оффлайн GuDeVic

Может такое https://docs.joomla.org/Subform_form_field_type
Да, это всё полезная информация, спасибо.
Но у меня другой вопрос. Можно ли в контроллере или модели registration (для создания новой записи) получить значение поля c id=filer_tip из формы другого представления (где просто выбирается тип заявки)[spoiler]
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_order
 */

defined('_JEXEC') or die;
JHtml::_('bootstrap.tooltip');

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidator');
?>
<div class="registration<?php echo $this->pageclass_sfx?>">

<form id="select-registration" action="<?php echo JRoute::_('index.php?option=com_order&view=registration'); ?>" method="post" class="form-validate form-horizontal well" enctype="multipart/form-data">
   <div class="js-stools-container-filters hidden-phone clearfix shown" style="display: block;" >
      <div class="js-stools-field-filter" >
            <select name="filter_tip" id="filter_tip" class="inputbox" style="width: 400px;" >
         
<option value=””>-укажите тип заявки-</option>
<option value=”1”>Заявка на измерение методом ЯМР</option>
<option value=”2”>Заявка на масс-спектроскопию высокого разрешения</option>
<option value=”3”>Заявка на ИК-спектроскопию</option>
<option value=”4”>Заявка на масс-спектроскопию высокого разрешения</option>
<option value=”5”>Заявка на электронный микроскоп</option>
<option value=”6”>Заявка на поляриметр</option>
<option value=”7”>Заявка на флуориметр</option>
<option value=”8”>Заявка на микроанализ</option>
<option value=”9”>Заявка на ВЭЖХ-МСД анализ</option>
<option value=”10”>Заявка на газовую хромато-масс-спектрометрию</option>

            </select>
         </div>
      </div>
   
      <div style="clear:both;"></div>
      
      <br /><br />
      
      <div class="control-group">
         <div class="controls">
            <button type="submit" class="btn btn-primary validate"><?php echo JText::_('JREGISTER');?></button>
            <a class="btn" href="<?php echo JRoute::_('');?>" title="<?php echo JText::_('JCANCEL');?>"><?php echo JText::_('JCANCEL');?></a>
            <input type="hidden" name="option" value="com_order" />
            <input type="hidden" name="task" value="registration" />
         </div>
      </div>
      <?php echo JHtml::_('form.token');?>
</form>
[/spoiler]

*

Оффлайн robert

Почему не скрыть по-умолчанию все "специфические" поля и показать только нужные в зависимости от значения filer_tip?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн b2z

  • *****
  • 7740
  • [+]739 / [-]0
  • Пол: Мужской
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Цитировать
Можно ли в контроллере или модели registration (для создания новой записи) получить значение поля c id=filer_tip из формы другого представления (где просто выбирается тип заявки)
Ну чтобы что-то показать, нужно сначал выбрать этот типа. Тут либо в два шага, либо аяксом подгружать форму в зависимости от выбранного типа заявки.

*

Оффлайн GuDeVic

Ну чтобы что-то показать, нужно сначал выбрать этот типа. Тут либо в два шага, либо аяксом подгружать форму в зависимости от выбранного типа заявки.
Так я и хочу сделать выбор типа заявки в одной форме (просто задать значение) (форму уже выкладывала) и перейти из этой формы   <input type="hidden" name="option" value="com_order" />
            <input type="hidden" name="task" value="registration" />
в форму регистрации и там (в контроллере?, в модели?) предварительно получить выбранное значение типа заявки. Конечно, можно в самой форме выбрать тип формы и по этому событию формировать поля формы (хоть вручную, хоть с суб-формами).
Я, может быть, не могу правильно сформулировать свой вопрос. Мне хотелось бы получить значение, выбранное в селекте одной независимой формы (где кроме этого селекта ничего нет и она не связана с таблицей) и получить это значение для начала регистрации.

*

Оффлайн GuDeVic

Почему не скрыть по-умолчанию все "специфические" поля и показать только нужные в зависимости от значения filer_tip?
Вопрос как получить это самое значение filer_tip, а не в том как скрывать или раскрывать поля.