Slyweb
На разработку сайта! Скидки 50%!

Импорт php классов в собственных компонентах Joomla версии 2 и 3

jQuery и CSS

В тех случаях, когда пишется собственный компонент, неотъемлемой его частью будут классы, обслуживающие данный компонент. Для того, чтобы написать что-то вроде mycomponentimport(mycomponent.render.renderjquery) и подключить класс расположенный по адресу "com_mycomponent/libraries/render/renderjquery.php", который затем можно будет использовать как в администраторской части сайта, так и на страницах самого сайта, необходимо добавить в файл компонента(в администраторскую часть сайта /administartor/components/com_mycomponent/mycomponent.php) с его названием mycomponent.php следующий код:

  • Код
  • Чистый код
  • Копировать в буфер
  1. if (! class_exists('MycomponentLoader')) {
  2.    require_once( JPATH_ADMINISTRATOR.DS.'components'.DS.'com_mycomponent'.DS.'libraries'.DS.'loader.php');
  3.}

        

С помощью этого кода будет подключен класс (файл должен быть расположн по адресу "components/com_mycomponent/libraries/loader.php") для импорта других классов, код которого указан ниже:

  • Код
  • Чистый код
  • Копировать в буфер
  1.<?php
  2./**
  3. * @package        Joomla.Framework
  4. * @copyright    Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
  5. * @license        GNU General Public License version 2 or later; see LICENSE.txt
  6. *
  7. * @component Yandex map
  8. * @copyright Copyright (C) www.slyweb.ru
  9. * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License version 2 or later;
10. */
11.if (!defined('DS')) {
12.    define('DS', DIRECTORY_SEPARATOR);
13.}
14.
15.spl_autoload_register(array('JLoader','load'));
16.
17.class MycomponentLoader extends JLoader
18.{
19.    private static $paths     = array();
20.    protected static $classes = array();
21.
22.    public static function import($filePath, $base = null, $key = 'libraries.') {
23.
24.        $keyPath = $key ? $key . $filePath : $filePath;
25.
26.        if (!isset($paths[$keyPath])) {
27.            if ( !$base ) {
28.                $base = JPATH_ADMINISTRATOR.DS.'components'.DS.'com_mycomponent'.DS.'libraries';
29.            }
30.
31.            $parts = explode( '.', $filePath );
32.
33.            $className = array_pop( $parts );
34.            
35.    
36.            switch($className) {
37.                case 'helper' :
38.                    $className = ucfirst(array_pop( $parts )).ucfirst($className);
39.                    break;
40.
41.                Default :
42.                    $className = ucfirst($className);
43.                    break;
44.            }
45.
46.            $path = str_replace( '.', DS, $filePath );
47.            
48.
49.            if (strpos($filePath, 'mycomponent') === 0) {
50.
51.                $className    = 'mycomponent'.$className;
52.                $classes    = JLoader::register($className, $base.DS.$path.'.php');
53.                $rs            = isset($classes[strtolower($className)]);
54.
55.            } else {
56.                // If it is not in the joomla namespace then we have no idea if
57.                // it uses our pattern for class names/files so just include
58.                // if the file exists or set it to false if not
59.
60.                $filename = $base.DS.$path.'.php';
61.                if (is_file($filename)) {
62.                    $rs = (bool) include $filename;
63.                } else {
64.                    // if the file doesn't exist fail
65.                    $rs = false;
66.
67.                    // note: JLoader::register does an is_file check itself so we don't need it above, we do it here because we
68.                    // try to load the file directly and it may not exist which could cause php to throw up nasty warning messages
69.                    // at us so we set it to false here and hope that if the programmer is good enough they'll check the return value
70.                    // instead of hoping it'll work. remmeber include only fires a warning, so $rs was going to be false with a nasty
71.                    // warning message
72.                }
73.            }
74.
75.            MycomponentLoader::$paths[$keyPath] = $rs;
76.        }
77.        
78.        return MycomponentLoader::$paths[$keyPath];
79.    }
80.}
81.
82.function mycomponentimport($path) {
83.    
84.    return MycomponentLoader::import($path);
85.}
86.

        

Класс "MycomponentLoader" расширяет стандартный класс "JLoader", в результате на страницах компонента возможно подключать классы в стиле Joomla jimport('joomla.application.component.controller');, но вместо jimport соответственно mycomponentimport(mycomponent.render.renderjquery). Будьте внимательны, классы компонента необходимо помещать в директорию libraries, следуя пути "mycomponent.render.renderjquery", в котором точка будет заменена на слэш, имя после завершающей точки будет соответствовать имени файла с расширением php. То есть mycomponentimport(mycomponent.render.renderjquery) подключит файл php, расположенный по адресу "/administrator/components/com_mycomponent/libraries/render/renderjquery.php".

Класс из подключенного файла можно использовать и на страницах сайта, - не только в администраторском разделе, для этого необходимо в файл компонента, расположенный по адресу "/components/com_mycomponent/mycomponent.php" добавить аналогичный код, что и в файл администраторской части:

  • Код
  • Чистый код
  • Копировать в буфер
  1.if (! class_exists('MycmponentLoader')) {
  2.
  3.    require_once( JPATH_ADMINISTRATOR.DS.'components'.DS.'com_mycomponent'.DS.'libraries'.DS.'loader.php');
  4.}

        

Сейчас классы с помощью данного импорта можно использовать где угодно в рамках компонента "com_mycomponent".

В следующей статье я расскажу о построении алиасов (маршрутиризации) для собственного компонента на сайте с помощью класса JRouter и файла router.php.


Александр Ермаков