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

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
Уважаемые Гуру
Строго не судите, очень слаб в компонентах, поэтому возможно вопрос покажется глупым
имеют list view аренда квартир, view каждой квартиры, ее занятость цена и тд все вроде, укладывается в модель MVC
Теперь , грубо говоря на этапе выбора квартиры нужно дать возможность ее забронировать, тоесть во view нужно ввести часть полей записи запроса на бронирование(Имя дата ,телефон, показать цену и тд)
Модель и view запроса на бронирование в админке сделал, просто чтобы была возможность редактировать.
А на фронте не понимаю как правильно, по инерции сделал дополнительный view  квартиры c какими-то полями для показа параметров квартиры, но тут же надо заполнить форму запроса на бронирование.
Можно ли скажем  использовать form-ы и  поля заготовленные в модели запроса на бронирование или просто тупо нарисовать форму с нужными полями и вручную сохранить? имею минимальный опыт работы с формами.
Тоесть, хотелось бы иметь максимальную проверку полей от джумлы , но не знаю как сделать это в чужом view (квартир)
или правильно делать модель записей бронирования и минуя view (тоже ни разу не делал такого), как то добавлять новую запись.
 
Может есть какие либо примеры где посмотреть
Спасибо заранее.любое мнение интересно.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
По логике MVC у вас должно быть два разных вида
1. Вид это ваш список квартир
2. вид формы бронирования

Форму из другой модели можно дёрнуть аяксом..
И в форму можно динамично строить с любыми полями )
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
И в форму можно динамично строить с любыми полями )
Спасибо.дернуть аяксом ... тоесть Joomla будет осуществлять проверку полей? ( я их сформировал в component creator). Примерчик бы какой, аяксом умею простейшие вещи типа загрузать raw формат из другой модели, без проверки.
Хотя...

Составляю простейшую форму где проставляю необходимые поля , и подтягиваю аяксом как обычный едит, только create сообразить как сделать
Спасибо большое :D :D :D :D :laugh:

« Последнее редактирование: 27.11.2017, 19:46:56 от tm2010 »
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
 >
По логике MVC у вас должно быть два разных вида
1. Вид это ваш список квартир
2. вид формы бронирования

Форму из другой модели можно дёрнуть аяксом..
И в форму можно динамично строить с любыми полями )
Алекс , в общем как всегда - запутался в собственных соплях и не могу найти причину, до аякса дело не дошло.
поскольку довольно слаб в кишочках Joomla, надергал из интернета решений создал вид который как то работал ( тоесть сохранял в базу данных записи запросов, но с проверкой полей уперся, сейчас уже не помню причину.
поскольку делал урывками, чтото поломал и сейчас "добился" того что мой вид - заполнения и сохранения формы
ни черта не делает - тоесть не сохраняет.
поскольку искал на англоязычных сайтах , не сразу нашел Ваш конструктор компонентов, где вы описываете как сделать форму обратной связи. Сделал компонент - работает. Практически все уже переписал из него в свой - после нажатия на кнопку сохранить не запускается в модели метод save , где у вас сохранение и отправка почты
Вы не взгляните ?
view
Спойлер
[свернуть]

модель
Спойлер
[свернуть]

Контроллер
Спойлер
[свернуть]

Трассировка показывает что в модели выполняются функции getTable,getForm  до save дело не доходит
посмотреть как это работает можно на http://apartment-rentals-budapest.com/component/rentflat/clientbrequest
где-то я думаю проморгал разницу между именем компонента и именем вида, или еще что-то более важное, чего я не понимаю >:(
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
у вас не хватает <input type="hidden" name="option" value="com_rentflat" />
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
у вас не хватает <input type="hidden" name="option" value="com_rentflat" />
Поставил в default.php
Спойлер
[свернуть]

действия не возымело, в default.php сгенерированным вашим конструктором, такого по-моему тоже нет
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Попробуйте так:
 <form action="<?php echo JRoute::_( 'index.php' )?>" method="post" class="form-validate">
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
<form action="<?php echo JRoute::_( 'index.php' )?>" method="post" class="form-validate">
Спойлер
[свернуть]

я туда еще положил в корень ваш router.php что был сгенерирован вашим конструктором не особо понимая что он делает.
Убрал сейчас тоже. тоже никакого эффекта
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
а вы уверенны что метод save не срабатывает?
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
Да, Vim debug  ставлю брейки на разных функциях модели, первая getTable, вторая getForm
save не работает.

и очень непонятно что после нажатия на save рабочий URL становится из классического
/index.php?option=com_rentflat&view=clientbrequest&layout=edit
в - component/rentflat/?view=clientbrequest&layout=edit
как левая часть - component/rentflat/ - ктото rewrite делает?
так и правая &layout=edit я во фронте компонента сейчас не нашел, постирал
чего его туда кидает этот view?  не пойму
думаю взять ваш компонент, сгенеренный конструктором и переписать его аккуратно под свои нужды, можно недели потратить на  поиски глупой ошибки
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
На функциях модели это всё хорошо, но для начала сделайте в контроллере:
public function save(){
die('correct');
}
и скажите или сработало
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
На функциях модели это всё хорошо, но для начала сделайте в контроллере:
public function save(){
die('correct');
}
и скажите или сработало
> хорошо попробую попозже, сейчас убегаю

мне кажется  лучше с помощью вашего конструктора сделать  com_rentflat учебный с двумя view 1- дефолтный а второй вот с этой хрень - brequests
скорее всего я чтото гдето неправильно по конвенциям Joomla не переименовал или наоборот переименовал
только я непонял, можно ли в ваших таблицах создать только свои поля?
ps по форуму? можно ли в настройках аккаунта сделать послать по  почте нотификацию, что то не нашел
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
собственно сделал
результат в URL
в контроллере  save срабатывает и после выдает вот такие ворнинги:

Warning: Declaration of RentflatControllerClientbrequest::allowSave() should be compatible with Joomla\CMS\MVC\Controller\FormController::allowSave($data, $key = 'id') in /var/www/web3/web/components/com_rentflat/controllers/clientbrequest.php on line 18
Call Stack
#   Time   Memory   Function   Location
1   0.0004   366960   {main}( )   .../index.php:0
2   0.0220   1221968   Joomla\CMS\Application\CMSApplication->execute( )   .../index.php:49
3   0.0220   1221968   Joomla\CMS\Application\SiteApplication->doExecute( )   .../CMSApplication.php:267
4   0.4436   1971424   Joomla\CMS\Application\SiteApplication->dispatch( )   .../SiteApplication.php:233
5   0.4477   1994616   Joomla\CMS\Component\ComponentHelper::renderComponent( )   .../SiteApplication.php:194
6   0.4486   2005856   Joomla\CMS\Component\ComponentHelper::executeComponent( )   .../ComponentHelper.php:367
7   0.4487   2026288   require_once( '/var/www/web3/web/components/com_rentflat/rentflat.php' )   .../ComponentHelper.php:392
8   0.4496   2046584   Joomla\CMS\MVC\Controller\BaseController::getInstance( )   .../rentflat.php:19
9   0.4500   2050528   require_once( '/var/www/web3/web/components/com_rentflat/controllers/clientbrequest.php' )   .../BaseController.php:283

( ! ) Warning: Declaration of RentflatControllerClientbrequest::save() should be compatible with Joomla\CMS\MVC\Controller\FormController::save($key = NULL, $urlVar = NULL) in /var/www/web3/web/components/com_rentflat/controllers/clientbrequest.php on line 18
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Вроде всё правильно, должно работать!
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
протрассировал parrent::save в контроллере
$validData давал false
мой кастом validation message в форме перекрывал ошибку в поле Gender
Оказалось дряхлеющий мозг  старого павиана забыл что из каких-то тестовых соображений поставил return false в validation rules для поля gender. как водится - сам идиот, надо было не стесняться и выложить XML полей
я то решил что custom validation message появляется всегда если его обьявить в XML
а оно указыает когда rule  дает false
Alex спфсибо
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
Алекс , можно еще вопрос
У вас в уроке есть способ перенаправления страницы на дополнительный view result , где находится страница уведомления что почта отправлена и тд
я наверное так и сделаю,  но мне непонятно почему нигде не работает редирект на
index.php?option=com_content&view=article&id=4 ( на статью с текстом что все отправилось)
гдебы я не ставил этот url, во view  <form action="<?php echo JRoute::_
или в контроллере
Спойлер
[свернуть]

страница уходит на site http://apartment-rentals-budapest.com/component/rentflat/?view=clientbrequests
что впрочем понятно по дефолту на list view
ну получится у меня на показ артикля прыгнуть?
« Последнее редактирование: 11.12.2017, 17:12:47 от tm2010 »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Эм в контроллере должно работать что то типа:
Код
public function save($key = null, $urlVar = null){
    if( parent::save($key, $urlVar) ){

        $this->setRedirect('index.php');
        return true;
    }
    return false;
}

У меня по крайней мере работает!
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
Опять уперся, дня три убил, ничего не понимаю
есть работающая форма во фронте которая делает save
Спойлер
[свернуть]
мысль была добавить Cancel с тем чтобы в как то разнообразить выход из формы, ну например вернуться назад к выбору дат в уже выбранной квартире, но так чтобы выполнять это в функции cancel контролера
Добавляю <input type="hidden" name="task" value="clientbrequest.cancel" />
соответственно кнопку Cancel( она тут уже есть) понимаю что не вижу никакой логической связи между этими элементами, тоесть никакой гарантии что кнопка cancel будет отправлять clientbrequest.cancel
собственно обе кнопки в этом варианте сохраняют (функция save)
лазил по инету, нашел советы Дмитрия Рекуна
https://joomla.stackexchange.com/questions/5819/cancel-button-in-custom-default-php-layout-leads-to-form-validation-error
сделал так как   вроде он советует.
Спойлер
[свернуть]
при нажатии на Save в отладке JS вижу
        Joomla.submitform(task); что task="clientbrequest.save"
дальше куда-то скачет в jquery и в основном контроллере
controller = JControllerLegacy::getInstance('RentFlat');
// Perform the Request task
$input = JFactory::getApplication()->input;
в отладчике вижу
$input->data['task'] = (string [6]) `cancel`           
$input->data['option'] = (string [12]) `com_rentflat`     
обе кнопки вызывают функцию cancel
от ошибок JS связанных с обработкой этих кнопок вроде избавился.
где еще перехватить исполнение кода не знаю
Может кто-нибудь увидит мою глупость , бросающуюся в глаза?
сейчас по ссылке  http://apartment-rentals-budapest.com/?option=com_rentflat&view=clientbrequest
стоит второй вариант view под спойлером
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
у вас в коде два таска:

так делать низя ) У вас система не поймёт какой таск ей обрабатывать!
Оставьте одно поле task В котором значение value пустота:
то есть должно быть так: <input type="hidden" name="task" value="" />
Смысл кода который вы увидели у Димы в том что при нажатии на кнопку это значение подставляется в поле task и уже летит куда надо!

и тогда уже в контроллере в controllers/clientbrequest.php вы можете переопределить метод cancel и сделать с ним что угодно!
*

tm2010

  • Захожу иногда
  • 76
  • 0 / 0
Обалдеть, работает
Спасибо! не устану говорить)))
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Можно ли поинтересоваться с чего начать изучение для понимания как в FrontEnd производить сохранение в разных моделях?
Что-то я тоже часто встаю в ступор по этому поводу.

Вот например сейчас собрал данные с формы cart и отправил данные аяксом на обработку в другой вид(gotobank) и из вида пытаюсь подключить модель (order) и сделать в ней save не выходит, хотя в своемже соседнем компоненте проворачивал это.

Я тут видимо что-то на корню не понимаю - подскажите чего надо изучить?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Вот например сейчас собрал данные с формы cart и отправил данные аяксом на обработку в другой вид(gotobank) и из вида пытаюсь подключить модель (order) и сделать в ней save не выходит, хотя в своемже соседнем компоненте проворачивал это.
Потому что вы не понимаете принципов MVC наверно, или что то перепутали! Вид служит только для вывода подготовленных данных! Данные для обработки нужно слать в контроллер! Контроллер уже может дёрнуть модель если вам нужно, в которой и делаете метод save и возвращаете контроллеру результат всего этого, а потом уже контроллер должен вам вернуть какие либо данные, а там уже от задачи зависит, либо вернуть json либо какой то HTML (а HTML в таких случаях лучше формировать в layouts) и в конце работы задачи контроллера делаете exit;
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Потому что вы не понимаете принципов MVC наверно, или что то перепутали! Вид служит только для вывода подготовленных данных! Данные для обработки нужно слать в контроллер! Контроллер уже может дёрнуть модель если вам нужно, в которой и делаете метод save и возвращаете контроллеру результат всего этого, а потом уже контроллер должен вам вернуть какие либо данные, а там уже от задачи зависит, либо вернуть json либо какой то HTML (а HTML в таких случаях лучше формировать в layouts) и в конце работы задачи контроллера делаете exit;
Конечно чего-то не понимаю, но...
Вид взаимодействует с моделью для вывода так вот может ли вид взаимодействовать с несколькими моделями и при этом в одной из них запустить метод save.

прохождение запроса по MVC мне видится следующим клиент->...->контроллер вида->вид->модель->вид->представление.

*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Сработало после того как создал структуры формы .xml и добавил функции в модель в которой происходит сохранение getForm getTable loadFormData
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Конечно чего-то не понимаю, но...
Вид взаимодействует с моделью для вывода так вот может ли вид взаимодействовать с несколькими моделями и при этом в одной из них запустить метод save.
Один вид, один контроллер, одна модель, это основа MVC...

прохождение запроса по MVC мне видится следующим клиент->...->контроллер вида->вид->модель->вид->представление.
Вот потому что вам так видится у вас и проблемы...
Правильное взаимодействие (по крайней мере у всех нормальных MVC фреймворков)


В Joomla это немного почему то извратили, и там контроллер запускает вид который бегает в модель, и выводит данный, притом вид бегает в модель односторонне, только получает данные, какие то данные отправить в неё не может..

Но в любом случае любая задача которая вам нужна, особенно с аяксом, решается как я писал выше:
1. Бежим в контроллер, запускаем в нём какой то метод, в нём подготавливаем данные
2. Подготовленные данные отправляем в модель (которая их например сохраняет в базе)
3. контроллером отдаём какие то данные обратно на ваш сайт
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
В Joomla это немного почему то извратили, и там контроллер запускает вид который бегает в модель, и выводит данный, притом вид бегает в модель односторонне, только получает данные, какие то данные отправить в неё не может..
Не понял до конца. Так все-таки как в Joomla это происходит?
клиент -> контроллер -> вид  -> модель -> вид -> клиент - это неправильно?
клиент -> контроллер -> модель -> контроллер -> вид (плюсом может быть  -> модель -> вид ) -> клиент - это правильно?

И другая проблема меня стала беспокоить. Я думал я умею подключать другие модели, а оказалось что нет.
есть два вида которые подключают другую модель код одинаков - результаты противоположны.

вот пример:
Код
class HzcatalogViewGoToBank extends JViewLegacy
{

public function display($tpl = null)
    {
...
$model = JModelLegacy::getInstance( 'order' , 'HzcatalogModel');
...
echo $model->some();
Этот работает, а нижний нет...
Код
class HzcatalogViewCart extends JViewLegacy
{

public function display( $tpl = null )
{
...
$model = JModelLegacy::getInstance( 'order' , 'HzcatalogModel');
echo $model->some();

Первый вызывается как raw вид для выполнения и вывода AJAX запроса, второй как вид HTML
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Не понял до конца. Так все-таки как в Joomla это происходит?
клиент -> контроллер -> вид  -> модель -> вид -> клиент - это неправильно?
Ну если почитать ту же википедию то там написано что то типа:
Цитировать
Модель предоставляет данные и методы работы с ними: запросы в базу данных, проверка на корректность. Модель не зависит от представления — не знает как данные визуализировать — и контроллера — не имеет точек взаимодействия с пользователем — просто предоставляя доступ к данным и управлению ими.
Чётко написано что модель не зависит от представления, а в Joomla модель как раз и зависит от представления, и можно из представления передавать данные в модель!


клиент -> контроллер -> модель -> контроллер -> вид (плюсом может быть  -> модель -> вид ) -> клиент - это правильно?
ну я выше же нарисовал схему как правильно, и как во всех фреймворках )


И другая проблема меня стала беспокоить. Я думал я умею подключать другие модели, а оказалось что нет.
есть два вида которые подключают другую модель код одинаков - результаты противоположны.
Возможно у вас где то ошибка перед эти кодом или после него, проверьте, но тут больше вас должно беспокоить что вы ломаете MVC парадигму )
С вида не должна вызываться модель )

У меня другой подход для вывода AJAX данных, который более соответствует логике MVC
1. Обращаемся в контроллер: index.php?option=com_hzcatalog&task=order.form

в контроллере controllers/order.php
создаёте метод:
publick function order(){
тут можно сбегать в модель получить какие то данные
вывести данные через JLayoutHelper::render() или отдать какие то JSON данные
exit;
}
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Спасибо! Тут видимо только практика поможет... Буду въезжать.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Спасибо! Тут видимо только практика поможет... Буду въезжать.
Советую поиграться с каким нить нормальным фреймворком, например Laravel, многие вещи сразу на места станут )
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться