Shorthand notation for Yii commands in Git Bash and Windows Terminal

Developing PHP applications in Yii 2 makes you use Yii command-line commands quite often (for example for migrations). Since I am a Windows maniac that uses XAMPP, I have to type:

php yii

before each command each and every time.

A bit tiring so I wanted to make this a little bit easy. For example, to be able to type:

y migrate

instead of:

php yii migrate

Getting there was quite easy for Windows scripts and using Windows Terminal. Things has got a little bit complicated when trying to achieve the same in PhpStorm. Which uses GitBash instead of Windows Terminal.

Read More “Shorthand notation for Yii commands in Git Bash and Windows Terminal”

Customize delete confirmation in GridView

As nearly everything in Yii 2, you are starting from scratch with out-of-the-box solution for displaying models in grids (using yii\grid\GridView). Usually last among columns ($columns) of such grid there is an button column (yii\grid\ActionColumn) that serves basic operations for corresponding row or item. One of such column’s buttons there’s a delete button.

Everything is ready for you, to be used without much effort, but only as long as you are building an English-only application, as translating or customizing delete confirmation in such scenario isn’t a super-easy task. One of a great approaches is given in here: How to create a custom delete button?.

But, it works just great, if you want to customize just a single delete button of a one or maybe two grid view. What about, if you have a grid view for each and every of your data model?

Read More “Customize delete confirmation in GridView”

One of two model’s attributes must be provided

Suppose that we have any Yii 2 model with to and from attributes. And we want to make sure that either of them is provided. So we need a logical OR relation between these two attributes.

A slightly modified Stack Overflow example will do the trick:

['from', 'required', 'when' => function($model) {
    return !is_numeric($model->to);
}, 'message' => Yii::t('models', 'Either "to" or "from" must be provided.')],

Using a closure (an anonymous function) is all the “magic” here. We use it as a value $when of property of yii\validators\Validator (actually yii\validators\RequiredValidator in this case).

To basically tell Yii 2 that it must validate whether from does not have null or empty value if, and only if to does not have null or empty value as well.

Adding new application to Yii 2 Advanced Project Template

After writing the previous article I have realized that I solved the problem quite wrong. I added the example RESTful app controller to the frontend application in the multi-application Yii 2 Advanced Project Template environment.

I have also realized that the corresponding Yii 2 Guide is very, very poor and limited. It only tells you that you can have many applications (like backend, fronted and console) in the multi-application Yii 2 Advanced Project Template environment. But it leaves you completely guessing on how to actually add new application.

This quick article is my memo to remember steps that must be undertaken in order to achieve this.

Read More “Adding new application to Yii 2 Advanced Project Template”

The quickest way to add RestAPI to your Yii 2 app. Part 1

The example given in Yii 2 Guide is of a low quality, because it It requires User model based on database, not a file. And the guide mixes two things together:

  • Yii 2 Basic Template, which is used in this example, has User model, but based on itself (on a file — list of users is given as an array)
  • Yii 2 Advanced Template has User model based on database, but it uses a multi-application concept in the same time and adding REST support, like shown in this example, isn’t possible.

As an effect, people who just starts their journey with Yii 2 and REST are often confused and finds official example not working in their side.

This article deals with this problem and show how to enable REST in Yii 2 Basic Project Template by using some model (database-based) other than User model.

Read More “The quickest way to add RestAPI to your Yii 2 app. Part 1”

Configure virtual hosts for separated apps in Advanced Project Template

When developing web applications in PHP based on Yii 2’s Advanced Project Template you have a clear separation between two applications:

  • Backend — for service’s admins
  • Frontend — for regular users

There’s also a separate console application but it isn’t important from web applications perspective as it is not accessed remotely via URL, but rather locally in console.

In local development environment you can separate access to these two applications using various methods:

  • Two separate domains — i.e. frontend.localhost and backend.localhost
  • Two subdomains — i.e. app.localhost and admin.app.localhost
  • Separate port — i.e. app.localhost and app.localhost:8080

This article deals with all three scenarios, but using XAMPP/Apache for Windows only. You must adjust provided examples, if you’re running Apache on different operating system.

Read More “Configure virtual hosts for separated apps in Advanced Project Template”

Create a non-standard primary key in Yii 2 migration

If you need a typical primary key then use $this->primaryKey() in your migration file. You can also use something like $this->primaryKey(2), if you need a bigger (here int(2)) primary key.

But, what when you need a non-standard primary key, i.e. you want to turn following example SQL code:

CREATE TABLE `country` (
  `code` CHAR(2) NOT NULL PRIMARY KEY,
  `name` CHAR(52) NOT NULL,
  `population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

into Yii 2 migration?

Calling:

'code' => $this->primaryKey()->char(2)->notNull()

will fail with error:

Exception: Calling unknown method: yii\db\mysql\ColumnSchemaBuilder::char()

Now, what Qiang?

Read More “Create a non-standard primary key in Yii 2 migration”

Introduction to curl

This is just a barely memo about very, very basics of curl. Since curl fetches URLs and data from some endpoints, it can be used for a variety of reasons. I am using to for a very basic (and quick!) API calls tests.

If you’re on Linux, Unix or any of its clones or if you’re on Mac then you most likely have curl. If you’re on Windows, but you’re using Git for Windows (or some similar tool) then you have curl.

So, let’s jump into that basics. Be warned — you will not find here anything that you wouldn’t already knew.

Read More “Introduction to curl”

Pluralized and non-pluralized rules for the same REST controller

The quickest way of adding REST support to your Yii 2 application is to add REST controller to it and configure REST rules. Just a couple of line and framework will do all the dirty stuff for you “behind the scene”.

If you do this then your REST rules will have pluralize property set to true be default meaning that even though you are using controller’s name in singular (i.e. UserController, PostController etc.) your REST URL rules will have it in plural, i.e. GET /posts/12, DELETE /posts/13 etc.

Since I am a purification and perfection maniac, I wasn’t pretty much satisfied with the idea that:

  • I have plural routes when fetching, deleting or updating single record (when pluralize = true) or
  • I have single GET /post router when fetching all records (when pluralize = false)

In other words, I wanted a solution that will give me:

  • Everything in singular (i.e. GET /post/12, PATCH /post/77)
  • Except listing all the records, where I will have plural (i.e. GET /posts)

The solution turned out to be quite simple…

Read More “Pluralized and non-pluralized rules for the same REST controller”

Relative file paths and migrations in Yii1

Watch out for relative file paths. When using them in any action, files lands in a folder (from that relative path) in root directory folder (where they’re is expected, at least according to me). But, when you use the very same path in a migration, then files will land in a folder in protected folder. I have just found this to my surprise.

To “fix” this, you need to add:

[php]dirname(__FILE__).’/../../’.[/php]

in front of your relative path (which makes it no longer relative, though).

Details on Yii forum.

Multi-column CListView

CListView widget is a great piece of code for quickly rendering lists of items that:

  • are based on your own provided view for each item (and thus let you customize final view in nearly every aspect) and
  • are providing fully functional paginator in the same time.

However, they lack support for rendering items in more than one column. This article shows one of many workarounds to fix this problem.

Read More “Multi-column CListView”

actionParams are not available in ACF’s matchCallback

When using matchCallback in AccessControlFilter in Yii2, an attempt to read $action->controller->actionParams or Yii::$app->controller->actionParams inside this callback fails, because these attributes are empty.

This is by design, because AccessControlFilter is executed at an earlier stage than parameters binding.

If you need to read action parameters inside matchCallback (for example to judge, if user has access to particular action, basing on action’s parameters) then the only way is to read them from Yii::$app->request->get(). More details here or here.

Using Yii2’s DetailView in a little bit more advanced way

The simplest and easiest way of rendering DetailView is to declare model and attributes list. This will renders each listed model’s attribute in a cool-looking, responsive table.

This article contains examples and solutions for going a little bit beyond that and using DetailView in a little bit more advanced way.

Read More “Using Yii2’s DetailView in a little bit more advanced way”

Interactive mode command-line command for Yii1

For one of my projects I needed an interactive console command in Yii 1, i.e. the one that is gathering all information from user in an interactive mode (a serie of questions and answers displayed directly in the console), ignoring command-line arguments at all.

This is an example (or rather a bare foundation, as this actually is doing nothing) of such solution. It has some console text formatting methods (borders, text alignment) plus simple method for gathering user response.

Read More “Interactive mode command-line command for Yii1”

Render checkbox list with initially checked items in Yii2

This guide shows, how to (in Yii2) render checkbox list with correctly selected items (preselected during form render), using both HTML helper classes and active form approach.

This is an extended version of this Stack Overflow question and an answer following it, plus some additional information from me and from other sources.

Read More “Render checkbox list with initially checked items in Yii2”

Chained, AJAX-updated listboxes in Yii2

There’s a great answer at Stack Overflow that shows, how in Yii2 you can implement a form containing listbox and two input fields. Listbox contains data from one model and when user selects any option, remaining two input fields should be populated with relevant values from related model.

I wrote an extended version of this code. It populates two other listboxes instead of just input fields. And it uses a little bit less deprecated code! :>

Read More “Chained, AJAX-updated listboxes in Yii2”

Changing Yii2 application’s configuration at runtime

You can’t use Yii::t() method inside Yii2 application’s configuration, right?

I mean… you can use it (application won’t fail), but you will always get string passed as method’s param in return, instead of actual translation, no matter, what language is currently set in your application.

This makes “How to translate application title (or any other configuration parameter)” a quite good question.

Read More “Changing Yii2 application’s configuration at runtime”

Migration that requires user confirmation to continue

Since there’s a pure Linux underlying PHP, you can use STDIN (actually: php://stdin) and read it with fopen when your PHP script is run in console to stop execution of your script and read a button user pressed.

Since Yii migrations are run in console, you can use this mechanism to ask user whether she or he want to continue with your database migration.

Quite handy in some scenarios (like: destroying entire database), don’t you think?

Read More “Migration that requires user confirmation to continue”

Converting database structure or .sql file into Yii migration

Yii Framework 1.x migration system is very powerful and gives you much more power and control over database update process. But it becomes a horrible nightmare, if you have to deal with .sql files and convert them into Yii migration files manually.

This article should help you in that strike or at least ease your work.

If you have any doubts, why the hell migrations are better than using plan .sql files then this blog post should provide you with at least some reasons.

Read More “Converting database structure or .sql file into Yii migration”