Новости Joomla

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

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Доброго времени суток! Пожалуйста помогите определится как лучше реализовать свой компонент для Joomla 2.5. Компонент будет частью моей ВКР. Задача: доступ к электронному каталогу (сайт библиотеки). Задумка: должна быть форма для ввода данных (автор, заглавие и т.д.) по нажатию на кнопку поиск в бд. Вопрос: стоит ли делать MVC если да то как конкретно обработать нажатие кнопки (как и где передать и обработать данные из формы) если нет то интересно будет Ваше мнение
*

b2z

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

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
b2z, спасибо за ответ. Как раз уже пару недель изучаю мануал. Веб-программированием занялся недавно поэтому мне не понятны некоторые моменты. Главный из них: в этом мануале (урок 8 валидация формы) обрабатывается действие формы код PHP генерирует ссылку на скрипт.
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="helloworld-form" class="form-validate">
к какому файлу здесь идет обращение? Что делает этот кусочек кода?   &layout=edit&id=' . (int) $this->item->id);
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Всегда обращение к файлу index.php это точка входа в приложение!
option=com_helloworld  - говорит о том что будем работать с компонентом com_helloworld  
layout=edit - говорит о том что в текущем виде отобразить слой edit! слои лежат в ваш_компонент/views/имя_вида/tmpl/edit.php и так далее! В этой папке может быть слой default.php это вид которой отобразится по умолчанию если не указанна переменная layout
« Последнее редактирование: 31.03.2014, 13:09:54 от Istaan »
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Istaan, спасибо уже яснее. Допустим у меня форма выводится скриптом default.php. Тогда по нажатию кнопки ПОИСК мне обращаться к контроллеру или модели? Как я понял контроллер отвечает за действия пользователя. И я правильно понял: в компоненте один вид (один слой для одной страницы) один контроллер и одна модель для одной страницы, т.е. их количество зависит от количества страниц компонента??

т. е. не могу понять кто какую роль в обработке данных должны сыграть контроллер и модель на странице с результатами поиска (как я себе это представляю контроллер получает сигнал что нужно начать выполнять действия, далее модель обращается к базе данных и получает результаты поиска, затем в виде уже их нужно только вывести)?
« Последнее редактирование: 31.03.2014, 13:31:08 от shenya »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Да обычно на каждое отображение заводят один вид! Но бывает что данные одни а отображение разное, тогда можно использовать слои!
А вот при нажатии на кнопку поиск можно обращаться сразу к модели, и там уже в запросе формировать данные!
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
т. е. не могу понять кто какую роль в обработке данных должны сыграть контроллер и модель на странице с результатами поиска (как я себе это представляю контроллер получает сигнал что нужно начать выполнять действия, далее модель обращается к базе данных и получает результаты поиска, затем в виде уже их нужно только вывести)?
Контроллер со страта у вас определяет какую задачу выполняет ваш компонент, даже если задача не указана то выполняется в контроллере по умолчанию задача
function display( $cachable = false, $urlparams = array() ){}, а это значит что выполняется задача на отображение текущего вида, и в модели вы уже формируете запрос в базу по данным которые пришли из запроса!
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Спасибо буду пробовать! Если все правильно понял положить в папку models еще один php скрипт с другим именем прописать в нем класс "модель" и он станет моделью. Т. е. строчка   class ***Model*** extends JModelItem  вместо *** должна быть именем файла и  ***  имя вида. И еще два нубских вопроса ^-^ переход с модели на вид происходит автоматически по окончанию скрипта или он тоже прописывается? Как передать параметры с вида на другую модель?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Имя модели|вида|контроллера должно быть: название_компонента(Model|View|Controller)Имя_Вида
и файлы моделей и контроллера должны называться как имя вида (если работают в паре с видом), если вам нужна отдельная модель то можно обозвать как хотите
И у вас неправильное восприятие MVC вид в модель ничего не должен передавать, только получать )
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
да, я понимаю что вид получает данные с модели. неправильно выразился - как передать данные с формы поиска для формирования запроса? например в итоге их должна получить модель чтобы выполнить запрос.
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Имя модели|вида|контроллера должно быть: название_компонента(Model|View|Controller)Имя_Вида
Вы имеете ввиду строку объявления класса  class TestModelTest extends JModelItem ? или название самого файла
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Вы имеете ввиду строку объявления класса  class TestModelTest extends JModelItem ? или название самого файла
Аха, именно это он и имеет ввиду.

Предположим у Вас компонент называется com_test, контроллер для называется List, модель называется List и представление тоже называется List. Тогда классы будут:
Код: php
class TestModelList extends JModelList
class TestViewList extends JViewLegacy
class TestControllerList extends JControllerLegacy

Когда в классах используется одинаковый суффикс (в нашем случае List), то в Joomla они имеют невидимую связь. Например TestViewList будет автоматом связан с TestModelList.

Цитировать
как передать данные с формы поиска для формирования запроса?
Через форму. Главное в форме вывести скрытое поле, которое будет указывать, какой контроллер подключить и какую задачу исполнить:
Код: php
<input type="hidden" name="task" value="controller.task" />

Например для нашего примера поиска:
Код: php
<input type="hidden" name="task" value="list.search" />

Будет вызван контроллер TestControllerList и задача (метод) search. Далее в методе search Вы получаете данные из формы и передаете в модель. Ну например:

Код: php
public function search ()
{
    // тут получаем данные
    $data = JFactory::getApplication()->input->get('formname');

    // передаем в метод search модели
    $model = $this->getModel();
    $model->search($data);

   // далее делаем что-то еще
}

В соседней теме мы обсуждали похожее Разработка компонента обработки файла XML
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
спасибо)) кое-что уже понятно, но переход на другой контроллер не получается. я пишу в action
Код
form action="<?php echo JRoute::_('index.php?option=com_test&layout=***'); ?>"
что нужно указать вместо ***? указываю название контроллера vivod в каталоге controllers. Класс нового контроллера
Код
class TestControllerVivod extends JControllerLegacy
в каталоге models vivod.php
Код
class TestModelVivod extends JModelItem
и соответственно вид в каталоге vivod, файл view.html.php
Код
class TestViewVivod extends JViewLegacy
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Цитировать
но переход на другой контроллер не получается
Это не делается в action. Редиректы делаются в контроллере. Я дал ссылку на соседнюю тему, там это тоже обсуждалось.
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Тогда может мне лучше сделать через один MVC и два слоя? Проблема в том что не могу передать данные в модель и далее в вид.
controller.php
Код
<?php
defined('_JEXEC') or die;
jimport('joomla.application.component.controller');

class TestController extends JControllerLegacy
{
public function search ()
{
    // тут получаем данные
    $data = JFactory::getApplication()->input->get('poisk');
    // передаем в метод search модели
    $model = $this->getModel();
    $model->search($data);
}
}
модель test.php
Код
<?php
defined('_JEXEC') or die;
jimport('joomla.application.component.modelitem');
class TestModelTest extends JModelItem
{
public function search($data)
{
if (!isset($this->item))
{
$this->item = $data;
}

return $this->item;
}

public function getItem()
{
if (!isset($this->item))
{
$this->item = 'test';
}

return $this->item;
}
}
Вид default.php
Код
<?php
defined('_JEXEC') or die;
?>
<h2><?php echo $this->item; ?></h2>
<form action="<?php echo JRoute::_('index.php?option=com_test&layout=vivod'); ?>" method="post" name="poisk" id="poisk">
<input type="submit" value="poisk">
<input type="text" name="test">
<input type="hidden" value="test.search" />
</form>
Понимаю что в модели сейчас ерунда. Как я понял метод getItem стандартный. Вопрос: если мы создаем свою функцию ее ведь надо будет вызвать? или она будет выполнена автоматически?
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Такс, это я ошибся. В поле <input type="hidden" value="test.search" /> должно же быть еще name="task":

Код: php
<input type="hidden" name="task" value="test.search" />
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
перейдет ли у меня тогда командой test.search в controller.php? или лучше переходить в другой контроллер (например назвать его search)? 
Как мНеправильно получить данные в модели и где можно почитать про стандартные переменные и методы Joomla? на официальном сайте находил только урок  HelloWorld
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Цитировать
перейдет ли у меня тогда командой test.search в controller.php?
Нет, это вызовет контроллер из /controllers/search.php. Если хотите вызвать контроллер по умолчанию, то не указывайте test.

Цитировать
или лучше переходить в другой контроллер (например назвать его search)? 
А это как Вам хочется...

Цитировать
Как меправильно получить данные в модели
Смотря какие данные. В документации, на которую я Вам давал ссылку в принципе есть информация по работе с моделью.

Цитировать
где можно почитать про стандартные переменные и методы Joomla?
Что Вы имеете ввиду? Нет такого понятия, как стандартные переменные.
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
А прямо из контроллера или из модели данные никак нельзя вывеси что бы посмотреть что в переменных? чтобы понять куда данные передались а куда нет.
Что Вы имеете ввиду? Нет такого понятия, как стандартные переменные.
Переменные, методы классы или тому подобное например JModelItem. как я понял это класс Joomla.

все таки не могу уловить: в контроллере пишем
Код
    $data = JFactory::getApplication()->input->get('poisk');
    // передаем в метод search модели
    $model = $this->getModel('poisk');
$model->search($data);

значит в модели должно быть что то вроде
public function search($data)
   {
         $this->item = $data;
   return $this->item;
        }

а модель отправляет данные методом get. Как же мне их тогда связать? просмотрел уже несколько раз примеры. Разжуйте пожалуйста для тех кто в танке
« Последнее редактирование: 01.04.2014, 11:46:26 от shenya »
*

DimkaJack

  • Осваиваюсь на форуме
  • 28
  • 0 / 0
Переменные, методы классы или тому подобное например JModelItem. как я понял это класс Joomla.

http://api.joomla.org/cms-3/classes/JModelItem.html
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Цитировать
А прямо из контроллера или из модели данные никак нельзя вывеси что бы посмотреть что в переменных? чтобы понять куда данные передались а куда нет.
Можно - print_r($var) или var_dump($var).

Цитировать
а модель отправляет данные методом get. Как же мне их тогда связать?
Куда отправляет? Что связать? Я Вам давал ссылку на соседнюю тему, там скачайте компонент, посмотрите как все связано.
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
не передает с формы. Отправляю
Код
<?php
defined('_JEXEC') or die;
?>
<h2><?php echo $this->item; ?></h2>

<form action="<?php echo JRoute::_('index.php?option=com_test&view=vivod'); ?>" method="post" name="poisk" id="poisk">
<input type="submit" name="button" value="poisk">
<input type="text" name="test_input">
<input type="hidden" name="task" value="vivod.search" />
</form>
Получаю
Код
<?php
defined('_JEXEC') or die;
jimport('joomla.application.component.controller');

class TestControllerVivod extends JControllerLegacy
{
public function search ()
{
    // тут получаем данные
    $data = JFactory::getApplication()->input->get('poisk');
 var_dump($data);

}
}
$data выводит NULL
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
А если вместо var_dump($data); сделать var_dump($_POST); Будет что-то?
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Так точно вывелся массив, спасибо))
array(3) { ["button"]=> string(5) "poisk" ["test_input"]=> string(5) "ляля" ["task"]=> string(6) "search" }
в модель заметил что тоже передается. Буду пробовать дальше

Значит можно без этого:
$data = JFactory::getApplication()->input->get('poisk');
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Теперь выясняй почему $data = JFactory::getApplication()->input->get('poisk'); не выводит. Брать значения напрямую из $_POST не стоит. Или проверять их надо. Иначе можно что-нибудь нехорошее получить.
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
JFactory::getApplication()->input->get('poisk'); ничего не выводит, так как в POST нету переменной с таким именем. Там есть test_input и task:

Код: php
$input = JFactory::getApplication()->input;
var_dump($input->get('test_input'));
var_dump($input->get('task'));

http://docs.joomla.org/Retrieving_request_data_using_JInput
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
спасибо за поправку подумал что нужно указывать имя формы, когда Вы писали
$data = JFactory::getApplication()->input->get('formname');
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Хорошо допустим я обратился к функции модели (test.search) из контроллера. В модели выполнился метод search. Как лучше передать массив, который получаем из базы данных, на вид. !
Как я понял мы в виде получаем данные из модели таким образом
$this->item = $this->get('Item');
Как тогда передать полученный массив в метод getItem (в модели)
Функция getItem
Код
	public function getItem()
        {
  $this->_item = 'Test';
  return $this->_item;
        }
чтобы вместо строки 'Test' отправился массив.
« Последнее редактирование: 02.04.2014, 09:33:36 от shenya »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Дело в том, что Вы изначально сделали неверно! ModelItem предназначена для работы с одной записью. Для работы со списком записей Вам нужна ModelList. Опять же, читайте документацию по созданию компонента, там все есть!
*

shenya

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
То что item это строка я понимаю и про ModelList я так и думал что в будущем это надо будет сделать. Сейчас меня волнует как вопрос как полученные данные в модели(даже если строка) перекачуют в вид?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Jroute компонента альбомов

Автор Koot

Ответов: 2
Просмотров: 593
Последний ответ 03.08.2019, 10:21:04
от Aleks.Denezh
Как использовать функции компонента в модуле?

Автор specialist-web

Ответов: 6
Просмотров: 667
Последний ответ 12.05.2019, 12:26:10
от AlekVolsk
params->get для компонента, как получить свои собственные параметры для компонента

Автор klubnichkaaa

Ответов: 13
Просмотров: 13262
Последний ответ 01.06.2017, 20:20:28
от Septdir
Форма обратной связи не отправляет почту (ajax_contact аддон SPPageBuilder)

Автор AHTEPO

Ответов: 3
Просмотров: 2750
Последний ответ 15.04.2017, 10:01:57
от Taatshi
Плагин Smart Search для своего компонента

Автор ftp27

Ответов: 1
Просмотров: 1590
Последний ответ 07.01.2017, 19:44:04
от newvideo