1 Отредактировано Илья (25.11.2016 21:41:40)

Тема: Выводит только 50 записей

Здравствуйте. Скажите пожалйста, из базы выводится только 50 записей.
Может где то лимит стоит или куда смотреть? просто я лимит на вывод не ставил.

файл myctrl.php

<?php
/**
* ReadyScript (http://readyscript.ru)
*
* @copyright Copyright (c) ReadyScript lab. (http://readyscript.ru)
* @license http://readyscript.ru/licenseAgreement/
*/
namespace Waybill\Controller\Admin;
use \RS\Html\Table\Type as TableType,
    \RS\Html\Toolbar\Button as ToolbarButton,
    \RS\Html\Toolbar,
    \RS\Html\Tree,
    \RS\Html\Table,
    \RS\Html\Filter;


class MyCtrl extends \RS\Controller\Admin\Crud
{
        function __construct()
    {
         parent::__construct(new \Waybill\Model\MyApi());
    }
    
    function helperIndex()
    {
           
        
        $helper = parent::helperIndex();
        $q = $this->api->queryObj(); //Получаем объект запроса
        //Изменяем запрос под наши нужды

        $q->leftjoin(new \Users\Model\Orm\User(), 'A.user_id=B.id', 'B');
            $q->where(array('status' => '7')); 
        
        $q->select = "B.id, B.phone, B.passport, A.totalcost, A.user_fio, A.user_phone, A.user_id, A.userfields";

        var_dump($q->toSql());  
        $helper = parent::helperIndex();//Получим helper по-умолчанию       
        $helper->setTopTitle(t('Накладная'));//Установим заголовок раздела
        $helper->setTopToolbar(new \Rs\Html\Toolbar\Element(array(
            'Items' => array( 
                new \Rs\Html\Toolbar\Button\Button($this->router->getAdminUrl('ordersReports'), t('Распечатать накладную')),
                new \Rs\Html\Toolbar\Button\Button($this->router->getAdminUrl('ordersReportsTitle'), t('Распечатать заголовки')),
                )
        )));  
        $helper->setTable(new Table\Element(array(
            'Columns' => array(         
                new TableType\Usertpl('user_id', t('Покупатель'), '%shop%/order_user_cell.tpl'),
                new TableType\Usertpl('phone', t('Телефон'), '%waybill%/order_phone_cell.tpl'),
                new TableType\Text('user_passport', t('Пасспорт')), 
                new TableType\Userfunc('userfields', t('ТК'), function($value){
                    $unserialized_array = @unserialize($value);
                    return $unserialized_array[tk]; 
                }),
                new TableType\Text('totalcost', t('Сумма'), array('Sortable' => SORTABLE_BOTH)),             
        ))));
        return $helper;
       
    }

       function actionOrdersReports()
        {
        $orders = \RS\Orm\Request::make() //Запрос к БД и получение объектов заказа
                           ->from(new \Shop\Model\Orm\Order())
                           ->where(array(
                                   'site_id' => \RS\Site\Manager::getSiteId(),
                                   'status' => '7'
                           ))->objects();
     
        $this->view->assign(array(
            'orders' =>$orders  //В результате переменная $orders появится в шаблоне
        ));
        $this->wrapOutput(false);
        return $this->result->setTemplate('orders_waybill.tpl');
        }

        function actionOrdersReportsTitle()
        {
        $orders = \RS\Orm\Request::make() //Запрос к БД и получение объектов заказа
                           ->from(new \Shop\Model\Orm\Order())
                           ->where(array(
                                   'site_id' => \RS\Site\Manager::getSiteId(),
                                   'status' => '7'
                           ))->objects();
     
        $this->view->assign(array(
            'orders' =>$orders  //В результате переменная $orders появится в шаблоне
        ));
        $this->wrapOutput(false);
        return $this->result->setTemplate('orders_title.tpl');
        }
    
}

Повысить оценку Понизить оценку

2 Отредактировано Закусило Александр (28.11.2016 11:19:58)

Re: Выводит только 50 записей

В каком именно запросе? У Вас тут три их.

3

Re: Выводит только 50 записей

Все три выводят только 50 записей из базы

Повысить оценку Понизить оценку

4 Отредактировано Закусило Александр (28.11.2016 13:25:37)

Re: Выводит только 50 записей

А Вы сам запрос пробовали в MySQL воспроизвести?

$sql = \RS\Orm\Request::make() //Запрос к БД и получение объектов заказа
                           ->from(new \Shop\Model\Orm\Order())
                           ->where(array(
                                   'site_id' => \RS\Site\Manager::getSiteId(),
                                   'status' => '7'
                           ))->toSql()
var_dump($sql);
;

Там тоже 50 записей?

5 Отредактировано Илья (28.11.2016 14:38:41)

Re: Выводит только 50 записей

Что то я запутался.
Сейчас поставил другой статус на вывод и там находится 355 заказов.
http://storage2.static.itmages.ru/i/16/1128/s_1480329053_4232591_ab256f9eb7.png

И вот что получается, в контроллере на странице выводятся все заказы
http://storage7.static.itmages.ru/i/16/1128/s_1480328988_2264389_da709caed5.png

Но еще в модуле если нажать на кнопку "Распечатать накладную"
http://storage1.static.itmages.ru/i/16/1128/s_1480329143_5001152_98e9376a16.png

И должно открываться следующее окно
http://storage5.static.itmages.ru/i/16/1128/s_1480329296_2203708_e03179fb28.png

Но открывается пустая страница потому что там слишком много заказов
Почему так?

model/waybillform/waybillform.inc.php

<?php
namespace Waybill\Model\WaybillForm;
class WaybillForm extends AbstractPrintForm
{
    
    function getId()
    {
        return 'waybill';
    }
    
    function getTitle()
    {
        return t('Накладная');
    }
    
    function getTemplate()
    {
        return '%waybill%/waybillform/waybillform.tpl';
    }
}

model/waybillform/abstractprintform.inc.php

<?php
/**
* ReadyScript (http://readyscript.ru)
*
* @copyright Copyright (c) ReadyScript lab. (http://readyscript.ru)
* @license http://readyscript.ru/licenseAgreement/
*/
namespace Waybill\Model\WaybillForm;

/**
* Абстрактный класс печатной формы заказа.
*/
abstract class AbstractPrintForm
{
    protected
        $order;
    
    /**
    * Конструктор печатной формы
    * 
    * @param \Shop\Model\Orm\Order $order - заказ, который должен быть использован для формирования печатной формы
    * @return AbstractPrintForm
    */
    function __construct(\Shop\Model\Orm\Order $order = null)
    {
        $this->setOrder($order);
    }
    
    public function setOrder(\Shop\Model\Orm\Order $order = null)
    {
        $this->order = $order;
    }
    
    /**
    * Возвращает объект печатной формы по символьному идентификатору
    * 
    * @param mixed $id
    * @param \Shop\Model\Orm\Order $order
    * @return AbstractPrintForm | false
    */
    public static function getById($id, \Shop\Model\Orm\Order $order = null)
    {
        $all = self::getList();
        if (isset($all[$id])) {
            $item = $all[$id];
            $item->setOrder($order);
            return $item;
        }
        return false;
    }
    
    /**
    * Возвращает список всех печатных форм, имеющихся в системе
    * 
    * @return array
    */
    public static function getList()
    {
        $result = array();
        $event_result = \RS\Event\Manager::fire('printform.getlist', array());
        $list = (array)$event_result->getResult();
        foreach($list as $print_form) {
            $result[$print_form->getId()] = $print_form;
            
        }
        return $result;
    }
    
    /**
    * Возвращает краткий символьный идентификатор печатной формы
    * 
    * @return string
    */
    abstract function getId();
    
    /**
    * Возвращает название печатной формы
    * 
    * @return string
    */
    abstract function getTitle();
    
    /**
    * Возвращает шаблон формы
    * 
    * @return string
    */
    abstract function getTemplate();
    
    /**
    * Возвращает HTML готовой печатной формы
    * 
    * @return string
    */
    function getHtml() 
    {
        $view = new \RS\View\Engine();
        $view->assign(array(
            'order' => $this->order
        ));
        $view->assign(\RS\Module\Item::getResourceFolders($this));
        return $view->fetch($this->getTemplate());        
    }
}
?>

model/myapi.inc.php

<?php
namespace Waybill\Model;
/**
* Класс API
*/
class MyApi extends \RS\Module\AbstractModel\EntityList
{
    
    function __construct()
    {
        parent::__construct(new \Shop\Model\Orm\Order, //С какой таблицей через ORM объект работать
        array(
            'multisite' => false, //Объект является не мультисайтовым (без поля site_id)
            //'defaultOrder' => 'id DESC' //Сортировка по умолчанию при выборке
        ));
    }

}

view/orders_waybill.tpl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        {if !empty($orders)} {* Проверяем есть ли заказы *}
            {foreach $orders as $order} {* Циклим чтобы вытащить каждый заказ отдельности *}
                {assign var=delivery value=$order->getDelivery()}
                {assign var=address value=$order->getAddress()}
                {assign var=cart value=$order->getCart()}
                {assign var=order_data value=$cart->getOrderData(true, false)}
                {assign var=products value=$cart->getProductItems()}
                {assign var=user value=$order->getUser()}
            {/foreach}
        {/if}
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
        <script>
        $(document).ready(function() {
            $("#btnExport").click(function(e) {
            e.preventDefault();

            //getting data from our table
            var data_type = 'data:application/vnd.ms-excel';
            var table_div = document.getElementById('tableWrap');
            var table_html = table_div.outerHTML.replace(/ /g, '%20');
            var userName = '<?php echo $order.order_num;?>';
            var a = document.createElement('a');
            a.href = data_type + ', ' + table_html;
            a.download = "{$order.order_num}-' + 16.xls";

            a.click();
            });
        });
        </script>
        <style>
        @media print {
            .button {
                display: none;
            }
        }
        </style>
    </head>
    <body>
        <input class="button" type="button" value="Печать" onclick="print()"></input><button class="button" id="btnExport">Скачать Excel</button>
        <div id="tableWrap">
            <div style="text-align:left;font-weight:bold;margin-bottom:10px;">
                ООО "ПБМ", ИНН 7328065001, КПП 732801001&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;
                Накладная номер {$today = date("d-m-y")}{$today}
            </div>    
            <table style="border: 1px solid black;border-collapse: collapse;">
                <thead>
                    <tr>
                        <th style="border: 1px solid black;border-collapse: collapse;">№</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">ТК</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">Город</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">ФИО</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">Паспорт</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">Телефон</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">Сумма</th>
                        <th style="border: 1px solid black;border-collapse: collapse;">Место</th>
                    </tr>
                </thead>       
                <tbody style="border: 1px solid black;border-collapse: collapse;">
                    {foreach $orders as $order}
                        <tr style="border: 1px solid black;border-collapse: collapse;">
                            <td style="border: 1px solid black;border-collapse: collapse;text-align: center;">{$order@iteration}</td> 
                            {if $order.user_id>0} 
                                {$address=$order->getAddress()}
                                <td style="border: 1px solid black;border-collapse: collapse;">{$address.city}</td>                    
                            {else}           
                                <td style="border: 1px solid black;border-collapse: collapse;">{$order.userfields_arr['tk']}</td>
                            {/if}                    
                            {if $order.user_id>0} 
                                {$address=$order->getAddress()}
                                <td style="border: 1px solid black;border-collapse: collapse;">г. {$address.region}</td>
                            {else}
                                <td style="border: 1px solid black;border-collapse: collapse;">г. {$order.userfields_arr['gorod']}</td>
                            {/if} 
                            {if $order.user_id>0}
                                {$user=$order->getUser()}
                                <td style="border: 1px solid black;border-collapse: collapse;">
                                    {if empty($user.company) && empty($address.zipcode)}
                                       <!--  Выводим ФИО -->
                                       {$user.surname} {$user.name} {$user.midname}
                                       <!--  Если нет получателя -->    
                                    {elseif empty($address.zipcode)}
                                       <!--  Выводим ИП -->
                                       {$user.company}<!--  / ИНН: {$user.company_inn} -->
                                    <!--  Если не ИП -->    
                                    {else empty($user.company)}
                                        <!--  Выводим получателя -->
                                        {$address.zipcode} 
                                    {/if}
                                </td> 
                            {else} 
                            {$address=$order->getAddress()}                               
                                <td style="border: 1px solid black;border-collapse: collapse;">{if empty($address.zipcode)}{$order.user_fio}{else}{$address.zipcode}{/if}</td>
                            {/if}
                            {if $order.user_id>0}              
                                <td style="border: 1px solid black;border-collapse: collapse;">{if empty($user.company_inn)}{$user.passport}{else}ИНН: {$user.company_inn}{/if}</td> 
                            {else} 
                                <td style="border: 1px solid black;border-collapse: collapse;">{$order.userfields_arr['passport']}</td>   
                            {/if}          
                            {if $order.user_id>0}
                                <td style="border: 1px solid black;border-collapse: collapse;width:125px;text-align:center;">
                                    {if empty($order.userfields_arr['phonerecipient'])}
                                        {preg_replace('#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#', '$1-$2-$3-$4-$5', $user.phone)}
                                    {else}
                                        {preg_replace('#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#', '$1-$2-$3-$4-$5', $order.userfields_arr['phonerecipient'])}
                                    {/if}
                                </td> 
                            {else}
                                {$user=$order->getUser()}
                                <td style="border: 1px solid black;border-collapse: collapse;width:125px;text-align:center;">
                                    {if empty($order.userfields_arr['phonerecipient'])}
                                        {preg_replace('#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#', '$1-$2-$3-$4-$5', $order.user_phone)}
                                    {else}
                                        {preg_replace('#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#', '$1-$2-$3-$4-$5', $order.userfields_arr['phonerecipient'])}
                                    {/if}
                                </td> 
                            {/if}
                            <td style="border: 1px solid black;border-collapse: collapse;width:85px;text-align:center;">{$order.new_cost|format_price} руб.</td>  
                            <td style="border: 1px solid black;border-collapse: collapse;text-align:center;">{$order.userfields_arr['mesto']}</td>             
                        </tr>
                    {/foreach} 
                </tbody>
            </table>
        </div>
    </body>
</html> 

Повысить оценку Понизить оценку

6

Re: Выводит только 50 записей

up up

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Теперь я ничего не понимаю. У Вас выводтся в печатной форме 50 заказов или что? Ничего не понимаю. Или у Вас запрос возвращает 50 заказов.

8

Re: Выводит только 50 записей

Закусило Александр Выводится пустая страница если там много заказов. А если заказов 30 то все выводится как положено

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Вот теперь понятно.
Ну значит у Вас отваливается по памяти. Видимо слишком много объектов в памяти, которые пытаетесь вывести. Отображение ошибок что-нибудь выводит? Смотрели исходный код когда белая страница?

10

Re: Выводит только 50 записей

Закусило Александр пишет:

Отображение ошибок что-нибудь выводит?

Ошибок нету. Отображение включено
P.S.
.htaccess
- php_flag display_errors on
Настройки системы
- Подробно отображать информацию об исключениях - ДА
Файл в конре сайта
- _local_settings.php - ЕСТЬ

Закусило Александр пишет:

Смотрели исходный код когда белая страница?

Исходный код страницы - пусто
firebag - консоль пусто
html
http://s017.radikal.ru/i441/1612/d5/06ac55c1bb10.png

Повысить оценку Понизить оценку

11 Отредактировано Закусило Александр (01.12.2016 14:53:32)

Re: Выводит только 50 записей

Если не выводит. То нужно посмотреть error.log файл на сайте. Но тут и так понятно, что отваливаются по памяти видимо слишком много объектов подгружаете и вся память для отработки скрипта забивается. Ну что тут можно сделать. Какие варианты:
1. Разбить постранично на пагинацию или ограничить периодом.
2. Можно в коде который выводит заказы запустит цикл, который порционно загрузить заказы в переменную. Например по 20 заказов. Т.к. переменная с массивом заказов будет перезаписываться, то помять увеличиваться не будет. А уже сведения для вывода можно записать в промежуточный массив, с которым потом оперировать.
Если выбрать второе решение, то это будет выглядеть примерно так:

            $limit  = 20; //По сколько выводить
            $offset = 0; //Начинаем с начала
            
            $orders_data = array();
            $q =  \RS\Orm\Request::make() //Формируем запрос
                    ->from(new \Shop\Model\Orm\Order())
                    ->limit($limit);      
            
            $i = 0;
            while($itemslist = $q->offset($offset)->objects(null, 'id')) {//Перебираем порциями до конца списка заказов

                foreach($itemslist as $order){
                    /**
                    * @var \Shop\Model\Orm\Order $order
                    */   
                    //Здесь записываем сведения в какой нибудь промежуточный массив Например $order_data и плюсуем его в $orders_data
                    $order_data = array(
                        'order_num' => $order['order_num'],
                        //и т.д.
                    );
                    $orders_data[] = $order_data;
                }
                $i++;
                $offset += $limit;  
            }

P.S. Изменить нужно под свои нужды.

12

Re: Выводит только 50 записей

Спасибо! Подскажите пожалуйста как вот в этом куске кода мне обратится к сериализованной ячейке userfields

$order_data = array(
                        'order_num' => $order['order_num'],
                        //и т.д.
                    );

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Как и везде

$order['userfields_arr'] или $order['userfields'] если нужно сериализованное значение

14

Re: Выводит только 50 записей

А что бы мне теперь получить данные из таблицы users, в запросе нужно сделать leftjoin к этой таблице?

Повысить оценку Понизить оценку

15 Отредактировано Закусило Александр (02.12.2016 11:47:42)

Re: Выводит только 50 записей

Конечно. Всё будет работать. Смелее пробуйте.

16 Отредактировано Илья (02.12.2016 15:36:35)

Re: Выводит только 50 записей

почему т окогда я делаю запрос в таком виде из 4х заказов у меня выводит только 2
Там 2 заказа от зарегистрированного и 2 от гостя. Так вот выводится один от зарегистрированного другой от гостя

$q =  $this->api->queryObj() //Формируем запрос
                    ->leftjoin(new \Users\Model\Orm\User(), 'A.user_id=B.id', 'B')
                    ->limit($limit);  

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Выведите запрос посмотрите что возвращает база. Мы сами ничего не обрезан, что Ваш составленный запрос вернул, то мы и показываем. Ни больше ни меньше.

18 Отредактировано Илья (02.12.2016 16:38:36)

Re: Выводит только 50 записей

string(118) "SELECT * FROM `readyscript`.`iazw_order` as A LEFT JOIN `readyscript`.`iazw_users` as B ON A.user_id=B.id LIMIT 0, 20"

Попробовал его запустить в phpmyadmin
http://s50.radikal.ru/i128/1612/fa/0c1adb0e0c53.png

function actionOrdersReports()
        {
         $limit  = 20; //По сколько выводить
            $offset = 0; //Начинаем с начала
            
            $orders_data = array();
            $q =  $this->api->queryObj() //Формируем запрос
                    ->leftjoin(new \Users\Model\Orm\User(), 'A.user_id=B.id', 'B')
                    ->limit($limit);      
            var_dump($q->toSql());
            $i = 0;
            while($itemslist = $q->offset($offset)->objects(null, 'id')) {//Перебираем порциями до конца списка заказов

                foreach($itemslist as $order){
                    /**
                    * @var \Shop\Model\Orm\Order $order
                    */   
                    //Здесь записываем сведения в какой нибудь промежуточный массив Например $order_data и плюсуем его в $orders_data
                    $order_data = array(
                        'order_num' => $order['order_num'],
                        //'new_cost' => $order['new_cost'],
                        //'userfields' => $order['userfields_arr'],
                        //'user_phone' => $order['user_phone'],
                        //'user_fio' => $order['user_fio'],
                        //'id' => $order['id'],
                        //'user_id' => $order['user_id'],
                        //'phone' => $order['phone'],
                        //'name' => $order['name'],
                        //и т.д.
                    );
                    $orders_data[] = $order_data;
                }
                $i++;
                $offset += $limit;  
            }
     
        $this->view->assign(array(
            'orders_data' => $orders_data  //В результате переменная $orders появится в шаблоне
        ));
        $this->wrapOutput(false);
        return $this->result->setTemplate('orders_waybill.tpl');
        }

Повысить оценку Понизить оценку

19 Отредактировано Закусило Александр (02.12.2016 17:01:43)

Re: Выводит только 50 записей

Ну вроде бы всё в порядке
var_dump(count($itemslist));
Сколько элементов элементов насчитал?
и
var_dump($orders_data); после всего что выдаёт?

20 Отредактировано Илья (02.12.2016 17:14:27)

Re: Выводит только 50 записей

Он начал выводить по два когда я запрос

 $q =  \RS\Orm\Request::make() //Формируем запрос
                    ->from(new \Shop\Model\Orm\Order())
                    ->limit($limit);  

поменял на

$q =  $this->api->queryObj() //Формируем запрос
                    ->leftjoin(new \Users\Model\Orm\User(), 'A.user_id=B.id', 'B')
                    ->limit($limit);      
            var_dump($q->toSql());

var_dump(count($itemslist));

int(2)

var_dump($orders_data);

array(2) {
  [0]=>
  array(1) {
    ["order_num"]=>
    string(2) "82"
  }
  [1]=>
  array(1) {
    ["order_num"]=>
    string(2) "84"
  }
}

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Надо копать. Я тут не подскажу. Вроде всё в порядке.

22 Отредактировано Илья (02.12.2016 17:39:17)

Re: Выводит только 50 записей

А не подскажите, сюда можно leftjoin встроить?А то мои попытки безуспешны

$q =  \RS\Orm\Request::make() //Формируем запрос
                    ->from(new \Shop\Model\Orm\Order())
                    ->limit($limit);  

Повысить оценку Понизить оценку

23 Отредактировано Закусило Александр (02.12.2016 17:42:47)

Re: Выводит только 50 записей

$q =  \RS\Orm\Request::make() //Формируем запрос
                    ->from(new \Shop\Model\Orm\Order(), 'A')
                    ->leftjoin(new \Users\Model\Orm\User(), 'A.user_id=B.id', 'B')
                    ->limit($limit);

24 Отредактировано Илья (02.12.2016 17:45:21)

Re: Выводит только 50 записей

блин вот с leftjoin выводит только 2, без него все 4

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Попробуйте поменять

$itemslist = $q->offset($offset)->objects(null, 'id')

на

$itemslist = $q->offset($offset)->objects()