• Схема оплаты дизайна при удалённой работе на студию (без договора)?

    65536
    @65536
    ходите со своим договором, не согласны - пусть идуть дальше. обязательный пункт договора - ничего кроме перечисленного в тз не является работой по договору, подразумевающейся возможностью и вообще само собой разумеющейся фичей. только блять то что перечислено в приложении 1 будет сделано и больше ничего. если от и до не отстаивать эту позицию то будете тупо разбазаривать свое время которое можно было бы тратить на следующий заказ или след тз по этому же заказу или бесплатное саморазвитие, а не полировку и напидоривание до совершенства какой-то фигни. я с посредниками всего пару раз работал, но мне видимо повезло, с ними было проще чем с большниством конечных клиентов. у них общее свойство - воспринимать завершенную (согласно пунктам тз) работу как набросок, у них появляется опора для дальнейших фантазий на тему своего проекта, тут же всплывает несколько самособойразумеющихся вещей отсутствие которых воспринимается чуть ли как не недоработка и вообще халатность. поэтому лучше тратить больше времени на утрясание тз, при этом донести до клиента ту мысль что сделано будет не более того что перечислено вон в том тексте понятными русскими словами. это реальная проблема. даже со всем этим 5 раз проговоренным возникают недопонимания и всякие "закономерные" просьбы. ну в первую очередь свой труд надо ценить, потом договариваться уметь, и с этими ушлыми "веб-студиями" не связываться.короче главное трясти тз до посинения и полного взаимопонимания с полжительной обратной связью, и только потом за работу.
    Ответ написан
    Комментировать
  • Готовый бесплатный интернет-магазин?

    65536
    @65536
    один мой друг
    Ответ написан
    Комментировать
  • Есть ли такой таймер который будет считать время только при активных действиях в нескольких программах?

    65536
    @65536
    manictime классная прога была, не знаю не ударилась ли в монетизацию. если нет, то рекомендую. посекундная запись шевелений в такойто программе с такимто заголовком окна. +удобное построение отчетов по набранной статистике в наглядном виде
    Ответ написан
    Комментировать
  • Где можно попрактиковаться в php?

    65536
    @65536
    Да-да, написать цмс это именно то, с чего стоит начать. Чтобы все предыдущие создатели обосрались и поняли как были в корне неправы. Советующий такое сам похоже не один десяток цмсов носоздавал.
    Ответ написан
    1 комментарий
  • Где вы храните сессии пользователя, почему?

    65536
    @65536
    Внимание, с 20 декабря по 10 января в вашем доме будут отключены cookies.

    В какой ситуации браузер может оказаться с неработающими кукис кроме той когда за рулем сидит параноидальный идиот. Или я что-то пропустил?

    Я отказался от стандартных пхп-сессий. У них основная проблема - это то, что все это хранится в одном файле, который теоретически может или хотел бы разрастаться до бесконечности. Каждое открывание и считывание большого файла будет выжирать. Вторая проблема это то что если этот файл открыт один раз, то пока он не закроется, еще раз его не открыть. Если один запрос висит, следующий стоит в очереди. Это все можно обойти используя session_set_save_handler и т. д., но по-моему слишком сложно. Гораздо проще выдавать пользователям/гостям уникальный ключ (единственное что будет храниться в их кукисах) а уже по этому ключу хранить у себя в базе или где-то как хотеть данные сессии. Единственное что нужно сделать самому это прописать механизм смерти этих сессий и кукисов, и выдачу уникальных ключей, чтобы кому-то чужая не перепала. В базе по такому ключу можно хранить бесконечное кол-во записей, разделенных по какому-то признаку, принадлежности к такому-то модулю, например, и не беспокоиться о проблеме разрастания до бесконечности
    Ответ написан
    Комментировать
  • Как написать условие в ModX?

    65536
    @65536
    Ответ написан
    Комментировать
  • Стоит ли создавать интернет-магазин для портфолио на чистом PHP?

    65536
    @65536
    правильная цепочка в вашем случае такова: чистый пхп -> фреймворк -> цмс -> магаз, можно без звена цмс. чистый пхп -> магаз - это будет такой магаз, который в один не столь отдаленный момент станет невозможно дорабатывать. писать фреймворк это целая жизнь, пока напишете, забудете про магаз, а заодно изучите популярные фв, поэтому написание фреймворка можно сократить. чистый пхп -> цмс - тема еще более гиблая, чем что либо на чистом пхп. цмс должна делаться поверх слоя, в котором уже решены более низкоуровневые задачи, и само по себе создание цмс может оказаться сложнее и нетривиальнее чем создание фв, вылезет куча разнообразных аспектов и тонкостей, о которых заранее не подозреваешь. в общем написание цмс можно тоже сократить. остается перебрать и изучить все что есть готовое из обозримого и что-то выбрать. ну либо пройти путь самурая с многократными переписываниями мегабайтов кода и других мытарств и так и не вспомнить про какой-то там магазин, либо просто сделать очередную неповижную говняшку на пхп
    Ответ написан
    Комментировать
  • Как с помощью php, убрать последнюю букву в слове, если только она гласная?

    65536
    @65536
    !in_array('а', 'е', 'и', ...)
    Ответ написан
    Комментировать
  • Как в php решается проблема с множественным наследованием?

    65536
    @65536
    Да вообще наследование неправильно устроено. Надо было делать как у людей - маму и папу. То есть чтобы класс мог унаследоваться только от двух классов и никак иначе. Таким образом имеем множественное наследование хоть до бесконечности. Не хватило мамы с папой, добавляем бабушку с дедушкой, можно по 2 штуки, и т д. Единственное что понадобится это добавить в язык половой признак класса и модификаторы для полей и методов, которые будут задавать приоритет при наличии у обоих родителей, если задано у обоих, то берём папин вариант (патриархат). Так можно было бы наглядно комбинировать разных мам и пап чтобы порождать детей с нужными повадками.
    Ответ написан
    1 комментарий
  • Где лучше хранить иформацию о каталогах?

    65536
    @65536
    {00-ff}/{00-ff}/{00-ff}/{00-ff}/{00000000-ffffffff}.{ext}
    Ответ написан
    Комментировать
  • PHP7 и foreach. Коварное изменение?

    65536
    @65536
    в общем то и раньше не стоило менять массив из форыча по нему
    Ответ написан
    5 комментариев
  • Какую выбрать схему хранения объектов?

    65536
    @65536
    на днях доделал такой сайт. ломание головы остановилось на eav с несколькими типами полей

    вот как получилось
    объявления
    f1bc0bc3600979af86b4cfbf448642f6.png
    категории объявлений
    f7987ad4cb33f257c4b867e1d6841a14.png
    общие поля для объяв из всех категорий
    62102cd79000c00d74d4835868272352.png
    свойства категорий
    7d575bca3a46792ca52094fcbb294546.png
    значения свойств для объявлений
    58517b28450b090220a79838bd750712.png

    основной косяк еава это то что невозможно выбрать одним запросом в зависимости от настроек фильтра, приходится по каждому параметру собирать айдишники и потом их интерсектить, примерно так
    private function get_offers($page, $per_page)
    {
        $filter_fields = $this->get_current_filter_enabled_fields();
        $filter_values = $this->s('@filter~:values_by_cats/' . $this->cat->id);
    
        //
    
        $offers_ids_sets = array();
        $offers_extra_ids_sets = array();
    
        if ($filter_values) {
            foreach ($filter_values as $field_id => $data) {
                if (isset($filter_fields[$field_id])) {
                    $field = $filter_fields[$field_id];
    
                    $prop = $field['prop'];
                    $common_prop = $field['common_prop'];
    
                    if ($prop) {
                        $type = $prop['type'];
    
                        if ($type == 'bool' && $data['value']) {
                            $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                    ->where('bool_value', true)
                                    ->lists('offer_id')->toArray();
                        }
    
                        if ($type == 'strings_list' && isset($data['selected']) && !is_null($data['selected'])) {
                            $prop_settings = _j($prop['settings']);
    
                            if (isset($prop_settings['strings_list']['items'][$data['selected']])) {
                                $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                        ->where('string_value', $prop_settings['strings_list']['items'][$data['selected']])
                                        ->lists('offer_id')->toArray();
                            }
                        }
    
                        if ($type == 'numbers_list' && isset($data['selected']) && !is_null($data['selected'])) {
                            $prop_settings = _j($prop['settings']);
    
                            if (isset($prop_settings['numbers_list']['items'][$data['selected']])) {
                                $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                        ->where('number_value', $prop_settings['numbers_list']['items'][$data['selected']])
                                        ->lists('offer_id')->toArray();
                            }
                        }
    
                        if (($type == 'numbers_list' || $type == 'number') && isset($data['min']) && isset($data['max'])) {
                            $offers_ids_sets[] = PropValue::where('prop_id', $prop['id'])
                                    ->where('number_value', '>=', $data['min'])
                                    ->where('number_value', '<=', $data['max'])
                                    ->lists('offer_id')->toArray();
                        }
                    }
    
                    if ($common_prop) {
                        $type = $common_prop['type'];
    
                        if (($type == 'numbers_list' || $type == 'number') && isset($data['min']) && isset($data['max'])) {
                            $offers_ids_sets[] = OfferExtra
                                    ::where($common_prop['field'], '>=', $data['min'])
                                    ->where($common_prop['field'], '<=', $data['max'])
                                    ->lists('offer_id')->toArray();
                        }
                    }
                }
            }
        }
    
        $offers_ids = array();
    
        if ($offers_ids_sets) {
            $offers_ids = (array)$offers_ids_sets[0];
    
            for ($i = 1; $i < count($offers_ids_sets); $i++) {
                $offers_ids = array_intersect($offers_ids, (array)$offers_ids_sets[$i]);
            }
        }
    
        //
    
        $builder = $this->cat->offers();
    
        if ($offers_ids_sets) {
            $builder = $builder->whereIn('id', $offers_ids);
        }
    
        $builder = $builder->whereHas('extra', function ($builder) use ($offers_extra_ids_sets) {
            $builder->where('enabled', true);
        });
    
        $count = $builder->count();
    
        $offers = $builder->orderBy('created_at', 'DESC')->offset(($page - 1) * $per_page)->take($per_page)->get();
    
        return array($count, $offers);
    }

    и вообще никак невозможно сортировать по параметрам, если нужна сортировка по какому-то параметру придется переносить ее в таблицу товаров самих

    но все равно по гибкости он выигрывает у остальных вариантов. клиент сам через интерфейс может рулить своими категориями свойствами и тд. если бы была таблица в которой всё, она бы вешалась при каждой такой операции, на время пропорциональное кол-ву товаров
    Ответ написан
  • Ошибка 500 после установки ModX на OpenServer..что делать?

    65536
    @65536
    может быть это проблема с ввв/без ввв. у него это разные вещи. но вроде она 500 не дает
    Ответ написан
    Комментировать
  • Как сделать ACL для пользователей?

    65536
    @65536
    я делал permissions <-> groups <-> users, где "<->" связь много ко много. потом еще приделал связь permissions <-> users для персонального отбирания/давания разрешения пользователю каких-то разрешений поверх того, что присваивается ему через группы. там где нужно проверить какое-то разрешение, там оно и проверяется. так же разрешения и группы можно связывать с какими-то другими объектами в системе, чтобы владельца обозначить и проверять принадлежность когда надо тоже
    Ответ написан
    Комментировать
  • Как реализовать ЧПУ?

    65536
    @65536
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^.]+)$ /index.php?route=$1 [L]
    Ответ написан
    7 комментариев
  • Как защитить php скрипт и упаковать в exe?

    65536
    @65536
    зажать в архив с паролем, сменить расширение на ехе
    Ответ написан
    Комментировать
  • Можно ли в Less как-то задать имя селектору из переменной?

    65536
    @65536 Автор вопроса
    Разгадал, вот ответ stackoverflow.com/questions/15777257/using-variabl...

    Если кому интересно, у меня он не срабатывал потому-что я пользовался https://github.com/leafo/lessphp, который похоже загнулся

    заменил на https://github.com/oyejorge/less.php, всё пашет, ничего даже переписывать не пришлось, вызовы те же
    Ответ написан
    Комментировать