1

Тема: Создать отдельную страницу

Добрый день. А каким образом можно сделать отдельную страницу?
Например мне нужно сделать страницу, и что бы на ней выводились все товары, к которым был применен купон.
С запросом все понятно. Но куда ее разместить?как к ней обратиться?

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

Re: Создать отдельную страницу

Если нужно в публичной части, то:
Вам нужно будет создать свой front контроллер, который выведет нужную информацию. А также объявить маршрут Вашей страницы.
Все маршруты(типы адресов страниц) объявляются в функции getRoute в handlers.inc.php. Вы можете посмотреть его в любом модуле. Этот маршрут будет вести на front контроллер, если набран указанный Вами адрес.
Статья на эту тему вот здесь:
http://readyscript.ru/text-blog/Kak-pra … adyScript/

Например вот такой маршрут:

function init()
{
        $this
            ->bind('getroute'); //Объявляем хук маршрутов

}
    /**
    * Объявление маршрутов в системе 
    *
    */
    public static function getRoute($routes) 
    {

            
        //Ваш маршрут
        $routes[] = new \RS\Router\Route('custom-front-mycontroller', 
            '/custom/myurl/', null, t('Мой FRONT контроллер'));
        
        
        return $routes;
    }  

Соотственно по пути /custom/myurl/ он будет стучаться в Вам на /modules/custom/controller/front/mycontroller.inc.php

Если нужно в админ панели сделать раздел, то смотрим моё видео о меню.
https://www.youtube.com/watch?v=AeOKRd5 … mp;index=6


И копируем себе в модуль какой-либо админский контроллер, который Вам больше нравится, после чего переделываем под себя.

Попробуйте. Если не будет получаться скажите, только фрагменты кода приведите.

3

Re: Создать отдельную страницу

Посмотрел видео, делаю по его примеру.
Все создал меню, только контроллер я скопировал из модуля users.

Убрал лишнее что не нужно, оставил пока по минимум. Потом подменю переменные на свои. И доведу до ума.

class MyCtrl extends \RS\Controller\Admin\Crud
{
        function __construct()
    {
        parent::__construct(new \Users\Model\Api());
    }
    
    function helperIndex()
    {
        $helper = parent::helperIndex();
        $helper->setTopTitle(t('Товары со скидками'));
        $edit_pattern = $this->router->getAdminPattern('edit', array(':id' => '@id'));
        $helper->setTable(new Table\Element(array(
            'Columns' => array(
                new TableType\Checkbox('id', array('showSelectAll' => true)),            
                new TableType\String('id', '№', array('ThAttr' => array('width' => '50'), 'Sortable' => SORTABLE_BOTH, 'CurrentSort' => SORTABLE_DESC)),
                new TableType\String('login', t('Логин'), array('href' => $edit_pattern, 'Sortable' => SORTABLE_BOTH, 'linkAttr' => array('class' => 'crud-edit'))),                
        ))));

        return $helper;
    }
    
}

Вот мой запрос

$order = new \Shop\Model\Orm\Orderitem();

$list = \RS\Orm\Request::make()
        ->select("order_id,discount,title,type")//что выбирать
        ->from(new \Shop\Model\Orm\Orderitem()) //из какой таблицы выбираем
        ->where('`discount` > 0.00')
                ->exec()
                ->fetchAll();

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

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

Re: Создать отдельную страницу

Ну тут нужно не совсем то.
Вот эта конструкция:

function __construct()
    {
        parent::__construct(new \Users\Model\Api()); //Указываем API с которым будет возвращаться вывод
    }

Нужно указать здесь API для вывода информации. В Вашем случае, нужно обращение к таблице с элементами заказа, которая описывается в \Shop\Model\Orm\Orderitem. API которое с этими ORM объектами работает в данном случае не существует.
Поэтому Вы создёте у себя класс АПИ и указываете наследование от EntityList, и указать объект, с которым будет работать АПИ. Например:

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

Соответственно нужно будет указать своё API для работы CRUD контроллера.

В самом helperIndex можно уточнить запрос по умолчанию, расширив его запросом. В этом классе сам объект апи находится в $this->api. Мы можешь получить объект запроса \RS\ORM\Request  через метод queryObj() . Ну например:

 
function helperIndex()
    {
        $helper = parent::helperIndex();
        $q = $this->api->queryObj();
        $q->where(
         //Моё нужное условие
        );

А сами поля вывода, если Вы заметили описываются здесь:

$helper->setTable(new Table\Element(array(
            'Columns' => array(
                new TableType\Checkbox('id', array('showSelectAll' => true)),            
                new TableType\String('id', '№', array('ThAttr' => array('width' => '50'), 'Sortable' => SORTABLE_BOTH, 'CurrentSort' => SORTABLE_DESC)),
                new TableType\String('login', t('Логин'), array('href' => $edit_pattern, 'Sortable' => SORTABLE_BOTH, 'linkAttr' => array('class' => 'crud-edit'))),                
        ))));

Поменяйте под себя.

5 Отредактировано Илья (28.06.2016 16:21:50)

Re: Создать отдельную страницу

Спасибо все получилось smile
А если вывести сюда еще поле code из таблици order_discount что бы получилась запись вида. Не соображу как сделать?

order_id                title                    code   
       1       название товара     номер купона

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

Re: Создать отдельную страницу

Не совсем понял, что хотите сделать. Поясните подробнее

7

Re: Создать отдельную страницу

Добавить вывод полей из таблицы order_discount

http://storage4.static.itmages.ru/i/16/0628/s_1467118465_1413433_61b5457b3a.png

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

Re: Создать отдельную страницу

Теперь понял. Ну тогда сделайте ещё join у объекта запроса. В чем проблема? smile У Вас же в $q объект.

9 Отредактировано Илья (29.06.2016 09:58:40)

Re: Создать отдельную страницу

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

Теперь понял. Ну тогда сделайте ещё join у объекта запроса. В чем проблема? smile У Вас же в $q объект.

Это понятно smile я не могу саму логику продумать, как правильно составить запрос.

вот я делаю второй запрос

$sub_query = \RS\Orm\Request::make()
                     ->from(new \Shop\Model\Orm\Discount()); 

не могу понять как правильно составить у where как там продолжить запрос

$q->where(array( не пойму что тут ));

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

Re: Создать отдельную страницу

Так у Вас же всё получилось?
\RS\Orm\Request строится по тем же правилам, что и обычные SQL запросы. Т.е. если Вы хотите подсоединить таблицу то можно использовать join, тогда у Вас появятся дополнительные колонки.
Обращение к основной таблице всегда с алиасом A.
Например:

$q = $this->api->queryObj();
$q->join(Ваша нужная к присоединению таблица, 'A.полеприсоединия=B.полеприсоединения', 'B') //INNER JOIN
->where(
      //Моё нужное условие в уже объединённой таблице
);

Если не знаете как составляется запрос join, то читайте документацию по MySQL:
http://phpclub.ru/mysql/doc/join.html
http://pionick.net/examples/mysql_join

и смотрите видео по запросам к БД в RS. Там тоже есть примеры с JOIN:
https://www.youtube.com/watch?v=n6ufZ2b … L4X2UTC6Aw

11

Re: Создать отдельную страницу

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

Так у Вас же всё получилось?
получилось не так как нужно

'A.полеприсоединия=B.полеприсоединения'
);

Вот в этом у меня и встал вопрос, какие поля брать для этого?

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

Re: Создать отдельную страницу

У вас таблица order_discount кикие имеет общие поля? Какие вообще поля  Вас есть в обоих таблицах?

13 Отредактировано Илья (29.06.2016 15:47:12)

Re: Создать отдельную страницу

В том то и дело что я не нахожу общих полей, в связи с этим у меня недопонимание как поступить, как сделать.
Купон же применяется к обьекту корзины? или заказу?
Или может в таблицу discount заносить id заказа?


http://storage8.static.itmages.ru/i/16/0629/s_1467188456_4613538_5157b9581c.png
http://storage9.static.itmages.ru/i/16/0629/s_1467188476_7613670_8a310f4044.png

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

Re: Создать отдельную страницу

В order_items у Вас есть entity_id, а в discount поле id.

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

Re: Создать отдельную страницу

вот такой запрос

$q = $this->api->queryObj();
        $q->join(new \Shop\Model\Orm\Orderitem(), 'A.id=B.entity_id', 'B')//INNER JOIN
            ->where(array('type' => "product"));

Тип product не выводит, а если укажу coupone или delivery, то их выводит. Подскажите почему так?

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

Re: Создать отдельную страницу

Всё очень просто. Вы фильтруете по типу товар, а не по типу купон. У Вас идентификаторы купона и товара разные. Так и должно быть. JOIN по этому и не сходится.
Вам наверное надо создать ещё одну промежуточную таблицу с полями order_id и discount_id. И при сохранении заказа писать в неё связь для всего заказа. Тогда можно через 2 JOIN объеденить то что Вам нужно.

17

Re: Создать отдельную страницу

Ну а в шаблоне orderview.tpl ведь купон каким то же образом выводится, нельзя по примеру сделать и тут?
http://storage2.static.itmages.ru/i/16/0629/s_1467205169_5552729_ac9743fd36.png

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

18 Отредактировано Закусило Александр (29.06.2016 17:13:54)

Re: Создать отдельную страницу

Купон грузится из корзины заказа где есть все orderitems. Т.е. сразу доступны все элементы. В Вашем случае, нужно получить формулу несколько по другому. У вас ведь не просмотр одного заказа.

Re: Создать отдельную страницу

Илья пишет:

Все создал, а теперь мне нужно вот это?
   

$this->addIndex(array('site_id', 'order_num'),self::INDEX_UNIQUE);

И что это? Куда вы индекс добавляете?

20 Отредактировано Илья (30.06.2016 11:02:27)

Re: Создать отдельную страницу

Можно же использовать функцию function beforeWrite($flag)
и подставить туда запрос на запись в новую бд?
И нужно создать еще один api?Тогда получается нужно создать еще папку orm и туда файл mydiscount.inc.php?

Или можно поступить таким образом?но опять таки нужно папку orm и туда файл mydiscount.inc.php
И в переменных я наверное ошибся?

$order = new \Newpage\Model\Orm\Mydiscount();
$order['order_id'] = $order_num;
$res = $order->insert();

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

Re: Создать отдельную страницу

Илья пишет:

Можно же использовать функцию function beforeWrite($flag)
и подставить туда запрос на запись в новую бд?
И нужно создать еще один api?Тогда получается нужно создать еще папку orm и туда файл mydiscount.inc.php?

Или можно поступить таким образом?но опять таки нужно папку orm и туда файл mydiscount.inc.php
И в переменных я наверное ошибся?

$order = new \Newpage\Model\Orm\Mydiscount();
$order['order_id'] = $order_num;
$res = $order->insert();

Вы молодец! Идёте в правильном направлении. Я просто говорил про то, что индекс Вам там такой не нужен. Т.к. можно просто использовать параметр у самого поля order_id при объявлении полей ORM объекта

  'index' => true,

22 Отредактировано Илья (30.06.2016 13:07:00)

Re: Создать отдельную страницу

В файле myapi.inc.php создал

        parent::__construct(new \Newpage\Model\Orm\Mydiscount,
        array(
            'multisite' => false
        ));

Затем в папке model создал папку orm в ней файл mydiscount.inc.php с содержимым

<?php

namespace Newpage\Model\Orm;
use \RS\Orm\Type;


class Mydiscount extends \RS\Orm\OrmObject
{
    protected static
        $table = 'order_mydiscount';

    function _init()
    {
        parent::_init()->append(array(           
            'order_id' => new Type\Integer(array(
                'index' => true,
                'description' => t('id заказа'),
            )),
            'discount_id' => new Type\Integer(array(
                'description' => t('id скидки'),
            )),
        ));    
    } 

    function beforeWrite($flag)
    {
        $order = new \Newpage\Model\Orm\Mydiscount();
        $order['order_id'] = $order_num;
        $res = $order->insert();
    }  
}        

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

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

Re: Создать отдельную страницу

Ну в данном случае можно обойтись без файла API. Он Вам незачем. Вы ведь просто ORM объект будете сохранять А так всё правильно.

24 Отредактировано Илья (30.06.2016 14:28:41)

Re: Создать отдельную страницу

Сделал заказ, он id заказа не записался. Значит чего то не хватает?
в функции beforewrite нужно дописать что то

А может дело в функции function _init(). Потому что я таблицу с ячеками создал вручную в phpmyadmin. А название таблицы и поля в функцию function _init() просто вписал, может быть дело в этом?

Функцию в mydiscount.inc.php закоментировал и попробовал проверить через var_dump. Создал файл в корне с содержимым

<?php
require_once 'setup.inc.php';

echo '<pre>';

$order = new \Newpage\Model\Orm\Mydiscount();
$order['order_id'] = "1";
$res = $order->insert();

var_dump($res);

echo '</pre>';

Запись в базу прошла.
А почему тогда не проходит при оформлении заказа?

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

25 Отредактировано Закусило Александр (30.06.2016 14:34:45)

Re: Создать отдельную страницу

Что означает у Вас данный код:

function beforeWrite($flag)
    {
        $order = new \Newpage\Model\Orm\Mydiscount();
        $order['order_id'] = $order_num;
        $res = $order->insert();
    }  

И почему вы вешаетесь на запись именно Вашего ORM MyDiscount? Вы ведь должны вешаться на запись самого заказа. Разве не так? И ещё вопрос, откуда вы предполагаете брать $order_num?