Joomla DJ Catalog 2 - проблема с плагином customfields для атрибутов - PullRequest
0 голосов
/ 22 февраля 2019

Компонент 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>';

но я не знаю как.Может ли кто-нибудь помочь мне с этим?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...