среда, 9 апреля 2014 г.

Организация мультиязычности в приложении на Yii, часть 1


Мне очень нравится максимально автоматизировать код.
Иногда даже пара строк кода в нужном месте могут существенно сократить время разработки или облегчить его дальнейшую поддержку.

Я много пишу на Yii framework. В нем реализована очень удобная, на мой взгляд, система мультиязычности. Кто не использовал, настоятельно рекомендую ознакомиться и внедрять в свой проект на самом начальном этапе разработки. Сложно предсказать скорость развития проекта и время его выхода на международную аудиторию :)

Итак, по умолчанию сообщения проекта хранятся в директории messages/{ID языка}.
В своей практике я разбиваю папку языка messages/ru на поддиректории: controllers, models, widgets. Затем в них уже собираю файлы с сообщением. Имя файла соответствует имени контроллера/модели/виджета. Файл с общими фразами для всего приложения, по умолчанию app.php, оставляем в папке языка.

Ок, удобно, скажете вы, но ведь теперь нужно вместо
Yii::t("app", "Hello, world")

набирать еще более длинное выражение:
Yii::t("controllers/controller", "Hello, world")
Да, отвечу я вам, но пусть за нас это сделает машина.
Открываем файл app.php и меняем его содержимое с:
return [
     "message 1" => "сообщение 1",
     "message 2" => "сообщение 2",
     ...
     "message N" => "сообщение Н",
]
на следующее:
$controllerMessages = dirname(__FILE__).'/controllers/'.Yii::app()->controller->id.'.php';
return return CMap::mergeArray(
     [
          "message 1" => "сообщение 1",
          "message 2" => "сообщение 2",
          ...
          "message N" => "сообщение Н",
     ],
     (is_file($controllerMessages) ? require_once($controllerMessages) : [])
)
Теперь при вызове Yii::t('app', 'Hello world'), словарь сообщений для текущего контроллера подключится автоматически.

Как быть дальше с моделями и виджетами, я расскажу во второй части статьи.


вторник, 8 апреля 2014 г.

Изменение HTML-формы при отправлении.


Недавно столкнулся с одной задачкой.

В HTML-форме интернет магазина необходимо было сделать две submit кнопки.

По логике, одна из них просто сохраняет изменения, а вторая размещает товар. Разница между этими состояниями товара, в базе данных, заключается лишь в значении поля status.

Совсем забыв про основы и потеряв тележку времени, выбирая среди костыля с перехватом массива $_POST или написанием дополнительных методов класса контроллера, наткнулся на следующее решение:


Как выяснилось, кнопке с типом submit можно также присваивать атрибуты name и value. При отправлении, их значения заменят одноименные значения, объявленные в форме выше.

Вот так вот =)