Компонент DJ Catalog2 имеет плагин для вставки пользовательских полей в описание продукта.В стандартной таблице customfileds - под описанием продукта - в многоцветном поле customfield - это как
<span class="djc_cartattr_color">
<span class="djc_cartattr_color-bg" style="background-image: url('/media/djcatalog2/images/colors/image.png');"></span>
<span class="djc_cartattr_color-name">Name</span></span>
Это код файла для отображения атрибутов:
<?php
/**
* @package DJ-Catalog2
* @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
* @license http://www.gnu.org/licenses GNU/GPL
* @author url: http://dj-extensions.com
* @author email contact@dj-extensions.com
*/
defined ('_JEXEC') or die('Restricted access');
?>
<?php
$item = $this->item_cursor;
$attribute = $this->attribute_cursor;
$attributeName = '_ef_'.$attribute->alias;
?>
<?php if (isset($this->item_cursor->$attributeName) && (is_array($this->item_cursor->$attributeName) || (is_scalar($this->item_cursor->$attributeName) && trim($this->item_cursor->$attributeName) != ''))) { ?>
<tr class="djc_attribute djc<?php echo $attributeName; ?>">
<td class="djc_label">
<?php
if ($attribute->imagelabel != '') {
echo '<img class="djc_attribute-imglabel" alt="'.htmlspecialchars($attribute->name).'" src="'.JURI::base().$attribute->imagelabel.'" />';
echo '<span class="djc_attribute-label">'.htmlspecialchars($attribute->name).'</span>';
} else {
echo '<span class="djc_attribute-label">'.htmlspecialchars($attribute->name).'</span>';
}
?>
</td>
<td class="djc_value">
<?php
if (is_array($this->item_cursor->$attributeName) && $attribute->type != 'multicolor' && $attribute->type != 'color'){
//$this->item_cursor->$attributeName = implode(', ', $this->item_cursor->$attributeName);
if (count($this->item_cursor->$attributeName) > 1) {
$this->item_cursor->$attributeName = '<ul><li>'.implode('</li><li>', $this->item_cursor->$attributeName).'</li></ul>';
} else {
$this->item_cursor->$attributeName = implode(' ', $this->item_cursor->$attributeName);
}
echo $this->item_cursor->$attributeName;
}
else if ($attribute->type == 'textarea' || $attribute->type == 'text'){
$value = nl2br(htmlspecialchars($this->item_cursor->$attributeName));
// convert URLs
$value = preg_replace('#([\w]+://)([^\s()<>]+)#iS', '<a target="_blank" rel="noopener noreferrer" href="$1$2">$2</a>', $value);
// convert emails
$value = preg_replace('#([\w.-]+(\+[\w.-]+)*@[\w.-]+)#i', '<a target="_blank" rel="noopener noreferrer" href="mailto:$1">$1</a>', $value);
echo $value;
}
else if ($attribute->type == 'html') {
echo $this->item_cursor->$attributeName;
}
else if ($attribute->type == 'calendar') {
echo JHtml::_('date', $this->item_cursor->$attributeName, JText::_('DATE_FORMAT_LC4'));
}
else if ($attribute->type == 'multicolor' || $attribute->type == 'color') {
$optionParamsName = '_efp_' . $attribute->alias;
if (!empty($item->$optionParamsName)) { ?>
<?php foreach ($item->$optionParamsName as $optId => $optionParams) {?>
<?php
$style = '';
$optionName = '';
foreach ($item->$attributeName as $optId2 => $optName) {
if ($optId2 == $optId) {
$optionName = $optName;
break;
}
}
if ($optionParams->get('hexcode')) {
$style .= 'background-color: ' . $optionParams->get('hexcode').';';
}
if ($optionParams->get('file_name')) {
$style .= 'background-image: url(\''.JUri::base(true) .'/media/djcatalog2/images/colors/'. $optionParams->get('file_name').'\');';
}
if ($style == '') {
$style = 'background-color: #ccc; background-image: url(\''.JUri::base(true) .'/components/com_djcatalog2/themes/'.$this->params->get('theme', 'default').'/images/icon-no-color.png\')';
}
?>
<span class="djc_cartattr_color">
<span class="djc_cartattr_color-bg" style="<?php echo $style; ?>">
</span>
<span class="djc_cartattr_color-name"><?php echo $optionName; ?></span>
</span>
<?php } ?>
<?php } else {
echo htmlspecialchars(implode(', ', $item->$attributeName));
}
}
else {
echo htmlspecialchars($this->item_cursor->$attributeName);
}
?>
</td>
</tr>
<?php } ?>
Если я пытаюсь добавитьодин атрибут к описанию продукта с помощью плагина (с кодом {djc2customfield color}) У меня есть только
<span class="djc_attribute color_pr__ba">
<span class="djc_attribute-value">atribute value 1, atribute value 2</span>
</span>
без изображения, назначенного для значения атрибута.
Код отображения атрибутов в описании продукта:
<code><?php
/**
* @package DJ-Catalog2
* @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
* @license http://www.gnu.org/licenses GNU/GPL
* @author url: http://dj-extensions.com
* @author email contact@dj-extensions.com
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.plugin.plugin');
class plgDJCatalog2Customfield extends JPlugin {
public static $attributes = array();
public function __construct(& $subject, $config)
{
parent::__construct($subject, $config);
$this->loadLanguage();
}
function onPrepareItemDescription( &$row, &$params, $page=0, $context = 'item')
{
$app = JFactory::getApplication();
if (empty(self::$attributes)) {
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('f.*, group_concat(fo.id separator \'|\') as options');
$query->from('#__djc2_items_extra_fields as f');
$query->join('LEFT', '#__djc2_items_extra_fields_options as fo ON fo.field_id=f.id');
$query->where('f.published = 1');
$query->group('f.id');
$query->order('f.group_id asc, f.ordering asc');
$db->setQuery($query);
self::$attributes = $db->loadObjectList();
}
//echo '<pre>'.print_r(self::$attributes,true).'
';// $ regex = '/ enjdjc2customfield\s+(.*?) coming/i';$ regex = '# {djc2customfield \ s ([a-z0-9 _] +?) ([^}] *?)} # iU';$ regexGrp = '# {djc2fieldgroup \ s ([a-z0-9 _] +?) ([^}] *?)} # iU';$ row -> _ nulledExtrafields = array ();$ nullExtraFields = array ();preg_match_all ($ regex, $ row-> description, $ match, PREG_SET_ORDER);preg_match_all ($ regexGrp, $ row-> description, $ matchGrp, PREG_SET_ORDER);if ($ matchGrp) {foreach ($ matchGrp как $ matchGrp) {$ output = null;$ row = array ();$ group_id = trim ($ matchGrp [1]);$ layout = 'table';if (isset ($ matchGrp [2])) {$ attrs = self :: parseAttributes (trim ($ matchGrp [2]));if (isset ($ attrs ['layout'])) {$ layout = trim ($ attrs ['layout']);}} foreach (self :: $ attribute как $ attribute) {if ($ attribute-> group_id == $ group_id) {$ item_attrib = '_ef _'. $ attribute-> alias;if (! empty ($ row -> $ item_attrib)) {$ attributeData = $ row -> $ item_attrib;if ($ layout == 'list') {$ row [] = ''. $ attribute-> name.' : '. $ this-> renderAttribute ($ attribute, $ attributeData, false).' ';} else if ($ layout == 'divs') {$ row [] = ''. $ attribute-> name.' : '. $ this-> renderAttribute ($ attribute, $ attributeData, false).' ';} else if ($ layout == 'inline') {$ row [] = ' '. $ this-> renderAttribute ($ attribute, $ attributeData, false). '';} else {$ row [] = ''. $ attribute-> имя. '. $ this-> renderAttribute ($ attribute, $ attributeData, false).' ';}} $ nullExtraFields [] = $ item_attrib;}} if (! empty ($ lines)) {if ($ layout == 'list') {$ output. = '«;$ output. = implode ('', $ row);$ output. = '';} else if ($ layout == 'divs') {$ output. = '«;$ output. = implode ('', $ row);$ output. = '';} else if ($ layout == 'inline') {$ output. = '«;$ output. = implode (',', $ lines);$ output. = '';} else {$ output. = '«;$ output. = implode ('', $ row);$ output. = '';} $ row-> description = preg_replace ('/'. preg_quote ($ matchGrp [0]). '/', $ this-> escapeValue ($ output), $ row-> description, 1);}}} // Нет совпадений, пропустите это, если ($ совпадений) {foreach ($ совпадений как $ совпадений) {$ matchlist = explode (',', $ match [1]);if (! array_key_exists (1, $ matchlist)) {$ matchlist [1] = null;} $ attrib = trim ($ matchlist [0]);$ item_attrib = '_ef _'. $ attrib;$ output = null;$ show_label = true;$ unset_var = true;if (isset ($ match [2])) {$ attrs = self :: parseAttributes (trim ($ match [2]));if (isset ($ attrs ['label']) && $ attrs ['label'] == '0') {$ show_label = false;} if (isset ($ attrs ['unset']) && $ attrs ['unset'] == '0') {$ unset_var = false;}} if (! empty ($ row -> $ item_attrib)) {foreach (self :: $ attribute как $ attribute) {if ($ attribute-> alias == $ attrib) {$ attributeData = $ row -> $ item_attrib;$ output. = $ this-> renderAttribute ($ attribute, $ attributeData, $ show_label);}} $ row -> _ nulledExtrafields [] = $ attrib;$ row -> _ nulledExtrafields [] = $ item_attrib;if ($ unset_var) {unset ($ row -> $ item_attrib);}} $ row-> description = preg_replace ("| $ match [0] |", $ this-> escapeValue ($ output), $ row-> description, 1);}} if (count ($ nullExtraFields)> 0) {foreach ($ nullExtraFields as $ item_attrib) {if (isset ($ row -> $ item_attrib)) {unset ($ row -> $ item_attrib);}}} return true;} открытая статическая функция parseAttributes ($ string) {$ attr = array ();$ retarray = array ();// Давайте захватим все пары ключ / значение с помощью регулярного выражения preg_match_all ('/ ([\ w: -] +) [\ s]? = [\ S]? "([^"] *) "/ I', $ string, $ attr); if (is_array ($ attr)) {$ numPairs = count ($ attr [1]); for ($ i = 0; $ i <$ numPairs; $ i ++) {$ retarray [$attr [1] [$ i]] = $ attr [2] [$ i];}} return $ retarray;} открытая статическая функция renderAttribute ($ attribute, $ attributeData, $ show_label) {$ output = ''; if (is_array ($ attributeData)) {$ attributeData = implode (',', $ attributeData);} if ($ show_label) {$ output. = ''(Имя $ attribute->) .htmlspecialchars.'. $ attribute-> name.': '. $ attributeData.' ';} else {$ output. = ' '. $ attributeData. '';} вернуть $ output;} публичная функция escapeValue ($ value) {$ value = addcslashes ($ value, '\\');$ value = preg_replace ('/ \ $ (\ d) /', '\\\ $$ 1', $ value);вернуть значение $;}}
Я хотел бы использовать layout = "divs".Я думаю, что мне нужно изменить код
else if ($layout == 'divs') {
$rows[] = '<div class="djc_attribute"><span class="djc_label">'.$attribute->name.'</span>: <span class="djc_value">
'.$this->renderAttribute($attribute, $attributeData, false).'
</span></div>';
но я не знаю как.Может ли кто-нибудь помочь мне с этим?