Чем больше я работаю с Community Builder, тем больше удивляюсь его возможностям. Однажды, читая комментарии к статье со сравнением Community Builder и JoomSocial, я увидел фразу, которую дословно не помню, но смысл такой: «Если выбирать между JoomSocial и Community Builder, то однозначно Community Builder. Правда искусством этого компонента еще нужно овладеть». Не хочу критиковать JoomSocial, т.к. мало с ним знаком, да и не сомневаюсь, что это достойный компонент, но про то, что весь потенциал Community Builder открывается только после того, как поработаешь с ним некоторое время – это точно.
В этой статье я расскажу про еще одну возможность Community Builder, точнее не про сам компонент, как таковой, а про замечательный плагин к нему, который называется CB MySQL Field Plugin. Благодаря этому плагину в Community Builder появляется возможность выводить в профиль результаты выполнения SQL-запроса к базе данных Joomla. И хоть SQL здесь весьма ограничен, мы можем вывести в профиль значение любого поля БД, а также результат математического вычисления нескольких полей, и самое главное, путем небольших манипуляций, мы можем использовать эти результаты для ранжирования профилей пользователей (см. списки CB).
Вышеописанное мало о чем говорит новичкам. Приведу пример: вывод в профиль количества статей, написанных пользователем, количества сообщений на форуме, количества комментариев, даты последнего сообщения, и, вообще, всего, что только можно придумать. Неплохо, не правда ли? О том, как это все осуществить, читайте в этой статье.
Итак, мы имеем Community Builder и… большое желание сделать что-то необычное, выделяющее наш сайт из общей массы. Кроме того, мы хотим заинтересовать пользователей и дать им нечто особенное. Что – каждый придумает сам, а я лишь расскажу – как.
Прежде всего нам нужно скачать и установить плагин CB MySQL Field Plugin. Т.к. плагин бесплатный и распространяется свободно, это просто. Вот ссылка на страничку каталога расширений Joomla с этим плагином, а вот прямая ссылка на скачивание (не знаю, долго ли она проработает, но все же…). Устанавливается плагин, как и любой другой, через менеджер плагинов Community Builder (не путайте с менеджером плагинов Joomla).
После установки плагин нужно опубликовать. Заходим в менеджер плагинов Community Builder, находим плагин CB MySQL Field и публикуем его. Все, пол дела сделано, плагин установлен и готов к работе. Осталось разобраться в том, как его использовать.
Использование может у многих вызвать проблемы. Я и сам изначально довольно долго разбирался в нем. Прежде всего, нам нужно создать новое поле, в которое мы будем выводить результаты запроса. Делается это через менеджер полей Community Builder, путем нажатия кнопки «New Field».
Далее можно заметить, что в списке выбора типа поля, появился вариант «MySQL field».
Он-то нам и нужен. Выбираем этот тип и видим появившиеся параметры поля:
Это то место, где мы будем формировать запрос к базе данных. Разберем все опции внимательно и подробно:
– Result Type (тип результата) – при выполнении SQL-запроса, мы можем получить как единичный результат, так и серию значений, скажем, номера всех пользователей, год рождения которых с 1985 по 1995. Тут все зависит от того, что мы рассчитываем получить. Если единичный результат, то выбираем Single, если множественный – Multiple. При этом в зависимости от типа результата меняются дальнейшие опции, точнее для множественного типа добавляется опция «Add Delimiter». Подробнее о ней написано ниже.
Далее мы начинаем формировать непосредственно SQL-запрос. Для людей, знакомых с языком SQL это не составит труда, а вот те, кто не сталкивался с ним, могут застопориться. Поэтому коротко расскажу, что здесь к чему.
Итак, наша цель – выбрать из базы данных определенные данные. Для того, чтобы сделать это, нужно ответить на 3 основных вопроса:
- Что выбирать? (SELECT)
- Из чего выбирать? (FROM)
- Как выбирать? (WHERE)
В скобочках я написал основные операторы SQL, ответственные за каждый из вопросов.
Теперь подробнее.
1) Как известно, база данных Joomla – это набор таблиц. У каждой таблицы есть столбцы и строки, при этом в столбцах указывается переменная, а в строках – ее значения.
Вот пример:
Таблица: birthday
ФИО |
Год рождения |
Иванов Иван Иванович |
1977 |
Петров Петр Петрович |
1988 |
Сидоров Сидр Сидорович |
1999 |
Чтобы выбрать конкретную запись, нам нужно выбрать правильный столбик и задать условие выбора строки. Т.е., например, сказать: «Выбери ФИО того человека, который родился в 1988 году».
В SQL за «выбери» отвечает SELECT, а за «который родился» – WHERE. Кроме того, т.к. в Joomla таблица не одна, а много, нам нужно указать в запросе название таблицы( за это отвечает оператор FROM).
Таким образом, наш SQL-запрос будет иметь следующий вид:
SELECT ФИО FROM birthday WHERE Год рождения = '1988'
Результатом выполнения этого запроса будет «Петров Петр Петрович»
Надеюсь, более-менее понятно. Более подробно о языке SQL можно почитать в Интернете. Информации море.
Вернемся к нашему плагину. Следующие три опции теперь должны быть понятны. Кроме того, они уже заполнены, так что можно делать по аналогии.
– SELECT – сюда вписываем название столбца, из которого будем выбирать значение;
– FROM – тут будет название таблицы, из которой будем выбирать столбец;
– WHERE – здесь нужно указать условие, по которому будет выбираться строка столбца.
Кстати, нужно отметить, что и столбцов, и таблиц, и условий может быть несколько. Разберем стандартный пример, который появляется по умолчанию:
1 2 3 4 5 |
SELECT CONCAT(name, ' - ', viewscount) FROM #__comprofiler_views, #__users WHERE viewer_id = id AND profile_id = {USERID} |
Посмотрим, что тут к чему. Во-первых, «CONCAT» - это оператор языка SQL, который объединяет строки. Т.е. мы объединяем значения столбцов name (имя пользователя) и viewscount (количество просмотров профиля), вставляя между ними дефис. Т.е. результатом будет что-то типа: «Иванов Иван Иванович - 156» и именно это выведется в профиль.
Теперь далее. Т.к. столбцов у нас два, и находятся они в разных таблицах, нам нужно указать эти две таблицы: #__comprofiler_views, #__users.
И последнее, самое важное и сложное, это условие выбора. Здесь в ход идут уже логические выражения «И»(AND) и «ИЛИ»(OR). AND означает, что результат будет выдан только для тех строк, в которых выполняется и первое и второе условие. OR – или первое, или второе, или обе вместе.
Нашим условием мы говорим, что нужно выбрать строку с тем пользователем, идентификатор которого является идентификатором пользователя текущей страницы (т.е. его страницы) и строку с тем количеством просмотров, идентификатор которой является идентификатором текущей страницы. Как-то так. Понимаю, разобраться здесь сложно. Но нужно хорошенько поднапрячь мозги, поэкспериментировать и все получится.
– Output Mode (режим выводов результата запроса) – ниже расскажу, что это такое, и, вообще, зачем нужен этот режим.
В ранних версиях плагина выбор режима вывода отсутствовал, и результат запроса просто выводился в профиль. Все работало отлично, если бы не одно но. В этом случае в базе данных не содержаться полученные результаты, они формируются «на лету» с помощью SQL-запроса. Из этого следует один большой минус данного метода – невозможно провести ранжирование пользователей по данному полю. Т.е. составить упорядоченный список пользователей, где они упорядочены по полю, полученному с помощью SQL-запроса. Это логично и правильно, но плохо, т.к. хочется, и потому многие пользователи писали автору плагина, что надо как-нибудь решить данную проблему. Автор прислушался и решил путем добавления возможности не только вывести результаты SQL-запроса, но и сохранить их в базу данных, что позволит производить по ним ранжирование. Решение, конечно, не слишком элегантное, т.к. для добавления в профиль одного поля в базу приходится добавлять два: в одном как бы исполняется SQL-запрос, а во второе сохраняется его результат. Зато это позволяет формировать какие душе угодно списки пользователей, что невероятно расширяет возможности Community Builder.
Таким образом, в данной опции мы можем выбрать одно из трех значений: Display Only – только показывать на профиле, не сохраняя значения, Save Only – только сохранение в базу данных, без отображения на профиле, Both – и отображать и сохранять в базу. При выборе Save Only или Both ниже появляется еще одна опция, про которую написано ниже.
– Field Name – имя таблицы базы данных, в которую нужно сохранять результаты выполнения SQL-запроса. Для этих целей нам нужна новая таблица. Она легко создается через все тот же менеджер полей Community Builder. При добавлении поля добавляется и таблица, которую в дальнейшем можно использовать для сохранения результатов. И ранжирование будет происходить как раз по этому полю.
– Add Prefix – добавление чего-либо перед выводом результата запроса. Под «чем-либо» я понимаю, например какой-нибудь вступительный текст и.т.д.
– Add Suffix – добавление чего-либо после вывода результата запроса.
– Add Delimiter (добавить разделитель) – появляется только в случае, когда опция Result Type установлена в Multiple. Позволяет выбрать разделитель значений результата, если результат множественный.
– Profile Display (отображение на профиле) – здесь можно выбрать кому показывать данное поле. All – всем, User Only – только пользователю, которому принадлежит профиль, Viewer Only – тол ько тем, кто просматривает профиль.
Как можно заметить, CB MySQL Field Plugin замечательный плагин, особенно, если его использовать в связке с Community Builder Profile PRO. Главный плюс этих расширений в том, что они снимают почти все технические ограничения. Остается только проявить фантазию и создать уникальный, ни с чем несравнимый сайт.
P.S.
Очень полезные для меня статьи по CB. Спасибо
Таблицу нашел :)
Главный вопрос - можно ли сохранить результаты множественного вывода?
У меня получается сохранить только одно значение
Select: referrees
From: jos_alpha_userpoints
Where: userid
цифру выводит,НО во всех профилях оно показывает кол-во привлечённых администратором,а цель стоит,выводить кол-во привлечённых пользователей конкретного профиля! Подскажите как осуществить! Я так понимаю мне ещё нужно брать данные столбца profile_id из таблицы jos_comprofiler_views или я ошибаюсь?
WHERE profile_id = {USERID}
Допишите это.
И еще вопрос. Можно ли при помощи этого плагина сделать следующее. Хотелось бы результаты запросов выводить не в профиле, а в произвольном месте сайта (например, в новом модуле). Или для этого существуют другие плагины? если знаете о них, напишите пожалуйста название!
Залезть в базу и найти. Там все хорошо структурировано. Проблем возникнуть не должно, если знаете что такое PhpMyAdmin.
Можно использовать, например, это:
http://extensions.joomla.org/extensions/core-enhancements/data-reports/10785
спасибо
Не получается так, как у Вас. Появляется строка - Написано статей, и прочерк вместо количества, хотя статьи добавленные есть.
В чем может быть ошибка?
Автор напиши если будет время ЗАПЛАЧУ.
Вот скайп: alexsei_rabota
А в целом надо прикрутить к виртуемарту и еще одному компоненту .. вот это
было бы очень актуально рассказать о настройках прав для пользователей : для списка и полей с табами ,поскольку все эксперименты с ними (на разных сборках джум ) похожи на один и очень большой баг,не малую роль в этом по-видимому сыграли и переводчики...
""Группа пользователей, к которой разрешается доступ:"" или я что-то недопонял,но в переводе это означает доступ к просмотру ,а не доступ к группе ,и вроде как работает...
А вот сдесь просто пустота-""View Access Level:"" я так понял для всех версий джум ,но не работает(
а с полями и табами совсем караул
и какой-либо внятной информации по этому поводу нет ,только рерайт 5 руб за 1000 знаков(
Как назвать поле без префикса cb_ ???
или как новые префиксы добавить?
Сортирует, но как то странно по первой цифре, а не по всему количеству т.е. например есть пользователи с 80, 60, 20, 120, 110 и 0 баллами так вот он вперед ставит именно в том порядке в котором я написал чуть выше... и как это исправить пока не можем дотумкать
Решение найдено
SELECT points
FROM ly30o_alpha_userpoints
WHERE userid={USERID}
На сайте появилось нужное поле с количеством баллов, НО теперь я не могу зайти в User Manager, т.к. мне пишет об ошибке 1064:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 SQL=SELECT `points` AS mysqlfield FROM `koj6x_alpha_userpoints` WHERE userid =
Что делать?
Реально помогло! Была похожая проблема.. Спасибо за статью, очень полезная!