Yii - начало.

"А чем бы еще заняться в отпуске?" - подумал я.

Yii  выбрал за наличие русскоязычной документации. Начал ставить сразу на платном хостинге в поддомен тэр.имхо.бел

Первые проблемы и их решения:

  1. Залил все файлы через фтп. И тут сразу был первый затуп. Влил всё в подпапку basic как это написано в руководстве на оф. сайте, как следствие все пути стали длинными типа тэр.имхо.бел/basic/web/index.php.
  2. Первая попытка открыть страницу тэр.имхо.бел/basic/web/index.php жэсточачэ мне указала на то что надо в конфиг файле задать значение
    'cookieValidationKey'

на какое-нибудь не пустое. Какое конкретно ни кто не пишет поэтому я влупил на клавиатуре кучу рандомных цифро-букв (штук 20 наверное) и меня пустили посмотреть на шаблон. Конфиг файл web.php прячется в подпапке config/. тут всё было относительно интуитивно.

  1. В оф. руководстве для укорачивания урл предлагают поправить файл httpd.conf к которому у меня похоже доступа нет.
  2. Решил сделать урл покороче через всякие там htaccess-ы. После некоторого времени безуспешных копипастов с разных сайтов до меня дошло что все советы даются для людей не делающих лишние (как я) папки - basic. перенес все файлы на папку выше стер нафиг этот басик. Выполнил следующий набор действий и урл стали покороче:
    1.  В корневой папке где сейчас куча папок yii добавили .htaccess с таким текстом
    2. Options +FollowSymLinks
      IndexIgnore */*
      RewriteEngine on
      
      RewriteCond %{REQUEST_URI} !^/(web)
      RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
      RewriteRule ^css/(.*)$ web/css/$1 [L]
      RewriteRule ^js/(.*)$ web/js/$1 [L]
      RewriteRule ^images/(.*)$ web/images/$1 [L]
      RewriteRule (.*) /web/$1
      
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /web/index.php
    3. В подпапке /web/ уже есть файл .htaccess с таким текстом, но если вдруг нет то добавить
    4. RewriteEngine On RewriteBase /
      
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      
      RewriteRule . index.php
    5. config/web.php не знаю зачем но разлочил блок красивых ссылок
      'urlManager' => [
                  'enablePrettyUrl' => true,
                  'showScriptName' => false,
                  'rules' => [
                  ],
              ],
    6. и дописал сразу под  "сякретным" паролем
       'request' => [
                  'cookieValidationKey' => '',
                  'baseUrl'=> '',

продолжение следует ...

9 responses to “Yii - начало.

  1. Категорически отказывался показывать фавикон при прямом прописывании в шаблоне. Пришлось решить вот так:
    < ?php $this->registerLinkTag([
    'rel' => 'shortcut icon',
    'type' => 'image/x-icon',
    'href' => '/web/favicon.ico',
    ]);?>

    в том же шаблоне main.php.
    За то этот подход типо позволяет быстро менять фавиконки для разных вьюшек. Ни разу не надо было, но теперь прямо захотелось

  2. Почти рабочий кусок выпадающего списка для форм:

    < ?= $form->field($model, 'mroid') -> dropDownList(ArrayHelper::map(MRO::find()->all(),"mroid","mroname")); ?>

    Должна уже быть создана модель для таблицы MRO. ArrayHelper::map преобразует выборку всего в массив ключ-значение, задаваемые 2 и 3м аргументами

    дополнительно подключаем:
    use yii\helpers\ArrayHelper;
    use app\models\MRO;

    сам dropDownList можно дополнить необязательной опцией: ..., ['prompt'=>'Выбираем МРО ...']) эта надпись выскочит по умолчанию. Если так не сделать, то будет автопостановка первого значения

    < ?= $form->field($model, 'mroid')->dropDownList(ArrayHelper::map(MRO::find()->all(),"mroid","mroname"),['prompt'=>'Выбираем МРО ...']); ?>

  3. Важно! Встроенный генератор кода избавляет от написания кучи текста, но для полного шоколада до начала запуска gii надо полностью прописать все связи в базе данных, тогда в модели стразу пропишутся методы связей hasOne и hadMany и относительно просто станет доступен метод joinWith для ActiveRecord

  4. всё вокруг регистрозависимое, поэтому делать названия таблиц в базе данных капсом ..... сложно сказать какой гемор из-за этого вылезет.

  5. Частичной русификации некоторых примочек YII можно достичь прописав в конфиге main.php
    $config = [
    'language'=>'ru',
    Это русифицирует некоторые кнопки, и стандартные подсказки.

    "Избавиться" от "My application" в заголовке можно в том же конфиге строчкой

    $config = [
    'name'=>'NOT My application hi hi',

  6. Если сайт создается не в localhost а сразу на нормальном сервере, то для возможности использования встроенного отладчика и gii требуется разрешить доступ к сайту по своему текущему ip в конфиге web.php. Тапм есть закомментированные строчки allowedIPs. Поскольку ip периодически меняется, то ленивые предлагают разрешить доступ по всем ip установив значение в "*". Выглядит как огромная дырка в безопасности.

    $config['modules']['debug'] = [
    'class' => 'yii\debug\Module',
    // uncomment the following to add your IP if you are not connecting from localhost.
    'allowedIPs' => ['127.0.0.1', '37.214.181.120'],
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
    'class' => 'yii\gii\Module',
    // uncomment the following to add your IP if you are not connecting from localhost.
    'allowedIPs' => ['127.0.0.1', '37.214.181.120'],
    ];

  7. Элемент интуитивного программирования. Для формы ввода учета нужен был выпадающий список договоров. Дополнил модель Dogovora:

    public function getNumDate()
    {
    return $this->dogovornum." / ".date('d.m.Y', strtotime ($this->dogovordate))." - ".$this->eso->esoname;
    }

    а в форме учетов сделал такой вызов:

    < ?= $form->field($model, 'dogovorid')->dropDownList(ArrayHelper::map(Dogovora::find()->all(),"dogovorid","numDate" ),['prompt'=>'Выбираем договор ...']) ?>

    !!! Всё сработало. Люблю такие моменты.

  8. Внешний вид - Редактор - functions.php добавил

    if ( function_exists('remove_filter') ) {
    remove_filter('the_content', 'wptexturize');
    remove_filter('the_title', 'wptexturize');
    remove_filter('comment_text', 'wptexturize');
    }

    должно было заменить "умную" замену ковычек WordPress-a. Более того! эта фишка спасла предыдущие испорченные записи. ура!

  9. Порядок добавления нового столбца в GridView (стандартный виджет таблицы из gii) с возможностью сортировки по нему на примере таблицы учетов:
    Цель добавить отображение столбика РЭГИ из связанной таблицы вместо изначально предлагаемого regiid
    1. В модели UchetySearch.php добавляем переменную
    class UchetySearch extends Uchety
    { public $regiName;

    2.1 в функции public function search($params) этой же модели дописываем (расширяем запрос)
    $query = Uchety::find()->joinWith('regi');
    2.2. там же дописываем (добавляем возможность сортировки по новому полю)
    $dataProvider = new ActiveDataProvider([
    'query' => $query,
    ]);
    $dataProvider->sort->attributes['regiName'] = [
    'asc' => [REGI::tableName().'.reginame' => SORT_ASC],
    'desc' => [REGI::tableName().'.reginame' => SORT_DESC],
    ];

    3. в index.php учетов в объявлении колонок виджета GridView добавляем строчку вместо 'regiid'
    ['attribute' => 'regiName','label' => 'РЭГИ', 'value'=>'regi.reginame'],

    и эта шайтан машина начинает отображать нужные данные и сортировать их. Но пока нету фильтрации по новому столбику. Для этого потребуется еще поколдовать с function search($params):
    2.3
    $query->andFilterWhere(['like', 'uchettip', $this->uchettip])
    ->andFilterWhere(['like', 'uchetnum', $this->uchetnum]);

    $query->andFilterWhere(['like', REGI::tableName().'.reginame', $this->regiName]);
    4. и дополнить новое поле в правила всё того же класса UchetySearch
    public function rules()
    {
    return [
    [['uchetid', 'uchettt', 'regiid', 'dogovorid'], 'integer'],
    [['uchettip', 'uchetnum', 'uchetpoverka', 'regiName'], 'safe'],
    [['uchetpoteri'], 'number'],
    ];
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *