Задать вопрос
  • Что делать с измененными пакетом в папке vendor?

    Denormalization
    @Denormalization
    Трогать vendor папку? Зачем?

    Если так хочеться что-то поменять, то можно форкнуть проект, и менять у себя.
    С обновлениями будет геморой, так что нужно либо сделать pull-request чтобы приняли ваши изменения, либо вручную мерджишь свою репу и из нее уже обновляться.
    Ответ написан
    1 комментарий
  • Где можно по шагам разобрать пример разработки сайта на yii 2.0?

    Driver86
    @Driver86
    Немодератор toster.ru
    Например, в блоге ElisDn можно найти немало полезной инфы
    Ответ написан
    Комментировать
  • Как решить 500 ошибку после деплоя с помощью capistrano?

    Freika
    @Freika
    Senior Ruby on Rails developer
    Вам нужно посмотреть логи, из них все должно быть понятно.
    Ответ написан
    Комментировать
  • Как решить 500 ошибку после деплоя с помощью capistrano?

    viktorvsk
    @viktorvsk
    Думаю, почти все решали проблемы с ошибкой 500. Только вот ошибок таких может быть миллион.
    Читайте логи.
    Ответ написан
    2 комментария
  • По какой причине перестало заходить в админку?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Часто, если без видимых причин перестает работать авторизация, это означает, что на диске закончилось место и сессия не может записаться.
    Ответ написан
    2 комментария
  • Как сделать навигацию в тексте по сноскам?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Вам нужны якоря.
    <a href="#anchorName">Переход</a>
    <a name="anchorName"></a> <!-- точка куда будет осуществлен переход -->


    Вот так в общем:
    <div class="content">
      Загаловок <sup><a href="#a1">[1]</a></sup>
      Загаловок <sup><a href="#a2">[2]</a></sup>
      Загаловок <sup><a href="#a3">[3]</a></sup>
        <div class="note_box">
          <sup><a name="a1"></a><strong>[1]</storng></sup> Загаловок - это....
          <sup><a name="a2"></a><strong>[2]</storng></sup> Загаловок - это....
          <sup><a name="a3"></a><strong>[3]</storng></sup> Загаловок - это....
        </div>
    </div>
    Ответ написан
    4 комментария
  • Как динамически менять путь в img?

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    1. Плохое решение — не нужно загружать ненужные изображения.

    2. Тоже не ахти. Генерацией путей, в общем случае, не следует управлять на фронтенде. И, опять же, будете грузить все изображения слайдера. Представляйте для таких ситуаций слайдер с сотней изображений.

    3. Верное решение. Причём, если речь идёт о слайдере, то все пути записаны в data-атрибуты. Для появления нужного изображения берём путь из нужного data-атрибута. Таким образом будет грузиться только нужное изображение. Можно делать упреждающую загрузку (скажем, на 3 изображения в обе стороны).
    Ответ написан
    3 комментария
  • Почему возникает Bad Request (#400) на форме в yii 2.0?

    @mrlipuzhin
    <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
    Ответ написан
    1 комментарий
  • Как реализовать подобною анимацию?

    kn1ght_t
    @kn1ght_t
    например, так
    Ответ написан
    Комментировать
  • Яндекс-метрика для админки CMS или что-то подобное?

    Встройте в адмику собственный JS-код который собирает статистику и вам на сервер отправляет

    UP. Поверьте моему опыту проще и дешевле сделать так, выделить день и 2 специалистов. Приехать в офис к клиентам или пригласить кого-то в офис себе. Посадить за комп, дать несколько заданий по мере увеличения сложности: изменить заголовок, обновить статью, добавить картинку, добавить раздел, отредактировать код шаблона. И смотрите куда люди тыкаются, сколько времени у них уходит, какие сложности возникают. В конце дня у вас будет необходимая информация при том что вы точно будете знать кто сидел за компом - женщина, мужчина, какого возраста и квалификации.
    Ответ написан
    3 комментария
  • Плавное появление background?

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    Использовать CSStransition.
    Ответ написан
    Комментировать
  • Как организовать загрузку файлов в форме?

    vakorovin
    @vakorovin
    Разработчик
    Здравствуйте! Не раскрыли вы полностью ваш вопрос, но постараюсь ответить, исходя из наших проектов на yii2.
    Если используется механизм, при котором файлы можно прикреплять на этапе создания некой модели (скажем Portfolio), и загружаются они сервер посредством ajax-запроса (к примеру https://github.com/hayageek/jquery-upload-file), то возникает ситуация, что привязываться то еще не к чему (объект класса Portfolio еще не сохранен), а файлы уже на сервере. На этот случай используем поле hash, значение которого уникально, и именно по нему привязываются файлы. Т.е. при создании нового объекта Portfolio сразу генерируем уникальный hash, передаем его в форму создания, и с ним грузим аяксом файлы. При желании можно повесить cron-задачу для удаления из файловой системы файлов, которые привязаны к несуществующему Portfolio.hash.

    Далее, сама модель. Берем официальную документацию:

    https://github.com/yiisoft/yii2/blob/master/docs/g...

    Расширяем как нам угодно, например так:

    class File extends \yii\db\ActiveRecord
    {
        public $file;
    
        public function rules()
        {
            return [
                [['file'], 'file'],
                [['filename', 'parent_id'], 'required'],
                [['parent_id'], 'integer'],
                [['filename', 'path'], 'string', 'max' => 255],
                [['description'], 'string']
            ];
        }


    Далее, в контроллере как себя вести, описано как раз по ссылке выше, но в нашем случае суть такова - для каждой новой модели (об этом чуть позже) получаем сам файл:

    $model = new File();
            $model->file = UploadedFile::getInstance($model, 'file');


    и назначаем все остальные параметры, будь то parent_id или что-то еще (включая генерацию нового имени для хранения в файловой системе). Далее, если модель проходит валидацию - сохраняем ее в БД и сохраняем файл в файловой системе:

    if ($model->file && $model->validate()) {                
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }


    Одно уточнение. Если загружать файлы по одному, и только в форме показывать несколько полей, то это решается средствами js, повесить кнопку для создания очередных fileInput с именем File[][file] и textInput File[][description] - проблем не составит. А вот если требуется закинуть их сразу пачкой, то выходов 2 - либо как в указанном по ссылке примере - в одной модели разрешить мультизагрузку, и уже из нее (после валидации) создавать нужные вам модели, либо (что мне кажется логичнее) играться с методом formName(), который будет возвращать нужное имя аттрибута из формы.

    Т.е. в базовом случае поля формы имею имена File[file], File[description], File[id]. В нашем же случае получаются такие имена:

    File[0][file], File[0][description], File[0][id];
    File[1][file], File[1][description], File[1][id];
    File[2][file], File[2][description], File[2][id];


    Теперь в контроллере в цикле проходим

    foreach (Yii::$app->request->post('File') as $sn => $file){
            $model = new File;
            $model->fakeFormName = "File[{$sn}]";
            $model->file = UploadedFile::getInstance($model, 'file');
        }


    В примере выше мы заранее создали свойство $fakeFormName, в которое поместим требуемое для каждого случая базовое имя полей формы и вернем его значение в методе formName(), в таком случае UploadedFile::getInstance($model, 'file') сработает как надо.

    Уф, не знаю, насколько доходчиво разъяснил, что-то может потерял в потоке сознания, но думаю основную суть и опорные точки разъяснил. Если что-то непонятно, отпишитесь, я распишу подробнее (проектов на Yii2 много, все включают работу с файлами в той или иной степени, есть разные реализации, в том числе прямо сейчас пишем файловый менеджер для нашей админки на yii2).
    Ответ написан
    Комментировать
  • В чем ошибка при составлении классов?

    restyler
    @restyler
    Если обсуждать "архитектурно правильные" способы разрешения такой ситуации в ООП и в Yii2 в частности - могу сказать, что ваш случай подпадает под кейс single table inheritance - вот отличный пример из мануала как его готовить.

    В результате при итерации по массиву News::find()->all() у вас там будут экземпляры не News, а NewsAdmin и NewsUser. Является ли вышеупомянутый паттерн оверинжинирингом в вашей ситуации? Решать только вам :) возможно, проще действительно не париться и захардкодить все в базовом классе.
    Ответ написан
    Комментировать
  • Как сделать ЧПУ пагинацию на Yii2?

    mulat
    @mulat
    seo, php, yii2
    Как раз только что с этим разобрался. Приведу пример кода из своего проекта.
    Вариант для yii\widgets\ListView
    Контроллер:
    $dataProvider = new ActiveDataProvider([
                'query' => Post::find()->andWhere(['category_id' => $model->id]),
                'pagination' => [
                    // Размер выводимых элементов на страницу. 
                    // Беру из настроек своего модуля blog
                    'pageSize' => Yii::$app->getModule('blog')->postPerPage,
                    // Размер эл-тов на страницу по умолчанию. Зачем нужен - поясню после кода
                    'defaultPageSize' => Yii::$app->getModule('blog')->postPerPage,
                    // Имя параметра, содержащего номер текущей страницы. 
                    // (если Ваш отличается от дефолтного 'page')
                    'pageParam' => 'pageNum',
                    // Так подавляется ссылка на первую страницу вида /category-name-х/1/
                    // Вместо неё выведется  /category-name-х/
                    'forcePageParam' => false,
                ]
            ]);


    Значение 'defaultPageSize' нужно установить равным значению 'pageSize' для того, чтобы подавить добавление классом Pagination параметра 'per-page' в урлы постранички. Но это нужно для того случая, когда не устраивает значение родного 'pageSize'. По-моему равно 20-ти.


    Так же требуется url первой страницы менять с такого mysite.ru/controllerName?page=1&per-page=2 на такой mysite.ru/controllerName

    Этот момент решается установкой параметра 'forcePageParam' в значение false.

    Для того, чтобы подхватывался route из Вашего urlManager, нужно чтобы описанный в менеджере pattern содержал правильные имена параметров. Т.е. в настройках класса Pagination - значение 'pageParam' по умолчанию задано как 'page'. Значит pattern для урлов должен быть такого плана:
    //...
    // Category with pager
     [
        'pattern' => '<alias:[\w\-]+>/<page:\d+>',
        'route' => 'blog/category/index',
        'suffix' => '/'
      ],
    //...


    В моём случае pattern для урлов такой:
    'pattern' => '<alias:[\w\-]+>/<pageNum:\d+>'

    P.S.
    В итоге мне самому этот вариант не подошёл, т.к. я хотел в постраничке оставить только ссылки на сами страницы без ссылок Следющий и Предыдщий пост. Не нашёл как сделать под ListView. А в LinkPager без проблем.
    Вариант для yii\widgets\LinkPager
    Контроллер:
    $query = Post::find()->andWhere(['category_id' => $model->id]);
            $countQuery = clone $query;
            $pages = new Pagination([
                'totalCount' => $countQuery->count(),
                'pageSize' => Yii::$app->getModule('blog')->postPerPage,
                'defaultPageSize' => Yii::$app->getModule('blog')->postPerPage,
                'pageParam' => 'pageNum',
                'forcePageParam' => false,
            ]);
            $postModels = $query->offset($pages->offset)->limit($pages->limit)->all();
    
            return $this->render('index', [
                'postModels' => $postModels,
                'pages' => $pages,
            ]);


    Представление:
    echo LinkPager::widget([
                'pagination' => $pages,
                // Отключаю ссылку "Следующий"
                'nextPageLabel' => false,
                // Отключаю ссылку "Предыдущий"
                'prevPageLabel' => false,
            ]);


    Вроде на оба вопроса ответил.

    P.S.

    Использую доработанный LinkPager. В частности ради настройки `activeLinkable` (не ссылаться на активную страницу), отображения номера конечной страницы и вывода островной нумерации:
    1,2,3,4 ... 44 [45] 46 ... 999
    Ответ написан
    1 комментарий
  • Как скопировать сайт на Drupal с FTP на локальный сервер?

    @mr_ko
    Javascript, Node.js. React.js, Vue.js, Wordpress
    Перед бекапом базы данных переведите сайт в Режим обслуживания, очистите весь кеш и тогда делайте бекап базы.
    Ответ написан
    7 комментариев
  • Как задавать namespace динамически?

    nazarpc
    @nazarpc
    Open Source enthusiast
    Кроме неймспейса что ещё отличается? Выносите отличия в настройки, наследуете, задаете другие настройки.
    А так, вам инструменты рефакторинга нужны, либо банальный поиск/замена, возьмите PhpStorm - он с этим хорошо справляется.
    Ответ написан
    Комментировать
  • Как задавать namespace динамически?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    А в чем проблема добавить еще один модуль с другим названием в конфигурации приложения?

    Просто динамический нейспейс - это признак явных архитектурных проблем.
    Ответ написан
    Комментировать
  • Реализация xml-парсинга со вставкой в базу данных на Yii 2?

    IvanCher
    @IvanCher
    Мысли шире
    Загружаете хмл, как обычный файл на сервер, получаете его содержание, берете нужные данные из хмл с помощью SimpleXML, расталкиваете их куда хотите по какой хотите логике.
    Ответ написан
    Комментировать