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

когда вы используете LEFT JOIN, то в этом случае, если записей у присединяемой таблицы больше чем у записи к которой присодиняется эта таблица, то записи в выдачи дублируются со стороны первой таблицы и не дублируюся со стороны второй.
Вам надо либо группировать по id заказа. Либо догружать записи потом. Что конкретно Вы хотите получить из таблицы с адресами пользователя? Количество адресов? или их самих?

Сами адреса

Получается следующее. Там находится 4 заказа, от незарегистрированного пользователя.  user_id у них получается одинаковый. И когда я добавляю

->groupby('C.user_id')

то они группируются и получается на выводе один заказ, а как быть в таком случае?

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

Поможет. Их может быть сколько угодно ещё.

Посмотрел по внимательней и получилось казалось бы. Я делаю left join вот таким образом

->leftjoin(new \Shop\Model\Orm\Address(), 'A.user_id=C.user_id', 'C')

Вот целый запрос

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

Там у меня находится 4 заказа.
Но вот при таком сравнении

'A.user_id=C.user_id

Показывается 1104 записи, как это может быть связано?

Спасибо! А как я могу получить данные из таблицы order_address ведь leftjoin тут уже не поможет?

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

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

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

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

 $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"
  }
}

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');
        }

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

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

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

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

$order_data = array(
                        'order_num' => $order['order_num'],
                        //и т.д.
                    );
Закусило Александр пишет:

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

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

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

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

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

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

up up

Что то я запутался.
Сейчас поставил другой статус на вывод и там находится 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> 

Все три выводят только 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');
        }
    
}

Закусило Александр, блин моя не внимательность, прошу прощения

там все норм как раз таки var_dump($_POST['addr_person']); string(14) "персона"

if (isset($_POST['person']) || isset($_POST['addr_person'])){ 
            $address['person'] = \RS\Http\Request::commonInstance()->request('person', TYPE_STRING); 
        }

Блин точно. Но почему заносится пустое значение? Т.е. в таблице NULL пропало и теперь просто пустая ячейка

Закусило Александр пишет:
orm.beforewrite.shop-address

Как раз пробовал третьим вариантом, что то не получается. Код что я выложил выше, там этот хук использую. Но как происвоить адресу?

if (isset($_POST['person'])){ 
            $address['addr_person'] = \RS\Http\Request::commonInstance()->request('addr_person', TYPE_STRING); 
        }

Здравствуйте.
Добавил новое поле в таблицу order_address
http://storage5.static.itmages.ru/i/16/1123/s_1479886461_9331343_1f329a06a6.png

Если через админку заказа вводить данные в это поле
http://storage1.static.itmages.ru/i/16/1123/s_1479886506_9957165_dd76c187b1.png

то данные заносятся
http://storage3.static.itmages.ru/i/16/1123/s_1479886525_8672629_ba83d93670.png

А при оформлении заказа не заносятся
http://storage6.static.itmages.ru/i/16/1123/s_1479886577_8525466_b1a05b237f.png

Подскажите что нужно указать в своем модуле?Наверное еще какой то хук?

<?php
namespace Person\Config;
use \RS\Orm\Type as OrmType;

class Handlers extends \RS\Event\HandlerAbstract
{
function init()
    {
        $this
            ->bind('orm.init.shop-address')
            ->bind('orm.beforewrite.shop-address');
    }
    
   
    public static function ormInitShopAddress (\Shop\Model\Orm\Address $address )
    {
        $address->getPropertyIterator()->append(array(
            'person' => new OrmType\Varchar(array(
                    'maxLength' => '100',
                    'description' => t('Персона'),
            )),

        ));
    } 

    /**
    * Действия перез записью заказа в БД
    */
    public static function ormBeforeWriteShopAddress ($data) {
        
        /**
        * @var \Shop\Model\Orm\Order
        */ 
        $address = $data['orm'];//Получаем объект заказа
        $flag = $data['flag'];//флаг

                
        if (isset($_POST['person'])){ 
            $address['person'] = \RS\Http\Request::commonInstance()->request('person', TYPE_STRING); 
        }
        // var_dump($address);
        

    }
 
}

Решение
Создаем собственный модуль

person/config/handlers.inc.php

<?php
namespace Person\Config;
use \RS\Orm\Type as OrmType;

class Handlers extends \RS\Event\HandlerAbstract
{
function init()
    {
        $this
            ->bind('orm.init.shop-address')
            ->bind('orm.beforewrite.shop-address');
    }
    
   
    public static function ormInitShopAddress (\Shop\Model\Orm\Address $address )
    {
        $address->getPropertyIterator()->append(array(
            'person' => new OrmType\Varchar(array(
                    'maxLength' => '100',
                    'description' => t('Получатель'),
            )),

        ));
    } 

    /**
    * Действия перез записью заказа в БД
    */
    public static function ormBeforeWriteShopAddress ($data) {
        
        /**
        * @var \Shop\Model\Orm\Order
        */ 
        $address = $data['orm'];//Получаем объект заказа
        $flag = $data['flag'];//флаг

                
        if (isset($_POST['person']) || isset($_POST['addr_person'])){ 
            $address['person'] = \RS\Http\Request::commonInstance()->request('person', TYPE_STRING); 
        }         
        

    }
 
}

person/config/file.inc.php

<?php
namespace Person\Config;
use \RS\Orm\Type;


class File extends \RS\Orm\ConfigObject
{
   
    
}

person/config/module.xml

<?xml version="1.0" encoding="utf-8"?>
<config>
    <defaultValues>    
        <name multilanguage="true">Расширение таблицы с адресами заказов</name>
        <description multilanguage="true">Модуль добавляет новые поля в таблицу адресов пользователя</description>        
        <version>1.0.0.0</version>
        <author>My mod</author>      
    </defaultValues>
</config>

Здравствуйте. Скажите, реально осуществить следующее?
Копировать товары из заказа А в заказ В?

Попробовал еще на скрине объяснить.
http://storage7.static.itmages.ru/i/16/1110/s_1478758692_1803385_54c3750c13.png

Закусило Александр я так понимаю это отдельный модуль? а хук не подскажите?

Закусило Александр, Мне нужна регистрация. А эти данные не всегда присутствуют