COBALT
Total posts: 408
21 Окт 2015 08:16

Есть поле select, где хочу изменить все Значения 1 на Значения 2, материалов очень много и в ручную редактировать каждый материал займёт очень много времени, возможно это сделать через phpMyAdmin с помощью SQL-запроса к базе данных?

Если возможно, подскажите как это сделать.

PS. MySQL 5.5

Последние изменения: 28 Янв 2016


Sergey
Total posts: 13,748
21 Окт 2015 19:00

Не совсем. Можно поменять все значения в табилце js_res_record_values. Это не сложно одним запросом. Но в каждой записи в колонке fields есть JSON закодированые данные тоже. Это что бы для отображения не делать лишние запросы а таблица js_res_record_values используется только для фильрации.

Sometimes you need to change value of one field to another in bulk. But there is no interface in cobalt. Here is quick tip how to do that.

Create file com_cobalt/controllers/custom.php and place this content there.

<?php
defined('_JEXEC') or die;

jimport('joomla.application.component.controllerform');

class CobaltControllerCustom extends JControllerForm
{
    public function __construct($config = array())
    {
        parent::__construct($config);
    }

    public function change()
    {
        $field_id   = 27;
        $section_id = 5;
        $value      = 'Red';
        $new_value  = 'Dark Red';


        $db = JFactory::getDbo();

        $db->setQuery("SELECT id, fields FROM #__js_res_record WHERE section_id = {$section_id} AND id IN(SELECT record_id FROM #__js_res_record_values WHERE field_id = {$field_id} AND field_value = '{$value}')");
        $list = $db->loadObjectList();

        foreach($list AS $item)
        {
            $fields = json_decode($item->fields, TRUE);

            if(empty($fields[$field_id]))
            {
                continue;
            }

            $fields[$field_id] = $this->_change($fields[$field_id], $value, $new_value);

            $db->setQuery("UPDATE #__js_res_record SET fields = '" . json_encode($fields) . "' WHERE id = " . $item->id);
            $db->execute();
        }

        $db->setQuery("UPDATE #__js_res_record_values SET field_value = '{$new_value}' WHERE field_id = {$field_id} AND field_value = '{$value}'");
        $db->execute();

    }

    private function _change($value, $what, $to)
    {
        if(is_array($value))
        {
            foreach($value AS &$val)
            {
                $val = $this->_change($val, $what, $to);
            }
        }
        else if($value == $what)
        {
            $value = $to;
        }

        return $value;
    }
}

Now you can chane these lines

$field_id   = 27;
$section_id = 5;
$value      = 'Red';
$new_value  = 'Dark Red';

And open URL

 http://localhost/index.php?option=com_cobalt& ;task=custom.change

This task have to be triggered and change all you need.


Sergey
Total posts: 13,748
23 Окт 2015 13:08

Зачем вставил psog6?


Sergey
Total posts: 13,748
26 Окт 2015 09:14

Попробуй поменять json_encode($fields) addslashes(json_encode($fields)).


COBALT
Total posts: 408
26 Окт 2015 09:34

Sergey Попробуй поменять json_encode($fields) addslashes(json_encode($fields)).

Спасибо, теперь работает!


Paul_I VIP
Total posts: 89
01 Янв 2016 15:03

Sergey Попробуй поменять json_encode($fields) addslashes(json_encode($fields)).

Вместо этого я использовал вариант json_encode($fields, JSON_UNESCAPED_UNICODE), тоже работает.


Paul_I VIP
Total posts: 89
02 Янв 2016 08:08

А еще лучше использовать addslashes(json_encode($fields, JSON_UNESCAPED_UNICODE))


COBALT
Total posts: 408
22 Янв 2016 12:47

Подскажите пожалуйста как в поле URL изменить все ярлыки ссылки на другой?

Данный способ не подходит, так как в field_value просто ссылка, без ярлыка.

Нужно изменить ярлык Загрузить на Windows Store, в разделе более 500 материалов, в ручную не вариант.


Sergey
Total posts: 13,748
25 Янв 2016 13:56

Могу только посоветовать использовать JText. Пропустите в шаблоне ярлык через JText и создайте ключ

ЗАГРУЗИТЬ="Windows Store"

COBALT
Total posts: 408
26 Янв 2016 07:04

Подскажите пожалуйста куда именно нужно добавить JText и как создать ключ?

Вот мой шаблон:

<?php
/**
 * Cobalt by MintJoomla
 * a component for Joomla! 1.7 - 2.5 CMS ( http://www.joomla.org )
 * Author Website:  http://www.mintjoomla.com/ 
 * @copyright Copyright (C) 2012 MintJoomla ( http://www.mintjoomla.com ). All rights reserved.
 * @license   GNU/GPL  http://www.gnu.org/copyleft/gpl.html 
 */
defined('_JEXEC') or die;

$value = $this->value;
$options = $this->params->get('params.open_url', 1) ? ' target="_blank"' : '';
$options .= !$this->params->get('params.index_redirect', 0) ? ' rel="nofollow"' : NULL;
$id = $record->id . $this->id;

if($this->params->get('params.links_sort', 0))
{
    if($this->params->get('params.links_sort') > 2 && $this->params->get('params.link_redirect', 0) && $this->params->get('params.show_hits', 1))
    {
        foreach($value as $i => $val)
        {
            $hit = (int)@$val['hits'];
            $tmp[] = $hit;
        }

        if($this->params->get('params.links_sort') == 3)
        {
            array_multisort($tmp, SORT_ASC, $value);

        }
        else
        {
            array_multisort($tmp, SORT_DESC, $value);
        }
    }
    else
    {
        foreach($value as $i => $val)
        {
            $label = $this->params->get('params.label', false) ? (int)@$val['label'] : $val['url'];
            $tmp[] = $label;
        }

        if($this->params->get('params.links_sort') == 1)
        {
            array_multisort($tmp, SORT_ASC, $value);

        }
        else
        {
            array_multisort($tmp, SORT_DESC, $value);
        }
    }
}
?>
<?php if(count($value) > 1): ?>
    <<?php echo $this->params->get('params.numeric_list', 0) ? 'ol' : 'ul class="unstyled"'; ?> >
<?php endif; ?>
<?php foreach($value as $i => $val): ?>
    <?php if(count($value) > 1): ?>
        <li>
    <?php endif; ?>
    <?php
    $url = $val['url'];
    $url_parse = parse_url($url);
    if($this->params->get('params.link_redirect', 0))
    {
        $url = JURI::root() . 'index.php?option=com_cobalt&task=field.call&func=_redirect&field_id=' . $this->id . '&record_id=' . $record->id . '&url=' . urlencode($val['url']);
    }
    ?>


    <a href="/<?php echo ' http://touchg.ru/dw/?url= ' . $url; ?>" <?php echo $options; ?>>
    <?php if($this->params->get('params.favicon', 0)): ?>
        <img src="//www.google.com/s2/favicons?domain=<?php echo $url_parse['host']; ?>" align="absmiddle" class="url-favicon">
    <?php endif; ?> <i class="uk-icon-download"></i> 
        <?php echo isset($val['label']) != '' ? $val['label'] : $val['url'] ?>
    </a>
    <?php if($this->params->get('params.snapshot', 1)): ?>
        <?php $img = htmlentities(JHtml::image(JURI::root() . 'components/com_cobalt/fields/url/assets/loading.gif', JText::_('Snapshot'), array('id' => "snapimg{$id}-$i")), ENT_QUOTES) ?>

        <img style="cursor: pointer"
             onclick="setTimeout(function(){jQuery('#snapimg<?php echo $id . '-' . $i; ?>').attr('src', ' http://mini.s-shot.ru/1280/< ;?php echo $this->params->get('params.snapshot_width', 200) ?>/jpeg?<?php echo $val['url']; ?>')}, 1000)"
             src="/<?php echo JURI::root(TRUE) ?>/media/mint/icons/16/document-text-image.png"
             rel="popover" data-original-title="<?php echo JText::_('Snapshot'); ?>" data-content="<?php echo $img; ?>">

    <?php endif; ?>

    <?php if($this->params->get('params.qr_code', 0)): ?>
        <?php $img = htmlentities(JHtml::image(' http://chart.apis.google.com/chart?chs= ' . $this->params->get('params.qr_width', 80) . 'x' . $this->params->get('params.qr_width', 80) . '&cht=qr&chld=L|0&chl=' . urlencode($url), JText::_('URL QR'),
            array(
            'class' => 'qr-image',
            'width' => $this->params->get('params.qr_width', 60) . 'px', 'height' => $this->params->get('params.qr_width', 60) . 'px', 'align' => 'top'
        )), ENT_QUOTES);?>
        <img class="urlqr" style="cursor: pointer" src="/<?php echo JURI::root(TRUE) ?>/media/mint/icons/16/barcode-2d-new.png" rel="popover" data-original-title="<?php echo JText::_('URL QR'); ?>" data-content="<?php echo $img; ?>">
    <?php endif; ?>


    <?php if($this->params->get('params.link_redirect', 0) && $this->params->get('params.show_hits', 1)): ?>
        <small><?php echo JText::_('CHITS'); ?> <span class="badge"><?php echo (int)@$val['hits'] ?></span></small>
    <?php endif; ?>

    <?php if($this->params->get('params.filter_enable')): ?>
        <?php echo FilterHelper::filterButton('filter_' . $this->id, $val['url'], $this->type_id, ($this->params->get('params.filter_tip') ? JText::sprintf($this->params->get('params.filter_tip'), '<b>' . $this->label . '</b>', '<b>' . $val['url'] . '</b>') : NULL), $section, $this->params->get('params.filter_icon', 'funnel-small.png')); ?>
    <?php endif; ?>


    <?php if(count($value) > 1): ?>
        </li>
    <?php endif; ?>
<?php endforeach; ?>
<?php if(count($value) > 1): ?>
    </<?php echo $this->params->get('params.numeric_list', 0) ? 'ol' : 'ul'; ?>>
<?php endif; ?>


Sergey
Total posts: 13,748
26 Янв 2016 09:36

Вот это

<?php echo isset($val['label']) != '' ? $val['label'] : $val['url'] ?>

змени на

<?php echo isset($val['label']) != '' ? JText::_($val['label']) : $val['url'] ?>

COBALT
Total posts: 408
26 Янв 2016 09:52

Спасибо огромное, всё получилось.


COBALT
Total posts: 408
26 Янв 2016 10:24

Теперь ещё одна проблема, дело в том что у меня три раздела и в каждом из разделов нужно заменить ярлык Загрузить на другой:

В разделе iOS нужно ярлык Загрузить изменить на App Store

В разделе Android нужно ярлык Загрузить изменить на Google Play

В разделе Windows Phone нужно ярлык Загрузить изменить на Windows Store

Можно как то сделать для каждого раздела свой ключ?

PS. Ещё как выход - отключить отображение ярлыка ссылки и прописать в самом шаблоне нужное значение App Store, Google Play, Windows Store. Чтобы независимо от настроек поля выводилось значение прописанное в шаблоне. Если так возможно сделать, подскажите пожалуйста как это сделать?


COBALT
Total posts: 408
26 Янв 2016 14:00

Что если зделать так:

Добавить в шаблон

$linklabel = "Windows Store";

Это

<?php echo isset($val['label']) != '' ? $val['label'] : $val['url'] ?>

Поменять на это

<?php echo isset($val['label']) != '' ? $linklabel : $val['url'] ?>

Все ярлыки поля использующие данный шаблон становятся Windows Store, то что мне нужно, для меня это идеальный вариант.

После таких правок у меня не будет проблем\ошибок?


Sergey
Total posts: 13,748
28 Янв 2016 13:45

Что бы не делать на каждый раздел свой шаблон можно сделать один примерно так

Поставить в начале шабона

$lables = array(
    2 => 'Windows Store',
    3 => 'App Store'
);

Где 2 и 3 это айди разделов. А потом.

<?php echo isset($val['label']) != '' ? $lables[$section->id] : $val['url'] ?>

Тогда можно использовать тот же шаблон на все поля.

Или лучше тогда уже вообще лейбл отключить что бы его не заполняли а вывести вот та.

<?php echo $lables[$section->id] ?>

COBALT
Total posts: 408
28 Янв 2016 14:28

Ещё рас спасибо.

Работает на Cobalt