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

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Валидация в frontend
« : 31.01.2015, 12:04:26 »
Здравствуйте, мой код в админке модели
Код
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
 
// Подключаем библиотеку modeladmin Joomla.
jimport('joomla.application.component.modeladmin');
 
/**
 * Модель HelloWorld.
 */
class ApartmentModelApartment extends JModelAdmin
{
    /**
     * Возвращает ссылку на объект таблицы, всегда его создавая.
     *
     * @param   string  $type    Тип таблицы для подключения.
     * @param   string  $prefix  Префикс класса таблицы. Необязателен.
     * @param   array   $config  Конфигурационный массив. Необязателен.
     *
     * @return  JTable  Объект JTable.
     */
    public function getTable($type = 'Apartment', $prefix = 'ApartmentTable', $config = array())
    {
        return JTable::getInstance($type, $prefix, $config);
    }
 
 
    /**
     * Метод для получения формы.
     *
     * @param   array    $data      Данные для формы.
     * @param   boolean  $loadData  True, если форма загружает свои данные (по умолчанию), false если нет.
     *
     * @return  mixed  Объект JForm в случае успеха, в противном случае false.
     */
    public function getForm($data = array(), $loadData = true)
    {
        
          JForm::addFormPath(JPATH_COMPONENT_ADMINISTRATOR . '/models/forms');
          
        // Получаем форму.
        $form = $this->loadForm(
             'com_apartment.apartment', 'apartment', array('control' => 'jform', 'load_data' => $loadData)
        );                   // название модели а не записи message все правильно написано


        if (empty($form))
        {
            return false;
        }
        
 
      $jinput = JFactory::getApplication()->input;
// The front end calls this model and uses a_id to avoid id clashes so we need to check for that first.
if ($jinput->get('id'))
{
$id = $jinput->get('id', 0);
}
// The back end uses id so we use that the rest of the time and set it to 0 by default.
else
{
$id = $jinput->get('id', 0);
}
         //$id = JFactory::getApplication()->input->get('id', 0);
         $user = JFactory::getUser();
         // Изменяем форму исходя из доступов пользователя.
         if ($id != 0 && (!$user->authorise('core.edit.state', 'com_apartment.message.' . (int) $id))
         || ($id == 0 && !$user->authorise('core.edit.state', 'com_apartment')))
         {
            // Модифицируем поля.
            $form->setFieldAttribute('state', 'disabled', 'true');
         }        
        
        return $form;
    }
 

    /**
     * Метод для получения данных, которые должны быть загружены в форму.
     *
     * @return  mixed  Данные для формы.
     */
    protected function loadFormData()
    {
        // Проверка сессии на наличие ранее введеных в форму данных.
        $data = JFactory::getApplication()->getUserState('com_apartment.edit.apartment.data', array());
        
        if (empty($data))
        {
            $data = $this->getItem();
        }
 
        if($data->opcii)
{
            $data->opcii =explode(',',$data->opcii);
        }  

        if($data->infstrukt)
{
            $data->infstrukt = explode(',',$data->infstrukt);
        }  
        
        if($data->vid_uslug)
{
            $data->vid_uslug =explode(',',$data->vid_uslug);
        }  


        return $data;
    }


    public function validate($form, $data, $group = null)
{
        if (isset($_POST['arenda']))
        {
              $data['arenda_ed']=implode(',',$_POST['arenda']);  
            
        }
        
        $db = JFactory::getDbo();
        // Конструируем SQL запрос.
        $query = $db->getQuery(true);
        $query->select('*')
                ->from('#__categories')
                ->where('id='.$data['catid']);
        $db->setQuery($query);
        $category = $db->loadRow();      
      
      // меняем required поля
      
       if ($category[8]=='Квартиры' || $category[8]=='Дома')
       {
         $form->setFieldAttribute('vid_uslug', 'required', 'false');
       }
       elseif ($category[8]=='Отели')
       {
         $form->setFieldAttribute('tip_adv', 'required', 'false');
         $form->setFieldAttribute('S', 'required', 'false');
         $form->setFieldAttribute('etag', 'required', 'false');
         $form->setFieldAttribute('hometag', 'required', 'false');
         $form->setFieldAttribute('god', 'required', 'false');
         $form->setFieldAttribute('komnat', 'required', 'false');
         $form->setFieldAttribute('vid_uslug', 'required', 'false');
       }
       elseif($category[8]=='Торговая площадь')
       {
         $form->setFieldAttribute('god', 'required', 'false');
         $form->setFieldAttribute('komnat', 'required', 'false');
         $form->setFieldAttribute('vid_uslug', 'required', 'false');
       }
       elseif($category[8]=='Земля, склады')
       {
         $form->setFieldAttribute('etag', 'required', 'false');
         $form->setFieldAttribute('hometag', 'required', 'false');
         $form->setFieldAttribute('god', 'required', 'false');
         $form->setFieldAttribute('komnat', 'required', 'false');
         $form->setFieldAttribute('vid_uslug', 'required', 'false');
       }
       elseif($category[8]=='Услуги' || $category[8]=='Магазины')
       {
         $form->setFieldAttribute('tip_adv', 'required', 'false');
         $form->setFieldAttribute('S', 'required', 'false');
         $form->setFieldAttribute('etag', 'required', 'false');
         $form->setFieldAttribute('hometag', 'required', 'false');
         $form->setFieldAttribute('god', 'required', 'false');
         $form->setFieldAttribute('komnat', 'required', 'false');
         $form->setFieldAttribute('cena', 'required', 'false');          
       }
        
         $return = parent::validate($form, $data, $group);
  if ($return === false) {
return false;
 }

  return $return;

    }


public function save($data)
{
        
if (isset($data['opcii']) && !empty($data['opcii']) )
{
  if (is_array($data['opcii']))
  {
             $data['opcii']=implode(',',$data['opcii']);
  }
        }
        else
        {
            $data['opcii']='';
        }


if (isset($data['infstrukt']) && !empty($data['infstrukt']) )
{
  if (is_array($data['infstrukt']))
           {
            $data['infstrukt'] = implode(',',$data['infstrukt']);
  }
        }
        else
        {
            $data['infstrukt']='';
        }
        
        
if (isset($data['vid_uslug']) && !empty($data['vid_uslug']))
{
 if (is_array($data['vid_uslug']))
          {
            $data['vid_uslug'] =implode(',',$data['vid_uslug']);
          }  
}
        else
        {
           $data['vid_uslug']='';
        }
      
      
    
        if (parent::save($data))
{
           return true;
        }

        return false;  
    }


      
/**
     * Метод для проверки, может ли пользователь удалять существующую запись.
     *
     * @param   object  $record  Объект записи.
     *
     * @return  boolean  True, если разрешено удалять запись.
     */
    protected function canDelete($record)
    {
        if (!empty($record->id))
        {
            return JFactory::getUser()->authorise('core.delete', $this->option . '.message.' . (int) $record->id);
        }
        else
        {
            return parent::canDelete($record);
        }
    }
    
    
   /**
    * Метод для проверки, может ли пользователь изменять состояние записи. т.е. опубликовано не опубликовано
    *
    * @param   object  $record  Объект записи.
    *
    * @return  boolean  True, если разрешено  изменять состояние записи.
   */
   protected function canEditState($record)
   {
      $user = JFactory::getUser();
 
       if (!empty($record->id))
       {
          return $user->authorise('core.edit.state', $this->option . '.message.' . (int) $record->id);
       }
       elseif (!empty($record->catid))
       {
          return $user->authorise('core.edit.state', $this->option . '.category.' . (int) $record->catid);
       }
       else
       {
          return parent::canEditState($record);
       }
    }    
    
}    

Frontend модель в ней подключаю модель админки выше
Код
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 *
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;


/**
 * Content Component Article Model
 *
 * @package     Joomla.Site
 * @subpackage  com_content
 * @since       1.5
 */
// Base this model on the backend version.
require_once JPATH_ADMINISTRATOR.'/components/com_apartment/models/apartment.php';
 
/**
 * UpdHelloWorld Model
 */
class ApartmentModelItem extends ApartmentModelApartment
{

/**
* Method to auto-populate the model state.
*
* Note. Calling getState in this method will result in recursion.
*
* @return  void
*
* @since   1.6
*/
protected function populateState()
{
$app = JFactory::getApplication();

// получаем id из url
$pk = $app->input->getInt('id');
$this->setState('message.id', $pk);

$this->setState('message.catid', $app->input->getInt('catid'));

$return = $app->input->get('return', null, 'base64');
$this->setState('return_page', base64_decode($return));

// Добавляем параметры в состояние модели.
$params = $app->getParams();
$this->setState('params', $params);

$this->setState('layout', $app->input->getString('layout'));
}




  /**
* Method to get article data.
*
* @param   integer  $itemId  The id of the article.
*
* @return  mixed  Content item data object on success, false on failure.
*/
public function getItem($itemId = null)
{
$itemId = (int) (!empty($itemId))? $itemId : $this->getState('message.id');

// Получаем экземпляр строки.
$table = $this->getTable();

// Попытка загрузить строку
$return = $table->load($itemId);

// Проверьте наличие ошибок таблице объекта.
if ($return === false && $table->getError())
{
$this->setError($table->getError());

return false;
}


$properties = $table->getProperties(1);
$value = JArrayHelper::toObject($properties, 'JObject');

         // Создаем JSON строку параметров.
$value->params = new JRegistry;

// Получение разрешений.
$user = JFactory::getUser();
$userId = $user->get('id');
$asset = 'com_apartment.message.' . $value->id;

// Check general edit permission first.
if ($user->authorise('core.edit', $asset))
{
$value->params->set('access-edit', true);
}

// Now check if edit.own is available.
elseif (!empty($userId) && $user->authorise('core.edit.own', $asset))
{
// Check for a valid user and that they are the owner.
if ($userId == $value->created_by)
{
$value->params->set('access-edit', true);
}
}

// Check edit state permission.
if ($itemId)
{
// Existing item
$value->params->set('access-change', $user->authorise('core.edit.state', $asset));
}
else
{
// New item.
$catId = (int) $this->getState('message.catid');

if ($catId)
{
$value->params->set('access-change', $user->authorise('core.edit.state', 'com_apartment.category.' . $catId));
$value->catid = $catId;
}
else
{
$value->params->set('access-change', $user->authorise('core.edit.state', 'com_apartment'));
}
}
        
        
        if (JRequest::getVar('catid')!='')
        {
           $catalias= JRequest::getVar('catid');
           $db = JFactory::getDbo();
           // Конструируем SQL запрос.
           $query = $db->getQuery(true);
           $query->select('*')
                ->from('#__categories')
                ->where('alias='.$db->quote($catalias));
          $db->setQuery($query);
          $item = $db->loadObject();
        }
        
        $value->catid=$item->id;

return $value;
}

}


В контроллере прописываю сохранение так, но валидация не происходит, оставляю обязательное поле пустым и все равно сохраняет, в админке все проходит норм, валидация нужна на стороне сервера, без javascript, подскажите в чем проблема, в инете только про валидацию на javascript в frontend, а на стороне сервера нет вот и делаю по аналогии с админкой
Код
public function save()
 {
    
     JRequest::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
     $return=base64_decode(JRequest::getVar('return','','post'));
// Initialise variables.
$app = JFactory::getApplication();
// Get the data from the form POST
$data = JRequest::getVar('jform', array(), 'post', 'array');
     $model = $this->getModel('item');
        
        $form=$model->getForm($data,false);
        $validate=$model->validate($form,$data);
        
        
        // Now update the loaded data to the database via a function in the model
        $upditem = $model->save($data);
 
     // check if ok and display appropriate message.  This can also have a redirect if desired.
        if ($upditem) {
            $this->setRedirect(JRoute::_('index.php?option=com_apartment&view=cabinet'));
        } else {
            $this->setRedirect($return);
        }
 
 }
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Re: Валидация в frontend
« Ответ #1 : 31.01.2015, 12:18:10 »
Валидация в frontend
валидация нужна на стороне сервера, без javascript,
это как бы разные вещи :)

ну так с чего она будет?
ну есть что-то такое
Цитировать
$validate=$model->validate($form,$data);
которое судя по всему должно возвращать boolean и в зависимости от этого как я понял уже надо сохранять или не сохранять и делать соответствующий редирект

а дальше идет
Цитировать
$upditem   = $model->save($data);
пофиг что возвращает $validate

*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Валидация в frontend
« Ответ #2 : 31.01.2015, 12:21:56 »
поправил все равно не работает

Код
public function save()
 {
   
     JRequest::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
     $return=base64_decode(JRequest::getVar('return','','post'));
// Initialise variables.
$app = JFactory::getApplication();
// Get the data from the form POST
$data = JRequest::getVar('jform', array(), 'post', 'array');
    $model = $this->getModel('item');
       
        $form=$model->getForm($data,false);
        $validate=$model->validate($form,$data);
        if ($validate){
            $this->setRedirect(JRoute::_('index.php?option=com_apartment&view=cabinet'));
        } else {
            $this->setRedirect($return);
        }
       
        // Now update the loaded data to the database via a function in the model
        $upditem = $model->save($data);
 
    // check if ok and display appropriate message.  This can also have a redirect if desired.
        if ($upditem) {
            $this->setRedirect(JRoute::_('index.php?option=com_apartment&view=cabinet'));
        } else {
            $this->setRedirect($return);
        }
 
 }
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Re: Валидация в frontend
« Ответ #3 : 31.01.2015, 12:24:59 »
поправил все равно не работает
что не работает? :)
Код
$validate=$model->validate($form,$data); 
//проверяем, если проверка прошла, то сохраняем
if ($validate) {
$upditem = $model->save($data);
....
} else {
//если нет чего-то там делаем
...
}
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Валидация в frontend
« Ответ #4 : 31.01.2015, 13:04:07 »
спс
что не работает? :)
Код
$validate=$model->validate($form,$data); 
//проверяем, если проверка прошла, то сохраняем


if ($validate) {
$upditem = $model->save($data);
....
} else {
//если нет чего-то там делаем
...
}

спс помогло+1, а как сделать чтобы вывелось какие поля не заполнены,   <jdoc:include type="message" /> в шаблоне есть, но ничего не выводит
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Валидация в frontend
« Ответ #5 : 31.01.2015, 13:06:17 »
чуточку в сторону: а чем не подходит jquery.validation?
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Валидация в frontend
« Ответ #6 : 31.01.2015, 13:11:08 »
мало ли вдруг в браузере будет отключен jquery
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Re: Валидация в frontend
« Ответ #7 : 31.01.2015, 13:30:31 »
а как сделать чтобы вывелось какие поля не заполнены,   <jdoc:include type="message" /> в шаблоне есть, но ничего не выводит
ну видимо надо установить это сообщение, как-то так
Код
if ($validate) {
$upditem = $model->save($data);
....
} else {
//если нет чего-то там делаем
$this->setRedirect($return, $model->getError(), 'error');
}
а там что модель возвращает надо уже смотреть, стандартно вроде ошибку должна вернуть
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Валидация в frontend
« Ответ #8 : 31.01.2015, 13:50:51 »
ну видимо надо установить это сообщение, как-то так
Код
if ($validate) {
$upditem = $model->save($data);
....
} else {
//если нет чего-то там делаем
$this->setRedirect($return, $model->getError(), 'error');
}
а там что модель возвращает надо уже смотреть, стандартно вроде ошибку должна вернуть
она возвращает не заполненное поле и еще кучу всего, а как толькочтобы выводило не заполненные поля
Код
exception 'RuntimeException' with message 'Требуется поле: COM_APARTMENT_FIELD_S_LABEL' in C:\home\kvmetr.kz\www\libraries\joomla\form\form.php:1918 Stack trace: #0 C:\home\kvmetr.kz\www\libraries\joomla\form\form.php(1160): JForm->validateField(Object(SimpleXMLElement), '', NULL, Object(JRegistry)) #1 C:\home\kvmetr.kz\www\libraries\legacy\model\form.php(296): JForm->validate(Array, NULL) #2 C:\home\kvmetr.kz\www\administrator\components\com_apartment\models\apartment.php(171): JModelForm->validate(Object(JForm), Array, NULL) #3 C:\home\kvmetr.kz\www\components\com_apartment\models\item.php(167): ApartmentModelApartment->validate(Object(JForm), Array, NULL) #4 C:\home\kvmetr.kz\www\components\com_apartment\controllers\apartment.php(256): ApartmentModelItem->validate(Object(JForm), Array) #5 C:\home\kvmetr.kz\www\libraries\legacy\controller\legacy.php(722): ApartmentControllerApartment->save() #6 C:\home\kvmetr.kz\www\components\com_apartment\apartment.php(13): JControllerLegacy->execute('save') #7 C:\home\kvmetr.kz\www\libraries\cms\component\helper.php(352): require_once('C:\home\kvmetr....') #8 C:\home\kvmetr.kz\www\libraries\cms\component\helper.php(332): JComponentHelper::executeComponent('C:\home\kvmetr....') #9 C:\home\kvmetr.kz\www\libraries\cms\application\site.php(178): JComponentHelper::renderComponent('com_apartment') #10 C:\home\kvmetr.kz\www\libraries\cms\application\site.php(208): JApplicationSite->dispatch() #11 C:\home\kvmetr.kz\www\libraries\cms\application\cms.php(255): JApplicationSite->doExecute() #12 C:\home\kvmetr.kz\www\index.php(40): JApplicationCms->execute() #13 {main}
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Re: Валидация в frontend
« Ответ #9 : 31.01.2015, 14:00:53 »
Код
$errors = $model->getErrors();
$msgs = array();
for ($i = 0, $n = count($errors); $i < $n; $i++)
{
if ($errors[$i] instanceof Exception)
{
    $msgs[] = $errors[$i]->getMessage();
}
else
{
$msgs[] = $errors[$i];
}
}
$this->setRedirect($return, implode('<br />', $msgs), 'error');
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Валидация в frontend
« Ответ #10 : 31.01.2015, 14:03:54 »
Код
$errors = $model->getErrors();
$msgs = array();
for ($i = 0, $n = count($errors); $i < $n; $i++)
{
if ($errors[$i] instanceof Exception)
{
    $msgs[] = $errors[$i]->getMessage();
}
else
{
$msgs[] = $errors[$i];
}
}
$this->setRedirect($return, implode('<br />', $msgs), 'error');
Супер спасибо большое!+1 добавлю через час, а то не дает форум
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Валидация формы

Автор tm2010

Ответов: 2
Просмотров: 704
Последний ответ 28.12.2017, 12:06:49
от tm2010
frontEnd, После сохранения перенаправить на другой вид

Автор platonische

Ответов: 3
Просмотров: 866
Последний ответ 04.04.2016, 19:53:42
от robert
Модель BackEnd для FrontEnd

Автор platonische

Ответов: 3
Просмотров: 883
Последний ответ 22.03.2016, 13:46:47
от platonische
Валидация формы на стророне сервера. Ответ с указанием ошибочных полей

Автор zaboich

Ответов: 0
Просмотров: 1318
Последний ответ 19.01.2015, 15:08:24
от zaboich
Сохранение frontend

Автор spirit1086

Ответов: 1
Просмотров: 1004
Последний ответ 16.12.2014, 17:01:02
от b2z