Форум русской поддержки Joomla!® CMS
03.12.2016, 23:51:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Совет: Берем значения поля из Jomsoical (вместо Community Builder)

 (Прочитано 58 раз)
0 Пользователей и 1 Гость смотрят эту тему.
moonaway
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« : 03.11.2016, 12:05:50 »

Как-то было делать нечего и я решил исправить ту вопиющую несправедливость, которая возникла с дружбой AdsManager и JomSocial. C CommunityBuilder дружит нативно, а с JomSocial нет. Казалось бы, что сложного брать поля из JS так же как из CB? Но на самом деле все упирается в то, что поля AdsManager изначально были построены по архитектуре поле CommunityBuilder - они имеют совершенно одинаковые таблицы! Засада, но мы не унываем и планомерно дорабатываем штатные функции до рабочего состояния.
Полную работоспособность данного решения я не гарантирую, но максимальную подгонку обещать могу.

Итак, дано: JomSoical 4.2.5 и AdsManager 3.1.6 Gold.

Что нам нужно?
- Чтобы вот тут в бекенде:

И на фронтенде соответственно брались нужные значения из указанных полей JS.

Делаем следующие:
1. берем файл \components\com_adsmanager\views\edit\view.html.php
и в строке, где берутся доп.поля профиля из CB мы берем поля из профиля JS новой функцией getJSProfile по аналогии с getCBProfile
Код:
if ($conf->comprofiler == 0) {
$profile = $usermodel->getProfile($user->id);
} else {
if (COMMUNITY_BUILDER == 1) {
$profile = $usermodel->getCBProfile($user->id);
}
if (JOMSICAL == 1) {
$profile = $usermodel->getJSProfile($user->id);
} else {
$profile = new stdClass();
}
}

2. Создаем новую функцию  getJSProfile рядом с getCBProfile в \administrator\components\com_adsmanager\models\user.php
Код:
function getJSProfile($userid) {
$this->_db->setQuery("SELECT u.name AS name, u.email as email FROM #__users AS u WHERE u.id=".(int)$userid);
$user = $this->_db->loadObject();
$this->_db->setQuery("SELECT fv.value AS value, f.name AS cbname FROM d44qz_adsmanager_fields AS f LEFT JOIN d44qz_community_fields_values AS fv ON f.cb_field = fv.field_id WHERE f.cb_field !='-1' AND f.published = 1 AND fv.user_id =".(int)$userid);
$rows = $this->_db->loadObjectList();
$new = array();

foreach ($rows as $row) {
$new[$row->cbname] = $row->value;
}

$user = (object)(array_merge((array)$user, $new));

return $user;
}

3. в файле \administrator\components\com_adsmanager\models\content.php
находим getContents и дописываем условие для JS
Код:
function getContents($filters = null,$limitstart=null,$limit=null,$filter_order=null,$filter_order_Dir=null,$admin=0,$favorite=0) {
$sql = "SELECT a.*, p.name as parent, p.id as parentid, c.name as cat, c.id as catid,u.username as user,u.name as fullname ".
" FROM #__adsmanager_ads as a ".
" INNER JOIN #__adsmanager_adcat as adcat ON adcat.adid = a.id ";
if (COMMUNITY_BUILDER == 1)
$sql .= " LEFT JOIN #__comprofiler as cb ON cb.user_id = a.userid ";
if (JOMSOCIAL == 1)
$sql .= " LEFT JOIN #__community_users as cb ON cb.userid = a.userid ";
$sql .= " LEFT JOIN #__users as u ON a.userid = u.id ".
" INNER JOIN #__adsmanager_categories as c ON adcat.catid = c.id ".
" LEFT JOIN #__adsmanager_categories as p ON c.parent = p.id ";
не помню зачем эта функция и работает ли она в моем случае специально не проверял)))) но, по логике должна...

4. \administrator\components\com_adsmanager\views\admin\view.html.php
Эта функция нужна для того, что в админке правильные поля выводились. В районе 811 строки находим получение значений функцией getAllCbFields() и дописываем условия
Код:
$cb_fields = $fieldmodel->getAllCbFields();
$cbfields[] = JHTML::_('select.option', '-1', JText::_('ADSMANAGER_NOT_USED') );
if (isset($cb_fields))
{
foreach($cb_fields as $cb)
{
if (COMMUNITY_BUILDER == 1)
$cbfields[] = JHTML::_('select.option', $cb->fieldid, "(".$cb->fieldid.") ".$cb->name );
if (JOMSOCIAL == 1)
$cbfields[] = JHTML::_('select.option', $cb->id, "(".$cb->id.") ".$cb->name );
}
}
тут можно было, конечно, просто исправить функцию getAllCbFields(), чтобы она сразу отдавала базу с fieldid, а не id, но поздно дошло, а уже лень. Да и так проще понять как это всё работает:)

так же там есть в районе 461 строки кусок кода, которые получает значения полей
Код:
foreach($fields as $field) {
if ($field->cbfieldvalues != "-1")
{
/*get CB value fields */
$cbfieldvalues = $fieldmodel->getCBFieldValues($field->cbfieldvalues);
$field_values[$field->fieldid] = $cbfieldvalues;
}
}
но его мы не правим. Просто любуемся и понимаем, что нужно менять ещё и getCBFieldValues();

5. вздыхаем и идём в \administrator\components\com_adsmanager\models\field.php
около 522 строки видим и правим вышеуказанные функции getAllCbFields() и getCBFieldValues()
Код:
function getAllCbFields() {
$config = JFactory::getConfig();
$dbprefix = JOOMLA_J3 ? $config->get('dbprefix') : $config->getValue('config.dbprefix');

if (COMMUNITY_BUILDER == 1)
$this->_db->setQuery("SHOW TABLES LIKE '".$dbprefix."comprofiler_fields'"  );
if (JOMSOCIAL == 1)
$this->_db->setQuery("SHOW TABLES LIKE '".$dbprefix."community_fields'"  );
$tables = $this->_db-> loadObjectList();
if (count($tables) > 0) {
if (COMMUNITY_BUILDER == 1)
$this->_db->setQuery("SELECT * FROM #__comprofiler_fields WHERE 1"  );
if (JOMSOCIAL == 1)
$this->_db->setQuery("SELECT * FROM #__community_fields WHERE fieldcode !='' "  );
$cb_fields = $this->_db-> loadObjectList();
return $cb_fields;
}
else
return array();
}

Код:
function getCBFieldValues($fieldcbid) {
if (JOMSOCIAL == 1) {
$this->_db->setQuery( "SELECT * FROM #__community_fields WHERE id = ".(int)$fieldcbid." ORDER by ordering ");
$index = $this->_db->loadObject();
$values = explode("\n", $index->options);

$cbfieldvalues = array();
foreach ($values as $key => $val) {
$cbfieldvalues[$key] = new stdClass();
$cbfieldvalues[$key]->fieldvalueid = $key;
$cbfieldvalues[$key]->fieldid = $index->id;
$cbfieldvalues[$key]->fieldtitle = $val;
$cbfieldvalues[$key]->fieldlabel = '';
$cbfieldvalues[$key]->ordering = $key;
$cbfieldvalues[$key]->sys = 0;
$cbfieldvalues[$key]->fieldvalue = $val;
}
return $cbfieldvalues;
}
if (COMMUNITY_BUILDER == 1) {
$this->_db->setQuery( "SELECT *, fieldtitle as fieldvalue FROM #__comprofiler_field_values WHERE fieldid = ".(int)$fieldcbid." ORDER by ordering ");
$cbfieldvalues = $this->_db->loadObjectList();
return $cbfieldvalues;
}
}

а так же в районе строки 267 разглядываем функцию getFieldValues которой требуется getCBFieldValues(), но не трогаем. Так как и так всё хорошо:)


У меня в итоге из JS берется откуда надо и вставляется куда надо все поля по аналогии с CB.

Самая фигня состоит в том, что у таблиц полей JS и СB cовершенно разная архитектура. И если у значения поля CB есть и fieldtitle и fieldvalueid и ordering, тот в полях JS ничего этого нет. Поэтому в функции getCBFieldValues их проходится просто эмулировать:) Что совершенно не сказывается на работоспособности.
В функции getJSProfile же получится совершенно дикий запрос сразу к трем таблица, вместо двух последовательных к CB да и потом функция разворота массива не добавляет  красоты. Кто знает, как сделать это проще - прошу в комментарии
« Последнее редактирование: 11.11.2016, 22:06:49 от moonaway » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet