Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Для хранения практически всей информации о сайте Joomla использует базу данных MySQL. Она позволяет хранить значительные объемы данных, при этом предоставляет нам удобный интерфейс для взаимодействия с ней. Компонент обычно создает хотя бы одну таблицу для хранения своей информации. Например, данные материалов компонента «com_content» хранятся в «jos_content» таблице (где «jos_» это префикс названия всех таблиц Joomla).
Однако возникает проблема, как универсально хранить в одной и той же таблице большое количество параметров, при этом легко работать с ними. Существует два выхода — каждый элемент настроек хранить в отдельном поле таблицы или все параметры хранить в одном месте. В принципе, нет никаких ограничений со способом хранения настроек компонента. Но в Joomla 1.5 уже существует API для хранения информации подобного рода. Разберем как это делается…
Это глобальные настройки задаются один раз на весь компонент, и как правило используются для одного конкретного сайта.
Пункт меню так же может иметь индивидуальные параметры для компонента. Обычно они перекрывают глобальные настройки расширения. Таким образом два разных пункта меню могут ссылаться на один и тот же материал, при этом материал может отображаться по разному, в зависимости от выбранного вида (не нужно путать с MVC), т. е. типом меню и настройками непосредственно самого пункта.
Наконец для каждого элемента (например материала для «com_content») можно установить индивидуальные настройки, которые будут перекрывать настройки из меню, а тот в свою очередь глобальные настройки компонента.
Обычно, все параметры хранятся в базе данных MySQL в. одном поле типа text. Различные параметры разделены символом переноса «\n», т. е. каждый параметр — это отдельная строка. Имя от значения отделяются друг от друга символом «=». Например
Они хранятся в поле «params» таблицы jos_components, в строке соответствующей определенному компоненту, к которому они применяются.
Они хранятся в поле «params» таблицы jos_menu, в строке соответствующей конкретному пункту меню, который указывает на компонент.
Они хранятся в текстовом поле в таблице, созданной с помощью компонента. Отметим, что нет строгого правила именования этого поля, хотя обычно его тоже называют «params». Не смотря на это, «com_content» например, использует для этого поле с именем «attribs».
Joomla предоставляет нам ряд удобств для работы с параметрами компонентов. Для этого все параметры должны быть описаны в файле «.xml» и объединены тегом <param />. Вложенные теги определяются как элементы формы, которая доступна в настройках компонента панели управления.
Каждый элемент формы должен иметь атрибуты «name» и «default». После установки компонента в базу данных запишутся эти значения как умолчания. Однако это не всегда удобно. Можно создать отдельный файл настроек компонента config.xml в корне директории «/administrator/components/com_COMPONENT_NAME/». Структура файла должна выглядеть так как ниже в примере.
В атрибуте «addpath» указывается директория с новыми типами элементов форм, которые можно самостоятельно определить при разработке. Также этот атрибут можно определить в теге <url>, который обрамляет специальные элементы <param>. Чтобы задействовать новый тип нужно в атрибуте «type» тега <param> указать название класса, который расширяет класс JElement. Класс этот должен быть объявлен в файле с именем класса и расположен в директории «/administrator/components/com_COMPONENT_NAME/elements».
Чтобы получить доступ к форме параметров необходимо прописать следующий код:
При использовании MVC этот код вписывается в файле «/administrator/components/com_COMPONENT_NAME/views/VIEW_NAME/view.html.php». В результате чего имеем:
При нажатии на эту кнопку, вы увидите форму настроек компонента, которая создается с помощью файла «config.xml». Обратите внимание, что нет большой необходимости объявлять значения по умолчанию, т.к они впишутся автоматически при установке компонента.
Обычно один компонент может иметь несколько представлений, например «категория», «материал», «раздел». И каждый из этих видов имеет свои настройки. Кроме того эти настройки при совпадении имен, могут переопределять глобальные(об этом ниже). Форма параметров определена в XML файле, который должен быть расположен по адресу «/components/com_COMPONENT_NAME/views/VIEW_NAME/tmpl/default.xml». Если название Вида не default, то XML-файл должен иметь название как и у файла Вида. Структура файла следующая:
За отображение этих форм отвечает административный компонент com_menus. После того как он обработает xml-файл, все что находилось внутри <url> и <params> будет отображено в основных параметрах, соответственно для содержимое <advanced> будет включено в расширенные параметры пункта меню.
При описании настроек для пункта меню нужно иметь ввиду несколько вещей:
Они определены в файле XML, который может храниться где угодно, но обычно находится в пределах Back-End директории «models» (если вы используете структуру MVC) и назван в зависимости от имени модели, к которой он применяется, например «/administrator/components/com_COMPONENT_NAME/models/MODEL_NAME.xml». Файл XML должен иметь следующую структуру:
Как и в случаях выше, можно вместо тега <root> использовать любой другой, но все же желательно использовать «root». Можно определить несколько групп параметров, указывая в теге <params> атрибут с именем группы. При наличие нескольких одинаковых групп, использоваться в работе будет только первая.
Для того чтобы эти группы отобразились в настройке элемента, в панели управления придется написать небольшой фрагмент кода. Нужно получить доступ к параметрам из базы данных. Для это стоит определиться с местом хранения параметров в базе MySQL и XML-файлом, который будет использоваться для описания формы. Например, будем считать что в $row содержится информация о материале, а в свойстве этого объекта params — сохраненные параметры из базы данных.
Этот код должен находится в файлах Вида (например, view.html.php) в соответствующих папках.
Для отображения параметров в форме слайдера (аккордиона) нужно использовать следующий код в файле шаблона (например, /administrator/com_COMPONENT_NAME/views/VIEW_NAME/tmpl/default.php). Пример слайдера можно увидеть на картинке выше, а реализация идет далее.
Для того, чтобы сохранить параметры в базу данных нужно перегрузить метод BIND(), который может быть найден в «/administrator/com_COMPONENT_NAME/tables/COMPONENT_NAME.php»
Работа с параметрами для лицевой части сайта, несколько сложнее, т. к. здесь будет срабатывать перекрытие, то нужно не забывать о том что у компонента «Элемент» перекрывает «Пункт меню», который перекрывает настройки по умолчанию. Желательно использовать эту иерархию, в крайнем случае придется прилагать дополнительные усилия и усложнять логику компонента, нарушая стандартную работу Joomla.
Следующий фрагмент кода, дает доступ к глобальным настройкам компонента, которые уже перекрыты пунктом меню (если это было возможно).
По правилам MVC код должен быть помещен в Вид (view.html.php)
Допустим параметры пункта меню хранятся в свойстве «params» переменной $row (объект пункта меню), тогда чтобы перекрыть глобальные параметры выполним следующее действие.
Заметим, что в обоих предыдущих примерах, мы не просто перекрываем параметры, мы так же добавляем новые, недостающие элементы и получаем в итоге полный комплект настроек. Теперь для доступа к конкретному значению используем следующий код:
Нужно понимать что при использовании метода merge() не получиться перекрывать определенные параметры. Другими словами следующий код не даст вам желаемого результата:
Как это правильно делать, читаем ниже.
Бывают случаи когда разработчикам нет необходимости использовать встроенное перекрытие, а нужно работать отдельно с каждым набором. Это немного сложнее реализовывать. В следующем примере $params будет присвоены параметры по умолчанию, без перекрытия
Если вам необходимо объединять параметры из определенного пункта меню, то код будет выглядеть примерно так
Это наиболее корректный метод, чем тот что описывается выше. В этом случае можно просто хранить все в смешанном объекте, например так
Таким образом можно гибко управлять настройками компонента. Например, сделать так чтобы компонент игнорировал в определенных случаях глобальные параметры и использовал только то что придет из пункта меню, или наоборот. Но тем не менее, лучше не отходить от стандартного подхода, а в крайнем случае каким-либо способом сообщить пользователю как работает расширение.
Доступ к конкретному значению осуществляется так же как описано чуть выше.
Огромное спасибо. Очень полезная статья - мне нужно было получить глобальные настройки компонента, которые перекрывались настройками пункта меню.
Скажите, пожалуйста для чего нужен в таком случае файл metadata.xml, который располагается в папке какого-либо вида в пользовательской части компонента?
"По правилам MVC код должен быть помещен в Вид"
ru.wikipedia.org/wiki/MVC
Представление, вид (англ. View). Отвечает за отображение информации (визуализация).
ИМХО кода там лишнего вобще не д.б.
Добрый день.
Создал файл config.xml. При нажатии на кнопку "настройки" выводится путая форма. Joomla 1.7
В чем может быть проблема? Заранее спасибо.
Текст конфига
<root>
<params>
<param type="text" name="moderator_email" size="129" default="wm@mydomain.ru" label="Email модератора" description="Адрес, на окторый будут отправляться сообщения о новых вопросах" />
</params>
</root>
анализ работающих компонентов показал.
для 1.7 config.xml должен выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<config>
<fields>
<fieldset name="component">
<field type="text" name="moderator_email" size="129" default="" label="Email модератора" description="Адрес, на окторый будут отправляться сообщения о новых вопросах" />
</fieldset>
</fields>
</config>
вот это работает.
Здравствуйте!
А как обратиться к параметру, скажем, "show_intro" поля "params" в таблице "jos_menu" из шаблона?
Очень просто, учитесь!
<?php
$menuitemid = JRequest::getInt( 'Itemid' );
if ($menuitemid) {
$menu = JSite::getMenu();
$show_intro = $menu->getParams( $menuitemid )->get('show_intro');
}
echo $show_intro;
?>
Статья хорошая, но она не говорит о том как вывести данные из пункта меню, menu. А там тёмный лес, можно много вещей творить! К сожалению даже на оф сайте эта тема не сильно описана. Хорошо комментарий нашёл, с описанием вывода этих настроек, кстати работает и для версии 2.5 и 3.х но xml файл немного другой.
Всем привет! есть статическое меню в html коде вида ul li li ul...... и так далее. Для примера вот сайт - chinainua.com. Меню состоит из 7000 категорий с подкатегориями. Как перенести это меню в joomla 3. Вся сложность в том что заносить руками в joomla такое меню из 7000 подкатегорий нереально.. В интернете уже неделю ищу решение данного вопроса - но ничего не нашел! Подскажите выход.
Thanks for finally talking about >Параметры расширений Joomla, API хранения, вызова,
объединения. / Типы XML-параметров в Joomla .:.
Документация Joomla! CMS <Liked it!
I am curious to find out what blog platform you are using?
I'm experiencing some minor security issues with my latest website
and I'd like to find something more secure.
Do you have any recommendations?
двукратная виза в китай стоимость
Wow that was unusual. I just wrote an extremely long comment but after I clicked submit
my comment didn't appear. Grrrr... well I'm not writing all that over again. Anyways, just wanted to say excellent blog!
My spouse and I stumbled over here by a different page
and thought I might check things out. I like what I see so now i am following you.
Look forward to looking over your web page for a second time.
I’m not that much of a internet reader to be honest but your blogs really nice, keep it up!
I'll go ahead and bookmark your site to come back later on. Many thanks
With havin so much written content do you ever run into any problems of plagorism or
copyright infringement? My website has a lot of exclusive content I've either written myself or
outsourced but it looks like a lot of it is popping
it up all over the web without my authorization. Do you know any techniques to help
reduce content from being stolen? I'd really appreciate it.
Appreciation to my father who told me on the topic of this weblog, this webpage is truly
amazing.
I have been browsing online more than 4 hours today, yet I never found any interesting
article like yours. It is pretty worth enough for me. In my view,
if all website owners and bloggers made good
content as you did, the web will be much more useful than ever before.
Woah! I'm really digging the template/theme of this website.
It's simple, yet effective. A lot of times it's very hard to get that
"perfect balance" between user friendliness and visual appearance.
I must say you've done a excellent job with this. Also, the blog
loads extremely fast for me on Firefox. Exceptional Blog!
Hello, after reading this remarkable piece of writing i
am as well delighted to share my knowledge here with
friends.
Awesome blog! Do you have any helpful hints for aspiring writers?
I'm hoping to start my own website soon but I'm a little lost on everything.
Would you propose starting with a free platform like Wordpress or
go for a paid option? There are so many choices
out there that I'm totally overwhelmed .. Any ideas? Cheers!
Can you tell us more about this? I'd care to find out more details.
If you are going for most excellent contents like I do,
only pay a quick visit this website every day for
the reason that it provides feature contents, thanks adreamoftrains website hosting services
Undeniably consider that that you said. Your favourite justification seemed to
be on the net the simplest thing to take into accout of.
I say to you, I certainly get annoyed even as other people
consider issues that they just don't understand about.
You managed to hit the nail upon the highest as well as
outlined out the whole thing with no need side-effects , folks can take a signal.
Will likely be again to get more. Thanks
This is my first time visit at here and i am truly pleassant
to read everthing at alone place.