Разработка

Техники быстрой разработки: предотвращение фрагментации кода в Joomla

Joomla
Добавление в избранное
Сохранить

Быстрая разработка: предотвращение фрагментации кода в Joomla

Если вам когда-то приходилось иметь дело с разработкой, то наверняка в закромах скопилось немалое количество собственных приемов и собралась внушительная база наиболее часто используемого кода. Это - «золотой запас» разработчика, который используется при работе над каждым своим проектом, потому что автору всегда проще и понятнее разобраться в собственном коде и, конечно, его всегда приятно использовать, и не важно, написан ли код на должном уровне с точки зрения другого разработчика или нет, но повторюсь - если решение реально работает, каждый разработчик будет использовать именно свои наработки.

Рассмотрим практический пример

За годы работы у разработчика собралась большая библиотека кода. Со временем приходится создавать отдельный проект для каждого сайта. Приходится делать две копии библиотеки: по одной на каждый проект. На первый взгляд кажется, что вносить изменения в обе версии библиотек не так сложно, но потом появляется третий проект, четвертый… Все может быть в порядке только поначалу, но потом, рано или поздно, это превратится в такую рутину, что вы схватитесь за голову (не буду говорить, насколько все усложнится, если к проекту подключится еще один разработчик). Библиотека, разбитая на части, станет бесполезной.

Очевидно, что решение проблемы – это одна копия библиотеки для всех проектов. Вопрос в том, как присоединить все файлы и не вставлять повсюду инструкцию require_once? Возможно вы, как и, я с удовольствием применяете jimport, благодаря которому создается ощущение работы в пакетной среде, такой как Java или .NET. К тому же, не возникает вопросов какие файлы классов используются и их путь по директории.

Особо дотошный программист оспорит необходимость использования глобальной функции jimport как универсального решения. И в самом деле, использование jImport нежелательно, т.к. эта функция является всего лишь оболочкой для класса «JLoader», позволяющего  быстро вставлять файлы без необходимости печатать JLoader::import().

Итак, мы остановились на варианте с одной библиотекой. Как же присоединить новую структуру к новым проектам и не менять уже существующий в проекте код? Для начала давайте посмотрим, как настроены ваши проекты (я возьму за пример Linux, хотя на Windows и Mac проблем тоже возникнуть не должно). Вот как это выглядит у меня:
/var/www/AlphaProject
/var/www/BetaProject

Оба этих проекта содержат установленную Joomla! с собственной копией моей библиотеки «MyLib»:
/var/www/AlphaProject/libraries/MyLib
/var/www/BetaProject/libraries/MyLib

Я использую Zend Studio, но у владельцев Eclipse также не должно возникнуть проблем в интерпретации команд.

Сделайте копию своей библиотеки и удалите ее из структуры своих проектов. Создайте новый проект в корневом каталоге под именем «MyLib». Чтобы было проще, я предлагаю иметь одну копию вашей библиотеки. Если же у вас есть несколько библиотек для импорта, то можно создать общий проект Библиотек, содержащий каждую библиотеку внутри этого проекта в отдельности.

Вот новый адрес нашей библиотеки — /var/www/MyLib. Как заставить jimport ссылаться (при необходимости) на эту папку? Для этого нужно провернуть небольшой тюнинг ядра.

Прежде, чем протестовать, учтите, что это изменение ядра коснется только вашей рабочей машины, на которой вы занимаетесь разроботкой. И пока у вашего живого веб-сайта есть копия библиотеки, построенная по обычному принципу /site/libraries/, то код для него менять не придется.

Перейдите в папку joomla/libraries и откройте файл loader.php. Он отвечает за подгрузку всех файлов во фреймворке Joomla, и нам нужно научить его распознавать нашу собственную библиотеку и дать указание, как её найти. Также нужно убедиться в том, что не возникнет проблем с нахождением библиотеки «joomla» или любой другой, находящейся в папке установки по умолчанию.

Переместитесь бегунком в самый низ и увидите пресловутую функцию jimport. Вызов jimport обычно происходит вот так:

jimport( 'joomla.application.component.controller' );

Первый сегмент – «joomla» - это название библиотеки в директории /joomla/libraries. Нужно проверить не даем ли мы имя своей библиотеке. Изменяем функцию jimport следующим образом:


function jimport($path)
{
    $parts = explode('.', $path);
    if($parts[0] == 'MyLib')
    {
        return JLoader::import($path, '/var/www');
    }
    else
    {
        return JLoader::import($path);
    }
}

Что же получилось?

Мы принимаем все входящие запросы от jimport и разделяем их, чтобы увидеть, направлен ли этот запрос именно на папку «MyLib». Если нет, то делаем все по стандартной схеме. Если же первый сегмент совпадает с MyLib, то мы указываем в функции JLoader путь к нашему текущему проекту.

jimport( 'MyLib.Views.FormView' );

будет ссылаться на: /var/www/MyLib/Views/FormView.php

Если такой пример покажется недостаточным, перепишите код так, чтобы запросы jimport() хранились в реестре автозагрузки. Классы, подгружаемые извне библиотеки joomla не хранятся в реестре из-за различия в именовании.

Вот и все. Теперь следует проверить тестовый сайт и убедиться, что все работает. Не забудьте скопировать свою библиотеку в папку с установленной «Joomla!», когда будете запускать проект на живом сайте.

Оригинальная статья: Jarrod Nettles
Katerina Vorobyova
Переводчик, IT любитель, фотомодель.

Подпишитесь на рассылку новостей CMScafe