Форум русской поддержки Joomla!® CMS
04.12.2016, 20:23:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

MVC, работа с видами

 (Прочитано 487 раз)
0 Пользователей и 1 Гость смотрят эту тему.
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« : 04.04.2015, 12: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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #1 : 04.04.2015, 13: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
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #2 : 04.04.2015, 21: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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #3 : 04.04.2015, 21:42:20 »

В этом и смысл MVC для каждого вида отдельный вид! Иначе у вас кода будет столько что вы потом сами офигеете его править! А так зашел в нужную связку MVC и отредактировал то что вам нужно, а не мешанину из всего подряд..
Ладно у вас будет три вида а если 23? И у каждого слоя у вас будет по 5 подшаблонов? 100 с хреном файлов только в папке tmpl?
так как вы делаете это не верный подход!
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #4 : 05.04.2015, 12: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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #5 : 05.04.2015, 12:14:06 »

что за бред?! отдельные виды для bmw, toyota.. вы что для каждого марки авто хотите делать отдельный вид?! Популярных брендов только 50 видов же!
У вас должен быть один вида! Категория! А что бы отобразить все тойоты вам нужно будет просто передать index.php?option=com_компонент&view=category&model=bmw
Где уже в таблицы выбрать все авто с марки "bmw" по полю в котором у вас в списке авто будет вписано название текущей модели авто!
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #6 : 05.04.2015, 12:35:16 »

Toyota и BMW - это две абсолютно разные базы, со своей структурой и своей спецификой.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6452



« Ответ #7 : 05.04.2015, 12:49:03 »

А зачем вам разные базы, когда все можно сделать в одной?
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #8 : 05.04.2015, 13:01:09 »

Базы разные, так как так и идут от производителя.
И каждый из производителей по своему видит структуру своих каталогов.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #9 : 05.04.2015, 13:04:24 »

Базы разные, так как так и идут от производителя.
И каждый из производителей по своему видит структуру своих каталогов.
Почему не сделать одну таблицу, взять общие данные, добавить поля которые отличаются и все импортнуть в одну таблицу, не делая такую ахинею!
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6452



« Ответ #10 : 05.04.2015, 13:10:35 »

Что, производитель целиком бд поставляет? жесть... Может быть, проще совместно разработать/согласовать транспортные файлы для передачи данных (xml, json, cvs)?
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #11 : 05.04.2015, 13:56:51 »

Объединить базы вообще ни как, выявлять общие данные накладно.
Поэтому приходится работать с базами как есть.

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

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

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #12 : 05.04.2015, 15: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, 15:32:23 от Istaan » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6452



« Ответ #13 : 05.04.2015, 16:07:44 »

Объединить базы вообще ни как, выявлять общие данные накладно.
Поэтому приходится работать с базами как есть.
Тогда Создайте в своей базе единую универсальную структуру, которая будет учитывать потребности всех производителей, далее периодически (по поступлению обновленных данных) просто цепляйте базу, импортируйте ее данные в свою (отдельный универсальный вид в админке), а уж потом работайте с единым массивом данных в одной базе, при грамотной структуре и ее индексации производительность увеличится в сотни раз! (я кстати, начинал свой первый компонент на J примерно с такой же задачей: объединить данные с различных баз в одну на J, только на входе были базы 1С, и я использовал xml-транспорт).
А то, как у вас сейчас, это даже не бред, это я не знаю как назвать даже... Вы сейчас все это наишите, отладите, потом забудете, через полгода понадобятся правки - залезете, а там... и сами не разберетесь.
« Последнее редактирование: 05.04.2015, 16:11:51 от AlekVolsk » Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #14 : 05.04.2015, 16: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
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6452



« Ответ #15 : 05.04.2015, 16:49:04 »

Цитировать
Но хотелось бы что то изящного..
http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/sozdanie-komponenta-dlya-joomla-2-5
Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #16 : 05.04.2015, 17:00:00 »

И это я читал.
Скажу больше, использую тот компонент для каркаса.
Но максимум что по моим вопросам можно почитать - это вторую часть, да и то там нет ответов.
Возможно я плохо читал, возможно мне вскружило голову что то новое, но буду рад если укажите на нужную часть.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #17 : 05.04.2015, 19: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
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #18 : 05.04.2015, 20:08:59 »

Кстати вот интересно, а отображение всего этого должно быть одинаково? Или вывод каталога меняется в зависимости от модели авто? или на все один дизайн?
Если на все один дизайн, то вам реально нужен один вид всего, и менять модель для работы с нужной таблицей (ну или несколько видов: список, обзор записи, заказ например или что там вам надо) и этим видам подсовывать нужную модель в зависимости от марки авто!
« Последнее редактирование: 05.04.2015, 20:13:38 от Istaan » Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #19 : 05.04.2015, 20:14:32 »

Позвольте ссылкой на источник
Audi, Volkswagen, Seat, Skota - это одна база ETKA, у них схожее поведение
BMW, Mini, Rolls-Royce - это все каталог от BMW
...я начинаю пробовать Ваш подход...
Записан
b2z
Support Team
*****

Репутация: +708/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #20 : 06.04.2015, 14: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
« Последнее редактирование: 06.04.2015, 14:30:37 от b2z » Записан
borodatych
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 32


« Ответ #21 : 06.04.2015, 15:13:11 »

@b2z, благодарю за ответ.
Видимо я привык к ТТУК — «Толстые тупые уродливые контроллеры», и увидев ТТУМ — «Толстые тупые уродливые виды», растерялся.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6452



« Ответ #22 : 06.04.2015, 15:24:08 »

Даже и не знаю, что лучше-то...
Записан
b2z
Support Team
*****

Репутация: +708/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #23 : 06.04.2015, 15:53:12 »

Лучше конечно логику держать в модели. Но, это не получается. Ну вот где делать различные проверки, типа опубликовна сущность или нет, залогинен юзер или нет и т.д. и т.п., перед тем, как вообще что-то отображать? В итоге контроллеры все равно разрастаются, если какие-то сложные вещи делаю, типа сохранения данных связанных сущностей и попутно проверки (итого 200 строк кода в одном методе). Но я пытаюсь держать их в узде.

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

В идеале, компонент должен быть таким, чтобы его с минимальным рефакторингом можно было бы при необходимости перенести на другой фреймворк. Но этого очень тяжело добиться, но все же если стараться, то ТТУК и ТТУМ не будет. Как-то так Azn
« Последнее редактирование: 06.04.2015, 16:03:07 от b2z » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet