These are chat archives for PHPixie/Hotline

19th
Nov 2015
Vadim Meling
@Linfuby
Nov 19 2015 10:02
@KokaUA Я тут много читал про flash, но не нашел его в композере. Он готов? Им можно пользоваться или ты чисто для себя делал?
Vadim Meling
@Linfuby
Nov 19 2015 10:59

@dracony А как тебе такая идея. Создавать relationship.
То есть если мне нужно добавить изображение к баннеру, мне нужно сделать

class ModuleBanner {
    protected $orm;
    public function __constructor($orm){
        $this->orm = $orm;
    }
    public function addImage($banner, $image){
        $banner = $this->orm()->in($banner_id)->findOne();
        $banner_image = $this->orm()->createEntity('banner_image');
        $banner_image->setField('image', $image);
        $banner_image->save();
        $banner ->images->add($banner_image);
    }
}

А если бы relationship мог сам создавать записи - было бы очень хорошо. Например:

class ModuleBanner {
    public function __constructor(){
    }
    public function addImage($banner, $image){
        $banner_image = $banner ->images->create()
        $banner_image->setField('image', $image);
        $banner_image->save();
        $banner ->images->add($banner_image);
    }
}
  1. Нет необходимости передавать компонент ORM (А передается он только ради createEntity())
  2. Не нужно знать имя модели зависимости (зависимость называется images, а имя модели banner_image)
  3. Конечно наличие возможности сразу передать массив данных в функцию create меня бы обрадовал еще больше.
    Сейчас я добавил функцию в сам Entity
    public function createMany($relations, $data)
     {
         $query  = $this->$relations->query();
         $entity = $this->builder->components()->orm()->createEntity($query->modelName());
         foreach ($data as $field => $value) {
             $entity->setField($field, $value);
         }
         $entity->save();
         $this->$relations->add($entity);
         return $entity;
     }
    // Вызывается так:
    class ModuleBanner {
     public function __constructor(){
     }
     public function addImage($banner, $image){
         $banner_image = $banner->createMany('images', array('image' => $image));
     }
    }
roman4e
@roman4e
Nov 19 2015 11:02
Всегда было интересно, как реагируют системы если сделать так
$this->orm()->in($banner_id); // пропустить findOne()
$this->orm()->createEntity('banner_image')
Vadim Meling
@Linfuby
Nov 19 2015 11:05

Да, забыл добавить query('banner'); Правильно так:

$banner = $this->orm()->query('banner')->in($banner_id)->findOne();

Если не указать findOne() $banner будет содержать объект запроса Query

Kostya
@KokaUA
Nov 19 2015 11:24
@Linfuby https://packagist.org/packages/koka/flash Вроде есть, для теста ставил с композера, все нашлось.
Vadim Meling
@Linfuby
Nov 19 2015 11:25
Значит я плохо искал. Спасибо, сейчас заценю (Как раз понадобилось)
Kostya
@KokaUA
Nov 19 2015 11:26
@Linfuby На прошлой неделе полностью переписал, кажется все ок. Тестами покрыт + если нужно тестировать то просто мокнуть интерфейс в компонентах
Vadim Meling
@Linfuby
Nov 19 2015 11:28
Я если честно с тестами еще не дружу... Все хочу научится, да путёвой статьи описывающей процесс не найду. Везде проверяют 2+2=4
Мне конечно не помешало бы свои тесты написать для своей корзины как минимум
Kostya
@KokaUA
Nov 19 2015 11:30
@Linfuby Ну я сам с контроллерами пока особо не возился, щас в основном только для либ пишу тесты
Vadim Meling
@Linfuby
Nov 19 2015 11:31
Ну корзина у меня как отдельная либа написана
Kostya
@KokaUA
Nov 19 2015 11:32
@Linfuby Кстати на щет статей, действительно мало.
Если честно сам раньше не любил тесты, но несколько раз они меня очень спасали при рефакторинге. Теперь стараюсь покрывать как можно больше
Vadim Meling
@Linfuby
Nov 19 2015 11:40
@KokaUA Понятно почему я не нашел. Искал по слову phpixie
Может название лучше сделать koka/phpixie-flash?
Kostya
@KokaUA
Nov 19 2015 11:40
@Linfuby Ну вообще должно искать по ключевым словам
Vadim Meling
@Linfuby
Nov 19 2015 11:41
Ну на сайте может быть, я то ищу в PHPStorm, а там просто по названиям ищет. А у тебя он называется просто koka/flash
Kostya
@KokaUA
Nov 19 2015 11:41
Загрузок мало, он в самом конце по ключевому слову phpixie, сам пакет просто не привязан жестко к пикси
По сути его к любому приложению можно привязать, там зависимости минимальные только http и slice
ну и dev зависимость phpixie/test
Vadim Meling
@Linfuby
Nov 19 2015 11:53
Все отлично работает.
Вопрос, чтобы изменить класс для alert нужно определить свой массив $types и получать просто сам код ошибки? $msg->getType(true);?
Kostya
@KokaUA
Nov 19 2015 11:55
@Linfuby На щет расширений, я как-то пропустил. Щас добавлю alert
Я типы под бутструп сразу как-то подгонял, щас будит)
Kostya
@KokaUA
Nov 19 2015 12:01
По идее алерт между info и notice
Vadim Meling
@Linfuby
Nov 19 2015 12:04
Я то на uikit сижу, и там есть классы с приставкой primary. Поэтому мне и нужно переопределить массив types (На всех не угодишь, но наличие возможности получить сам код, очень в этом помогает)
Kostya
@KokaUA
Nov 19 2015 12:06
Запушил, щас должно обновится, потом добавлю возможноть передавать свои типы при добавление в компонент
С одной стороны это можно было бы вынести в отдельный клас type как было раньше, с другой стороны я убрал магию, что требует переопределять flash
Что сводится или к магии, или к удобству расширения... Вот и встает дискусия что выбрать
Kostya
@KokaUA
Nov 19 2015 12:11
Я кстати раньше забыл тип danger, дак использова в шаблоне !$flash->type()== 'error' ?: 'danger';
Vadim Meling
@Linfuby
Nov 19 2015 12:12

Ну есть решение лучше. Передавать массив в конструктор (Все равно в Components прописывается)

protected function buildFlash()
    {
        return new \Koka\Flash\Flash($this->builder->context(), $this->builder->assets()->configStorage()->get('flash'));
    }

Соответственно если вторым параметром вернется null - использовать массив по умолчанию

И таким как я достаточно будет создать файл flash в папке assets/config который вернет нужный мне массив
Kostya
@KokaUA
Nov 19 2015 12:15
в таком случае во flash нужно спользовать __call(), а его в тестировании не так удобно
Vadim Meling
@Linfuby
Nov 19 2015 12:17
Погоди, сформулирую свою идею.
Kostya
@KokaUA
Nov 19 2015 12:18
Ну я понял, свой массив types
Просто при добавление использую константы а не доступ к массиву
По хорошему действительно можно вынести типы отдельно, но тогда при добавлении сообщений прийдется использовать магию Или вместе с типама еще и flash переопределять. В принципе стандартных типов не так много, думаю все собрать в кучу не совставит труда. А если кому-то нужен уникальй, как вариант использовать имеющийся с условием. Как раньше написал
Vadim Meling
@Linfuby
Nov 19 2015 12:31
protected $types = [
        'error' => 'alert-error',
        'danger' => 'alert-danget',
        'warning' => 'alert-warning',
        'notice' => 'alert-notice',
        'info' => 'alert-info',
        'success' => 'alert-success'
    ];
// Функция например success
public function success($message)
    {
        $this->push('success', $message);
        return $this;
    }
// А в push соответственно тоже добавляется не цифра, а текст
protected function push($type, $message)
    {
        $messages = $this->get();
        $message = new Message($type, $message);
        $messages[$type][] = $message;
        $this->set($messages);
    }
// Ну и getType() соответственно уже будет возвращать класс
public function getType($asKey = false)
    {
        if ($asKey) {
            return $this->type;
        }
        return $this->types[$this->type];
    }
Таким образом для каждого типа сообщения можно очень тонко настроить свои классы
В общем как говорится "Моё дело предложить"
Kostya
@KokaUA
Nov 19 2015 12:34

@Linfuby Вот смотри в твоем случае

public function success($message)
    {
        $this->push('success', $message);
        return $this;
    }

Даже если передать свой тип, прийдется еще и в flash новую функцию добавлтья

Vadim Meling
@Linfuby
Nov 19 2015 12:34
А зачем новый тип? Типы фиксированные, просто за счет своего конфига их можно переопределять
Kostya
@KokaUA
Nov 19 2015 12:35
Типа что-бы info можно было обозвать alert?
Roman Tsiupa
@dracony
Nov 19 2015 12:36
tut)
Kostya
@KokaUA
Nov 19 2015 12:39
@Linfuby В любом случае это сведется или к переопределению flash или к магии. При этом при тестировании магию не так удобно. + Если делать динамически методы, их в интерфейте то не определишь, что-бы мокать потом
Vadim Meling
@Linfuby
Nov 19 2015 12:39
Да. Например мне будет удобно для alert (который ты добавил) укзать класс uk-alert-primary
А для полного счастья добавить еще метод custom c ключем custom где можно все что угодно вывести,
Roman Tsiupa
@dracony
Nov 19 2015 12:39
@linfuby идея хорошая, но проблема в том что если будет вызов ->create() то оно ведь должно автоматически связать модель
Vadim Meling
@Linfuby
Nov 19 2015 12:39
Магию не надо... Я сам ее не очень люблю
Roman Tsiupa
@dracony
Nov 19 2015 12:39
а так как данных в ней еще нет то получиться связь с пустым объектом
ну типа
$post = $category->posts->create();
на этом моменте я так понимаю пост не должен быть записан в бд еще
так как он не наполнен
Kostya
@KokaUA
Nov 19 2015 12:40
@Linfuby А на щет префикса/суфикса, это в шаблоне уже "alert-<?=$msg->type()?>
Главное сам тип, а префиксы это уже зависит от css фреймворка/своего
Vadim Meling
@Linfuby
Nov 19 2015 12:41
@dracony Да. Однако в Post ты разве не можешь проставить связь, ведь create вызывается из relationship
Roman Tsiupa
@dracony
Nov 19 2015 12:41
угу
Kostya
@KokaUA
Nov 19 2015 12:42
В твоем случае uk-<?=$msg->type()?>-primary
Roman Tsiupa
@dracony
Nov 19 2015 12:42
и работает только с сохраненными объектами
по факту проблема в том что приходиться передавать модель image в твой баннер
чтобы работал createMany
но если подумать то сама сущность баннера может и не должна работать с "сырыми" данными сама превращая их в сущности image
если это вынести в отдельный сервис тогда самим моделем не понадобиться чужой репозиторий
Vadim Meling
@Linfuby
Nov 19 2015 12:44
@KokaUA Нет. primary надо только для определенных типов сообщений
Roman Tsiupa
@dracony
Nov 19 2015 12:44
вот например как у меня в demo-todo вынесено в класс Tracker
Vadim Meling
@Linfuby
Nov 19 2015 12:44
@KokaUA Некоторые будут uk-alert-danger
Roman Tsiupa
@dracony
Nov 19 2015 12:45
@roman4e ->in() можно вызвать только на запросе (Query)
Kostya
@KokaUA
Nov 19 2015 12:48
@Linfuby Подумаю, мб сделать массив types кастомный, а получать тогда тип через экземпляр types. Ну это или сингилтон делать или статику.
Roman Tsiupa
@dracony
Nov 19 2015 12:48
в принципе можно совсем все типы кастомными сделать
))))
по ходу кого-то так зовут
верхный результат по поиску в гугле
Kostya
@KokaUA
Nov 19 2015 12:50
    /**
     * @param string $message
     * @return $this
     */
    public function notice($message)
    {
        $this->push(Message::NOTICE, $message);
        return $this;
    }
Тут в любом случае магия тогда нужна...
Roman Tsiupa
@dracony
Nov 19 2015 12:50
ну их тогда модно совсем убрать может
или
Kostya
@KokaUA
Nov 19 2015 12:50
Точнее push оборачивать в call который уже будит кастомные type разруливать
Как я раньше делал
Roman Tsiupa
@dracony
Nov 19 2015 12:51
но с другой стороны разруливать это по классам цсс проблема уже вьюшки
Kostya
@KokaUA
Nov 19 2015 12:52

@dracony У меня раньше было

    /**
     * @param string $type
     * @param array $args
     */
    public function __call($type, $args)
    {
        !in_array($type, ['error', 'warning', 'notice', 'info', 'success'])
            ?: $this->push($type, $args[0], true);
    }

Я просто от магии решил отсказатся

Roman Tsiupa
@dracony
Nov 19 2015 12:52
а то что делать если мне 2 класа надо сразу? типа class="error error-popup erorr-amazing"
я о том что тип месседжа это одно а цсс класс другое
Kostya
@KokaUA
Nov 19 2015 12:53
class="<?=$flash->type()?> <?=$flash->type()?>-popup <?=$flash->type()?>-amazing"
Roman Tsiupa
@dracony
Nov 19 2015 12:54
я о том что мне как раз надо popup i amazing )
a ne 'error'
Kostya
@KokaUA
Nov 19 2015 12:55
Ну к примеру если делать кастопмыне типы, то отдельно и popup и amazing делать. Это получается два пуша делать?
Roman Tsiupa
@dracony
Nov 19 2015 12:55
ну я о том что всем и так не угодишь)
Kostya
@KokaUA
Nov 19 2015 12:56
В принципе кастомные типа сделать не проблема, но все это к магии сводится.
Roman Tsiupa
@dracony
Nov 19 2015 12:56
ну почему
пусть будут себе стандартные методы
те что есть
и отдельно
Kostya
@KokaUA
Nov 19 2015 12:56
Типа публичный push со своими типами?
Roman Tsiupa
@dracony
Nov 19 2015 12:57
ugu
Kostya
@KokaUA
Nov 19 2015 12:57
Ну тут проблемка разве что с приоритетами, я к примеру предусмотривал вывод сообщений определенного типа
Roman Tsiupa
@dracony
Nov 19 2015 12:58
приоритет третим параметром
может
хз
Kostya
@KokaUA
Nov 19 2015 12:59
    public function testPopMessageWithArrayType()
    {
        $this->flash->success('Test pop message');
        $this->flash->success('Test pop message');
        $this->flash->info('Test pop message');
        $this->flash->info('Test pop message');
        $this->flash->notice('Test pop message');
        $this->assertCount(3, $this->flash->pop([Message::SUCCESS, Message::NOTICE]));
    }
Просто как-бы они не путались, если много типов будит расширятся
Roman Tsiupa
@dracony
Nov 19 2015 12:59
Message::CUSTOM ?
на уровне info
Kostya
@KokaUA
Nov 19 2015 13:00
Ну если все к кастум определить, как их отлечить от popup или amazing
Roman Tsiupa
@dracony
Nov 19 2015 13:00
ну это не получиться никак)
я этот пример как раз привел к тому
что не надо думать о цсс
а это уже в шаблоне кто-то должен
Kostya
@KokaUA
Nov 19 2015 13:01
Ну и я к тому с начала вел, основной тип/ошибка/тревога/предупреждение - а в шаблоне уже разруливать как вывести
Roman Tsiupa
@dracony
Nov 19 2015 13:01
if($type === Message::SUCCESS) {
     <div class="flash flash-success">aassdada</div>
}
Kostya
@KokaUA
Nov 19 2015 13:01
Как вариан тоже
Roman Tsiupa
@dracony
Nov 19 2015 13:01
а))
или проще:
$map = array(
     Message::SUCCESS => 'flash flash-success'
);
<div class="$map[$type]">fsdfsd</div>
ну итд)
Kostya
@KokaUA
Nov 19 2015 13:03
Ну это уже и к прошлому сообщению сводится, к условию. Тут вопрос стоял в кастомных типах, а не том как их выводить
Как по мне error и в африке error
а классы уже самому подставить
Roman Tsiupa
@dracony
Nov 19 2015 13:04
так @linfuby как раз о вьюшке говорил
что у него там еще primary есть
кароч мы по ходу о том же говорили все время))))))
просто я тебя не понял)
@Linfuby так primary это ж типа success, нет?
Kostya
@KokaUA
Nov 19 2015 13:07
Ну дак я об этом уже писал. Вот смотри. Что требуется от приложения? Передать сообщение что некое действие вернуло такой то результат, к примеру error. Сама либа не знает как в приложение реализована вьюшка ошибок.
Нам нужно сообщить во вью что была ошибка. А в самом вью уже подставить в css класс. К примеру uk-<?=$msg->type()?>-primary
Кастомный массив types конечно хорошо, но как я понимаю это сведется или к магии (что я не хочу), или к статистическому доступу к массиву types + расширение flash ибо все методы предусмотреть не реально
Честно мне кажется проще со временем наполнить массив основными типами
    protected $types = [
        'error' => 10,
        'danger' => 20,
        'warning' => 30,
        'notice' => 40,
        'alert' => 45,
        'info' => 50,
        'success' => 60
    ];
  • добавить константы что используются при добавлении.
    А если кому нужно их костомезировать, это уже во вью
Kostya
@KokaUA
Nov 19 2015 13:15
А вообще проще форкнуть саму либу, и под себя уже поправить типы и методы во flash
Vadim Meling
@Linfuby
Nov 19 2015 13:19
@KokaUA Давай наверное так и сделаем. Я Форкну и закину тебе pull и там обсудим.
Kostya
@KokaUA
Nov 19 2015 13:20
@Linfuby Как вариант).
Vadim Meling
@Linfuby
Nov 19 2015 13:22
@dracony Интересный вопрос. В след. году мне нужно будет подключение к БД Firebird В PHPixie ведь не сложно будет написать свое подключение? Возможно придется и Query где-то подправить?
Kostya
@KokaUA
Nov 19 2015 13:23
@Linfuby Скорее всего conection and db
Vadim Meling
@Linfuby
Nov 19 2015 13:27
Там подключение то такое же как у MySQL (Хотя могу ошибаться, еще не изучал этот вопрос) Просто сейчас начальство спросило возможно ли
$str_conn = "firebird:dbname=C:\db\banco.gdb;host=localhost";
$dbh = new PDO($str_conn, "SYSDBA", "masterkey");
Kostya
@KokaUA
Nov 19 2015 13:29
Ну по логике свой адаптер жужен
  • если синтексис отлечается то query builer править
Vadim Meling
@Linfuby
Nov 19 2015 13:30
Ну посмотрим. Пока сообщил что "Без проблем" :)
Kostya
@KokaUA
Nov 19 2015 13:31
Проблемы нужно решать по мере поступления
Roman Tsiupa
@dracony
Nov 19 2015 14:09
это зависит какой у низ там sql
вот в оракла sql
но даже лимит и оффсет надо через бубен делать
))
а его кто-то еще использует?
Vadim Meling
@Linfuby
Nov 19 2015 14:10
Да вроде очень схож... Если не очень схож, то можно просто делать execute()
Используют. У нас.
Правда для настольной программы, и как раз будет задача оттуда данные тянуть
Roman Tsiupa
@dracony
Nov 19 2015 14:14
ну главное что через пдо работает
так что разве что адаптер написать
там саовсем немного
посмотрю =)
Kostya
@KokaUA
Nov 19 2015 16:32
@dracony Бандл проверял?
Вообщем если что проверь, ну или завтра с отдельной ветки конфиги скину
Roman Tsiupa
@dracony
Nov 19 2015 17:15
Пока нет, сорри, много дел (((
Но сегодня точно посмотрю
Только домой доберусь
Roman Tsiupa
@dracony
Nov 19 2015 19:08
разобрался
!!!
все просто ведь
роутинг парситься пока паттерн не подойдет
но он не проверяет есть ли процессор или нет
только паттерн
то есть если у тебя стандартный /<processor>/<action> паттерн в бандле 1
то она поймает и урлы из бандла 2
но еси в бандле 1 прописаны конкрентные роуты
и в бандле 2 тоже
то можно смело монтировать в одно место
кстати интересно
может смогу переделать чтобы оно еще и процессор проверяло сразу