Новости Joomla

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!Файловый менеджер Quantum — одно...

Файловый менеджер Quantum — одно из самых популярных решений для Joomla, созданное разработчиком из сообщества Joomla, Дмитрием Цымбалом (@tsymbalmitia). Он делает Quantum удобным, безопасным и современным, обновляет его, исправляет уязвимости и отвечает пользователям — всё это в свободное от основной работы время.

Теперь настал момент для следующего шага: развитие проекта требует больше времени и ресурсов.

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

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Вопрос не простой. Поэтому придется описать все подробно.

Обычно для каждого вида в компоненте у нас есть:
- своя подпапка в папке views
   Например views/helloworld с файлом вида view.html.php и папкой шаблона tmpl с шаблоном default.php
- Свой контроллер в папке controllers
- Свой файл модели в папке models

При этом для администраторской части, если мы хотим работать с таблицами SQL и добавить реакцию на toolbar кнопки такие как Add, Edit и т.п. мы, как описано во всех примерах, делаем отдельные виды, контроллеры, модели. Например в примерах типа HelloWorld появляются классы HelloWorlds.

Вторая "неприятность", приходится снова делать свои контроллеры, виды, модели для каждого LinkBar'а. Например в стандартном компоненте com_banners их четыре - Баннеры, Категории, Клиенты, Статистика.

Вопрос 1.
Как все LinkBar запихнуть в одну директорию tmpl вида?
Это Я решил.

Схема действий такая:
- Создаем файл helper типа:
Код
class TSJsHelper
{
   public static function addSubmenu($vName)
   {
      JSubMenuHelper::addEntry(
         JText::_('COM_MY_SUBMENU_MAIN'),
         'index.php?option=com_my&view=mys&layout=main',
         $vName == 'main'
      );

      JSubMenuHelper::addEntry(
         JText::_('COM_MY_SUBMENU_EXT'),
         'index.php?option=com_my&view=mys&layout=ext',
         $vName == 'city'
      );
...

А далее в папку tmpl нашего вида кладем файлы main.php и ext.php стандартного содержания из default.php
Заполнить каждый Linkbar данными их разных таблиц SQL тоже не проблема. Просто вместо $this->items для каждой таблицы используем свои функции например $this->mainitems, которые прописываем в модели и в view.html.php формы вызываем.

Вопрос 2.
Бьюсь уже два дня.

Теперь у меня один вид view.html.php с несколькими шаблонами в папке tmpl. Каждый шаблон я вывожу на свой Linkbar (так и хочется назвать его табом - очень похоже).
Но так как вид у меня один, то и кнопки Add и Edit у меня общие для всех Linkbar.
А значит реакция при их нажатии будет одна и та же, так как будут отрабатывать одни и те же модели и контроллеры.

Как сделать так чтобы одни и те же кнопки в ToolBar вызывали в зависимости от активного Linkbar разные контроллеры и модели?
« Последнее редактирование: 04.11.2012, 22:18:41 от rsa_m »
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
P.S.: Если описать всю проблему иначе, то Я использую layout чтобы можно было обойтись одним видом.
Но раз есть layout, то наверняка есть и методы работы с ним с точки зрения моделей и контроллеров. Но как? Нигде ни примеров нет, ни описаний.
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
По моему и будут вызывать разные. Если исходить из устройства стандартных компонентов, то контроллер определяется не кнопкой, а скрытым поле в форме, типа <input type="hidden" name="controller" value="mycontroller1">. А кнопка только task определяет.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Мы видимо про разные кнопки говорим.

Я имею ввиду кнопки Toolbar которые мы определяем в view.html.php вида.
Код
class HelloWorldViewHelloWorlds extends JView
{
.....
protected function addToolBar()
{
JToolBarHelper::title(JText::_('COM_HELLOWORLS_MANAGER'), 'helloworlds');

      $toolbar =& JToolBar::getInstance('toolbar');

      JToolBarHelper::deleteList('', 'helloworlds.delete');
      JToolBarHelper::editList('helloworlds.edit');
      JToolBarHelper::addNew('helloworlds.add');

В данном случае движок сам, как я понимаю, при нажатии затем на кнопки будет вызывать модель и контроллер из файлов helloworlds.php. Но только из них. А у меня затем несколько layout уже со своими именами.
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Нет про разные версии. Вот же связка конроллер-task - JToolBarHelper::deleteList('', 'helloworlds.delete');
Отработает метод delete в контроллере helloworlds. И определяйте его в соответствии со своей логикой.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
JToolBarHelper::deleteList('', 'helloworlds.delete');

Ну да. Вот и получаем что для одного вида будет всегда отрабатываться только helloworlds.
А у меня один вид и несколько layout. Соответственно несколько форм в models/forms
Сейчас получается что при нажатии на кнопку Add вызывается форма helloworlds.xml. А мне опять же нужно чтобы в зависимости от активного layout (Linkbar'а) свои формы вызывались.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Отработает метод delete в контроллере helloworlds. И определяйте его в соответствии со своей логикой.

Вот в эту сторону тоже думаю.
Как в контроллере helloworlds затем определить текущий layout (Linkbar)!?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Вот в эту сторону тоже думаю.
Как в контроллере helloworlds затем определить текущий layout (Linkbar)!?
Передавайте его в скрытом поле, а потом отлавливайте в контроллере.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Передавайте его в скрытом поле, а потом отлавливайте в контроллере.

Чтобы передать в скрытом поле, нужно в это поле положить значение в зависимости от текущего layout. Но это пока не удается сделать по следующей причине:
Мой класс view в файле view.html.php это
Код
class HelloWorldViewHelloWorlds extends JView
{
......
В нем метод
Код
	function display($tpl = null) 
{
Именно этот метод вызывается когда я перехожу между layout.
В этом классе мне удалось получить текущий layout. Я объявил переменную в этом классе
Код
   public $layout='';
и устанавливаю ее функцией которую вызываю в методе display
Код
$layout = $this->getLayout();
Это работает.

Затем кнопка к примеру edit объявлена, как
Код
      JToolBarHelper::editList('helloworld.edit','Edit ');
Обратите внимание что именно helloworld.edit, а не helloworlds.edit потому что модель у  helloworlds это класс JModelList. А в этом классе нет метода loadForm который нужен чтобы получить форму.
А модель helloworld это JModelAdmin и метод loadForm есть.

Т.е. получается что при нажатии кнопки edit, я попадаю в контроллер и модель helloworld, т.е. другие классы.
Снова тупик. Как в классе модели class HelloWorldModelHelloWorld extends JModelAdmin
получить переменную $layout из класса вида class HelloWorldViewHelloWorlds extends JView !?




*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Кнопка JToolBarHelper::editList('helloworld.edit','Edit '); у вас находится в шаблоне, который принадлежит View у которого есть значение layout?
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Вы рушите все принципы MVC и еще спрашиваете как это сделать. При нормальном MVC, модели должно быть совершенно параллельно какой там layout и даже какой там контроллер. Посидите и подумайте над MVC архитектурой. Иначе дальше будет еще хуже.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Кнопка JToolBarHelper::editList('helloworld.edit','Edit '); у вас находится в шаблоне, который принадлежит View у которого есть значение layout?

Да. Все взято из примера.
http://tungusov.ru/create-toolbar.html
Там тоже самое. Два контроллера, две модели. И все замечательно работает, до тех пор пока не появляются layout.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Вы рушите все принципы MVC и еще спрашиваете как это сделать. При нормальном MVC, модели должно быть совершенно параллельно какой там layout и даже какой там контроллер. Посидите и подумайте над MVC архитектурой. Иначе дальше будет еще хуже.
Да, тут есть доля правды. Layout не должен влиять на модель, так как это просто вывод информации.

Да. Все взято из примера.
Ну так в чем проблема. Поместите в поле формы значение layout, раз оно доступно в виде.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Согласен что не должен влиять на модель. Но по некоторой информации может использовать несколько различных моделей.
Вот выдержка из обсуждения в google groups.
Если нет акаунта там, то приведу выдержку оттуда:
Цитировать
You could try using mulitple layouts. Adding '&layout=LAYOUTNAME' to your URL parameters will call a specific layout from a view tmpl folder; not adding it will always call the default.php layout.

In your views 'view.html.php' file you could check for '&layout=LAYOUTNAME' using 'JRequest::getVar('layout');' and assign relevant data models - if needed.

Попробую этот путь.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Переделал все "классическим" способом. Все работает.
Но все же "осадочек остался". Неужели нельзя решить задачу более элегантно.
Вероятно что мое первое описание проблемы было достаточно мутным и не совсем понятным. Поэтому попробую еще один заход, более простой.

Предположим что у меня есть две SQL таблицы (не связанные друг с другом):
Овощи (Овоши_id, Овощи_name)
Фрукты (Фрукты_id, Фрукты_name)

Чтобы через админ панель вывести и заполнить эти таблицы мне необходимо для каждой из них:
для отображения списков создать свой вид - модель - контроллер
создать форму через которую будем заполнять таблицу
для заполнения тоже создать свой вид - модель - контроллер

Для двух таблиц не страшно.

Но когда таких таблиц становится 10ть или больше, то возникает неизбежно вопрос.
Неужели нельзя сократить однотипный на 99% код до одного вида-модели-контроллера для отображения и одного вида-модели-контроллера для заполнения ?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Нельзя!

Код должен быть простым, логичным и незапутанным. Да, сначала Вам кажется, что Вы создаете слишком много. Но когда Ваш компонент вырастет, Вы оцените то, что для каждой сущности создавали отдельные MVC, а не пихали все в одну реализацию.

Советую Вам почитать парочку материалов на тему правильного ООП программирования.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Код должен быть простым, логичным и незапутанным. Да, сначала Вам кажется, что Вы создаете слишком много. Но когда Ваш компонент вырастет, Вы оцените то, что для каждой сущности создавали отдельные MVC, а не пихали все в одну реализацию.
Этот подход, естественно хорош с точки зрения простоты и понятности кода. Но плох с точки зрения его использования. Например когда нужно будет исправить баг, то вместо того чтобы сделать это в одном месте придется править в 10ти. Но это не критично

Советую Вам почитать парочку материалов на тему правильного ООП программирования.
Вот в том то и дело что мы используем ООП. И здесь, по моему мнению, мы смешали в кучу ООП и принцип MVC.
С точки зрения ООП. Если мне нужно чтобы мои таблицы обрабатывались едино, то я использую полиморфизм. В ООП я создам класс породив его от другого. И затем дополню его методом (или переопределю уже имеющийся у родителя метод) который будет например сохранять таблицу.
А далее в зависимости от моей прозорливости я либо метод реализую таким образом что в него либо через свойство класса, либо через параметр метода я буду передавать название таблицы которую хочу сохранить метдом. Либо для каждой таблицы порожу свой класс уже от моего класса с новым методом сохранения.
При этом никакие принципы ООП не будут нарушены. Но у меня будет либо один метод для сохранения любой таблицы, либо свой класс для каждой таблицы.
Извините за лирическое отступление.

Возвращаясь к Joomla. То о чем я писал выше реализовано в Joomla. Так у нас есть объект JDatabase который в своем составе имеет все нужные методы работы с базами.
Но далее мы используем принцип MVC, который собственно говоря является также в свою очередь объектной моделью которую кто-то сделал.
И с точки зрения ООП я понимаю что раз это объектная модель со своей иерархией классов, то я могу ее дополнить использовав все тот же полиморфизм и наследование. Но при этом другой стороной медали будет то что это будет уже не MVC если под MVC понимать не лишь принцип разделения функциональности на три виртуальные части каждая из которой отвечает за свой набор действий, а полностью всю объектную модель как неизменную часть системы Joomla.

Вот как то так резюмировать хочется весь топик.
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Тут у меня ошибка
Цитировать
"мои таблицы обрабатывались едино, то я использую полиморфизм."
Так как данные однотипны, то это будет наследование, а не полиморфизм.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Компонент для работы с несколькими таблицами

Автор balbec

Ответов: 1
Просмотров: 1164
Последний ответ 27.07.2012, 09:10:11
от balbec