Перейти к содержимому


Фотография
- - - - -

CSV


Лучший Ответ DMTR3000S , 03 July 2017 - 21:25

Нашёл в чём дело. Актуально для версии JBZoo 2.0.2

 

Есть хэлпер jbcsv.php, который находится здесь:

/media/zoo/applications/jbuniversal/framework/helpers

и в нём есть функция _createFile в самом конце, внутри которой видно, что перебираются строки и с помощью fputcsv форматируются собственно в CSV и пихаются в файл. Так вот, для fputcsv явно не указаны параметры delimiter и enclosure, поэтому они подставляются по умолчанию. Чтобы это исправить в 135 (у меня, по крайней мере) строке меняем это:

fputcsv($handle, $this->app->data->create($row)->flattenRecursive());

на вот это:

fputcsv($handle, $this->app->data->create($row)->flattenRecursive(), '~', '^');

тем самым явно указывая желаемые разделитель и ограничитель (в нашем случае это ~ и ^). После этого всё должно заработать. Но это неточно!

Перейти к сообщению


Сообщений в теме: 27

#1 Tukan

Tukan

Отправлено 26 June 2017 - 09:41

Здравствуйте.

 
У нас была ваша подписка. Срок закончился. Сайты продолжают работать и по сей день.
 
Я знаю ваши условия и правила, что на технические вопросы отвечаете только по подписке. Но у нас возникла одна проблема из-за которой вроде как подписку пока продлевать смысла нет. Может вы подскажите как исправить?
 
Вопрос касается экспорта объявлений с сайта в CSV. По-умолчанию там стоит в качестве разделителя запятая (,). Из-за этого у нас всё в таблице итоговой съезжает сильно. Можно как-то этот разделитель заменить на что-то другое (например на ;).
 
Заранее спасибо.


#2 DMTR3000S

DMTR3000S

Отправлено 26 June 2017 - 11:19

На странице экспорта ведь есть возможность задать свои разделитель и ограничитель:

0001.png


  • 0

#3 isay777

isay777

Отправлено 26 June 2017 - 11:26

Я обычно ставлю # и ^ - это сильно облегчает. 


  • 0
ХОСТИНГ для сайтов jbzoo (все попугаи)

#4 Tukan

Tukan

Отправлено 26 June 2017 - 18:11

На странице экспорта ведь есть возможность задать свои разделитель и ограничитель:

attachicon.gif0001.png

 

Да, но версия JBZoo и Joomla старые - JBZoo 2.0.2 Pro и Joomla 2.5

 

Когда-то, очень давно) это выглядело как-то так 

Прикрепленные изображения

  • 001.png


#5 Tukan

Tukan

Отправлено 28 June 2017 - 10:18

Так, что, есть у кого какие идеи как быть в моём случае?



#6 DMTR3000S

DMTR3000S

Отправлено 28 June 2017 - 10:27

Идеи есть. Откройте файл jbcsv.php, который должен лежать по адресу:

/media/zoo/application/jbuniversal/framework/helpers/

и где-то на 84 и 85 строках внутри функции fromFile увидите separator и enclosure - разделитель и ограничитель соответственно - замените их на свои. Должно помочь.


  • 1

#7 Tukan

Tukan

Отправлено 28 June 2017 - 17:38

Идеи есть. Откройте файл jbcsv.php, который должен лежать по адресу:

/media/zoo/application/jbuniversal/framework/helpers/

и где-то на 84 и 85 строках внутри функции fromFile увидите separator и enclosure - разделитель и ограничитель соответственно - замените их на свои. Должно помочь.

 

Да есть такой файл и функция такая есть. 

 

Изменения внёс, но не сработало(

 

Вот сам код. У меня это строки 58, 59 и 88. Разделители пробовал разные. Ничего не срабатывает. Упорно туда попадает запятая.

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


/**
 * Class JBCSVHelper
 */
class JBCSVHelper extends AppHelper
{
    /**
     * @param $data
     * @param $file
     * @param array $maxima
     * @return bool|string
     */
    public function toFile($data, $file, array $maxima = null)
    {
        if (empty($data)) {
            return false;
        }

        // use maxima to pad arrays
        if (!empty($maxima)) {
            foreach ($maxima as $key => $num) {
                foreach (array_keys($data) as $i) {
                    $data[$i][$key] = array_pad($data[$i][$key], $num, '');
                }
            }
        }

        return $this->_createFile($data, $file);
    }

    /**
     * From file
     * @param $file
     * @param JSONData $options
     * @return array
     */
    public function fromFile($file, $options)
    {
        $lines = array();
        if (($handle = fopen($file, "r")) !== false) {

            while (($data = fgetcsv($handle, 0,
                    $options->get('separator', ';'),
                    $options->get('enclosure', '"'))
                ) !== false) {

                $lines[] = $data;
            }

            fclose($handle);
        }

        return $lines;
    }

    /**
     * From file
     * @param $file
     * @param JSONData $options
     * @param int $start
     * @param int $step
     * @return array
     */
    public function getLinesfromFile($file, $options, $start, $step)
    {
        $lines  = array();
        $finish = (int)$start + (int)$step;

        $i = 0;

        if (($handle = fopen($file, "r")) !== false) {

            while (($data = fgetcsv($handle, 0, $options->get('separator', ';'), $options->get('enclosure', '"'))) !== false) {
                $i++;
                if ($i > $finish) break;
                if ($start >= $i) continue;
                $lines[] = $data;
            }

            fclose($handle);
        }

        return $lines;
    }

    /**
     * Add header
     * @param $data
     * @return mixed
     */
    protected function _addHeader($data)
    {
        array_unshift($data, array());
        foreach ($data[1] as $key => $value) {
            $num     = is_array($value) ? count($value) : 1;
            $data[0] = array_merge($data[0], array_fill(0, max(1, $num), $key));
        }

        return $data;
    }

    /**
     * Create CSV file from $data
     * @param $data
     * @param $filename
     * @return string
     * @throws AppException
     */
    protected function _createFile($data, $filename)
    {
        $file = JPath::clean($this->app->path->path('tmp:') . "/jbzoo-export/$filename.csv");

        if (!JFile::exists($file)) {
            $data = $this->_addHeader($data);
        }

        if (($handle = fopen($file, "a")) !== false) {

            foreach ($data as $row) {
                fputcsv($handle, $this->app->data->create($row)->flattenRecursive());
            }

            fclose($handle);

        } else {
            throw new AppException(sprintf('Unable to write to file %s.', $file));
        }

        return $file;
    }

}

В приведёном выше коде, я уже заменил запятую на двоеточие. До изменений у меня там была запятая.



#8 mmth

mmth

Отправлено 28 June 2017 - 21:13

Да есть такой файл и функция такая есть. 

 

Изменения внёс, но не сработало(

 

Вот сам код. У меня это строки 58, 59 и 88. Разделители пробовал разные. Ничего не срабатывает. Упорно туда попадает запятая.

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


/**
 * Class JBCSVHelper
 */
class JBCSVHelper extends AppHelper
{
    /**
     * @param $data
     * @param $file
     * @param array $maxima
     * @return bool|string
     */
    public function toFile($data, $file, array $maxima = null)
    {
        if (empty($data)) {
            return false;
        }

        // use maxima to pad arrays
        if (!empty($maxima)) {
            foreach ($maxima as $key => $num) {
                foreach (array_keys($data) as $i) {
                    $data[$i][$key] = array_pad($data[$i][$key], $num, '');
                }
            }
        }

        return $this->_createFile($data, $file);
    }

    /**
     * From file
     * @param $file
     * @param JSONData $options
     * @return array
     */
    public function fromFile($file, $options)
    {
        $lines = array();
        if (($handle = fopen($file, "r")) !== false) {

            while (($data = fgetcsv($handle, 0,
                    $options->get('separator', ';'),
                    $options->get('enclosure', '"'))
                ) !== false) {

                $lines[] = $data;
            }

            fclose($handle);
        }

        return $lines;
    }

    /**
     * From file
     * @param $file
     * @param JSONData $options
     * @param int $start
     * @param int $step
     * @return array
     */
    public function getLinesfromFile($file, $options, $start, $step)
    {
        $lines  = array();
        $finish = (int)$start + (int)$step;

        $i = 0;

        if (($handle = fopen($file, "r")) !== false) {

            while (($data = fgetcsv($handle, 0, $options->get('separator', ';'), $options->get('enclosure', '"'))) !== false) {
                $i++;
                if ($i > $finish) break;
                if ($start >= $i) continue;
                $lines[] = $data;
            }

            fclose($handle);
        }

        return $lines;
    }

    /**
     * Add header
     * @param $data
     * @return mixed
     */
    protected function _addHeader($data)
    {
        array_unshift($data, array());
        foreach ($data[1] as $key => $value) {
            $num     = is_array($value) ? count($value) : 1;
            $data[0] = array_merge($data[0], array_fill(0, max(1, $num), $key));
        }

        return $data;
    }

    /**
     * Create CSV file from $data
     * @param $data
     * @param $filename
     * @return string
     * @throws AppException
     */
    protected function _createFile($data, $filename)
    {
        $file = JPath::clean($this->app->path->path('tmp:') . "/jbzoo-export/$filename.csv");

        if (!JFile::exists($file)) {
            $data = $this->_addHeader($data);
        }

        if (($handle = fopen($file, "a")) !== false) {

            foreach ($data as $row) {
                fputcsv($handle, $this->app->data->create($row)->flattenRecursive());
            }

            fclose($handle);

        } else {
            throw new AppException(sprintf('Unable to write to file %s.', $file));
        }

        return $file;
    }

}

В приведёном выше коде, я уже заменил запятую на двоеточие. До изменений у меня там была запятая.

вместо

 

  1. while (($data = fgetcsv($handle, 0,$options->get('separator', ';'),$options->get('enclosure', '"'))) !== false) {

 

можно просто так 

while (($data = fgetcsv($handle, 0,'~','^')) !== false) {

менять в двух местах параметры while и да я как разделители использую эти два символа ~ ^


Сообщение отредактировал mmth: 28 June 2017 - 21:15

  • 0

#9 Tukan

Tukan

Отправлено 29 June 2017 - 11:34

вместо

 

  1. while (($data = fgetcsv($handle, 0,$options->get('separator', ';'),$options->get('enclosure', '"'))) !== false) {

 

можно просто так 

while (($data = fgetcsv($handle, 0,'~','^')) !== false) {

менять в двух местах параметры while и да я как разделители использую эти два символа ~ ^

 

Очень странно, но не срабатывает. Всё равно формируется файл с запятой и кавычками в качестве разделителей...



#10 DMTR3000S

DMTR3000S

Отправлено 29 June 2017 - 12:02

Ёпт, вот я вопрос нормально не прочитал и насоветовал... НОВЫЙ ПЛАН! :)

Открываем файл admin.jbexport.php, который лежит здесь:

/media/zoo/application/jbuniversal/framework/controllers

и на 37-38 строках меняете enclosure и separator на нужные. Это для работы экспорта. Для работы импорта с нужными ограничителем и разделителем откройте admin.jbimport.php, который лежит там же и так же внесите нужные правки


  • 1




Click to return to top of page in style!