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

Magys

  • Осваиваюсь на форуме
  • 32
  • 1 / 0
Re: Информация по написанию компонента
« Ответ #30 : 23.03.2009, 13:34:01 »
хватило извините за небольшой флуд
*

Magys

  • Осваиваюсь на форуме
  • 32
  • 1 / 0
Re: Информация по написанию компонента
« Ответ #31 : 23.03.2009, 13:35:17 »
тема про книги пошла вот хотел узнать о книжках, извините, что глубоко вошел в разбор вопроса...
*

Magys

  • Осваиваюсь на форуме
  • 32
  • 1 / 0
Re: Информация по написанию компонента
« Ответ #33 : 23.03.2009, 13:43:10 »
не буду спорить, но просто скажу для написания компонента или плагина вы указывали книги в данном разделе, раз дело пошло о создании серьезного компонента, вдобавок приведен пример по использованию соответствующей литературы возник вопрос есть ли там описания кодов, т.е. самый начальный базовый уровень или же там сразу начинается с создания...

Больше ни слова ни по теме, дабы не портить тему... и не ругаться...
*

era

  • Администратор
  • 1587
  • 391 / 5
  • В туалете лучше быть пользователем, чем админом.
Re: Информация по написанию компонента
« Ответ #34 : 23.03.2009, 13:54:52 »
я думаю что что-бы понять начальную суть компонентов Joomla нужно написать компонентик такого плана:
В BackEnd'е добавляется материал, у него есть свой id, заголовок, текст
Во фронте загружается список материалов в виде ссылок - при клике переходит на просмотр текста этого материала.

Вот, а далее уже прыгать от этого компонентика.
*

doxtor

  • Осваиваюсь на форуме
  • 20
  • 1 / 0
Re: Информация по написанию компонента
« Ответ #35 : 23.03.2009, 14:04:14 »
to Magys:
Php.net, google и чтение форумов, а самое главное задавать конкретный вопрос, что значит что ты не размышляешь о сем да этом, а уже сел за разработку.
to others:
Лично я, как уже некоторые поняли, нуждаюсь в написании компонента, очень схожего с WATS = Web Amoeba Ticket System. Этот компонент создал James Kennard, который как раз и написал книгу Mastering Joomla... С ним можно и общаться, только конечно тупые вопросы я ему задавать не хочу, потому пишу на форумах) Как напишу свой компонент, а он простой как двери, поделюсь опытом с начинающими. Я почитал английский форум, там та же проблема - начинающие теряются, а старички заняты. Tutorial-ы, подобные этому, пишут редкие энтузиасты. Вот так. Да, еще хорошо смотреть на готовые встроенные компоненты, правда мне это мало помогло пока. Но рано или поздно все разъяснится у всех, кто хочет. Удачи
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #36 : 23.03.2009, 21:31:30 »
Собирались заняться контроллером. Им и займёмся. Стоит четыре задачи, сохранение, удаление, редактирование, опубликование.
Это пока.  Начнём с редактирования.
Кнопка "изменить" у нас есть, но не работают чекбоксы. А не работают из за ошибки. Открываем default.php находим
Код
<th width="20px">
<input type="checkbox" name="toggle" value=""onclick="checkAll(<?php echo count( $cat ); ?>);" />
</th>

и  <?php echo count( $cat ); ?> переписываем в <?php echo count( $this->cat ); ?>. Чекбоксы заработали.
Отмечаем чекбокс, нажимаем и происходит черт знает что. Вылетаем в начало компонента. А ничего, кроме перезагрузки страницы происходить не должно. Вот оно - методы get и post в файле входа  нам аукнулись. Идем в simplecatalog.php и из строки

If ($cont = Jrequest::getVar('controller','','get')){

убираем этот get вообще, то есть так

If ($cont = Jrequest::getVar('controller','')){

во теперь вроде нормально.
Кнопка Edit по умолчанию отправляет в контроллер пару task=>edit. Поэтому переходим в контроллер и секцию _construct
пишем так:

Код
  function __construct()
   {
    parent::__construct();
    $this->registerTask( 'edit'       , 'editCats' );
   }

Регистрируем нашу команду task, первый параметр это собственно команда от кнопки, второй имя функции (метода) в нашем контроллере которая эту команду будет исполнять. Я назвал её editCats можно как то и по другому.
Раз у нас редактирование, то это связано с изменением БД, а за это отвечает модель. Поэтому файл модели /models/categoryes.php и пишем функцию сохранения:

Код
function store()
    {
        $row =& $this->getTable();

        $data = JRequest::get( 'post' );

        // Bind the form fields to the hello table
        if (!$row->bind($data)) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // Make sure the hello record is valid
        if (!$row->check()) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // Store the web link table to the database
        if (!$row->store()) {
            $this->setError( $row->getErrorMsg() );
            return false;
        }

        return true;
    }

Основано на функциях API joomla смотрим там и взято из знаменитого com_hello.
Функция сохранения изменений и ни одного SQL запроса UPDATE. Это потому, что за нас его сделает класс JTаble.
Переходим в /tables/categoryes.php и пишем:

Код
<?php

class TableCategoryes extends JTable
{
/** @var int Primary key */
var $id = null;
/** @var int */
var $parent_id = null;
/** @var string The menu title for the category (a short name)*/
var $title = null;
/** @var string The full name for the category*/
var $name = null;
/** @var string The the alias for the category*/
var $alias = null;
/** @var string */
var $image = null;
/** @var string */
var $section = null;
/** @var int */
var $image_position = null;
/** @var string */
var $description = null;
/** @var boolean */
var $published = null;
/** @var boolean */
var $checked_out = 0;
/** @var time */
var $checked_out_time = 0;
/** @var int */
var $ordering = null;
/** @var int */
var $access = null;
/** @var string */
var $params = null;

/**
* @param database A database connector object
*/
function __construct( &$db )
{
parent::__construct( '#__simplecatalog_categoryes', 'id', $db );
}
}
?>

Скопировано из родного файла Joomla и отредактировано. Пока устраивает.
Вообще то редактирование осуществляется в открывающейся форме. Поэтому ее как минимум сделать нужно. Делаем. В каталоге views/tmpl cоздаем файл  form.php и пишем:

Код
<?php defined('_JEXEC') or die('Restricted access'); ?>

<form action="index.php" method="post" name="adminForm" id="adminForm">
<div class="col100">
<fieldset class="adminform">
<legend><?php echo JText::_( 'Title' ); ?></legend>

<table class="admintable">
<tr>
<td width="100" align="right" class="key">
<label for="greeting">
<?php echo JText::_( 'Description' ); ?>:
</label>
</td>
<td>
<input class="text_area" type="text" name="Title" id="greeting" size="32" maxlength="250" value="" />
</td>
</tr>
</table>
</fieldset>
</div>
<div class="clr"></div>

<input type="hidden" name="option" value="com_simplecatalog" />
<input type="hidden" name="id" value="" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="controller" value="categoryes" />
</form>

Взято из того-же компонента com_hello4 и нeмного отредактирвано.
И так, задача написать в контроллере такую функцию которая, пока хотя бы, подгружала нашу форму. Нажата кнопка Edit загружается форма. Пишем:

Код
function editCats()
 {
$view = $this->getView('categoryes','html');
$view->display('form');
}

Нажимаем Edit? ничего не происходит.
Изменим наше представление (view.html.php)

function display (tpl=null) сделаем так, а parent::display($tpl) так.
Пробуем.
Не работает. Идем в файл simplecatalog.php и сроку controller->execute( 'task');
заменяем на:
Код
$task=JRequest::getCmd('task', 'display');
$controller->execute( $task);

Забыли блин.
Нажимаем Edit снова.
Упс. Ругается. Файл form_default не найден. Мы не гордые переименуем. Переименовываем файл form.php в form_default.php. Загружается. И не надо заморачиваться со всякими loadTemplate.
Самое начало шаблона формы напишем так:

Код
<?php defined('_JEXEC') or die('Restricted access'); 
JToolBarHelper::save();
JToolBarHelper::apply();
JToolBarHelper:: cancel();
?>

Неудобно через браузер возвращаться, поэтому сначала обработаем кнопку Cancel. В контроллере напишем:

Код
$this->registerTask( 'cancel'       , 	'cancel' );/*это рядом с аналогичной строкой*/

А это в теле класса

Код
function Cancel()
{
$this->setRedirect('index.php?option=com_simplecatalog&controller=categoryes');
}

Сообщение об отмене операции позже напишем, сейчас только мешать будет. Занесем в Task list, чтобы не забыть.
Вернемся к Edit.
Форма у нас предназначена для отображения единичной записи, а функции для ее извлечения в модели нет, возвращаемся в модель и пишем:
В секции var
Код
var $_category; //на всякий случай, вдруг понадобиться
Метод класса модели:
Код
function getCategory() 
    {
        /* Загружает данные категории если они еще не загружены в виде stdClass-ов*/
        if (!$this->_category)
        {
            $db =& $this->getDBO();
      $query = "SELECT * FROM ".$db->nameQuote('#__simplecatalog_categoryes').
             " WHERE ".$db->nameQuote('id')." =  ".$this->_id ;
            $db->setQuery($query);
            $this->_category = $db->loadObject();
        }
        // выдаем данные как результат функции
        return $this->_category;
    }

Переходим в контроллер в CatsEdit выше display(‘form’) пишем.

Код
$model=$this->getModel();
$category = $model->getCategory();
$view->assignRef('ct', $category);

И ловим нашу ct в шаблоне формы, строку:

 
Код
<input class="text_area" type="text" name="Title" id="greeting" size="32" maxlength="250" value="" />
Переписываем так:
Код
<input class="text_area" type="text" name="Title" id="greeting" size="32" maxlength="250" value="<?php echo $this->ct->title;?>" />
Отмечаем в чекбоксе категорию, жмем Edit, отображается именно та строка. Должна по крайней мере.
Вот так в контроллере можно написать практически новое представление. MVC не соответствует, но мне показалось рациональнее, чем создавать новые контроллеры, представления и пр. Впрочем наверное есть другие решения.
По принципу <?php echo $this->ct->имя поля БД;?> можно вывести все данные для редактирования.
Вызов редактора.
Поле description в HTML-овском textarea редактировать не очень удобно поэтому вызовем редактор.
В вверху (где кнопочки прописаны) шаблона формы пишем:
Код
$editor = &JFactory::getEditor();

А там где поля выводятся, в нужном месте (в каком считаете нужным) вставляем:
Код
<tr>
<td width="100" align="right" class="key">
<label for="greeting">
<?php echo JText::_( 'Description' ); ?>:
</label>
</td>
<td>
<?php
// parameters : areaname, content, width, height, cols, rows
echo $editor->display( 'description',  $this->ct->description , '100%', '550', '75', '20') ;?>

</td>
</tr>

Подумал будем ли вставлять картинки, разрыв страницы, разделять на вступительный и полный текст. Потом глянул на таблицу, подумал о назначении этой фигни и решил что нет, кнопки разрыва страницы, вставки картинки и пр. нам не нужны. А потому перепишем.
Код
echo $editor->display( 'description',  $this->cat->description , '100%', '550', '75', '20', false) ;?>
Вывод на редактирование у нас получился. Как сохрянять отредактирвоанное немного позже.



Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

doxtor

  • Осваиваюсь на форуме
  • 20
  • 1 / 0
Re: Информация по написанию компонента
« Ответ #37 : 23.03.2009, 21:44:58 »
Здоров, наприпер мне удобнее сперва глянуть код, а потом читать объяснения. Если можешь, пакуй для новичков zip файл компонента как атачмент. Это пожелание, а так хорошо написано
*

shprota

  • Давно я тут
  • 770
  • 53 / 1
  • Тружусь, не покладая рук
Re: Информация по написанию компонента
« Ответ #38 : 23.03.2009, 23:10:09 »
Парни, по-моему, вы лезете не в те дебри :)
Берем компонент EasyCreator  - он умеет генерить уже работающие компоненты почти со всеми необходимыми элементами, читаем справочную информацию на девелоперском сайте Joomla и пишем все, что нужно для счастья.
Update: Еще забыл сказать, что хороший отладчик решает большую часть вопросов, как что работает. Сам пользуюсь Eclipse PDT с XDebug
« Последнее редактирование: 23.03.2009, 23:16:57 от shprota »
*

doxtor

  • Осваиваюсь на форуме
  • 20
  • 1 / 0
Re: Информация по написанию компонента
« Ответ #39 : 24.03.2009, 00:03:17 »
Цитировать
Парни, по-моему, вы лезете не в те дебри Azn
Берем компонент EasyCreator  - он умеет генерить уже работающие компоненты почти со всеми необходимыми элементами, читаем справочную информацию на девелоперском сайте Joomla и пишем все, что нужно для счастья.
Ну это ты пишешь будучи уже опытным. Я учу joomly недели 2, сразу же начал писать компонент на базе готового com_hello. А вот по этим генераторам (которых много) тяжело ориентироваться, так как они суть шаблоны. А шаблон нужен опытному ленивому программеру. Проще стартовать с элементарного "живого" компонента. Вижу на своем опыте, уже слепил базовую функциональность и по сути оторвался от первостепенного непонимания. На девелоперском сайте Joomla далеко не все имеется. А вот Eclipse PDT с XDebug действительно рулит.
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #40 : 24.03.2009, 07:59:18 »
Не знаю, может действительно не в те дебри лезем. Но это уже не важно. Тут два момента.
Раз уж влезли в дебри, даже если не в те, то все равно их до конца пройти надо.
Помню как в студенческие времена, нещадно ставили неуды за использование готовых бланков и шаблонов.
Вбили накрепко. Требовали чтобы было написано собственноручно с первого до последнего символа.
Даже если это шаблон. ;D
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Информация по написанию компонента
« Ответ #41 : 24.03.2009, 10:15:39 »
Всё верно мы делаем! Надо начинать с нуля. Но MVC генератор стоит заюзать - он создаёт хорошую структуру и просто облегчает работу.

Eclipse PDT с XDebug тоже установил по инструкции с dev сайта Joomla, но пока ещё не начал с ним работать.
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #42 : 24.03.2009, 13:48:05 »
Создаем XML файл. 

Код
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd">
<install type="component" version="1.5">
   <name>Simplecatalog</name>
   <creationDate>MonthName Year</creationDate>
   <author>Author's Name</author>
   <authorEmail>Author's Email</authorEmail>
   <authorUrl>Author's Website</authorUrl>
   <copyright>Copyright Notice</copyright>
   <license>Component License Agreement</license>
   <version>Component Version</version>
   <description>Component Description</description>
       <administration>
              <menu>Simplecatalog</menu>
       </administration>
       <install />
       <uninstall />
</install>

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



*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #43 : 24.03.2009, 14:03:20 »
Возможно и ошибка. Упакуй все созданное в архив прикрепи к посту или в почту. Приду домой буду ошибку искать.
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #44 : 24.03.2009, 14:08:49 »
Вот то что у меня вышло.
Зарание благодарен.

[вложение удалено Администратором]
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Информация по написанию компонента
« Ответ #45 : 24.03.2009, 14:11:43 »
Белый лист - значит где-то ошибка. Вбей в .htaccess строчку php_value display_errors on - ошибка будет на экране тогда.
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #46 : 24.03.2009, 14:16:26 »
Хм, странно на какую бы я позицию его не кидал ничего не появляетса.
Можно это как-нибудь через админку настроить??
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Информация по написанию компонента
« Ответ #47 : 24.03.2009, 14:19:24 »
Ну там тоже есть нстройка отображения ошибок - поставь на максимум
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #48 : 24.03.2009, 14:26:18 »

Ну что бы я не делал в админке он мне выдаёт чистый лист, а вот если создать пункт меню нй там пишет что не может найти компонент.
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #49 : 24.03.2009, 15:33:36 »
Там файлы лежат не на месте. Отсустствует /helpers/helper.php, default.php лежит в views/setting/default.php, а надо views/setting/tmpl/devault.php. Но ошибка все таки присутствовала, спасибо konstantinopol. Первый пост отредактировал. В /controllers/categories.php надо:

<?php
// no direct access
defined('_JEXEC') or die('Restricted access');

jimport( 'joomla.application.component.controller' );
require_once( JPATH_COMPONENT.DS.'helpers'.DS.'helper.php' );
 class CategoryesController extends JController
{
    function __construct() {

   parent::__construct();
    }
}
?>

Может специально ошибки делать, чтобы понятно было - надо это кому-то или нет  ;D
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #50 : 24.03.2009, 15:49:15 »
На неправильном месте?? Странно вроде всё делал по инструкции.
Попробую всё заново проделать.
Может нарисуешь более подробно что и где должно лежать?? Как это зделано tut http://www.webflasher.net/ru/webmasteru/components-urok-1.html??
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #51 : 24.03.2009, 16:09:23 »

Нашел картинку в книге, но она расплывчатая и нифига невидно что и где находится

[вложение удалено Администратором]
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Информация по написанию компонента
« Ответ #52 : 24.03.2009, 17:07:34 »
Юзай MVC generator! Я его сразу заюзал и создал по максимуму всё :) В процессе написания компонента лишнее удалю.
*

konstantinopol

  • Захожу иногда
  • 66
  • 2 / 0
Re: Информация по написанию компонента
« Ответ #53 : 24.03.2009, 17:22:26 »
Ну это видимо самый удобный/правильный выход из ситуации  ^-^
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #54 : 25.03.2009, 07:07:43 »
Угу. Ну и будете к этой структуре пожизненно привязаны. А если изменить потребуется. В общем ясно. Освобожусь немного, следующий пост этому посвящу. Как и где по умолчанию ищутся контроллеры, представления, модели, шаблоны и как это изменить. Можно посмотреть в исходных кодах методов __construct классов JController, JModel, JView
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #55 : 26.03.2009, 00:26:05 »
Взаимосвязь: входной файл=>контроллер=>представление или обшибка View not found
Контроллеры.
Нужный контроллер подключается в одноимённом c компонентом входном файле, который располагается в корне компонента. У нас компонент соm_simplecatalog входной файл simplecatalog.php. Подключение осуществляется конструкцией:

Код
	If ($cont = JRequest::getVar('controller','')){ 
require_once JPATH_COMPONENT.DS.'controllers'.DS.$cont.'.php';

$cont = $cont.'Controller';

}else{

$cont = 'SettingController';

}
$controller = new $cont();

Что тут происходит. Если в массиве переменных окружения $_GET, $_POST и др. имеется ключ «controller», то переменной  $cont присваивается значение этого ключа. Т.е. Из пары controller=>name переменная $cont будет иметь значение name. Далее, если переменная $count получила какое-то значение, функцией require_once подключается файл контроллера. При этом подключается файл имеющий имя содержащееся в переменной $cont. Потом формируется имя класса контроллера и переменная $cont переопределяется. Теперь она содержит имя контроллера, составленное из первоначального значения $cont и строки «Controller». А дальше создаётся экземпляр класса этого контроллера. Соответственно класс с этим именем должен быть определен в подключённом файле.
 (Хм. Попытался подключить таким образом, контроллер соседнего компонента, нифига не вышло. Но может быть просто ошибся с указанием пути, особо не вдавался. Или защита от хакеров в движке так устроена).
Откуда берется значение «Controller».
Из любой ссылки содержащей эту пару. Посмотрите в ссылках меню компонента
там есть «controller=categoryes. При нажатии на ссылку переменная $cont получает значение categoryes ну и оно используется  в подключении файла контроллера и создании его объекта.
Это значение может отправляться формами шаблонов. Обратите внимание, что каждый шаблон содержит скрытое поле <input type="hidden" name="controller" value="categoryes" />.
Вот эта пара "controller" => "categoryes" и передается формой со всеми остальными данными  и отлавливается в входном файле, подключается нужный контроллер, в даном случае  categoryesController в файле categoryes.php и выполняется его метод (функция), которая определяется второй парой «task» => «значение», так же отправляемой формой с помощью скрытого поля. Приведённый пример подключения конечно не догма. Можно придумать другие механизмы подключения (оператором выбора switch () например). Лишь-бы подключался файл содержащий класс контроллера экземпляр которого создаётся в входном файле (new  NameController). Приставка  Controller обязательна.
Вот во общем-то все с контроллером.
Что происходит когда контроллер подключён. По умолчанию он подключает представление из каталога (далее пути из корня компонента) views/каталог имеющий имя контроллера/view.html.php. Это по умолчанию. Можно переопределить каталог по умолчанию views с помощью метода addViewPath класса JСontroller. Например так:
 
Код
class SettingController extends JController {

 

    function __construct() {

     parent::__construct();

    $this->addViewPath (JPATH_COMPONENT.DS.'myfolder');

}

}

Тогда контроллер будет искать представление по пути /myfolder/имя_контроллера/view.html.php
Каталог который указан здесь как «имя_контроллера» тоже можно переназначить, но только изменив имя контроллера в конструкторе (может и другой способ есть, но я его не знаю)

Код
class SettingController extends JController {

 

    function __construct($config=array()) {

     $config['name'] = 'newname';
parent::__construct($config);

    $this->addViewPath (JPATH_COMPONENT.DS.'myfolder');

}

}

Как вариант можно так

Код
class SettingController extends JController {

 

    function __construct($config=array()) {

$config['name'] = 'newname';

$config['view_path'] =JPATH_COMPONENT.DS.'myfolder'

        parent::__construct($config);

При этих конструкциях путь будет такой /myfolder/newname/view.html.php
Правда при любом изменении пути к представлению придется менять путь к шаблону. Иначе представление не найдет свой шаблон. Для этого есть метод  addTemplatePath класса JView.
В view.html.php так

Код
function display($tpl = null) {

$this->addTemplatePath (JPATH_COMPONENT.DS.'myfolder'.DS.'newname'.DS.'tmpl');

parent::display($tpl);

Ну вот вкратце о связке: входной файл=>контроллер=>представление. Подробнее можно посмотреть в исходных кодах классов JController(подключение представления) и JView (подключение шаблона). О связке Controller=>Model, View=>Model рассказывать или дальше компонент писать будем?
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

b2z

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

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #57 : 28.03.2009, 19:48:29 »
В дополнение к предыдущему посту хочу отметить, что метод addViewPath и изменение пути в конструкторе не равнозначны. В первом случае путь дополняется к пути по умолчанию, во втором идет замена пути по умолчанию на путь определенный в конструкторе. Поэкспериментировать и посмотреть  пути можно написав в методе display контроллера
Код
 
print_r ($_path);

Далее связка view->шаблон(макет). Загрузившись view по умолчанию ищет свой шаблон по пути /views/имя_представления/tmpl/default.php. Имя представления здесь последнее слово в имени класса представления т.е  это class CategoryesViewCategoryes extends JView
Как подгрузить к представлению другой шаблон видно из второго (кажется) поста. Это display(‘имя нового макета’);. Метод  display выполняет loadTemplate и выводит новый шаблон для просмотра.
Переопределение (добавление) путей описано выше. К имени нового макета автоматом прибавляется _default. Поэтому файл должен назваться макет_default.php.

Контроллер => модель.
По умолчанию контроллер ищет модель по пути /models/имя_контроллера.php. К этому пути можно добавить путь к другому каталогу отличному от models методом addModelPath контроллера.
$this-> addModelPath (‘новый путь’) по аналогии с представлением в общем.
Надо сказать, что классом JController, ошибка, когда не найден файл модели не обрабатывается. Т.е. ошибку, что не найдена модель, как с представлением не получим. В нашем случае, не будет работать конструкция:
Код
$model = $this->getModel();
$cat = $model->getCategoryes();
Выдаст, что метода getCategoryes() вызван вне объекта (Fatal error: Call to a member function getCategoryes() on a non-object).

 Представление => Модель.

По умолчанию, /models/имя_пердставления.php
Сразу скажу, как эта штука работает понятия не имею. >:( Разобраться мозгов не хватило.  crazy!
Метод научного тыка тоже ничего не дал. Поместил в каталог models файл newmod.php  в нем класс NewmodModelNewmod в нем метод

Function getNewmod()
{
Return ‘Новая модель’;
}
В представлении
ни
$n = $this->get(‘Newmod’);
ни
$model = $this->getModel(‘Newmod’);
$n = $model->getNewmod();
Не сработали. В первом случае, молча не работает, во втором говорит, что функция getNewmod() вызвана вне объекта.
Coogl дал это http://forum.joomla.org/viewtopic.php?f=304&t=316802&start=0/ Но как описано тоже не заработало. Заработало это:
В контроллере

Код
function display()
{
$mod = $this->getModel('Newmod','NewmodModel');
$neww = $mod->getNewmod();
$view = $this->getView('Categoryes','html');
$view->assignRef('newmod',$neww);
$view->display();
}
Но опять таки, одновременно вывести данные из двух моделей не удалось.
Примем пока как данность, что в одном представлении можно получить данные из одной модели.
Если у кого получилось отпишитесь, любопытно – так оно и есть или я затупил.
А посему позже продолжим писать компонент. А то куда-то в сторону занесло.

P.S. Ха заработало. Нужно. ;D

Контроллер
Код
function display()
{
$mod = $this->getModel('Newmod','NewmodModel')
$mod1 = $this->getModel();
$view = $this->getView('Categoryes','html');
$view->setModel($mod,false);
$view->setModel($mod1);
$view->display();
}

Представление
Код
function display($tpl = null) {
$c = $this->get('Categoryes','Categoryes');
$this->assignRef('cat',$c);
$n = $this->get('Newmod','Newmod');
$this->assignRef('newmod',$n);
parent::display($tpl);
}
« Последнее редактирование: 28.03.2009, 20:26:56 от Lex »
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #58 : 30.03.2009, 13:08:59 »
В дополнение. В компоненте Hello World. Есть способ вызова представления и шаблона из контроллера с помощью JRequest::setVar(‘view’,’myview’) и шаблона JRequest::setVar(‘layout’,’mytemplate’). Забыл про него. Видимо потому, что он мне не понравился. Не знаю почему. Сразу выбросил из арсенала.
Вернемся к нашему компоненту.
В аттаче архив с компонентом, который у нас был, до вопроса связок частей MVC структуры. Ставится как компонент. У меня на Денвере встал нормально. Сделан для обозначения начала. А то с экспериментами, первоначальный вариант  у меня куда-то подевался. Пришлось восстанавливать.
 Займемся общей таблицей категорий, а то она какая-то «недоделанная». ^-^
Сделаем заголовки категорий ссылками на редактирование, для этого в views/categoryes/tmpl/default.php к строкам:

Код
$row = &$this->cats[$i];
$published = JHTML::_('grid.published', $row, $i );
$checked = JHTML::_('grid.checkedout',   $row, $i );

Добавим выделенную строку
Код
$row = &$this->cats[$i];
$published = JHTML::_('grid.published', $row, $i );
$checked = JHTML::_('grid.checkedout',   $row, $i );
$link = JHTML::_('link', JRoute::_( 'index.php?option=com_simplecatalog&controller=categoryes&task=edit&cid[]='. $row->id ),$row->title, 'title="'.JText::_( 'Edit' ).'"');
А строку где выводится название категории:
Код
<td align="left">
<?php echo $row->title;?>
</td>
Заменим на:
Код
<td align="left">
<?php echo $link;?>
</td>
Дальше опубликование и снятие с публикации.
Поле в таблице у нас уже есть. В файле views/categoryes/tmpl/default.php добавим две кнопочки.
Код
JToolBarHelper::publishList();
JToolBarHelper::unpublishList();
В файле контроллера зарегистрируем task. Там уже есть подобные записи, добавляем.
Код
$this->registerTask( 'publish'    , 	'publish' );
$this->registerTask( 'unpublish'  , 'publish' );
Как видим, обработчик будет один, ну и создаем его
Код
function publish()
    {
    JRequest::checkToken() or jexit( 'Invalid Token' );
    $data = JRequest::getVar('cid',  0, '', 'array');
    if (empty($data)) {
$message = JText::_('No data');
            $this->setRedirect('index.php?option=com_simplecatalog&controller=categoryes', $message);
        }
    $model = $this->getModel();
    $table = $model->getTable();
    if ($this->_task == 'publish')
    {
    if ($table->publish($data))
    {
        $message = JText::_('Category').' '.JText::_('Published');
    }
    else
    {
        $message = JText::_('Category no Published. Failed');
        $message .= ' ['.$ table->getError().']';
    }
      }
    if ($this->_task == 'unpublish')
    {
    if ($table->publish($data,0))
    {
    if ($data>1)
        $message = JText::_('Category').' '.JText::_('Unpublished.');
    }
    else
    {
        $message = JText::_('Category no Unpublished. Failed');
        $message .= ' ['.$table->getError().']';
    }
    }
    $this->setRedirect('index.php?option=com_simplecatalog&controller=categoryes', $message);
  }
Поскольку используется метод publish() класса JTable, то часть приведенного выше обработчика можно перенести в модель, но особого смысла в этом не вижу.
Опубликование должно работать.
Добавим постраничную навигацию.
Переходим в файл /models/categoryes.php и ниже строки parent::__construct(); пишем:
Код
$apl =& JFactory::getApplication();

        // Get the pagination request variables
        $limit = $apl->getUserStateFromRequest('global.list.limit','limit', $apl->getCfg('list_limit'));
        $limitstart = $apl->getUserStateFromRequest($option.'limitstart', 'limitstart', 0);
        // set the state pagination variables
        $this->setState('limit', $limit);
        $this->setState('limitstart', $limitstart);

Т.е. как понял, получаем данные о количестве отображаемых позиций на листе установленных в общих настрйказ сайта и присваиваем их для нашего компонента.
Почитать можно здесь http://docs.joomla.org/How_to_use_user_state_variables
Пишем функции

Выдает общее количество записей
 
Код
function getTotal()
    {
        // Load the content if it doesn't already exist
        if (empty($this->_total)) {
            $query = $this->_buildQuery();
            $this->_total = $this->_getListCount($query);
        }
        return $this->_total;
    }
Создает экземпляр объекта JPagination и присваиваются значения полученные выше и ниже.
Код
function getPagination()
    {
        // Load the content if it doesn't already exist
        if (empty($this->_pagination)) {
            jimport('joomla.html.pagination');
            $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit') );
        }
        return $this->_pagination;
    }
И переписываем нашу функцию getCategoryes так:
Из таблицы извлекается только количество записей установленных в глобальных настройках. Пока свои настройки не установили.
Код
function getCategoryes()
        {
            If (empty($this->_categoryes))
            {
            $this->_categoryes = $this->_getList($this->_buildQuery(), $this->getState('limitstart'), $this->getState('limit'));
            $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit'));
            }
        return $this->_categoryes;
        }
В файле представления /views/categoryes/view.html.php добавляем полученные данные для передачи в шаблон.
Код
$pagination =& $this->get('Pagination');
$this->assignRef('pagination', $pagination);
И получаем их в шаблоне /views/categoryes/tmpl/default.php. Ниже блока где прописаны заголовки таблицы вставляем:
Код
<tfoot>
<tr>
<td colspan="13">
<?php echo $this->pagination->getListFooter(); ?>
</td>

</tr>
    </tfoot>
Картинки рисуются и отображаются данные методом getListFooter() объекта JPagination.
Хм. По книжке получилось, что графический объект создается в модели (подключается библиотека jimport('joomla.html.pagination'). И в представление передается уже готовым объектом. Не лучше ли его создавать в представлении, а в представлении из модели получать только данные. По MVC так кажется. Оставим как есть. 
Позже займемся сортировкой записей.




[вложение удалено Администратором]
« Последнее редактирование: 04.04.2009, 09:30:48 от Lex »
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
*

Lex

  • Завсегдатай
  • 1615
  • 274 / 1
Re: Информация по написанию компонента
« Ответ #59 : 04.04.2009, 09:42:57 »
Суббота. Очередной пост не готов. Начитался.
Update: Еще забыл сказать, что хороший отладчик решает большую часть вопросов, как что работает. Сам пользуюсь Eclipse PDT с XDebug
Eclipse PDT с XDebug тоже установил по инструкции с dev сайта Joomla, но пока ещё не начал с ним работать.
Поставил NetBeans. Сейчас пытаюсь этого зверя приручить и подружить его с Joomla. Пока с переменным успехом. В части отладки полный мрак. Добью его и продолжим с компонентом. Если кто с netBeans в ладах отпишитесь удалось ли прогнать отладку по Joomla и наладить автоподсказку дальше уровня классов. Т.е. до их методов. Может это вообще невозможно и я зря время теряю.
Жизнь заставила учиться.
В личке на вопросы не отвечаю.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

При попытке войти в админку 404 ошибка компонента

Автор omezik

Ответов: 4
Просмотров: 2399
Последний ответ 31.08.2019, 22:41:46
от Taatshi
Вывод компонента в качестве модуля

Автор fMichail

Ответов: 4
Просмотров: 2969
Последний ответ 06.08.2014, 15:16:29
от anar4ik
Переменные, доступные из любого компонента

Автор Serjo_man

Ответов: 3
Просмотров: 1523
Последний ответ 03.02.2014, 05:22:00
от Arkadiy
Работа компонента Ninja RSS 1.1.11 на Joomla 1.5.26

Автор Adam.K

Ответов: 1
Просмотров: 1435
Последний ответ 16.12.2013, 21:26:31
от Adam.K
Доработка компонента - нужна помощь

Автор wfire

Ответов: 5
Просмотров: 1355
Последний ответ 24.09.2013, 13:17:28
от robert