Phpxcore:php4:newmodule:main

Материал из phpXCoreWiki.

Перейти к: навигация, поиск

Back

Содержание

[править] С чего начать

  • Изменение конфигурационного файла modules.run.xml.
  • Создание основных файлов модуля.
  • Манипулирование данными
  • Вывод данных.


[править] Конфигурация

Всё что нам нужно - это измененить modules.run.xml. Далее приведен пример с комментариями для модуля xstaticpages:

<xstaticpages enabled='true' seo='info'>
        <run>
         <!-- Имена классов-->
        <main>XStaticPages</main>
        <default>XStaticPagesDefault</default>
        <gateway>XStaticPagesGateway</gateway>
        <admin>XStaticPagesAdmin</admin>
        </run>
    </xstaticpages>
<!-- Настройка статусов:
  Статус - xcmod+xcact - имя статуса по имени xcact
 -->
    <status>
        <show    template='XC.show.tpl'  />
        <default template='XC.index.tpl' />
    </status>

И файл xstaticpages.xml

<?xml version="1.0" encoding="UTF-8" ?>
<module>
        <!-- Информация о авторах модуля -->
    <info>
        <author>
            <name>FirstName LastName</name>
            <email>email@domain.com</email>
        </author>
        <description><![CDATA[ Информация о модуле ]]>
        </description>
    </info>
    <config>
        <!-- Информация о зависимостях модуля -->
        <dependences>
            <dependence>xcategory</dependence>
        </dependences>
        <!-- Информация о таблицах модуля -->
        <tables>
            <table>#__static_pages</table>
        </tables>
        <!-- Информация о поддерживаемых языках -->
    <languages enabled='true' path='lang'>
            <lang>en</lang>
            <lang>ru</lang>
      </languages>
        <main>
        <!-- Секция для автоподключения файлов (указанные файлы нет необходимости подключать в дальнейшем)
             Есть возможность описывать для каждого возможного запуска модуля:
                  - main
                  - default
                  - gateway
                  - xajax
                  - admin
        -->
            <autoinit>
                <file>classes/XStaticPageEntity.class.php</file>
            </autoinit>
        </main>
        <gateway>
            <autoinit>
                <file>classes/XStaticPageEntity.class.php</file>
            </autoinit>
        </gateway>
        <!-- Секция для настройки админки - необязательна -->
        <admin enabled = 'true'>
        <autoinit>
                <file>classes/XStaticPageEntity.class.php</file>
         </autoinit>
 
            <image>icons/24x24/pages.gif</image>
            <title>Management of Static Pages</title> 
            <!-- Настройка главного меню админки -->           
            <menu>
                <title>Static Pages</title>
                <hint>Management of Static Pages</hint>                
                <image1>icons/16x16/Normal/pages.gif</image1>
                <image2>icons/16x16/Disabled/pages.gif</image2>
                <!-- Под пункт меню -->
                <item>
                    <title>Create New</title>
                    <hint>Create new Static Page</hint>
                    <action>create</action>
                </item>            
                <item>
                    <title>Show All</title>
                    <hint>Show all Static Pages</hint>
                    <action>listing</action>
                </item>
            </menu>
        </admin>
    </config>
</module>

[править] Реализация

[править] Создание файлов

Для работы нам необходимо создать основной файл XStaticPages.class.php (конструктор можно не описывать):

class XStaticPages extends XModuleMain
{
 
	/**
	 * run
	 *
	 * Run method
	 *
	 * @class   XStaticPages
	 * @access  public
	 * @return  void
	 */
	function run()
	{		    
	    // switch statement for $this->request->action
	    switch ($this->request->action) {
	    	case 'category':
	    		$this->showCategory();
	    		break;
 
	    	default:
		        $this->ShowPage($this->request->action);
	    		break;
	    }
	}

Метод run будет вызван только при непосредственном обращении к модулю, т.е. xcmod == xstaticpages для данного примера.

[править] Манипулирование данными

В данном примере xcmod=xcounter и xcact=show, следовательно $this->active == true и $this->request->action == show, исходя из этого и конструкции в методе run выполняется метод _show:

/**
 * _show
 *
 * @access  private
 * 
 * @return  bool
 */
 function _show() 
 {
      /* Получение текущего пользователя */
      /* @var $XUser XUser */
       $XUser =& $this->config->active_user;
 
      /* Получение данных из $_REQUEST */
      $day = $this->request->params['day']);
      $day = $this->request->get('day', null);
 
            /* Получения строки из конфига source для текущего языка */
            $this->output->lang->getSource('labels', 'logged');
 
            /* Получения строки из конфига template для текущего языка */
            $this->output->lang->getTemplate('labels', 'logged');
 
            /* Получение данных из конфига модуля*/
            $var1 = $this->config->all["test"]["var1"]["@"]["value"];
 
            /* Создание правильной линки */
            $link = Output::getURL("xcounter", "show", array("day" => $day));
 }

[править] Вывод данных

Для вывода информации используем следующие средства:

/* Assign переменных в главные шаблоны */
$this->output->assignGlobal('title', 'Counter Statistic');
 
/* Assign переменных в шаблоны модуля */
$this->output->assign('test',"Good");
/* Или */
$this->assign('test',"Good");
 
/* Добавляем сообщение (используя class Document)*/
$this->output->document->addMessage("Тук-тук!");
 
/* Добавляем сообщение о ошибке*/
$this->output->document->addError("Ошибочка вышла!");
 
/* Шаблон для вывода информации */
$this->output->addTemplate($this->config->tpl_path."show.tpl");
/* Или Сокращенный вариант */
$this->addTemplate("show.tpl");
 
/* Разделение вывода информации */
$this->output->addTemplate($this->config->tpl_path."front.tpl", "front");
/* Или Сокращенный вариант */
$this->addTemplate("front.tpl", "front");

Главные шаблоны находяться в директории application\templates

Пример главного шаблона XC.stat.tpl (использование данного шаблона указано в modules.run.xml):

<table>
  <tr>
    <td>{$title} <!-- это вывод глобальной переменной --></td>
    <td>{output module='xcounter' view='front'} <!-- это пример разделения вывода --></td>
  </tr>
  <tr>
    <td colspan="2">
         {document type='getRenderedMessages'} <!-- вывод сообщений -->
	{document type='getRenderedErrors'} <!-- вывод ошибок -->
	{output action='fetch_active'}  <!-- вывод основных данных - в данном примере аналог {$xcounter.main} -->
    </td>
  </tr>  
</table>

[править] Redirect

Различные виды редиректа:

/* Добавляем сообщение и редиректим на нужную страницу*/
Output::setMessage('Notes was added');
header('Location: '. Output::getURL('xcounter', ''));
exit;
 
/* Добавляем ошибку и редиректим на нужную страницу*/
Output::setError('Notes was added');
header('Location: '. Output::getURL('xcounter', ''));
exit; 
/* Или Сокращенный вариант */
Output::setError('Notes was added');
Output::goURL("xcounter", "");
 
 
/* Добавляем ошибку(или сообщение) и редиректим на home страницу*/
header('Location: '. Output::getMainURL('Permission denied', DOCUMENT_ERROR));
exit;
/* Или Сокращенный вариант */
Output::goMainURL('Permission denied', DOCUMENT_ERROR);

Не следует использовать редирект при манипуляциях со Datagrid'om, т.е. если Вы отображаете датагридом список item'ов, и Вам необходимо добавить/отредактировать/удалить один из них, то следующий код является непостежимым злом:

// вполне нормальная функция run
function run()
{		    
    // switch statement for $this->request->action
    switch ($this->request->action) {
        case 'add':
            // функция которая добаваляет запись
            $this->add();
            break;
        case 'del':
            // функция которая удаляет запись
            $this->del();
            break;
        case 'showList':
            // функция которая выводит Datagrid
            $this->showList();
            break;
 
        default:
            $this->showList();
            break;
    }
}
 
// ненормальная функция add
function add()
{		    
    // тут идет код для добавления записи в БД
    // ...
    // добавили и делаем редирект!!!
    Output::setMessages('Notes was added');
    Output::goURL("xnotes", "showList");
}

Правильно будет написать следующее:

// нормальная функция add
function add()
{		    
    // тут идет код для добавления записи в БД
    // ...
    // добавили и переходим на функцию showList
    $this->output->document->addMessage('Notes was added');
    return $this->showList();
}
Личные инструменты
123