Задать вопрос
  • Robot.txt и карта сайта для поддоменов?

    @kucheriavij
    Виктор Уманский, У меня кастомный urlManager. Писал его не я, пришлось продолжать то что было. Я бы правил в конфиги накидал
    namespace app\base;
    
    use dictionary\models\Average;
    use dictionary\models\Features;
    use dictionary\models\Kitchen;
    use dictionary\models\Position;
    use dictionary\models\Type;
    use dictionary\models\TypeFacility;
    use restaurants\models\Restaurants;
    use structure\models\Section;
    use tops\models\Collection;
    
    /**
     * Class UrlManager
     *
     * @package app\base
     */
    class UrlManager extends \yii\web\UrlManager
    {
        /**
         * @var
         */
        public $domain;
        /**
         * @var
         */
        public $original;
    
        /**
         * @var array
         */
        private $_params = [];
    
        /**
         * @param \yii\web\Request $request
         * @return mixed
         */
        public function parseRequest($request)
        {
    
            if (false !== $r = parent::parseRequest($request)) {
                return $r;
            }
    
            $result = false;
            $name = !empty($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'];
            /* @var Restaurants $rest */
            if (($rest = \Yii::$app->db->cache(function ($db) use ($name) {return Restaurants::findOne(['domain' => $name, 'publish' => 1]);}, 3600))) {
                $this->_params['rest'] = $rest;
                $this->_params['city'] = $rest->city;
    
                if ($request->url === '/') {
                    $this->_params['section'] = \Yii::$app->db->cache(function ($db) use ($rest) {
                        return Section::findOne(['rest_id' => $rest->id, 'depth' => 0, 'publish' => 1]);
                    }, 3600);
                    $result = ['restaurants/frontend/default', []];
                } else {
                    $result = $this->parseStruct($request, $rest);
                }
            } elseif ($dict = Average::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'average';
                    $result = ['dictionary/frontend/default', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'average';
                    $result = ['dictionary/frontend/default/robots', []];
                }
            } elseif ($dict = Kitchen::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'kitchen';
                    $result = ['dictionary/frontend/default', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'kitchen';
                    $result = ['dictionary/frontend/default/robots', []];
                }
            } elseif ($dict = Type::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'type';
                    $result = ['dictionary/frontend/default', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'type';
                    $result = ['dictionary/frontend/default/robots', []];
                }
            } elseif ($dict = Position::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'position';
                    $result = ['dictionary/frontend/default', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'position';
                    $result = ['dictionary/frontend/default/robots', []];
                }
            } elseif ($dict = TypeFacility::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'type_facility';
                    $result = ['dictionary/frontend/default', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'type_facility';
                    $result = ['dictionary/frontend/default/robots', []];
                }
            } elseif ($dict = Features::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'features';
                    $result = ['dictionary/frontend/default', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['dictionary'] = $dict;
                    $this->_params['model_type'] = 'features';
                    $result = ['dictionary/frontend/default/robots', []];
                }
            } elseif ($top = Collection::findOne(['domain' => $name, 'publish' => 1])) {
                if ($request->url === '/' || $request->url === '/all') {
                    $this->_params['collection'] = $top;
                    $this->_params['model_type'] = 'collection';
                    $result = ['tops/frontend/top/index', []];
                } elseif ($request->url === '/robots.txt') {
                    $this->_params['collection'] = $top;
                    $this->_params['model_type'] = 'collection';
                    $result = ['tops/frontend/top/robots', []];
                }
            } elseif (($route = $this->parseStruct($request))) {
                $section = $this->_params['section'];
    
                if (strpos($name, $section->city->name) === false) {
                    $qr = !empty($request->queryString) ? "?" . $request->queryString : "";
                    $url = sprintf("http://%s.%s%s", $section->city->name, \Yii::$app->params['domain'], $section->url, $qr);
    //                \Yii::$app->response->redirect($url, 301);
                    header("Location: {$url}");
                    // TODO убрать если что-то сломается
                    die();
                }
                $result = $route;
            }
    
            return $result;
        }
    
        /**
         * @return array
         */
        public function getParams()
        {
            return $this->_params;
        }
    
        /**
         * @param \yii\web\Request $request
         * @param Restaurants $rest
         * @return mixed
         */
        private function parseStruct($request, $rest = null)
        {
            $pathInfo = trim($request->pathInfo, '/');
    
            $query = Section::find();
    
            if ($pathInfo === '') {
                $query->where(['publish' => 1, 'depth' => 0]);
            } elseif ($pathInfo === 'robots.txt') {
                $request->pathInfo = 'robots';
            } else {
                $segments[] = '/' . $pathInfo . '/';
                while (($pos = strrpos($pathInfo, '/')) !== false) {
                    $pathInfo = substr($pathInfo, 0, $pos);
                    $segments[] = '/' . $pathInfo . '/';
                }
    
                $query->where(['publish' => 1, 'url' => $segments])
                    ->orderBy(['lft' => SORT_DESC, 'depth' => SORT_DESC]);
            }
    
            if (isset($rest)) {
                $query->andWhere(['rest_id' => $rest->id]);
            }
    
            $section = \Yii::$app->db->cache(function ($db) use ($query) {
                return $query->one();
            }, 3600);
    
            if (isset($section)) {
                $this->_params['section'] = $section;
                $this->_params['city'] = isset($rest->city_id) ? $rest->city_id : 'krasnodar';
    
                $route = trim(str_replace($section->url, '/', '/' . $request->pathInfo . '/'), '/');
    
                if ($route === '') {
                    $request->pathInfo = $section->route;
                    $route = $section->route;
                } else {
                    $route = substr($section->route, 0, strrpos($section->route, '/') + 1) . $route;
                    $request->pathInfo = $route;
                }
    
                $this->_params['route'] = $route;
    
                $this->enableStrictParsing = false;
                if (false !== $r = parent::parseRequest($request)) {
                    $this->enableStrictParsing = true;
    
                    return $r;
                }
            }
    
            return $request->pathInfo;
        }
    }

    Далее в контроллере парочка функций:
    /**
         * @return null|Robots
         */
        protected function getRobots()
        {
            $url = $_SERVER['HTTP_HOST'];
            $restName = strtok($url, '.');
            $rest = Restaurants::findOne(['name' => $restName]);
            $robots = Robots::findOne(['rest_id' => $rest->id]);
    
            return $robots;
        }
    
        /**
         * @return string
         */
        public function actionRobots()
        {
            $response = \Yii::$app->response;
            $response->format = Response::FORMAT_RAW;
            $response->getHeaders()->set('Content-Type', 'text/plain; charset=utf-8');
    
            if ($this->getRobots()) {
                return $this->renderPartial('robots', ['content' => $this->getRobots()->content]);
            }
    
            $content = <<<TEXT
    User-agent: *
    Allow: *
    Host: {$_SERVER['HTTP_HOST']}
    TEXT;
    
            return $this->renderPartial('robots', ['content' => $content]);
        }


    Ну и вьюха для вывода. В админке у соответствующих записей есть раздел для редактирования всей этой кухни с самой обычной textarea, все это пишется в БД
  • Можно ли уже использовать PHP7 для 1С Битрикс?

    @kucheriavij
    Senseich, ничего они не будут менять. Пора забыть про это изделие. Каждое их обновление в первую очередь нацелено на сохранение обратной совместимости, именно по этой причине они уже лет 5 не могут внедрить свое ультракрутое ядро d7. А сохраняют они обратную совместимость, потому что не хотят профукать маркетплейс, так как доход у них с него, а не с продажи дистрибутивов
  • Какие есть нормальные оффлайн альтернативы Photoshop или Avocode под Linux для вёрстки?

    @kucheriavij
    wbrapist, меня с моими 100 Мб напрягало, а не с маленькими макетами работаю. Вот и получается что фотошоп держит меня на винде. На работе перешли на affinity, замечательный редактор, но он к сожалению по никсами не запускается, так как использует виндовое aero. В общем печаль, и путь только один, держать виртуалку с необходимым софтом
  • Какие есть нормальные оффлайн альтернативы Photoshop или Avocode под Linux для вёрстки?

    @kucheriavij
    Не понравился авокод именно потом что он сначало льет макет в свое облако, которое отнюдь не быстрое
  • Использовать compact для передачи моделей в вид это хороший прием или наоборот?

    @kucheriavij
    Decadal: нормально все подхватывается, только что проверил. Правда у меня шторм последний, и переменные во вьюхе объявлены. А без объявления во вьюхе он и с массивом ругался.
    spoiler
    6427e406734f487db8d0201a00dde65d.png
  • Использовать compact для передачи моделей в вид это хороший прием или наоборот?

    @kucheriavij
    Все подхватывает, laravel активно использует compact. В yii так завелось что передают данные через массив во вьюху. Но это не значит что нельзя ипользовать compact
  • Как решить загадку с mbstring.func_overload?

    @kucheriavij
    Андрей Еськов: не то что-бы нельзя, просто начиная с 5.3 версии это просто не работает
  • Почему некорректно отображается GridView (Yii2)?

    @kucheriavij
    А почему-бы не посчитать это в модели, а потом вывести в GridView?
  • Написать личный кабинет на битрикс?

    @kucheriavij
    Илья: причем тут это? я достаточно долго работал с битриксом, потом перешел на yii, и с последним больше нравится работать чем с битриксом. Я написал вариант решения, модуль "киоск" вполне покроет большую часть вопросов автора, можно также как и вы написали, и реализовать самому, но зачем когда есть готовое решение, которое стоит совсем не дорого
  • Написать личный кабинет на битрикс?

    @kucheriavij
    Илья: достаточно пробовал для того, что-бы перестать работать с битриксом совсем. Самое оптимальное решение для данного вопроса это использовать коробочные варианты и докупить модуль "киоск". Форум кстати у битрикса вполне годный, можно даже стили править спокойно в нем, правда в них вакханалия полная творится.
  • Написать личный кабинет на битрикс?

    @kucheriavij
    начиная с редакции стандарт у битрикса есть модуль форума. Да и все вышеописанные модули у битрикса есть из коробки
  • Почему Не работает ResizeImageGet в template.php?

    @kucheriavij
    IgorRastarov: ну и как вариант, еще попробуйте не массив изображения послать, а его айдишник
  • Почему Не работает ResizeImageGet в template.php?

    @kucheriavij
    Попробуйте тогда неймспейс указать \CFile::ResizeImageGet, битрикс последнее время куралесит сильно
  • Как в sphinx искать в сзязанных таблицах?

    @kucheriavij Автор вопроса
    Воспользовался вашим способом, вроде заработало. Спасибо.
  • Как в sphinx искать в сзязанных таблицах?

    @kucheriavij Автор вопроса
    Мне бы пример. А то с форматом подачи документации сфинкса я мозг быстрее сломаю
  • Как в sphinx искать в сзязанных таблицах?

    @kucheriavij Автор вопроса
    Сделал, не могу могу понять как в этом селекте в запросе передавать строку из поиска на таблицы которые джойнятся
    Делаю так
    sql_query = SELECT \
            `r`.`id`, `r`.`title`, `r`.`name`, `r`.`address`, `r`.`phone`, `r`.`publish`,\
                `r`.`schedule`, `r`.`sites`, `r`.`prior_single`, `r`.`prior_map`, `r`.`prior_biz`, `r`.`prior_banket`\
            FROM `gg__restaurants` as `r` LEFT JOIN `gg__restaurants_kitchens` as `rk` ON `rk`.`rest_id`=`r`.`id` LEFT JOIN `gg__dictionary_kitchen` as `dk` ON `dk`.`id`=`rk`.`kitchen_id` WHERE ((`r`.`publish`=1))
  • Как в sphinx искать в сзязанных таблицах?

    @kucheriavij Автор вопроса
    то есть мне достаточно сджойнить необходимые мне таблицы в один запрос и должно сработать?
  • Какой лучший способ установить adobe photoshop на линукс?

    @kucheriavij
    Sergey Goryachev: у меня на работе дизайн в новом шопе делается. Конечно от дизайнера зависит, и от стиля его работы, но много вещей от них прилетает, которые даже в более старшей версии cc не работают. Хотя на самом деле, у нас на работе, сейчас вообще остро стоит вопрос о переходе на другое ПО (affinity), так как фотошоп начинает сдавать позиции, не реально тупить, зачем-то практически все пытается прогнать через свое облако, начиная от палитры цветов и заканчивая линками, и это только малая часть айсберга
  • Какой лучший способ установить adobe photoshop на линукс?

    @kucheriavij
    Sergey Goryachev: и как же по jpg мне надо будет вычислять градиент например? или эту самую многослойную тень? А если дизайнер не смыслет в верстке, и просто отдал мне экспортированные слои? Это не всегда удобно, и выглядит примерно так-же, как если-бы я просил дизайнера нарезать мне спрайты из иконок
  • Какой лучший способ установить adobe photoshop на линукс?

    @kucheriavij
    Ошибаетесь что хватит старого шопа. В последнем куча всего, начиная от арт-бордов, и заканчивая всякой ерундой типа многослойных теней, которые в старых версиях попросту не откроются, и будет боль, когда что-то не доверстается. Именно фотошоп меня и удерживает от установки линукса, как бы мне этого не хотелось