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

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
MVC, работа с видами
« : 04.04.2015, 11:44:35 »
Доброго времени суток.

К примеру есть данный контроллер:
Код
class ComponentControllerName extends JControllerLegacy {

    public function myMethod(){
       
        $view = $this->getView('name', 'html');
        $view->setLayout(__FUNCTION__);
       
        /// Отрабатывает код и я получаю переменную
        $arParams = [...тут какие то данные...];
       
        $view->arParams = $arParams;

        $view->display();
    }

}
Все отлично теперь мне остатется обработать результат в ./views/name/tmpl/mymethod.php

Сразу же вопрос, я что то не довключил или Joomla не понимает Camel стиль?
То есть такой путь он воспринимает ./views/name/tmpl/mymethod.php,
А токой нет ./views/name/tmpl/myMethod.php
...это в принципе мелочь, не смертельно...

Далее я хотел сгруппировать несколько видов в группу, по принципу:
Код
$view->setLayout("groups/".__FUNCTION__);

Ожидая, что подхватит ./views/name/tmpl/groups/mymethod.php, но чудо не получилось.
Подскажите как осуществить данную задумку?

Сейчас появилась нужда в использовании вида в виде:
Код
class ComponentControllerName extends JControllerLegacy {

    public function myMethod(){
       
        $view = $this->getView('name', 'html');
        $view->setLayout(__FUNCTION__);
       
        $vBreads = $this->getView('name', 'html');
        $vBreads->setLayout('breads');
        $vBreads->arBreads = $arBreads;
       
        /// Отрабатывает код и я получаю переменную
        $arParams = [...тут какие то данные...];
       
        $view->vBreads = $vBreads;
        $view->arParams = $arParams;

        $view->display();
    }

}
Данный код не пробовал, решил за одно спросить. В целом, имеет место быть?

..Возможно я много хочу...
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #1 : 04.04.2015, 12:16:20 »
1. Зачем вы все это делаете?
Joomla сама подхватывает имя вида если вы укажете
index.php?option=com_ваш_компонент&view=имя_вида!

2. Layout - это отдельный слой для отображения а не подшаблон!
Для подшаблона используют
default.php - основной шаблон загружающийся по умолчанию если не указан другой через $this->setLayout('layout_name'); в виде, или не указан через $_REQUEST index.php?option=com_ваш_компонент&view=имя_вида&layout=mymethod
default_images.php - первый подшаблон
default_documens.php - второй подшаблон
Загружаются подшаблоны в любом шаблоне через echo $this->loadTemplate('images'); echo $this->loadTemplate('documens');
Если же у вас другое имя слоя (mymethod.php) то файлы должны быть mymethod_images.php, mymethod_documens.php и загружаться будут точно так же как и выше!

3. Обрабатывать переменные по идее вы должны в модели!
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #2 : 04.04.2015, 20:27:31 »
1. Знаю, тогда наплодится папок вида: ./views/имя_вида, ./views/имя_вида_2, ./views/имя_вида_3
Сперва я попробовал данный подход, но перспективы не вдохновляли...
Поэтому решил пойти, возможно Неправильном, другим путем - использовать task=контроллер.экшен.
У меня на весь контроллер одна папка ./views/имя_вида.
Дальше на каждый экшен свой файл ./views/имя_вида/tmpl/имя_экшена.
В моем компоненте пока 3-и контолера, в каждом контролере по 7-мь методов.
Файлов и папок было бы как грязи. Хотелось как все красивенько разложить.
Если можно как то по другому, готов выслушать, на следующем контолере попробую.

2. Если честно, я запутался в написанном...
Использовать так?:
Код
class ComponentControllerName extends JControllerLegacy {

    public function myMethod(){
       
        $view = $this->getView('name', 'html');
        $view->setLayout(__FUNCTION__);
       
        ///$vBreads = $this->getView('name', 'html');
        $vBreads->loadTemplate('breads');
        $vBreads->arBreads = $arBreads;
       
        /// Отрабатывает код и я получаю переменную
        $arParams = [...тут какие то данные...];
       
        $view->vBreads = $vBreads;
        $view->arParams = $arParams;

        $view->display();
    }

}

3. Так как работаю с API, решил не делать дополнительные движения, создавая новые файлы.
Сперва, да, так и было...
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #3 : 04.04.2015, 20:42:20 »
В этом и смысл MVC для каждого вида отдельный вид! Иначе у вас кода будет столько что вы потом сами офигеете его править! А так зашел в нужную связку MVC и отредактировал то что вам нужно, а не мешанину из всего подряд..
Ладно у вас будет три вида а если 23? И у каждого слоя у вас будет по 5 подшаблонов? 100 с хреном файлов только в папке tmpl?
так как вы делаете это не верный подход!
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #4 : 05.04.2015, 11:03:22 »
Просто в Joomla, как мне показалось, такое громоздкое понятие вид.

По такой схеме я получаю вот такую структуру:
Код
site
-views
--name1
---view.html.php
---tmpl
----default
--name2
---view.html.php
---tmpl
----default
--nameN
---view.html.php
---tmpl
----default

Я работаю с API актокатолога и плюсом в громоздкой структуре, я могу получить и пляски с именами:
Код
site
-views
--markets_bmw
---view.html.php
---tmpl
----default.php
--markets_toyota
---view.html.php
---tmpl
----default.php
--models_bmw
---view.html.php
---tmpl
----default.php
--models_toyota
---view.html.php
---tmpl
----default.php
--details_bmw
---view.html.php
---tmpl
----default.php
--details_toyota
---view.html.php
---tmpl
----default.php

Сейчас я решил остановиться на:
Код
site
-views
--bmw
---view.html.php
---tmpl
----markets.php
----models.php
----details.php
--toyota
---view.html.php
---tmpl
----markets.php
----models.php
----details.php

Мой вариант мне кажется более лаконичным.
И если вариант выше, есть истина, то я пока не готов ее принять.

По поводу вида в виде, мне нужно было:
Код
site
-views
--bmw
---view.html.php
---tmpl
----markets.php
----models.php
----details.php
----search
-----vin.php
-----detail.php
--toyota
---view.html.php
---tmpl
----markets.php
----models.php
----details.php
----search
-----detail.php
-----vin
------detaled.php
------nomatch.php

Я добился этого, переопределив в view.html.php метод loadTemplate
Добавил разделитель директорий в разрешающие символы:
Код
$file = preg_replace('/[^A-Z0-9_\.-\/]/i', '', $file);

На сколько это плохо не знаю, но я не нашел другого пути...
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #5 : 05.04.2015, 11:14:06 »
что за бред?! отдельные виды для bmw, toyota.. вы что для каждого марки авто хотите делать отдельный вид?! Популярных брендов только 50 видов же!
У вас должен быть один вида! Категория! А что бы отобразить все тойоты вам нужно будет просто передать index.php?option=com_компонент&view=category&model=bmw
Где уже в таблицы выбрать все авто с марки "bmw" по полю в котором у вас в списке авто будет вписано название текущей модели авто!
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #6 : 05.04.2015, 11:35:16 »
Toyota и BMW - это две абсолютно разные базы, со своей структурой и своей спецификой.
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Re: MVC, работа с видами
« Ответ #7 : 05.04.2015, 11:49:03 »
А зачем вам разные базы, когда все можно сделать в одной?
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #8 : 05.04.2015, 12:01:09 »
Базы разные, так как так и идут от производителя.
И каждый из производителей по своему видит структуру своих каталогов.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #9 : 05.04.2015, 12:04:24 »
Базы разные, так как так и идут от производителя.
И каждый из производителей по своему видит структуру своих каталогов.
Почему не сделать одну таблицу, взять общие данные, добавить поля которые отличаются и все импортнуть в одну таблицу, не делая такую ахинею!
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Re: MVC, работа с видами
« Ответ #10 : 05.04.2015, 12:10:35 »
Что, производитель целиком бд поставляет? жесть... Может быть, проще совместно разработать/согласовать транспортные файлы для передачи данных (xml, json, cvs)?
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #11 : 05.04.2015, 12:56:51 »
Объединить базы вообще ни как, выявлять общие данные накладно.
Поэтому приходится работать с базами как есть.

В общем мы маленько ушли от темы.
Благодарю за дискуссию, возможно мы когда-нибудь вернемся к этому моменту, если будет желания по обсуждать.

Остался один момент - как подгрузит под-вид, передав в него параметры, что бы потом использовать в основном виде?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #12 : 05.04.2015, 14:12:07 »
Остался один момент - как подгрузит под-вид, передав в него параметры, что бы потом использовать в основном виде?
Никак (если вы имеете ввиду $this->loadTemplate()), подвиды загружаются внутри шаблонов вида, и получают параметры из вида, или с передачи с основного вида! В вашей задаче в любом случае (даже с двумя, хоть с 22-мя разными базами) нужно использовать только один вид!
А уже при указании модели выполнять просто выборку с нужной таблицы, возможно подсовывая запросы или слои..
Так как вы делаете это бред!
И зачем вы это вообще делаете не понимаю? MVC в системе для того и нужна что бы писать по её стандарту! Не можете писать по этому стандарту - удалите все  и создайте нужную вам структуру которая будет бегать куда вам нужно и делать то что нужно без привязки к API системы и впихивания бесконечного количества костылей! Ведь вы все равно не используете то что вам дает система, и то чем облегчает жизнь, а пишете костыль в обход задействовав пару процентов от того что дает Joomla MVC!

И все же я не понимаю почему вы не можете использовать так: index.php?option=com_component&view=bmv&layout=search
А в виде view.html.php в зависимости от того какой у вас layout уже получать нужные данные из модели!
« Последнее редактирование: 05.04.2015, 14:32:23 от Istaan »
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Re: MVC, работа с видами
« Ответ #13 : 05.04.2015, 15:07:44 »
Объединить базы вообще ни как, выявлять общие данные накладно.
Поэтому приходится работать с базами как есть.
Тогда Создайте в своей базе единую универсальную структуру, которая будет учитывать потребности всех производителей, далее периодически (по поступлению обновленных данных) просто цепляйте базу, импортируйте ее данные в свою (отдельный универсальный вид в админке), а уж потом работайте с единым массивом данных в одной базе, при грамотной структуре и ее индексации производительность увеличится в сотни раз! (я кстати, начинал свой первый компонент на J примерно с такой же задачей: объединить данные с различных баз в одну на J, только на входе были базы 1С, и я использовал xml-транспорт).
А то, как у вас сейчас, это даже не бред, это я не знаю как назвать даже... Вы сейчас все это наишите, отладите, потом забудете, через полгода понадобятся правки - залезете, а там... и сами не разберетесь.
« Последнее редактирование: 05.04.2015, 15:11:51 от AlekVolsk »
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #14 : 05.04.2015, 15:26:52 »
@Istaan
Цитировать
нужно использовать только один вид!
Ну не могу я пока это психологически воспринять...
Во всех MVC фреймворках, с которыми я работал, вид идет на каждое действие.
А тут какой то контроллер-вид получается.

Сейчас у меня: index.php?option=com_autocatalog&task=etka.markets&mark=volkswagen
Вы предлагаете, если я правильно понял: index.php?option=com_autocatalog&view=etka&layout=markets&mark=volkswagen

Ваш подход я обязательно попробую, но уже к другой базе.
И у меня уже появились вопросы.
layout так же как view автоматически подхватывается Joomla?
Где в Вашем случае контроллер? Что он делает?

Вид в виде пришлось решить через инклуд, а данные передавать через статические свойства объекта.
Но хотелось бы что то изящного..


@AlekVolsk
Думаю в этом направлении, пока все не однозначно.
Поднакопим больше баз, хотя бы с десяток, что бы понять, что нам нужно
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Re: MVC, работа с видами
« Ответ #15 : 05.04.2015, 15:49:04 »
Цитировать
Но хотелось бы что то изящного..
http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/sozdanie-komponenta-dlya-joomla-2-5
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #16 : 05.04.2015, 16:00:00 »
И это я читал.
Скажу больше, использую тот компонент для каркаса.
Но максимум что по моим вопросам можно почитать - это вторую часть, да и то там нет ответов.
Возможно я плохо читал, возможно мне вскружило голову что то новое, но буду рад если укажите на нужную часть.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #17 : 05.04.2015, 18:56:13 »
Во всех MVC фреймворках, с которыми я работал, вид идет на каждое действие.
А тут какой то контроллер-вид получается.
Ни в одном фреймворке не идет вид на каждое действие! Допустим у нас есть вид списка, в котором есть кнопки снять с публикации и удалить, вы хотите сказать что вы для этих действий делали отдельные виды?)

Сейчас у меня: index.php?option=com_autocatalog&task=etka.markets&mark=volkswagen
Вы предлагаете, если я правильно понял: index.php?option=com_autocatalog&view=etka&layout=markets&mark=volkswagen
Нет я не это предлагаю! У вас же на каждое авто отдельный вид! Я предлагаю: index.php?option=com_autocatalog&view=volkswagen&layout=search

layout так же как view автоматически подхватывается Joomla?
Где в Вашем случае контроллер? Что он делает?
При передачи ссылки типа: index.php?option=com_autocatalog&view=volkswagen&layout=search
Подключается дефолтный контроллер, который смотрит или есть что в переменной task! Если ничего нет - то выполняет метод display() который подключает вид который пришел в переменной view (и заодно модель для этого вида)! А вид уже в зависимости от того что пришло в layout подключает нужный слой! Если ничего не пришло подключает tmpl/default.php

Вид в виде пришлось решить через инклуд, а данные передавать через статические свойства объекта.
Но хотелось бы что то изящного..
Я уже писал выше - изящно - использовать стандарт Joomla, нужно по другому удалить все что есть и написать какой вам удобно костыль..
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: MVC, работа с видами
« Ответ #18 : 05.04.2015, 19:08:59 »
Кстати вот интересно, а отображение всего этого должно быть одинаково? Или вывод каталога меняется в зависимости от модели авто? или на все один дизайн?
Если на все один дизайн, то вам реально нужен один вид всего, и менять модель для работы с нужной таблицей (ну или несколько видов: список, обзор записи, заказ например или что там вам надо) и этим видам подсовывать нужную модель в зависимости от марки авто!
« Последнее редактирование: 05.04.2015, 19:13:38 от Istaan »
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #19 : 05.04.2015, 19:14:32 »
Позвольте ссылкой на источник
Audi, Volkswagen, Seat, Skota - это одна база ETKA, у них схожее поведение
BMW, Mini, Rolls-Royce - это все каталог от BMW
...я начинаю пробовать Ваш подход...
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Re: MVC, работа с видами
« Ответ #20 : 06.04.2015, 13:18:23 »
Цитировать
Во всех MVC фреймворках, с которыми я работал, вид идет на каждое действие.
Это наверное потому, что в Joomla вид (представление) - это не просто графический интерфейс, а именно настоящий View - взаимодействует с основной моделью (или несколькими), содержит в себе данные из этой модели и в то же время занимается отображение этих данных.
http://blog.ircmaxell.com/2014/11/a-beginners-guide-to-mvc-for-web.html

А в остальных фреймворках представление тупо отображает те данные, что ей дали, либо сразу шаблонизатор используют:
http://laravel.com/docs/5.0/views
http://www.yiiframework.com/doc-2.0/guide-structure-views.html
http://symfony.com/doc/current/quick_tour/the_view.html
http://www.codeigniter.com/userguide3/general/views.html
*

borodatych

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Re: MVC, работа с видами
« Ответ #21 : 06.04.2015, 14:13:11 »
@b2z, благодарю за ответ.
Видимо я привык к ТТУК — «Толстые тупые уродливые контроллеры», и увидев ТТУМ — «Толстые тупые уродливые виды», растерялся.
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Re: MVC, работа с видами
« Ответ #22 : 06.04.2015, 14:24:08 »
Даже и не знаю, что лучше-то...
*

b2z

  • Глобальный модератор
  • 7284
  • 778 / 0
  • Разраблю понемногу
Re: MVC, работа с видами
« Ответ #23 : 06.04.2015, 14:53:12 »
Лучше конечно логику держать в модели. Но, это не получается. Ну вот где делать различные проверки, типа опубликовна сущность или нет, залогинен юзер или нет и т.д. и т.п., перед тем, как вообще что-то отображать? В итоге контроллеры все равно разрастаются, если какие-то сложные вещи делаю, типа сохранения данных связанных сущностей и попутно проверки (итого 200 строк кода в одном методе). Но я пытаюсь держать их в узде.

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

В идеале, компонент должен быть таким, чтобы его с минимальным рефакторингом можно было бы при необходимости перенести на другой фреймворк. Но этого очень тяжело добиться, но все же если стараться, то ТТУК и ТТУМ не будет. Как-то так :)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Работа с датой, дата в родительском падеже

Автор Xiss

Ответов: 4
Просмотров: 2282
Последний ответ 27.02.2014, 19:13:43
от Xiss
[Решено] Работа со сторонним модулем из своего компонента

Автор st.al

Ответов: 5
Просмотров: 1333
Последний ответ 20.06.2013, 17:35:04
от st.al
Работа с несколькими таблицами базы данных на одной странице редактирования материала Joomla

Автор Extalionez

Ответов: 6
Просмотров: 5353
Последний ответ 02.12.2012, 16:14:53
от rsa_m
Редактирование объекта в компоненте - работа с 2мя таблица. Как реализовать?

Автор Sl@vk@

Ответов: 6
Просмотров: 1789
Последний ответ 08.03.2012, 23:47:59
от Sl@vk@
Работа с JFilterInput в J1.7

Автор Helios

Ответов: 3
Просмотров: 1801
Последний ответ 12.12.2011, 18:17:01
от SDKiller