Suvi Khan

Controlling PWM fans with the Raspberry Pi CM4 IO Board’s EMC2301

Noctua 120mm PWM fan connected to Raspberry Pi CM4 IO Board

When I initially reviewed the Compute Module 4 IO Board, I briefly mentioned there’s a 4-pin fan connector. It’s connected to the Pi’s I2C bus using a little PWM chip, the EMC2301.

But wait… what’s I2C, what’s PWM, and what’s so special about a 4-pin fan connector? I’m glad you asked—this post will answer that and show you how you can control a fan connected to the IO Board, like the quiet Noctua NF-P12 pictured above with my IO Board.

If you plug a fan like that into the CM4 IO Board, it will start running full blast, 24×7. If you need that much cooling, that’s great, but a lot of times, I don’t mind my Pi’s CPU getting warmer if it means I can run the fan silent most of the time.

So what are my options? First of all, I could just buy an inline PWM controller, like a Noctua NA-FC1. It lets me turn up and down the fan speed with a little dial. But it doesn’t know the temperature of my Pi, so it can’t increase airflow for higher temperatures or turn off the fan when it’s under a certain temperature.

EMC2301 Fan controller on Raspberry Pi CM4 IO Board

The better option is to use the built-in PWM fan controller on the IO Board (pictured above). And to do that, we’re going to need to use the Raspberry Pi’s I2C bus!

What is I2C?

I2C—or more correctly, I2C—stands for “Inter-Integrated Circuit” and is a two-wire serial communication interface used by many electronic devices for control and communications.

I’m not going to cover it in detail here, but if you get into any more advanced electronics projects with Arduino, Raspberry Pi, or other microcontrollers or PCs, you’ll probably encounter it. To learn the basics of the protocol, I recommend Analog Device’s I2C Primer.

Controlling the fan over I2C

You have to edit your /boot/config.txt file to enable the i2c_vc bus, which is bus #1. The Pi Device Tree Documentation actually recommends against touching i2c_vc unless you need to, because you could mess up CSI camera or DSI display functionality.

Make sure the following lines exist and are uncommented in /boot/config.txt and reboot the Pi:

# Enable I2C.
dtparam=i2c_arm=on
# Enable I2C bus 1.
dtparam=i2c_vc=on

Note: If you just enable I2C under the ‘Interfaces’ option of raspi-config, it will only enable i2c_arm. To see the fan controller, you need to enable i2c_vc as well.

Make sure the i2c-tools package is installed on your system; if it is, the following commands should work straightaway. If not, you will need to install the package with sudo apt-get install -y i2c-tools.

Now, check if you can see the fan controller chip on the bus, using i2cdetect -y 10:

$ i2cdetect -y 10
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- 0c -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2f
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

The fan is the 2f device. Test if you can turn off the fan using:

$ i2cset -y 10 0x2f 0x30 0x00

The fan should now be off. And to turn it back on:

$ i2cset -y 10 0x2f 0x30 0xff

To get the value of the fan setting, you can use:

$ i2cget -y 10 0x2f 0x30
0xff

What about setting the fan to a value between 0% (off) and 100% (full on) though? The value is hexadecimal, so 0xFF stands for 255, while 0x00 is 0. Using a high-ish number should be safe, right, to set the fan to a lower speed? Well, let’s try it out.

 

 

Load more 4501
Load more 4502
Load more 4503
Load more 4504
Load more 4505
Load more 4506
Load more 4507
Load more 4508
Load more 4509
Load more 4510
Load more 4511
Load more 4512
Load more 4513
Load more 4514
Load more 4515
Load more 4516
Load more 4517
Load more 4518
Load more 4519
Load more 4520
Load more 4521
Load more 4522
Load more 4523
Load more 4524
Load more 4525
Load more 4526
Load more 4527
Load more 4528
Load more 4529
Load more 4530
Load more 4531
Load more 4532
Load more 4533
Load more 4534
Load more 4535
Load more 4536
Load more 4537
Load more 4538
Load more 4539
Load more 4540
Load more 4541
Load more 4542
Load more 4543
Load more 4544
Load more 4545
Load more 4546
Load more 4547
Load more 4548
Load more 4549
Load more 4550
Load more 4551
Load more 4552
Load more 4553
Load more 4554
Load more 4555
Load more 4556
Load more 4557
Load more 4558
Load more 4559
Load more 4560
Load more 4561
Load more 4562
Load more 4563
Load more 4564
Load more 4565
Load more 4566
Load more 4567
Load more 4568
Load more 4569
Load more 4570
Load more 4571
Load more 4572
Load more 4573
Load more 4574
Load more 4575
Load more 4576
Load more 4577
Load more 4578
Load more 4579
Load more 4580
Load more 4581
Load more 4582
Load more 4583
Load more 4584
Load more 4585
Load more 4586
Load more 4587
Load more 4588
Load more 4589
Load more 4590
Load more 4591
Load more 4592
Load more 4593
Load more 4594
Load more 4595
Load more 4596
Load more 4597
Load more 4598
Load more 4599
Load more 4600
Load more 4601
Load more 4602
Load more 4603
Load more 4604
Load more 4605
Load more 4606
Load more 4607
Load more 4608
Load more 4609
Load more 4610
Load more 4611
Load more 4612
Load more 4613
Load more 4614
Load more 4615
Load more 4616
Load more 4617
Load more 4618
Load more 4619
Load more 4620
Load more 4621
Load more 4622
Load more 4623
Load more 4624
Load more 4625
Load more 4626
Load more 4627
Load more 4628
Load more 4629
Load more 4630
Load more 4631
Load more 4632
Load more 4633
Load more 4634
Load more 4635
Load more 4636
Load more 4637
Load more 4638
Load more 4639
Load more 4640
Load more 4641
Load more 4642
Load more 4643
Load more 4644
Load more 4645
Load more 4646
Load more 4647
Load more 4648
Load more 4649
Load more 4650
Load more 4651
Load more 4652
Load more 4653
Load more 4654
Load more 4655
Load more 4656
Load more 4657
Load more 4658
Load more 4659
Load more 4660
Load more 4661
Load more 4662
Load more 4663
Load more 4664
Load more 4665
Load more 4666
Load more 4667
Load more 4668
Load more 4669
Load more 4670
Load more 4671
Load more 4672
Load more 4673
Load more 4674
Load more 4675
Load more 4676
Load more 4677
Load more 4678
Load more 4679
Load more 4680
Load more 4681
Load more 4682
Load more 4683
Load more 4684
Load more 4685
Load more 4686
Load more 4687
Load more 4688
Load more 4689
Load more 4690
Load more 4691
Load more 4692
Load more 4693
Load more 4694
Load more 4695
Load more 4696
Load more 4697
Load more 4698
Load more 4699
Load more 4700
Load more 4701
Load more 4702
Load more 4703
Load more 4704
Load more 4705
Load more 4706
Load more 4707
Load more 4708
Load more 4709
Load more 4710
Load more 4711
Load more 4712
Load more 4713
Load more 4714
Load more 4715
Load more 4716
Load more 4717
Load more 4718
Load more 4719
Load more 4720
Load more 4721
Load more 4722
Load more 4723
Load more 4724
Load more 4725
Load more 4726
Load more 4727
Load more 4728
Load more 4729
Load more 4730
Load more 4731
Load more 4732
Load more 4733
Load more 4734
Load more 4735
Load more 4736
Load more 4737
Load more 4738
Load more 4739
Load more 4740
Load more 4741
Load more 4742
Load more 4743
Load more 4744
Load more 4745
Load more 4746
Load more 4747
Load more 4748
Load more 4749
Load more 4750
Load more 4751
Load more 4752
Load more 4753
Load more 4754
Load more 4755
Load more 4756
Load more 4757
Load more 4758
Load more 4759
Load more 4760
Load more 4761
Load more 4762
Load more 4763
Load more 4764
Load more 4765
Load more 4766
Load more 4767
Load more 4768
Load more 4769
Load more 4770
Load more 4771
Load more 4772
Load more 4773
Load more 4774
Load more 4775
Load more 4776
Load more 4777
Load more 4778
Load more 4779
Load more 4780
Load more 4781
Load more 4782
Load more 4783
Load more 4784
Load more 4785
Load more 4786
Load more 4787
Load more 4788
Load more 4789
Load more 4790
Load more 4791
Load more 4792
Load more 4793
Load more 4794
Load more 4795
Load more 4796
Load more 4797
Load more 4798
Load more 4799
Load more 4800
Load more 4801
Load more 4802
Load more 4803
Load more 4804
Load more 4805
Load more 4806
Load more 4807
Load more 4808
Load more 4809
Load more 4810
Load more 4811
Load more 4812
Load more 4813
Load more 4814
Load more 4815
Load more 4816
Load more 4817
Load more 4818
Load more 4819
Load more 4820
Load more 4821
Load more 4822
Load more 4823
Load more 4824
Load more 4825
Load more 4826
Load more 4827
Load more 4828
Load more 4829
Load more 4830
Load more 4831
Load more 4832
Load more 4833
Load more 4834
Load more 4835
Load more 4836
Load more 4837
Load more 4838
Load more 4839
Load more 4840
Load more 4841
Load more 4842
Load more 4843
Load more 4844
Load more 4845
Load more 4846
Load more 4847
Load more 4848
Load more 4849
Load more 4850
Load more 4851
Load more 4852
Load more 4853
Load more 4854
Load more 4855
Load more 4856
Load more 4857
Load more 4858
Load more 4859
Load more 4860
Load more 4861
Load more 4862
Load more 4863
Load more 4864
Load more 4865
Load more 4866
Load more 4867
Load more 4868
Load more 4869
Load more 4870

Mini-ITX Seaberry adds 11 PCIe slots to a Raspberry Pi

Since the Compute Module 4 came along last year, there have been a few projects that use it that make me do a double-take: They did what with a Pi?

Alftel Seaberry mini ITX board for the Raspberry Pi Compute Module 4 - top

Alftel’s Seaberry is a carrier board for the CM4 in the Mini ITX form factor that adds on eleven PCI Express slots:

  • 1 x16 slot (with x1 lane) in the standard ITX location
  • 1 x1 slot on board edge
  • 4 mini PCIe slots
  • 4 M.2 E-key slots (with dual PCIe lines so you can run specialty cards like dual-TPU accelerators)
  • 1 M.2 M-key slot for NVMe SSD

The rear of the board also has a decent mix of built-in IO, including a Cisco-style serial console cable you can use with an easy-to-find USB adapter so you can attach to a Raspberry Pi’s Serial Console (UART) for debugging.

I’ve been using the board for a couple weeks, even installing it inside my smallest ITX PC case, a Goodisory MX01. This is the first Pi board I’ve used that fits in a standard PC form factor, marking the first time I’ve been able to build a ‘custom PC’ with a Pi, using standardized components and not requiring extra time strapping together a makeshift or 3D-printed case:

Seaberry installed in mini ITX case

And the Seaberry needs all that room, to jam in all the ports! I tested an Intel i350 dual-gigabit LAN card, a Dual-TPU Coral M.2 Accelerator, a KIOXIA XG6 M.2 NVMe SSD, a Compex WLE200NX 802.11n WiFi card, an Intel AX210 WiFi 6E card, a dual SATA controller, and more—and everything worked (more or less…).

Many cards have built-in drivers in Pi OS—the NVMe drive and the SATA SSD I plugged in worked right away, and required no custom drivers or kernel rebuilds. (For power, the board also includes a four-pin berg header to power SATA drives and other peripherals).

Cards like Intel’s AX210 required the installation of custom firmware and Intel’s driver, but worked great afterwards (giving me over 1 Gbps wireless on my home’s WiFi 6 network!).

Google’s Coral TPU cards still don’t work, unfortunately—the PCI Express implementation on the BCM2711 seems to not handle some of the memory access patterns it needs—but that brings me to another feature of the Seaberry (and many other CM4 boards): it is also supposedly compatible with Radxa’s CM3 and Pine64’s SOQuartz, two ‘pin compatible’ replacements for the CM4.

I have a CM3 and am awaiting shipment of the SOQuartz, so I’ll test them out later this year.

AMD Radeon GPU graphics card on Seaberry Raspberry Pi CM4 carrier

The other type of card I’m keen to get working with ARM64 SBCs is any kind of graphics card—mostly for the fun of it. I’ve struggled mightily to get AMD’s radeon and amdgpu drivers working, and Nvidia’s black box driver also has the same problem with the CM4—random hard lockups and kernel panics.

Anyways, the Seaberry is the perfect platform for my testing—and I even installed Alftel’s 12-card M.2 carrier board in the thing, so I could have 20 PCI Express devices wired into the Pi at once.

Alftel Seaberry with 12-slot PCIe carrier board

Doing so also uncovered one limitation with the CM4 (besides the anemic x1 Gen 2.0 lane): if I plugged in more than three NVMe drives at once, it seemed the nvme driver would have some strange kernel panics either at boot or shutdown. Sometimes it would boot fine with four NVMe drives, but never with five or more.

 

 

Load more 4001
Load more 4002
Load more 4003
Load more 4004
Load more 4005
Load more 4006
Load more 4007
Load more 4008
Load more 4009
Load more 4010
Load more 4011
Load more 4012
Load more 4013
Load more 4014
Load more 4015
Load more 4016
Load more 4017
Load more 4018
Load more 4019
Load more 4020
Load more 4021
Load more 4022
Load more 4023
Load more 4024
Load more 4025
Load more 4026
Load more 4027
Load more 4028
Load more 4029
Load more 4030
Load more 4031
Load more 4032
Load more 4033
Load more 4034
Load more 4035
Load more 4036
Load more 4037
Load more 4038
Load more 4039
Load more 4040
Load more 4041
Load more 4042
Load more 4043
Load more 4044
Load more 4045
Load more 4046
Load more 4047
Load more 4048
Load more 4049
Load more 4050
Load more 4051
Load more 4052
Load more 4053
Load more 4054
Load more 4055
Load more 4056
Load more 4057
Load more 4058
Load more 4059
Load more 4060
Load more 4061
Load more 4062
Load more 4063
Load more 4064
Load more 4065
Load more 4066
Load more 4067
Load more 4068
Load more 4069
Load more 4070
Load more 4071
Load more 4072
Load more 4073
Load more 4074
Load more 4075
Load more 4076
Load more 4077
Load more 4078
Load more 4079
Load more 4080
Load more 4081
Load more 4082
Load more 4083
Load more 4084
Load more 4085
Load more 4086
Load more 4087
Load more 4088
Load more 4089
Load more 4090
Load more 4091
Load more 4092
Load more 4093
Load more 4094
Load more 4095
Load more 4096
Load more 4097
Load more 4098
Load more 4099
Load more 4100
Load more 4101
Load more 4102
Load more 4103
Load more 4104
Load more 4105
Load more 4106
Load more 4107
Load more 4108
Load more 4109
Load more 4110
Load more 4111
Load more 4112
Load more 4113
Load more 4114
Load more 4115
Load more 4116
Load more 4117
Load more 4118
Load more 4119
Load more 4120
Load more 4121
Load more 4122
Load more 4123
Load more 4124
Load more 4125
Load more 4126
Load more 4127
Load more 4128
Load more 4129
Load more 4130
Load more 4131
Load more 4132
Load more 4133
Load more 4134
Load more 4135
Load more 4136
Load more 4137
Load more 4138
Load more 4139
Load more 4140
Load more 4141
Load more 4142
Load more 4143
Load more 4144
Load more 4145
Load more 4146
Load more 4147
Load more 4148
Load more 4149
Load more 4150
Load more 4151
Load more 4152
Load more 4153
Load more 4154
Load more 4155
Load more 4156
Load more 4157
Load more 4158
Load more 4159
Load more 4160
Load more 4161
Load more 4162
Load more 4163
Load more 4164
Load more 4165
Load more 4166
Load more 4167
Load more 4168
Load more 4169
Load more 4170
Load more 4171
Load more 4172
Load more 4173
Load more 4174
Load more 4175
Load more 4176
Load more 4177
Load more 4178
Load more 4179
Load more 4180
Load more 4181
Load more 4182
Load more 4183
Load more 4184
Load more 4185
Load more 4186
Load more 4187
Load more 4188
Load more 4189
Load more 4190
Load more 4191
Load more 4192
Load more 4193
Load more 4194
Load more 4195
Load more 4196
Load more 4197
Load more 4198
Load more 4199
Load more 4200
Load more 4201
Load more 4202
Load more 4203
Load more 4204
Load more 4205
Load more 4206
Load more 4207
Load more 4208
Load more 4209
Load more 4210
Load more 4211
Load more 4212
Load more 4213
Load more 4214
Load more 4215
Load more 4216
Load more 4217
Load more 4218
Load more 4219
Load more 4220
Load more 4221
Load more 4222
Load more 4223
Load more 4224
Load more 4225
Load more 4226
Load more 4227
Load more 4228
Load more 4229
Load more 4230
Load more 4231
Load more 4232
Load more 4233
Load more 4234
Load more 4235
Load more 4236
Load more 4237
Load more 4238
Load more 4239
Load more 4240
Load more 4241
Load more 4242
Load more 4243
Load more 4244
Load more 4245
Load more 4246
Load more 4247
Load more 4248
Load more 4249
Load more 4250
Load more 4251
Load more 4252
Load more 4253
Load more 4254
Load more 4255
Load more 4256
Load more 4257
Load more 4258
Load more 4259
Load more 4260
Load more 4261
Load more 4262
Load more 4263
Load more 4264
Load more 4265
Load more 4266
Load more 4267
Load more 4268
Load more 4269
Load more 4270
Load more 4271
Load more 4272
Load more 4273
Load more 4274
Load more 4275
Load more 4276
Load more 4277
Load more 4278
Load more 4279
Load more 4280
Load more 4281
Load more 4282
Load more 4283
Load more 4284
Load more 4285
Load more 4286
Load more 4287
Load more 4288
Load more 4289
Load more 4290
Load more 4291
Load more 4292
Load more 4293
Load more 4294
Load more 4295
Load more 4296
Load more 4297
Load more 4298
Load more 4299
Load more 4300
Load more 4301
Load more 4302
Load more 4303
Load more 4304
Load more 4305
Load more 4306
Load more 4307
Load more 4308
Load more 4309
Load more 4310
Load more 4311
Load more 4312
Load more 4313
Load more 4314
Load more 4315
Load more 4316
Load more 4317
Load more 4318
Load more 4319
Load more 4320
Load more 4321
Load more 4322
Load more 4323
Load more 4324
Load more 4325
Load more 4326
Load more 4327
Load more 4328
Load more 4329
Load more 4330
Load more 4331
Load more 4332
Load more 4333
Load more 4334
Load more 4335
Load more 4336
Load more 4337
Load more 4338
Load more 4339
Load more 4340
Load more 4341
Load more 4342
Load more 4343
Load more 4344
Load more 4345
Load more 4346
Load more 4347
Load more 4348
Load more 4349
Load more 4350
Load more 4351
Load more 4352
Load more 4353
Load more 4354
Load more 4355
Load more 4356
Load more 4357
Load more 4358
Load more 4359
Load more 4360
Load more 4361
Load more 4362
Load more 4363
Load more 4364
Load more 4365
Load more 4366
Load more 4367
Load more 4368
Load more 4369
Load more 4370
Load more 4371
Load more 4372
Load more 4373
Load more 4374
Load more 4375
Load more 4376
Load more 4377
Load more 4378
Load more 4379
Load more 4380
Load more 4381
Load more 4382
Load more 4383
Load more 4384
Load more 4385
Load more 4386
Load more 4387
Load more 4388
Load more 4389
Load more 4390
Load more 4391
Load more 4392
Load more 4393
Load more 4394
Load more 4395
Load more 4396
Load more 4397
Load more 4398
Load more 4399
Load more 4400
Load more 4401
Load more 4402
Load more 4403
Load more 4404
Load more 4405
Load more 4406
Load more 4407
Load more 4408
Load more 4409
Load more 4410
Load more 4411
Load more 4412
Load more 4413
Load more 4414
Load more 4415
Load more 4416
Load more 4417
Load more 4418
Load more 4419
Load more 4420
Load more 4421
Load more 4422
Load more 4423
Load more 4424
Load more 4425
Load more 4426
Load more 4427
Load more 4428
Load more 4429
Load more 4430
Load more 4431
Load more 4432
Load more 4433
Load more 4434
Load more 4435
Load more 4436
Load more 4437
Load more 4438
Load more 4439
Load more 4440
Load more 4441
Load more 4442
Load more 4443
Load more 4444
Load more 4445
Load more 4446
Load more 4447
Load more 4448
Load more 4449
Load more 4450
Load more 4451
Load more 4452
Load more 4453
Load more 4454
Load more 4455
Load more 4456
Load more 4457
Load more 4458
Load more 4459
Load more 4460
Load more 4461
Load more 4462
Load more 4463
Load more 4464
Load more 4465
Load more 4466
Load more 4467
Load more 4468
Load more 4469
Load more 4470
Load more 4471
Load more 4472
Load more 4473
Load more 4474
Load more 4475
Load more 4476
Load more 4477
Load more 4478
Load more 4479
Load more 4480
Load more 4481
Load more 4482
Load more 4483
Load more 4484
Load more 4485
Load more 4486
Load more 4487
Load more 4488
Load more 4489
Load more 4490
Load more 4491
Load more 4492
Load more 4493
Load more 4494
Load more 4495
Load more 4496
Load more 4497
Load more 4498
Load more 4499
Load more 4500

Turing Pi 2: 4 Raspberry Pi nodes on a mini ITX board

Last year I spent a bit of time building a Kubernetes cluster with the original Turing Pi. It was fun, and interesting, but ultimately the performance of the Compute Module 3+ it was designed around led me to running my homelab off some newer Pi 4 model B computers, which are at least twice as fast for almost everything I run on them.

Turing Pi 2

So this year, I was excited when the folks at Turing Pi sent me a Turing Pi 2 to test drive. And the board arrived just in time for Patrick Kennedy from ServeTheHome to challenge me to a cluster build-off at Supercomputing ’21! Check out his ARM cluster build here.

The Turing Pi 2 is a mini ITX motherboard capable of holding up to four Raspberry Pi Compute Module 4s or NVIDIA Jetson Nanos, and it integrates a board management backplane, power management, and gigabit Ethernet switch, alongside various PCI Express breakouts, so you can build a 4-node SBC cluster.

And it performs—as I hoped—much better than the older version. Not only do the CM4, Jetson Nano, and even pin-compatible replacements like Radxa’s CM3 and Pine64’s SOQuartz all have full gigabit Ethernet, their CPUs are noticeably faster than the CM3+ they replace.

The board I have is a prototype, and as such is still running a very early version of the firmware—RTC PWM fan control aren’t even implemented yet! But the folks at Turing Pi seem set on having all the features ironed out for a January 2022 launch. The board will cost about $200, with CM4 adapter cards (which connect a CM4 to the vertical SO-DIMM slot) adding on $10 each.

PCIe Expansion support

Since each CM4 has one PCI Express Gen 2 lane available, the board exposes each one in a different way.

Turing Pi 2 overhead top down shot

For node 1 (at the top of the board), there’s a mini PCIe slot with a SIM tray underneath—useful for things like 4G or 5G modems. For node 2, there’s another mini PCIe slot (with no SIM tray).

Node 3 is connected to an ASMedia 2-port SATA controller, so you can plug in up to two SATA III drives directly into the Turing Pi 2, and they’ll be controlled by the computer in slot 3.

Node 4 is connected to a VL805 USB 3.0 controller, and that exposes a USB 3 front panel header and two USB 3.0 ports on the rear to the computer in slot 4.

Blinkenlights

Turing Pi 2 Blinkenlights

Besides performance, one thing I didn’t like about the original board was how few status LEDs it had. This new board is much better in that regard, with status LEDs for almost every important feature.

Both of the Ethernet ports on the back have functional link and activity lights. Each slot also has appropriately-colored link and activity lights. Each slot also has a power indicator LED, plus there’s an overall board power LED, and an LED to indicate the MCU is ‘on’ (helpful when deciding to safely shut down the cluster).

And finally, each of the CM4 adapter cards has a green power and activity LED on the back, so you can visually confirm they’re powered on and doing something.

All in all, a good show of blinkenlights if I’ve ever seen one.

 

 

 

Load more 3501
Load more 3502
Load more 3503
Load more 3504
Load more 3505
Load more 3506
Load more 3507
Load more 3508
Load more 3509
Load more 3510
Load more 3511
Load more 3512
Load more 3513
Load more 3514
Load more 3515
Load more 3516
Load more 3517
Load more 3518
Load more 3519
Load more 3520
Load more 3521
Load more 3522
Load more 3523
Load more 3524
Load more 3525
Load more 3526
Load more 3527
Load more 3528
Load more 3529
Load more 3530
Load more 3531
Load more 3532
Load more 3533
Load more 3534
Load more 3535
Load more 3536
Load more 3537
Load more 3538
Load more 3539
Load more 3540
Load more 3541
Load more 3542
Load more 3543
Load more 3544
Load more 3545
Load more 3546
Load more 3547
Load more 3548
Load more 3549
Load more 3550
Load more 3551
Load more 3552
Load more 3553
Load more 3554
Load more 3555
Load more 3556
Load more 3557
Load more 3558
Load more 3559
Load more 3560
Load more 3561
Load more 3562
Load more 3563
Load more 3564
Load more 3565
Load more 3566
Load more 3567
Load more 3568
Load more 3569
Load more 3570
Load more 3571
Load more 3572
Load more 3573
Load more 3574
Load more 3575
Load more 3576
Load more 3577
Load more 3578
Load more 3579
Load more 3580
Load more 3581
Load more 3582
Load more 3583
Load more 3584
Load more 3585
Load more 3586
Load more 3587
Load more 3588
Load more 3589
Load more 3590
Load more 3591
Load more 3592
Load more 3593
Load more 3594
Load more 3595
Load more 3596
Load more 3597
Load more 3598
Load more 3599
Load more 3600
Load more 3601
Load more 3602
Load more 3603
Load more 3604
Load more 3605
Load more 3606
Load more 3607
Load more 3608
Load more 3609
Load more 3610
Load more 3611
Load more 3612
Load more 3613
Load more 3614
Load more 3615
Load more 3616
Load more 3617
Load more 3618
Load more 3619
Load more 3620
Load more 3621
Load more 3622
Load more 3623
Load more 3624
Load more 3625
Load more 3626
Load more 3627
Load more 3628
Load more 3629
Load more 3630
Load more 3631
Load more 3632
Load more 3633
Load more 3634
Load more 3635
Load more 3636
Load more 3637
Load more 3638
Load more 3639
Load more 3640
Load more 3641
Load more 3642
Load more 3643
Load more 3644
Load more 3645
Load more 3646
Load more 3647
Load more 3648
Load more 3649
Load more 3650
Load more 3651
Load more 3652
Load more 3653
Load more 3654
Load more 3655
Load more 3656
Load more 3657
Load more 3658
Load more 3659
Load more 3660
Load more 3661
Load more 3662
Load more 3663
Load more 3664
Load more 3665
Load more 3666
Load more 3667
Load more 3668
Load more 3669
Load more 3670
Load more 3671
Load more 3672
Load more 3673
Load more 3674
Load more 3675
Load more 3676
Load more 3677
Load more 3678
Load more 3679
Load more 3680
Load more 3681
Load more 3682
Load more 3683
Load more 3684
Load more 3685
Load more 3686
Load more 3687
Load more 3688
Load more 3689
Load more 3690
Load more 3691
Load more 3692
Load more 3693
Load more 3694
Load more 3695
Load more 3696
Load more 3697
Load more 3698
Load more 3699
Load more 3700
Load more 3701
Load more 3702
Load more 3703
Load more 3704
Load more 3705
Load more 3706
Load more 3707
Load more 3708
Load more 3709
Load more 3710
Load more 3711
Load more 3712
Load more 3713
Load more 3714
Load more 3715
Load more 3716
Load more 3717
Load more 3718
Load more 3719
Load more 3720
Load more 3721
Load more 3722
Load more 3723
Load more 3724
Load more 3725
Load more 3726
Load more 3727
Load more 3728
Load more 3729
Load more 3730
Load more 3731
Load more 3732
Load more 3733
Load more 3734
Load more 3735
Load more 3736
Load more 3737
Load more 3738
Load more 3739
Load more 3740
Load more 3741
Load more 3742
Load more 3743
Load more 3744
Load more 3745
Load more 3746
Load more 3747
Load more 3748
Load more 3749
Load more 3750
Load more 3751
Load more 3752
Load more 3753
Load more 3754
Load more 3755
Load more 3756
Load more 3757
Load more 3758
Load more 3759
Load more 3760
Load more 3761
Load more 3762
Load more 3763
Load more 3764
Load more 3765
Load more 3766
Load more 3767
Load more 3768
Load more 3769
Load more 3770
Load more 3771
Load more 3772
Load more 3773
Load more 3774
Load more 3775
Load more 3776
Load more 3777
Load more 3778
Load more 3779
Load more 3780
Load more 3781
Load more 3782
Load more 3783
Load more 3784
Load more 3785
Load more 3786
Load more 3787
Load more 3788
Load more 3789
Load more 3790
Load more 3791
Load more 3792
Load more 3793
Load more 3794
Load more 3795
Load more 3796
Load more 3797
Load more 3798
Load more 3799
Load more 3800
Load more 3801
Load more 3802
Load more 3803
Load more 3804
Load more 3805
Load more 3806
Load more 3807
Load more 3808
Load more 3809
Load more 3810
Load more 3811
Load more 3812
Load more 3813
Load more 3814
Load more 3815
Load more 3816
Load more 3817
Load more 3818
Load more 3819
Load more 3820
Load more 3821
Load more 3822
Load more 3823
Load more 3824
Load more 3825
Load more 3826
Load more 3827
Load more 3828
Load more 3829
Load more 3830
Load more 3831
Load more 3832
Load more 3833
Load more 3834
Load more 3835
Load more 3836
Load more 3837
Load more 3838
Load more 3839
Load more 3840
Load more 3841
Load more 3842
Load more 3843
Load more 3844
Load more 3845
Load more 3846
Load more 3847
Load more 3848
Load more 3849
Load more 3850
Load more 3851
Load more 3852
Load more 3853
Load more 3854
Load more 3855
Load more 3856
Load more 3857
Load more 3858
Load more 3859
Load more 3860
Load more 3861
Load more 3862
Load more 3863
Load more 3864
Load more 3865
Load more 3866
Load more 3867
Load more 3868
Load more 3869
Load more 3870
Load more 3871
Load more 3872
Load more 3873
Load more 3874
Load more 3875
Load more 3876
Load more 3877
Load more 3878
Load more 3879
Load more 3880
Load more 3881
Load more 3882
Load more 3883
Load more 3884
Load more 3885
Load more 3886
Load more 3887
Load more 3888
Load more 3889
Load more 3890
Load more 3891
Load more 3892
Load more 3893
Load more 3894
Load more 3895
Load more 3896
Load more 3897
Load more 3898
Load more 3899
Load more 3900
Load more 3901
Load more 3902
Load more 3903
Load more 3904
Load more 3905
Load more 3906
Load more 3907
Load more 3908
Load more 3909
Load more 3910
Load more 3911
Load more 3912
Load more 3913
Load more 3914
Load more 3915
Load more 3916
Load more 3917
Load more 3918
Load more 3919
Load more 3920
Load more 3921
Load more 3922
Load more 3923
Load more 3924
Load more 3925
Load more 3926
Load more 3927
Load more 3928
Load more 3929
Load more 3930
Load more 3931
Load more 3932
Load more 3933
Load more 3934
Load more 3935
Load more 3936
Load more 3937
Load more 3938
Load more 3939
Load more 3940
Load more 3941
Load more 3942
Load more 3943
Load more 3944
Load more 3945
Load more 3946
Load more 3947
Load more 3948
Load more 3949
Load more 3950
Load more 3951
Load more 3952
Load more 3953
Load more 3954
Load more 3955
Load more 3956
Load more 3957
Load more 3958
Load more 3959
Load more 3960
Load more 3961
Load more 3962
Load more 3963
Load more 3964
Load more 3965
Load more 3966
Load more 3967
Load more 3968
Load more 3969
Load more 3970
Load more 3971
Load more 3972
Load more 3973
Load more 3974
Load more 3975
Load more 3976
Load more 3977
Load more 3978
Load more 3979
Load more 3980
Load more 3981
Load more 3982
Load more 3983
Load more 3984
Load more 3985
Load more 3986
Load more 3987
Load more 3988
Load more 3989
Load more 3990
Load more 3991
Load more 3992
Load more 3993
Load more 3994
Load more 3995
Load more 3996
Load more 3997
Load more 3998
Load more 3999
Load more 4000

Install Python 3.9 on Raspberry Pi OS or Debian 10 (for Ansible or other uses)

I’ve started getting a lot of bug reports on my repos to the effect of “Ansible won’t install on my Raspberry Pi anymore”. Accompanying it is a debug message like one of the following:

$ python3 -m pip install ansible
...
No matching distribution found for ansible-core<2.13,>=2.12.0 (from ansible)

# Alternatively:
ERROR: No matching distribution found for ansible-core<2.13,>=2.12.0

The problem is ansible-core 2.12 has a new hard requirement for Python 3.8 or newer. And ansible-core 2.12 is included in Ansible 5.0.0, which was recently released. Raspberry Pi OS, which was based on Debian 10 (“Buster”) until recently, includes Python 3.7, which is too old to satisfy Ansible’s installation requirements.

There was recently a fix that makes it so Ansible 5.x won’t get installed on these older systems, but who wants to get stuck on old unsupported Ansible versions?

There are three options:

  • Stick with Ansible 4.x or earlier
  • Switch to Debian 11 “Bullseye” (download the latest version of Pi OS) or another newer OS that has Python 3.8 or later by default.
  • Install at least Python 3.8

Workaround: Stay on Ansible 4.x

The easiest workaround for now is to install the latest version of Ansible 4, which uses ansible-core 2.11, which is compatible with the version of Python (3.7) that ships with Debian 10 Buster. To do that, run:

$ python -m pip install --user ansible==4.9.0

That should work, and as long as you don’t try upgrading to Ansible 5, you’d have a stable (if no longer supported) version of Ansible running.

Best fix: Install Python 3.9

It’s best to upgrade Python so you can install the latest version of Ansible cleanly. Unfortunately for those with older OSes that don’t have a pre-packaged version of Python available, you will need to either deal with the complexity of pyenv, or build a newer version of Python from source.

If you’re running Debian 10 or the slightly-older version of Raspberry Pi OS based on it, you can still install Python 3.9 using apt, but you’ll need to update your ‘apt sources’ to pull down a newer version of Python.

Edit /etc/apt/sources.list:

$ sudo nano /etc/apt/sources.list

Then add the following line to the bottom of the file and save it:

deb http://http.us.debian.org/debian/ testing non-free contrib main

Now, to install Python 3.9, run:

$ sudo apt update
$ sudo apt install -y python3.9

Now you should start seeing a Python 3.9 version installed:

$ python3 --version
Python 3.9.9

And you can now install the latest version of Ansible without an issue:

$ python3 -m pip install ansible

Note: If you get an error like AttributeError: 'HTMLParser' object has no attribute 'unescape', try running python3 -m pip install --upgrade setuptools and then try installing Ansible again (thanks to this answer for the solution). You may also get an error like can't find Rust compiler'—if so, also runpython3 -m pip install –upgrade pip` and then try installing Ansible again.

Note 2: Please read through the first few comments below for suggestions on how to do this while also pinning the change to just Python—if you don’t do that, you could end up upgrading a lot of other packages unintentionally, leading to system breakage!

Now verify that Ansible’s installed:

$ python3 -m pip freeze
ansible==5.0.1
ansible-core==2.12.0
cffi==1.15.0

 

 

 

Load more 3001
Load more 3002
Load more 3003
Load more 3004
Load more 3005
Load more 3006
Load more 3007
Load more 3008
Load more 3009
Load more 3010
Load more 3011
Load more 3012
Load more 3013
Load more 3014
Load more 3015
Load more 3016
Load more 3017
Load more 3018
Load more 3019
Load more 3020
Load more 3021
Load more 3022
Load more 3023
Load more 3024
Load more 3025
Load more 3026
Load more 3027
Load more 3028
Load more 3029
Load more 3030
Load more 3031
Load more 3032
Load more 3033
Load more 3034
Load more 3035
Load more 3036
Load more 3037
Load more 3038
Load more 3039
Load more 3040
Load more 3041
Load more 3042
Load more 3043
Load more 3044
Load more 3045
Load more 3046
Load more 3047
Load more 3048
Load more 3049
Load more 3050
Load more 3051
Load more 3052
Load more 3053
Load more 3054
Load more 3055
Load more 3056
Load more 3057
Load more 3058
Load more 3059
Load more 3060
Load more 3061
Load more 3062
Load more 3063
Load more 3064
Load more 3065
Load more 3066
Load more 3067
Load more 3068
Load more 3069
Load more 3070
Load more 3071
Load more 3072
Load more 3073
Load more 3074
Load more 3075
Load more 3076
Load more 3077
Load more 3078
Load more 3079
Load more 3080
Load more 3081
Load more 3082
Load more 3083
Load more 3084
Load more 3085
Load more 3086
Load more 3087
Load more 3088
Load more 3089
Load more 3090
Load more 3091
Load more 3092
Load more 3093
Load more 3094
Load more 3095
Load more 3096
Load more 3097
Load more 3098
Load more 3099
Load more 3100
Load more 3101
Load more 3102
Load more 3103
Load more 3104
Load more 3105
Load more 3106
Load more 3107
Load more 3108
Load more 3109
Load more 3110
Load more 3111
Load more 3112
Load more 3113
Load more 3114
Load more 3115
Load more 3116
Load more 3117
Load more 3118
Load more 3119
Load more 3120
Load more 3121
Load more 3122
Load more 3123
Load more 3124
Load more 3125
Load more 3126
Load more 3127
Load more 3128
Load more 3129
Load more 3130
Load more 3131
Load more 3132
Load more 3133
Load more 3134
Load more 3135
Load more 3136
Load more 3137
Load more 3138
Load more 3139
Load more 3140
Load more 3141
Load more 3142
Load more 3143
Load more 3144
Load more 3145
Load more 3146
Load more 3147
Load more 3148
Load more 3149
Load more 3150
Load more 3151
Load more 3152
Load more 3153
Load more 3154
Load more 3155
Load more 3156
Load more 3157
Load more 3158
Load more 3159
Load more 3160
Load more 3161
Load more 3162
Load more 3163
Load more 3164
Load more 3165
Load more 3166
Load more 3167
Load more 3168
Load more 3169
Load more 3170
Load more 3171
Load more 3172
Load more 3173
Load more 3174
Load more 3175
Load more 3176
Load more 3177
Load more 3178
Load more 3179
Load more 3180
Load more 3181
Load more 3182
Load more 3183
Load more 3184
Load more 3185
Load more 3186
Load more 3187
Load more 3188
Load more 3189
Load more 3190
Load more 3191
Load more 3192
Load more 3193
Load more 3194
Load more 3195
Load more 3196
Load more 3197
Load more 3198
Load more 3199
Load more 3200
Load more 3201
Load more 3202
Load more 3203
Load more 3204
Load more 3205
Load more 3206
Load more 3207
Load more 3208
Load more 3209
Load more 3210
Load more 3211
Load more 3212
Load more 3213
Load more 3214
Load more 3215
Load more 3216
Load more 3217
Load more 3218
Load more 3219
Load more 3220
Load more 3221
Load more 3222
Load more 3223
Load more 3224
Load more 3225
Load more 3226
Load more 3227
Load more 3228
Load more 3229
Load more 3230
Load more 3231
Load more 3232
Load more 3233
Load more 3234
Load more 3235
Load more 3236
Load more 3237
Load more 3238
Load more 3239
Load more 3240
Load more 3241
Load more 3242
Load more 3243
Load more 3244
Load more 3245
Load more 3246
Load more 3247
Load more 3248
Load more 3249
Load more 3250
Load more 3251
Load more 3252
Load more 3253
Load more 3254
Load more 3255
Load more 3256
Load more 3257
Load more 3258
Load more 3259
Load more 3260
Load more 3261
Load more 3262
Load more 3263
Load more 3264
Load more 3265
Load more 3266
Load more 3267
Load more 3268
Load more 3269
Load more 3270
Load more 3271
Load more 3272
Load more 3273
Load more 3274
Load more 3275
Load more 3276
Load more 3277
Load more 3278
Load more 3279
Load more 3280
Load more 3281
Load more 3282
Load more 3283
Load more 3284
Load more 3285
Load more 3286
Load more 3287
Load more 3288
Load more 3289
Load more 3290
Load more 3291
Load more 3292
Load more 3293
Load more 3294
Load more 3295
Load more 3296
Load more 3297
Load more 3298
Load more 3299
Load more 3300
Load more 3301
Load more 3302
Load more 3303
Load more 3304
Load more 3305
Load more 3306
Load more 3307
Load more 3308
Load more 3309
Load more 3310
Load more 3311
Load more 3312
Load more 3313
Load more 3314
Load more 3315
Load more 3316
Load more 3317
Load more 3318
Load more 3319
Load more 3320
Load more 3321
Load more 3322
Load more 3323
Load more 3324
Load more 3325
Load more 3326
Load more 3327
Load more 3328
Load more 3329
Load more 3330
Load more 3331
Load more 3332
Load more 3333
Load more 3334
Load more 3335
Load more 3336
Load more 3337
Load more 3338
Load more 3339
Load more 3340
Load more 3341
Load more 3342
Load more 3343
Load more 3344
Load more 3345
Load more 3346
Load more 3347
Load more 3348
Load more 3349
Load more 3350
Load more 3351
Load more 3352
Load more 3353
Load more 3354
Load more 3355
Load more 3356
Load more 3357
Load more 3358
Load more 3359
Load more 3360
Load more 3361
Load more 3362
Load more 3363
Load more 3364
Load more 3365
Load more 3366
Load more 3367
Load more 3368
Load more 3369
Load more 3370
Load more 3371
Load more 3372
Load more 3373
Load more 3374
Load more 3375
Load more 3376
Load more 3377
Load more 3378
Load more 3379
Load more 3380
Load more 3381
Load more 3382
Load more 3383
Load more 3384
Load more 3385
Load more 3386
Load more 3387
Load more 3388
Load more 3389
Load more 3390
Load more 3391
Load more 3392
Load more 3393
Load more 3394
Load more 3395
Load more 3396
Load more 3397
Load more 3398
Load more 3399
Load more 3400
Load more 3401
Load more 3402
Load more 3403
Load more 3404
Load more 3405
Load more 3406
Load more 3407
Load more 3408
Load more 3409
Load more 3410
Load more 3411
Load more 3412
Load more 3413
Load more 3414
Load more 3415
Load more 3416
Load more 3417
Load more 3418
Load more 3419
Load more 3420
Load more 3421
Load more 3422
Load more 3423
Load more 3424
Load more 3425
Load more 3426
Load more 3427
Load more 3428
Load more 3429
Load more 3430
Load more 3431
Load more 3432
Load more 3433
Load more 3434
Load more 3435
Load more 3436
Load more 3437
Load more 3438
Load more 3439
Load more 3440
Load more 3441
Load more 3442
Load more 3443
Load more 3444
Load more 3445
Load more 3446
Load more 3447
Load more 3448
Load more 3449
Load more 3450
Load more 3451
Load more 3452
Load more 3453
Load more 3454
Load more 3455
Load more 3456
Load more 3457
Load more 3458
Load more 3459
Load more 3460
Load more 3461
Load more 3462
Load more 3463
Load more 3464
Load more 3465
Load more 3466
Load more 3467
Load more 3468
Load more 3469
Load more 3470
Load more 3471
Load more 3472
Load more 3473
Load more 3474
Load more 3475
Load more 3476
Load more 3477
Load more 3478
Load more 3479
Load more 3480
Load more 3481
Load more 3482
Load more 3483
Load more 3484
Load more 3485
Load more 3486
Load more 3487
Load more 3488
Load more 3489
Load more 3490
Load more 3491
Load more 3492
Load more 3493
Load more 3494
Load more 3495
Load more 3496
Load more 3497
Load more 3498
Load more 3499
Load more 3500

Pine64 and Radxa’s new Pi CM4-compatible boards

Since the Raspberry Pi was introduced, hundreds of clones have adopted the Pi’s form factor (from the diminutive Zero to the ‘full size’ model B). Often they have better hardware specs, and yet they remain a more obscure also-ran in that generation of Single Board Computer (SBC).

Pine64 SOQuartz and Radxa CM3 in front of Raspberry Pi Compute Module 4

So when I saw Radxa’s CM3 and Pine64’s SOQuartz, I wanted to see if either would be—as they advertised—’drop in, pin-compatible replacements’ for the Raspberry Pi Compute Module 4.

tl;dr: They’re not. At least not yet.

Hardware and Specs

Both boards are technically pin-compatible. And both will boot and run (to some extent) on pre-existing Compute Module 4 carrier boards, including Raspberry Pi’s official IO Board:

Pine64 SOQuartz on Raspberry Pi Compute Module 4 IO Board

Because the boards are pin-compatible, you can use them on almost every pre-existing carrier board designed for the CM4—I’m tracking almost 100 on my Pi PCIe site!

That’s great, because while many of the CM4 carrier boards are available, the CM4 itself is not. It’s nearly impossible to snag the model you want, and for most flavors there won’t be any in stock for months!

And just because the boards are Pi clones, they don’t have to stick to all the limitations of the CM4’s layout—the Radxa CM3 sports a third IO board-to-board connector along the top edge that’s not present on the CM4 or SOQuartz:

Radxa CM3 3rd connector on bottom for IO

This connector breaks out two SATA ports (split between the PCIe bus and USB 3.0 port), an extra USB 3.0 port, and extra GPIO pins above and beyond what the Pi offers. But it requires a board that supports the third connector, and none that are available do, yet (Radxa’s own is still not available for testing or purchase).

The RK3566 (used by both the CM3 and the SOQuartz) also includes ARMv8 crypto extensions, and a 0.8 TOPS AI accelerator, so there are some other hardware niceties on offer, even though the 4x Cortex A55 cores are slightly slower (even at a higher clock) than the A72 cores in the CM4.

But if you just want to drool over specs, go read them at the source:

The Promise

After months of testing dozens of PCI Express devices with the Compute Module 4—which exposes the BCM2711 PCIe Gen 2.0 x1 lane directly—I’ve encountered issues with some drivers, notably any GPU / graphics card, some storage controllers, and the Coral TPU.

The Pi’s chip doesn’t have a fully-baked PCIe bus. It’s perfectly adequate for USB 3.0 chips (like the VL805 used in the Pi 4 model B and Pi 400), most NVMe SSDs, and a number of other devices, but the Pi locks up in strange ways when you try something crazy like plugging in an AMD Radeon RX 6700 XT.

Rockchip RK3566 SoC on Pine64 SOQuartz

So I am hoping the Rockchip RK3566 used in these other boards might have a better PCIe implementation. Good enough to be able to load drivers for more devices without hacky patches to work around the PCIe bus limitations on the Pi.

And supposedly the bootloader and firmware surrounding Rockchip-based boards is more open than that on the Raspberry Pi. This isn’t a huge issue for most users, but it is a thorn in the otherwise stellar reputation Raspberry Pi has for working with open source hardware and software.

Load more 2501
Load more 2502
Load more 2503
Load more 2504
Load more 2505
Load more 2506
Load more 2507
Load more 2508
Load more 2509
Load more 2510
Load more 2511
Load more 2512
Load more 2513
Load more 2514
Load more 2515
Load more 2516
Load more 2517
Load more 2518
Load more 2519
Load more 2520
Load more 2521
Load more 2522
Load more 2523
Load more 2524
Load more 2525
Load more 2526
Load more 2527
Load more 2528
Load more 2529
Load more 2530
Load more 2531
Load more 2532
Load more 2533
Load more 2534
Load more 2535
Load more 2536
Load more 2537
Load more 2538
Load more 2539
Load more 2540
Load more 2541
Load more 2542
Load more 2543
Load more 2544
Load more 2545
Load more 2546
Load more 2547
Load more 2548
Load more 2549
Load more 2550
Load more 2551
Load more 2552
Load more 2553
Load more 2554
Load more 2555
Load more 2556
Load more 2557
Load more 2558
Load more 2559
Load more 2560
Load more 2561
Load more 2562
Load more 2563
Load more 2564
Load more 2565
Load more 2566
Load more 2567
Load more 2568
Load more 2569
Load more 2570
Load more 2571
Load more 2572
Load more 2573
Load more 2574
Load more 2575
Load more 2576
Load more 2577
Load more 2578
Load more 2579
Load more 2580
Load more 2581
Load more 2582
Load more 2583
Load more 2584
Load more 2585
Load more 2586
Load more 2587
Load more 2588
Load more 2589
Load more 2590
Load more 2591
Load more 2592
Load more 2593
Load more 2594
Load more 2595
Load more 2596
Load more 2597
Load more 2598
Load more 2599
Load more 2600
Load more 2601
Load more 2602
Load more 2603
Load more 2604
Load more 2605
Load more 2606
Load more 2607
Load more 2608
Load more 2609
Load more 2610
Load more 2611
Load more 2612
Load more 2613
Load more 2614
Load more 2615
Load more 2616
Load more 2617
Load more 2618
Load more 2619
Load more 2620
Load more 2621
Load more 2622
Load more 2623
Load more 2624
Load more 2625
Load more 2626
Load more 2627
Load more 2628
Load more 2629
Load more 2630
Load more 2631
Load more 2632
Load more 2633
Load more 2634
Load more 2635
Load more 2636
Load more 2637
Load more 2638
Load more 2639
Load more 2640
Load more 2641
Load more 2642
Load more 2643
Load more 2644
Load more 2645
Load more 2646
Load more 2647
Load more 2648
Load more 2649
Load more 2650
Load more 2651
Load more 2652
Load more 2653
Load more 2654
Load more 2655
Load more 2656
Load more 2657
Load more 2658
Load more 2659
Load more 2660
Load more 2661
Load more 2662
Load more 2663
Load more 2664
Load more 2665
Load more 2666
Load more 2667
Load more 2668
Load more 2669
Load more 2670
Load more 2671
Load more 2672
Load more 2673
Load more 2674
Load more 2675
Load more 2676
Load more 2677
Load more 2678
Load more 2679
Load more 2680
Load more 2681
Load more 2682
Load more 2683
Load more 2684
Load more 2685
Load more 2686
Load more 2687
Load more 2688
Load more 2689
Load more 2690
Load more 2691
Load more 2692
Load more 2693
Load more 2694
Load more 2695
Load more 2696
Load more 2697
Load more 2698
Load more 2699
Load more 2700
Load more 2701
Load more 2702
Load more 2703
Load more 2704
Load more 2705
Load more 2706
Load more 2707
Load more 2708
Load more 2709
Load more 2710
Load more 2711
Load more 2712
Load more 2713
Load more 2714
Load more 2715
Load more 2716
Load more 2717
Load more 2718
Load more 2719
Load more 2720
Load more 2721
Load more 2722
Load more 2723
Load more 2724
Load more 2725
Load more 2726
Load more 2727
Load more 2728
Load more 2729
Load more 2730
Load more 2731
Load more 2732
Load more 2733
Load more 2734
Load more 2735
Load more 2736
Load more 2737
Load more 2738
Load more 2739
Load more 2740
Load more 2741
Load more 2742
Load more 2743
Load more 2744
Load more 2745
Load more 2746
Load more 2747
Load more 2748
Load more 2749
Load more 2750
Load more 2751
Load more 2752
Load more 2753
Load more 2754
Load more 2755
Load more 2756
Load more 2757
Load more 2758
Load more 2759
Load more 2760
Load more 2761
Load more 2762
Load more 2763
Load more 2764
Load more 2765
Load more 2766
Load more 2767
Load more 2768
Load more 2769
Load more 2770
Load more 2771
Load more 2772
Load more 2773
Load more 2774
Load more 2775
Load more 2776
Load more 2777
Load more 2778
Load more 2779
Load more 2780
Load more 2781
Load more 2782
Load more 2783
Load more 2784
Load more 2785
Load more 2786
Load more 2787
Load more 2788
Load more 2789
Load more 2790
Load more 2791
Load more 2792
Load more 2793
Load more 2794
Load more 2795
Load more 2796
Load more 2797
Load more 2798
Load more 2799
Load more 2800
Load more 2801
Load more 2802
Load more 2803
Load more 2804
Load more 2805
Load more 2806
Load more 2807
Load more 2808
Load more 2809
Load more 2810
Load more 2811
Load more 2812
Load more 2813
Load more 2814
Load more 2815
Load more 2816
Load more 2817
Load more 2818
Load more 2819
Load more 2820
Load more 2821
Load more 2822
Load more 2823
Load more 2824
Load more 2825
Load more 2826
Load more 2827
Load more 2828
Load more 2829
Load more 2830
Load more 2831
Load more 2832
Load more 2833
Load more 2834
Load more 2835
Load more 2836
Load more 2837
Load more 2838
Load more 2839
Load more 2840
Load more 2841
Load more 2842
Load more 2843
Load more 2844
Load more 2845
Load more 2846
Load more 2847
Load more 2848
Load more 2849
Load more 2850
Load more 2851
Load more 2852
Load more 2853
Load more 2854
Load more 2855
Load more 2856
Load more 2857
Load more 2858
Load more 2859
Load more 2860
Load more 2861
Load more 2862
Load more 2863
Load more 2864
Load more 2865
Load more 2866
Load more 2867
Load more 2868
Load more 2869
Load more 2870
Load more 2871
Load more 2872
Load more 2873
Load more 2874
Load more 2875
Load more 2876
Load more 2877
Load more 2878
Load more 2879
Load more 2880
Load more 2881
Load more 2882
Load more 2883
Load more 2884
Load more 2885
Load more 2886
Load more 2887
Load more 2888
Load more 2889
Load more 2890
Load more 2891
Load more 2892
Load more 2893
Load more 2894
Load more 2895
Load more 2896
Load more 2897
Load more 2898
Load more 2899
Load more 2900
Load more 2901
Load more 2902
Load more 2903
Load more 2904
Load more 2905
Load more 2906
Load more 2907
Load more 2908
Load more 2909
Load more 2910
Load more 2911
Load more 2912
Load more 2913
Load more 2914
Load more 2915
Load more 2916
Load more 2917
Load more 2918
Load more 2919
Load more 2920
Load more 2921
Load more 2922
Load more 2923
Load more 2924
Load more 2925
Load more 2926
Load more 2927
Load more 2928
Load more 2929
Load more 2930
Load more 2931
Load more 2932
Load more 2933
Load more 2934
Load more 2935
Load more 2936
Load more 2937
Load more 2938
Load more 2939
Load more 2940
Load more 2941
Load more 2942
Load more 2943
Load more 2944
Load more 2945
Load more 2946
Load more 2947
Load more 2948
Load more 2949
Load more 2950
Load more 2951
Load more 2952
Load more 2953
Load more 2954
Load more 2955
Load more 2956
Load more 2957
Load more 2958
Load more 2959
Load more 2960
Load more 2961
Load more 2962
Load more 2963
Load more 2964
Load more 2965
Load more 2966
Load more 2967
Load more 2968
Load more 2969
Load more 2970
Load more 2971
Load more 2972
Load more 2973
Load more 2974
Load more 2975
Load more 2976
Load more 2977
Load more 2978
Load more 2979
Load more 2980
Load more 2981
Load more 2982
Load more 2983
Load more 2984
Load more 2985
Load more 2986
Load more 2987
Load more 2988
Load more 2989
Load more 2990
Load more 2991
Load more 2992
Load more 2993
Load more 2994
Load more 2995
Load more 2996
Load more 2997
Load more 2998
Load more 2999
Load more 3000

HTGWA: Use bcache for SSD caching on a Raspberry Pi

This is a simple guide, part of a series I’ll call ‘How-To Guide Without Ads’. In it, I’m going to document how I set up bcache on a Raspberry Pi, so I could use an SSD as a cache in front of a RAID array.

Getting bcache

bcache is sometimes used on Linux devices to allow a more efficient SSD cache to run in front of a single or multiple slower hard drives—typically in a storage array.

In my case, I have three SATA hard drives: /dev/sda/dev/sdb, and /dev/sdc. And I have one NVMe SSD: /dev/nvme0n1.

created a RAID5 array with mdadm for the three hard drives, and had the raid device /dev/md0.

I then installed bcache-tools:

$ sudo apt-get install bcache-tools

And used make-bcache to create the backing and cache devices:

$ sudo make-bcache -B /dev/md0
UUID:           eb360a2d-4c62-451d-8549-a68621c633e5
Set UUID:       c8b5c63c-0a44-49f3-bb65-cd4df9b751a0
version:        1
block_size:     1
data_offset:        16

$ sudo make-bcache -C /dev/nvme0n1
UUID:           15bf54e9-be21-4478-b676-a08dad937963
Set UUID:       dea419ba-d795-4566-b01f-bb57fa96eb21
version:        0
nbuckets:       15261770
block_size:     1
bucket_size:        1024
nr_in_set:      1
nr_this_dev:        0
first_bucket:       1

Then I tried to look in /sys/block/md0/bcache/ so I could attach the cache to the backing device, but I realized bcache isn’t loaded into the default Raspberry Pi OS kernel… so I’ll have to compile that in.

Getting bcache on Raspberry Pi OS

cross-compiled the Raspberry Pi Linux kernel, and when I did it, during the menuconfig portion, I selected the following option:

> Device Drivers
  > Multiple devices driver support (RAID and LVM)
    > Block device as cache (BCACHE)

I recompiled the kernel and copied my updated kernel to the Pi, then rebooted.

At this point, I could see the bcache0 device was working:

pi@omv:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda           8:0    0  3.6T  0 disk  
└─md0         9:0    0  7.3T  0 raid5 
  └─bcache0 254:0    0  7.3T  0 disk  /mnt
sdb           8:16   0  3.6T  0 disk  
└─md0         9:0    0  7.3T  0 raid5 
  └─bcache0 254:0    0  7.3T  0 disk  /mnt
sdc           8:32   0  3.6T  0 disk  
└─md0         9:0    0  7.3T  0 raid5 
  └─bcache0 254:0    0  7.3T  0 disk  /mnt
mmcblk0     179:0    0 14.8G  0 disk  
├─mmcblk0p1 179:1    0  256M  0 part  /boot
└─mmcblk0p2 179:2    0 14.6G  0 part  /
nvme0n1     259:0    0  7.3T  0 disk  

But if I checked on the status of the cache, it said there was no cache:

pi@omv:~ $ cat /sys/block/bcache0/bcache/state
no cache

Attaching the SSD cache to the backing device

Finally, it’s time to attach the SSD cache to the backing device:

$ sudo su  # switch to the root user
# cd /sys/block/md0/bcache/
# echo dea419ba-d795-4566-b01f-bb57fa96eb21 > attach
# cat state 
clean

The UUID in the echo command above comes from the ‘Set UUID’ output from the make-bcache -C command earlier.

Creating a filesystem and mounting

To actually use the device, I formatted it and mounted it to /mnt:

$ sudo mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/bcache0
$ sudo mount /dev/bcache0 /mnt

To avoid the initialization when making the filesystem, you can omit the -E option entirely. But for RAID arrays I typically let it go full blast on first initialization, because I don’t like relying on ext4lazyinit on a RAID array—it can take days at its reduced rate, and affect RAID performance that whole time!

Getting stats

You can check the stats from bcache with:

$ tail /sys/block/bcache0/bcache/stats_total/*
==> /sys/block/bcache0/bcache/stats_total/bypassed <==
563.1M

==> /sys/block/bcache0/bcache/stats_total/cache_bypass_hits <==
0

==> /sys/block/bcache0/bcache/stats_total/cache_bypass_misses <==
0

==> /sys/block/bcache0/bcache/stats_total/cache_hit_ratio <==
13

==> /sys/block/bcache0/bcache/stats_total/cache_hits <==
132

==> /sys/block/bcache0/bcache/stats_total/cache_miss_collisions <==
0

==> /sys/block/bcache0/bcache/stats_total/cache_misses <==
849

==> /sys/block/bcache0/bcache/stats_total/cache_readaheads <==
0

Switching the caching mode

There are multiple caching modes, including writebackwritethroughwritearound, and none. The most performant (but most dangerous, especially if you’re using a single SSD and not a set of SSDs in RAID 1 for safety) is writeback, which caches reads, and writes data to the SSD first (considering a write ‘complete’ once written to the SSD), then asynchronously copies that data to the backing device.

 

 

 

Load more 2001
Load more 2002
Load more 2003
Load more 2004
Load more 2005
Load more 2006
Load more 2007
Load more 2008
Load more 2009
Load more 2010
Load more 2011
Load more 2012
Load more 2013
Load more 2014
Load more 2015
Load more 2016
Load more 2017
Load more 2018
Load more 2019
Load more 2020
Load more 2021
Load more 2022
Load more 2023
Load more 2024
Load more 2025
Load more 2026
Load more 2027
Load more 2028
Load more 2029
Load more 2030
Load more 2031
Load more 2032
Load more 2033
Load more 2034
Load more 2035
Load more 2036
Load more 2037
Load more 2038
Load more 2039
Load more 2040
Load more 2041
Load more 2042
Load more 2043
Load more 2044
Load more 2045
Load more 2046
Load more 2047
Load more 2048
Load more 2049
Load more 2050
Load more 2051
Load more 2052
Load more 2053
Load more 2054
Load more 2055
Load more 2056
Load more 2057
Load more 2058
Load more 2059
Load more 2060
Load more 2061
Load more 2062
Load more 2063
Load more 2064
Load more 2065
Load more 2066
Load more 2067
Load more 2068
Load more 2069
Load more 2070
Load more 2071
Load more 2072
Load more 2073
Load more 2074
Load more 2075
Load more 2076
Load more 2077
Load more 2078
Load more 2079
Load more 2080
Load more 2081
Load more 2082
Load more 2083
Load more 2084
Load more 2085
Load more 2086
Load more 2087
Load more 2088
Load more 2089
Load more 2090
Load more 2091
Load more 2092
Load more 2093
Load more 2094
Load more 2095
Load more 2096
Load more 2097
Load more 2098
Load more 2099
Load more 2100
Load more 2101
Load more 2102
Load more 2103
Load more 2104
Load more 2105
Load more 2106
Load more 2107
Load more 2108
Load more 2109
Load more 2110
Load more 2111
Load more 2112
Load more 2113
Load more 2114
Load more 2115
Load more 2116
Load more 2117
Load more 2118
Load more 2119
Load more 2120
Load more 2121
Load more 2122
Load more 2123
Load more 2124
Load more 2125
Load more 2126
Load more 2127
Load more 2128
Load more 2129
Load more 2130
Load more 2131
Load more 2132
Load more 2133
Load more 2134
Load more 2135
Load more 2136
Load more 2137
Load more 2138
Load more 2139
Load more 2140
Load more 2141
Load more 2142
Load more 2143
Load more 2144
Load more 2145
Load more 2146
Load more 2147
Load more 2148
Load more 2149
Load more 2150
Load more 2151
Load more 2152
Load more 2153
Load more 2154
Load more 2155
Load more 2156
Load more 2157
Load more 2158
Load more 2159
Load more 2160
Load more 2161
Load more 2162
Load more 2163
Load more 2164
Load more 2165
Load more 2166
Load more 2167
Load more 2168
Load more 2169
Load more 2170
Load more 2171
Load more 2172
Load more 2173
Load more 2174
Load more 2175
Load more 2176
Load more 2177
Load more 2178
Load more 2179
Load more 2180
Load more 2181
Load more 2182
Load more 2183
Load more 2184
Load more 2185
Load more 2186
Load more 2187
Load more 2188
Load more 2189
Load more 2190
Load more 2191
Load more 2192
Load more 2193
Load more 2194
Load more 2195
Load more 2196
Load more 2197
Load more 2198
Load more 2199
Load more 2200
Load more 2201
Load more 2202
Load more 2203
Load more 2204
Load more 2205
Load more 2206
Load more 2207
Load more 2208
Load more 2209
Load more 2210
Load more 2211
Load more 2212
Load more 2213
Load more 2214
Load more 2215
Load more 2216
Load more 2217
Load more 2218
Load more 2219
Load more 2220
Load more 2221
Load more 2222
Load more 2223
Load more 2224
Load more 2225
Load more 2226
Load more 2227
Load more 2228
Load more 2229
Load more 2230
Load more 2231
Load more 2232
Load more 2233
Load more 2234
Load more 2235
Load more 2236
Load more 2237
Load more 2238
Load more 2239
Load more 2240
Load more 2241
Load more 2242
Load more 2243
Load more 2244
Load more 2245
Load more 2246
Load more 2247
Load more 2248
Load more 2249
Load more 2250
Load more 2251
Load more 2252
Load more 2253
Load more 2254
Load more 2255
Load more 2256
Load more 2257
Load more 2258
Load more 2259
Load more 2260
Load more 2261
Load more 2262
Load more 2263
Load more 2264
Load more 2265
Load more 2266
Load more 2267
Load more 2268
Load more 2269
Load more 2270
Load more 2271
Load more 2272
Load more 2273
Load more 2274
Load more 2275
Load more 2276
Load more 2277
Load more 2278
Load more 2279
Load more 2280
Load more 2281
Load more 2282
Load more 2283
Load more 2284
Load more 2285
Load more 2286
Load more 2287
Load more 2288
Load more 2289
Load more 2290
Load more 2291
Load more 2292
Load more 2293
Load more 2294
Load more 2295
Load more 2296
Load more 2297
Load more 2298
Load more 2299
Load more 2300
Load more 2301
Load more 2302
Load more 2303
Load more 2304
Load more 2305
Load more 2306
Load more 2307
Load more 2308
Load more 2309
Load more 2310
Load more 2311
Load more 2312
Load more 2313
Load more 2314
Load more 2315
Load more 2316
Load more 2317
Load more 2318
Load more 2319
Load more 2320
Load more 2321
Load more 2322
Load more 2323
Load more 2324
Load more 2325
Load more 2326
Load more 2327
Load more 2328
Load more 2329
Load more 2330
Load more 2331
Load more 2332
Load more 2333
Load more 2334
Load more 2335
Load more 2336
Load more 2337
Load more 2338
Load more 2339
Load more 2340
Load more 2341
Load more 2342
Load more 2343
Load more 2344
Load more 2345
Load more 2346
Load more 2347
Load more 2348
Load more 2349
Load more 2350
Load more 2351
Load more 2352
Load more 2353
Load more 2354
Load more 2355
Load more 2356
Load more 2357
Load more 2358
Load more 2359
Load more 2360
Load more 2361
Load more 2362
Load more 2363
Load more 2364
Load more 2365
Load more 2366
Load more 2367
Load more 2368
Load more 2369
Load more 2370
Load more 2371
Load more 2372
Load more 2373
Load more 2374
Load more 2375
Load more 2376
Load more 2377
Load more 2378
Load more 2379
Load more 2380
Load more 2381
Load more 2382
Load more 2383
Load more 2384
Load more 2385
Load more 2386
Load more 2387
Load more 2388
Load more 2389
Load more 2390
Load more 2391
Load more 2392
Load more 2393
Load more 2394
Load more 2395
Load more 2396
Load more 2397
Load more 2398
Load more 2399
Load more 2400
Load more 2401
Load more 2402
Load more 2403
Load more 2404
Load more 2405
Load more 2406
Load more 2407
Load more 2408
Load more 2409
Load more 2410
Load more 2411
Load more 2412
Load more 2413
Load more 2414
Load more 2415
Load more 2416
Load more 2417
Load more 2418
Load more 2419
Load more 2420
Load more 2421
Load more 2422
Load more 2423
Load more 2424
Load more 2425
Load more 2426
Load more 2427
Load more 2428
Load more 2429
Load more 2430
Load more 2431
Load more 2432
Load more 2433
Load more 2434
Load more 2435
Load more 2436
Load more 2437
Load more 2438
Load more 2439
Load more 2440
Load more 2441
Load more 2442
Load more 2443
Load more 2444
Load more 2445
Load more 2446
Load more 2447
Load more 2448
Load more 2449
Load more 2450
Load more 2451
Load more 2452
Load more 2453
Load more 2454
Load more 2455
Load more 2456
Load more 2457
Load more 2458
Load more 2459
Load more 2460
Load more 2461
Load more 2462
Load more 2463
Load more 2464
Load more 2465
Load more 2466
Load more 2467
Load more 2468
Load more 2469
Load more 2470
Load more 2471
Load more 2472
Load more 2473
Load more 2474
Load more 2475
Load more 2476
Load more 2477
Load more 2478
Load more 2479
Load more 2480
Load more 2481
Load more 2482
Load more 2483
Load more 2484
Load more 2485
Load more 2486
Load more 2487
Load more 2488
Load more 2489
Load more 2490
Load more 2491
Load more 2492
Load more 2493
Load more 2494
Load more 2495
Load more 2496
Load more 2497
Load more 2498
Load more 2499
Load more 2500

Check your driver! Faster Linux 2.5G Networking with Realtek RTL8125B

Since the Raspberry Pi Compute Module 4 was introduced last year, I’ve been testing a variety of PCI Express NICs with it. One of the main types of NIC I’m interested in is cheap 2.5 Gigabit Ethernet adapters.

2.5 Gigabits is about the highest reasonable bandwidth you can get through the PCI Express Gen 2.0 x1 lane on the Raspberry Pi, and it’s also a lot more accessible than 10 Gigabit networking, especially for home users who might already have Cat5e runs that they are loathe to swap out for Cat6 or better cabling.

In my testing, besides discovering that not all 10 Gbps SFP+ transceivers are created equal, I found out that when it comes to performance, the Linux driver you’re using matters—a lot.

And as a stark illustration of this point, I recently pitted an ASUSTOR Drivestor 4 Pro NAS against a Raspberry Pi ‘Taco’ NAS. Both of these devices use the popular Realtek RTL8125B chip, and both of them were reporting underwhelming iperf3 bandwidth results:

iperf3 bandwidth - kernel driver

The maximum throughput was eerily similar, just under 1.9 Gbps. And worse, I noticed when using devices through a PCI Express switch on the Pi, like a SATA RAID array, the network throughput took a hit, down to 1.51 Gbps on the Pi.

I wondered if the driver might’ve seen some improvements in later revisions of the Linux kernel, so I recompiled the kernel using the 5.15.x source:

menuconfig - Realtek 2.5G network driver in Linux kernel source tree

That made no difference—in fact, the results started to have more jitter in them, so I decided that avenue wasn’t worth pursuing further.

So next, I downloaded the driver directly from Realtek’s website, and installed version 9.007.01:

$ sudo apt-get install -y raspberrypi-kernel-headers
$ tar vjxf r8125-9.007.01.tar.bz2
$ cd r8125-9.007.01/
$ sudo ./autorun.sh

I re-ran my benchmarks, and wouldn’t you know? I’m able to get the full 2.35 Gbps of real-world throughput through the card—regardless of other traffic on the PCIe bus!

iperf3 bandwidth - realtek driver

So the moral of the story seems to be: if you’re not seeing the performance you expect, see if the vendor’s driver is better than what’s in the kernel tree.

Many vendors take an upstream-first approach, where they make sure any driver optimizations make their way to the kernel quickly… but not all. I’m not sure how the discrepancy is so big, though, in this case. It looks like 8125B support was only added a year and a half ago, and only a few chip-specific commits have been added since.

I have to wonder if maybe since far fewer Linux users have 2.5G-capable networks, these kinds of performance issues aren’t discussed as much?

I confirmed with ASUSTOR that their current Drivestor 4 Pro software is running the driver from the kernel, and not the Realtek vendor driver. No word yet on if that could change—but if so, it may be able to unlock more performance from their value-lineup of 2.5G NASes!

For all my debugging details, check out my GitHub issue NAS Comparison – ASUSTOR Drivestor 4 Pro vs Pi CM4.

Load more 1501
Load more 1502
Load more 1503
Load more 1504
Load more 1505
Load more 1506
Load more 1507
Load more 1508
Load more 1509
Load more 1510
Load more 1511
Load more 1512
Load more 1513
Load more 1514
Load more 1515
Load more 1516
Load more 1517
Load more 1518
Load more 1519
Load more 1520
Load more 1521
Load more 1522
Load more 1523
Load more 1524
Load more 1525
Load more 1526
Load more 1527
Load more 1528
Load more 1529
Load more 1530
Load more 1531
Load more 1532
Load more 1533
Load more 1534
Load more 1535
Load more 1536
Load more 1537
Load more 1538
Load more 1539
Load more 1540
Load more 1541
Load more 1542
Load more 1543
Load more 1544
Load more 1545
Load more 1546
Load more 1547
Load more 1548
Load more 1549
Load more 1550
Load more 1551
Load more 1552
Load more 1553
Load more 1554
Load more 1555
Load more 1556
Load more 1557
Load more 1558
Load more 1559
Load more 1560
Load more 1561
Load more 1562
Load more 1563
Load more 1564
Load more 1565
Load more 1566
Load more 1567
Load more 1568
Load more 1569
Load more 1570
Load more 1571
Load more 1572
Load more 1573
Load more 1574
Load more 1575
Load more 1576
Load more 1577
Load more 1578
Load more 1579
Load more 1580
Load more 1581
Load more 1582
Load more 1583
Load more 1584
Load more 1585
Load more 1586
Load more 1587
Load more 1588
Load more 1589
Load more 1590
Load more 1591
Load more 1592
Load more 1593
Load more 1594
Load more 1595
Load more 1596
Load more 1597
Load more 1598
Load more 1599
Load more 1600
Load more 1601
Load more 1602
Load more 1603
Load more 1604
Load more 1605
Load more 1606
Load more 1607
Load more 1608
Load more 1609
Load more 1610
Load more 1611
Load more 1612
Load more 1613
Load more 1614
Load more 1615
Load more 1616
Load more 1617
Load more 1618
Load more 1619
Load more 1620
Load more 1621
Load more 1622
Load more 1623
Load more 1624
Load more 1625
Load more 1626
Load more 1627
Load more 1628
Load more 1629
Load more 1630
Load more 1631
Load more 1632
Load more 1633
Load more 1634
Load more 1635
Load more 1636
Load more 1637
Load more 1638
Load more 1639
Load more 1640
Load more 1641
Load more 1642
Load more 1643
Load more 1644
Load more 1645
Load more 1646
Load more 1647
Load more 1648
Load more 1649
Load more 1650
Load more 1651
Load more 1652
Load more 1653
Load more 1654
Load more 1655
Load more 1656
Load more 1657
Load more 1658
Load more 1659
Load more 1660
Load more 1661
Load more 1662
Load more 1663
Load more 1664
Load more 1665
Load more 1666
Load more 1667
Load more 1668
Load more 1669
Load more 1670
Load more 1671
Load more 1672
Load more 1673
Load more 1674
Load more 1675
Load more 1676
Load more 1677
Load more 1678
Load more 1679
Load more 1680
Load more 1681
Load more 1682
Load more 1683
Load more 1684
Load more 1685
Load more 1686
Load more 1687
Load more 1688
Load more 1689
Load more 1690
Load more 1691
Load more 1692
Load more 1693
Load more 1694
Load more 1695
Load more 1696
Load more 1697
Load more 1698
Load more 1699
Load more 1700
Load more 1701
Load more 1702
Load more 1703
Load more 1704
Load more 1705
Load more 1706
Load more 1707
Load more 1708
Load more 1709
Load more 1710
Load more 1711
Load more 1712
Load more 1713
Load more 1714
Load more 1715
Load more 1716
Load more 1717
Load more 1718
Load more 1719
Load more 1720
Load more 1721
Load more 1722
Load more 1723
Load more 1724
Load more 1725
Load more 1726
Load more 1727
Load more 1728
Load more 1729
Load more 1730
Load more 1731
Load more 1732
Load more 1733
Load more 1734
Load more 1735
Load more 1736
Load more 1737
Load more 1738
Load more 1739
Load more 1740
Load more 1741
Load more 1742
Load more 1743
Load more 1744
Load more 1745
Load more 1746
Load more 1747
Load more 1748
Load more 1749
Load more 1750
Load more 1751
Load more 1752
Load more 1753
Load more 1754
Load more 1755
Load more 1756
Load more 1757
Load more 1758
Load more 1759
Load more 1760
Load more 1761
Load more 1762
Load more 1763
Load more 1764
Load more 1765
Load more 1766
Load more 1767
Load more 1768
Load more 1769
Load more 1770
Load more 1771
Load more 1772
Load more 1773
Load more 1774
Load more 1775
Load more 1776
Load more 1777
Load more 1778
Load more 1779
Load more 1780
Load more 1781
Load more 1782
Load more 1783
Load more 1784
Load more 1785
Load more 1786
Load more 1787
Load more 1788
Load more 1789
Load more 1790
Load more 1791
Load more 1792
Load more 1793
Load more 1794
Load more 1795
Load more 1796
Load more 1797
Load more 1798
Load more 1799
Load more 1800
Load more 1801
Load more 1802
Load more 1803
Load more 1804
Load more 1805
Load more 1806
Load more 1807
Load more 1808
Load more 1809
Load more 1810
Load more 1811
Load more 1812
Load more 1813
Load more 1814
Load more 1815
Load more 1816
Load more 1817
Load more 1818
Load more 1819
Load more 1820
Load more 1821
Load more 1822
Load more 1823
Load more 1824
Load more 1825
Load more 1826
Load more 1827
Load more 1828
Load more 1829
Load more 1830
Load more 1831
Load more 1832
Load more 1833
Load more 1834
Load more 1835
Load more 1836
Load more 1837
Load more 1838
Load more 1839
Load more 1840
Load more 1841
Load more 1842
Load more 1843
Load more 1844
Load more 1845
Load more 1846
Load more 1847
Load more 1848
Load more 1849
Load more 1850
Load more 1851
Load more 1852
Load more 1853
Load more 1854
Load more 1855
Load more 1856
Load more 1857
Load more 1858
Load more 1859
Load more 1860
Load more 1861
Load more 1862
Load more 1863
Load more 1864
Load more 1865
Load more 1866
Load more 1867
Load more 1868
Load more 1869
Load more 1870
Load more 1871
Load more 1872
Load more 1873
Load more 1874
Load more 1875
Load more 1876
Load more 1877
Load more 1878
Load more 1879
Load more 1880
Load more 1881
Load more 1882
Load more 1883
Load more 1884
Load more 1885
Load more 1886
Load more 1887
Load more 1888
Load more 1889
Load more 1890
Load more 1891
Load more 1892
Load more 1893
Load more 1894
Load more 1895
Load more 1896
Load more 1897
Load more 1898
Load more 1899
Load more 1900
Load more 1901
Load more 1902
Load more 1903
Load more 1904
Load more 1905
Load more 1906
Load more 1907
Load more 1908
Load more 1909
Load more 1910
Load more 1911
Load more 1912
Load more 1913
Load more 1914
Load more 1915
Load more 1916
Load more 1917
Load more 1918
Load more 1919
Load more 1920
Load more 1921
Load more 1922
Load more 1923
Load more 1924
Load more 1925
Load more 1926
Load more 1927
Load more 1928
Load more 1929
Load more 1930
Load more 1931
Load more 1932
Load more 1933
Load more 1934
Load more 1935
Load more 1936
Load more 1937
Load more 1938
Load more 1939
Load more 1940
Load more 1941
Load more 1942
Load more 1943
Load more 1944
Load more 1945
Load more 1946
Load more 1947
Load more 1948
Load more 1949
Load more 1950
Load more 1951
Load more 1952
Load more 1953
Load more 1954
Load more 1955
Load more 1956
Load more 1957
Load more 1958
Load more 1959
Load more 1960
Load more 1961
Load more 1962
Load more 1963
Load more 1964
Load more 1965
Load more 1966
Load more 1967
Load more 1968
Load more 1969
Load more 1970
Load more 1971
Load more 1972
Load more 1973
Load more 1974
Load more 1975
Load more 1976
Load more 1977
Load more 1978
Load more 1979
Load more 1980
Load more 1981
Load more 1982
Load more 1983
Load more 1984
Load more 1985
Load more 1986
Load more 1987
Load more 1988
Load more 1989
Load more 1990
Load more 1991
Load more 1992
Load more 1993
Load more 1994
Load more 1995
Load more 1996
Load more 1997
Load more 1998
Load more 1999
Load more 2000

Raspberry Pi holds its own against low-cost ARM NAS

Earlier this year, I pitted the $549 ASUSTOR Lockerstor 4 NAS against a homebrew $350 Raspberry Pi CM4 NAS, and came to the (rather obvious) conclusion that the Lockerstor was better in almost every regard.

Jeff Geerling holding Raspberry Pi Radxa Taco NAS board and ASUSTOR Drivestor 4 Pro

Well, ASUSTOR introduced a new lower-cost NAS, the $329 Drivestor 4 Pro (model AS3304T—pictured above), and sent me one to review against the Raspberry Pi, since it make for a better matchup—both have 4-core ARM CPUs and a more limited PCI Express Gen 2 bus at their heart.

Around the same time, Radxa also sent me their new Taco—a less-than-$100 Raspberry Pi Compute Module 4 carrier board with 5x SATA ports, 1 Gbps and 2.5 Gbps Ethernet, an M.2 NVMe slot, and an M.2 A+E key slot. (The Taco will soon be available as part of a kit with a CM4 and case for around $200.)

The specs evenly matched, at least on paper:

Radxa Taco Raspberry Pi NAS vs ASUSTOR Drivestor 4 Pro NAS spec comparison

But specs are one thing, measurable performance is another.

Disk performance

I benchmarked the raw disk access performance with fio and iozone to get a general idea of how fast the SATA drives would perform in RAID 5.

I chose RAID 5 because it taxes all the subsystems that are traditionally weak points on lower-powered ARM boards: the SoC’s CPU for parity calculations when writing, the PCIe bus for throughput, and the SATA controller.

Note: All the details of my test methodology and benchmarks I ran are documented in this GitHub issue.

Here’s how raw disk performance looks:

Disk benchmarks on ASUSTOR Drivestor 4 Pro vs Raspberry Pi Taco

The Pi is faster for reads, but the ASUSTOR somehow wipes the floor on writes. Seeing that the Pi board also had space for an NVMe drive, I also set up bcache in Pi OS in writeback mode to give the Pi a boost. And that definitely helped:

bcache Disk benchmarks on ASUSTOR Drivestor 4 Pro vs Raspberry Pi Taco

But NASes have to expose raw storage to a network—and that’s an area lower-end NASes often fall short, especially when they try saturating more than a 1 Gbps network connection!

Network and Samba performance

Indeed, both the Taco and the Drivestor seemed to struggle to saturate a 2.5 Gbps network connection in their default configuration—both using the Realtek driver built into the Linux kernel:

RTL8125B NIC performance on 2.5G network

But I noticed if I switched the Pi over to Realtek’s own driver, I could fully saturate the connection:

RTL8125B NIC performance on 2.5G network - realtek driver

I wrote up a blog post about the driver issue, but it seems like Realtek’s driver has some optimizations that offload a lot of the network packet processing from the CPU, or somehow saves on interrupts by a very significant amount.

But that network throughput doesn’t automatically translate to network file copy performance, as demonstrated in my next benchmark:

Samba file copy on ASUSTOR Drivestor 4 Pro vs Raspberry Pi Taco NAS

The benchmark above was a large file copy—the best case scenario. And both the Pi and the Drivestor were very consistent across multiple tests. When you tax a low power SoC with RAID 5 and set it up as the traffic cop between SATA and a 2.5G Ethernet port, it’s obvious the performance is more limited than more expensive Intel/AMD options.

Overclocking could help, but honestly, if you want to see supercharged network file copy performance, opt for a more expensive and better endowed NAS.

 

Load more 1001
Load more 1002
Load more 1003
Load more 1004
Load more 1005
Load more 1006
Load more 1007
Load more 1008
Load more 1009
Load more 1010
Load more 1011
Load more 1012
Load more 1013
Load more 1014
Load more 1015
Load more 1016
Load more 1017
Load more 1018
Load more 1019
Load more 1020
Load more 1021
Load more 1022
Load more 1023
Load more 1024
Load more 1025
Load more 1026
Load more 1027
Load more 1028
Load more 1029
Load more 1030
Load more 1031
Load more 1032
Load more 1033
Load more 1034
Load more 1035
Load more 1036
Load more 1037
Load more 1038
Load more 1039
Load more 1040
Load more 1041
Load more 1042
Load more 1043
Load more 1044
Load more 1045
Load more 1046
Load more 1047
Load more 1048
Load more 1049
Load more 1050
Load more 1051
Load more 1052
Load more 1053
Load more 1054
Load more 1055
Load more 1056
Load more 1057
Load more 1058
Load more 1059
Load more 1060
Load more 1061
Load more 1062
Load more 1063
Load more 1064
Load more 1065
Load more 1066
Load more 1067
Load more 1068
Load more 1069
Load more 1070
Load more 1071
Load more 1072
Load more 1073
Load more 1074
Load more 1075
Load more 1076
Load more 1077
Load more 1078
Load more 1079
Load more 1080
Load more 1081
Load more 1082
Load more 1083
Load more 1084
Load more 1085
Load more 1086
Load more 1087
Load more 1088
Load more 1089
Load more 1090
Load more 1091
Load more 1092
Load more 1093
Load more 1094
Load more 1095
Load more 1096
Load more 1097
Load more 1098
Load more 1099
Load more 1100
Load more 1101
Load more 1102
Load more 1103
Load more 1104
Load more 1105
Load more 1106
Load more 1107
Load more 1108
Load more 1109
Load more 1110
Load more 1111
Load more 1112
Load more 1113
Load more 1114
Load more 1115
Load more 1116
Load more 1117
Load more 1118
Load more 1119
Load more 1120
Load more 1121
Load more 1122
Load more 1123
Load more 1124
Load more 1125
Load more 1126
Load more 1127
Load more 1128
Load more 1129
Load more 1130
Load more 1131
Load more 1132
Load more 1133
Load more 1134
Load more 1135
Load more 1136
Load more 1137
Load more 1138
Load more 1139
Load more 1140
Load more 1141
Load more 1142
Load more 1143
Load more 1144
Load more 1145
Load more 1146
Load more 1147
Load more 1148
Load more 1149
Load more 1150
Load more 1151
Load more 1152
Load more 1153
Load more 1154
Load more 1155
Load more 1156
Load more 1157
Load more 1158
Load more 1159
Load more 1160
Load more 1161
Load more 1162
Load more 1163
Load more 1164
Load more 1165
Load more 1166
Load more 1167
Load more 1168
Load more 1169
Load more 1170
Load more 1171
Load more 1172
Load more 1173
Load more 1174
Load more 1175
Load more 1176
Load more 1177
Load more 1178
Load more 1179
Load more 1180
Load more 1181
Load more 1182
Load more 1183
Load more 1184
Load more 1185
Load more 1186
Load more 1187
Load more 1188
Load more 1189
Load more 1190
Load more 1191
Load more 1192
Load more 1193
Load more 1194
Load more 1195
Load more 1196
Load more 1197
Load more 1198
Load more 1199
Load more 1200
Load more 1201
Load more 1202
Load more 1203
Load more 1204
Load more 1205
Load more 1206
Load more 1207
Load more 1208
Load more 1209
Load more 1210
Load more 1211
Load more 1212
Load more 1213
Load more 1214
Load more 1215
Load more 1216
Load more 1217
Load more 1218
Load more 1219
Load more 1220
Load more 1221
Load more 1222
Load more 1223
Load more 1224
Load more 1225
Load more 1226
Load more 1227
Load more 1228
Load more 1229
Load more 1230
Load more 1231
Load more 1232
Load more 1233
Load more 1234
Load more 1235
Load more 1236
Load more 1237
Load more 1238
Load more 1239
Load more 1240
Load more 1241
Load more 1242
Load more 1243
Load more 1244
Load more 1245
Load more 1246
Load more 1247
Load more 1248
Load more 1249
Load more 1250
Load more 1251
Load more 1252
Load more 1253
Load more 1254
Load more 1255
Load more 1256
Load more 1257
Load more 1258
Load more 1259
Load more 1260
Load more 1261
Load more 1262
Load more 1263
Load more 1264
Load more 1265
Load more 1266
Load more 1267
Load more 1268
Load more 1269
Load more 1270
Load more 1271
Load more 1272
Load more 1273
Load more 1274
Load more 1275
Load more 1276
Load more 1277
Load more 1278
Load more 1279
Load more 1280
Load more 1281
Load more 1282
Load more 1283
Load more 1284
Load more 1285
Load more 1286
Load more 1287
Load more 1288
Load more 1289
Load more 1290
Load more 1291
Load more 1292
Load more 1293
Load more 1294
Load more 1295
Load more 1296
Load more 1297
Load more 1298
Load more 1299
Load more 1300
Load more 1301
Load more 1302
Load more 1303
Load more 1304
Load more 1305
Load more 1306
Load more 1307
Load more 1308
Load more 1309
Load more 1310
Load more 1311
Load more 1312
Load more 1313
Load more 1314
Load more 1315
Load more 1316
Load more 1317
Load more 1318
Load more 1319
Load more 1320
Load more 1321
Load more 1322
Load more 1323
Load more 1324
Load more 1325
Load more 1326
Load more 1327
Load more 1328
Load more 1329
Load more 1330
Load more 1331
Load more 1332
Load more 1333
Load more 1334
Load more 1335
Load more 1336
Load more 1337
Load more 1338
Load more 1339
Load more 1340
Load more 1341
Load more 1342
Load more 1343
Load more 1344
Load more 1345
Load more 1346
Load more 1347
Load more 1348
Load more 1349
Load more 1350
Load more 1351
Load more 1352
Load more 1353
Load more 1354
Load more 1355
Load more 1356
Load more 1357
Load more 1358
Load more 1359
Load more 1360
Load more 1361
Load more 1362
Load more 1363
Load more 1364
Load more 1365
Load more 1366
Load more 1367
Load more 1368
Load more 1369
Load more 1370
Load more 1371
Load more 1372
Load more 1373
Load more 1374
Load more 1375
Load more 1376
Load more 1377
Load more 1378
Load more 1379
Load more 1380
Load more 1381
Load more 1382
Load more 1383
Load more 1384
Load more 1385
Load more 1386
Load more 1387
Load more 1388
Load more 1389
Load more 1390
Load more 1391
Load more 1392
Load more 1393
Load more 1394
Load more 1395
Load more 1396
Load more 1397
Load more 1398
Load more 1399
Load more 1400
Load more 1401
Load more 1402
Load more 1403
Load more 1404
Load more 1405
Load more 1406
Load more 1407
Load more 1408
Load more 1409
Load more 1410
Load more 1411
Load more 1412
Load more 1413
Load more 1414
Load more 1415
Load more 1416
Load more 1417
Load more 1418
Load more 1419
Load more 1420
Load more 1421
Load more 1422
Load more 1423
Load more 1424
Load more 1425
Load more 1426
Load more 1427
Load more 1428
Load more 1429
Load more 1430
Load more 1431
Load more 1432
Load more 1433
Load more 1434
Load more 1435
Load more 1436
Load more 1437
Load more 1438
Load more 1439
Load more 1440
Load more 1441
Load more 1442
Load more 1443
Load more 1444
Load more 1445
Load more 1446
Load more 1447
Load more 1448
Load more 1449
Load more 1450
Load more 1451
Load more 1452
Load more 1453
Load more 1454
Load more 1455
Load more 1456
Load more 1457
Load more 1458
Load more 1459
Load more 1460
Load more 1461
Load more 1462
Load more 1463
Load more 1464
Load more 1465
Load more 1466
Load more 1467
Load more 1468
Load more 1469
Load more 1470
Load more 1471
Load more 1472
Load more 1473
Load more 1474
Load more 1475
Load more 1476
Load more 1477
Load more 1478
Load more 1479
Load more 1480
Load more 1481
Load more 1482
Load more 1483
Load more 1484
Load more 1485
Load more 1486
Load more 1487
Load more 1488
Load more 1489
Load more 1490
Load more 1491
Load more 1492
Load more 1493
Load more 1494
Load more 1495
Load more 1496
Load more 1497
Load more 1498
Load more 1499
Load more 1500

Organic Groups and Message Stack in Drupal 8

Organic Groups

The heroes: @RoySegall@pfrenssen @damiankloip@chx et al.

For years Organic Groups has been one of the proven solutions for multi-sites functionality, in the form of one code base, one database, and one dashboard to rule them all. After so many years and seeing so many different implementations, such as Harvard’s OpenScholar, OpenAtrium, and many others, I’m even more confident OG is doing many things right.

Most of OG7’s concepts are being migrated to OG8, but obviously this is also a good time to fix some old mistakes. One of the mistakes was treating users and content (i.e. non-user entities) alike. But, well, you know – they are not. Because when we came to re-think of it, membership really makes sense only for users. For example, if the membership state is activepending or blocked, that should indeed be applied only to users. So we’ve changed it:

  • A reference between a group content and a group is done via an entity reference field with a default storage. The link between them is simply registered as a row in the DB.
  • A reference between a user and a group is also done via an entity reference field, however the field storage is custom. It’s the OgMembership entity you know from OG7.

Group module

At DrupalCon, a few people asked for my opinion on the Group module. I’m happy to say that none of them were surprised that I was very positive about it – which is probably another great case for open source.

So to repeat the answer I gave back in New Orleans, if Group is working for you, and satisfies your needs, go ahead and use it. For completeness here’s my critique on some of it’s core concepts:

One of the core concepts of Group is that a group isn’t a node. It’s a Group entity. That’s fine, also OG can have any entity as a group, but I’d argue that 90% of the time your group should be content. Because more often than not, groups need to have published/unpublished status. Or because groups need to have privacy options, and even in Drupal 8 we have only {node_access} table, not an {entity_access}.

Furthermore, there are quite a few cases where a single group content should be attached to multiple groups. This is where the power of OG kicks in, doing all the heavy lifting of making sure permissions are being handled correctly. I can assure you this is not a trivial task.

OG alternatives have always been there, and choosing the right tool for the problem is important. Group is actually solving a subset of the challenges OG deals with. If it works for you, go ahead and use it. I know you’ll be in good hands with it because Group’s author @kristiaanvandeneynde is a great person and a wonderful developer.

Message stack

The heroes: @RoySegall@jhedstrom@mccrodp et al.

The message stack is mostly ported to D8, and it has already reached a good place. I’m still not cutting an alpha release, because it requires polishing and might have a few data structure changes.

There are no big differences here in terms of concepts, although worth mentioning @bojanz’s suggestion to rename message type to message template. Suddenly it makes it much clearer what the intention of message template is.

If you would like to contribute you are most welcome to the repos: MessageMessage notify and Message subscribe

 

Load more 501
Load more 502
Load more 503
Load more 504
Load more 505
Load more 506
Load more 507
Load more 508
Load more 509
Load more 510
Load more 511
Load more 512
Load more 513
Load more 514
Load more 515
Load more 516
Load more 517
Load more 518
Load more 519
Load more 520
Load more 521
Load more 522
Load more 523
Load more 524
Load more 525
Load more 526
Load more 527
Load more 528
Load more 529
Load more 530
Load more 531
Load more 532
Load more 533
Load more 534
Load more 535
Load more 536
Load more 537
Load more 538
Load more 539
Load more 540
Load more 541
Load more 542
Load more 543
Load more 544
Load more 545
Load more 546
Load more 547
Load more 548
Load more 549
Load more 550
Load more 551
Load more 552
Load more 553
Load more 554
Load more 555
Load more 556
Load more 557
Load more 558
Load more 559
Load more 560
Load more 561
Load more 562
Load more 563
Load more 564
Load more 565
Load more 566
Load more 567
Load more 568
Load more 569
Load more 570
Load more 571
Load more 572
Load more 573
Load more 574
Load more 575
Load more 576
Load more 577
Load more 578
Load more 579
Load more 580
Load more 581
Load more 582
Load more 583
Load more 584
Load more 585
Load more 586
Load more 587
Load more 588
Load more 589
Load more 590
Load more 591
Load more 592
Load more 593
Load more 594
Load more 595
Load more 596
Load more 597
Load more 598
Load more 599
Load more 600
Load more 601
Load more 602
Load more 603
Load more 604
Load more 605
Load more 606
Load more 607
Load more 608
Load more 609
Load more 610
Load more 611
Load more 612
Load more 613
Load more 614
Load more 615
Load more 616
Load more 617
Load more 618
Load more 619
Load more 620
Load more 621
Load more 622
Load more 623
Load more 624
Load more 625
Load more 626
Load more 627
Load more 628
Load more 629
Load more 630
Load more 631
Load more 632
Load more 633
Load more 634
Load more 635
Load more 636
Load more 637
Load more 638
Load more 639
Load more 640
Load more 641
Load more 642
Load more 643
Load more 644
Load more 645
Load more 646
Load more 647
Load more 648
Load more 649
Load more 650
Load more 651
Load more 652
Load more 653
Load more 654
Load more 655
Load more 656
Load more 657
Load more 658
Load more 659
Load more 660
Load more 661
Load more 662
Load more 663
Load more 664
Load more 665
Load more 666
Load more 667
Load more 668
Load more 669
Load more 670
Load more 671
Load more 672
Load more 673
Load more 674
Load more 675
Load more 676
Load more 677
Load more 678
Load more 679
Load more 680
Load more 681
Load more 682
Load more 683
Load more 684
Load more 685
Load more 686
Load more 687
Load more 688
Load more 689
Load more 690
Load more 691
Load more 692
Load more 693
Load more 694
Load more 695
Load more 696
Load more 697
Load more 698
Load more 699
Load more 700
Load more 701
Load more 702
Load more 703
Load more 704
Load more 705
Load more 706
Load more 707
Load more 708
Load more 709
Load more 710
Load more 711
Load more 712
Load more 713
Load more 714
Load more 715
Load more 716
Load more 717
Load more 718
Load more 719
Load more 720
Load more 721
Load more 722
Load more 723
Load more 724
Load more 725
Load more 726
Load more 727
Load more 728
Load more 729
Load more 730
Load more 731
Load more 732
Load more 733
Load more 734
Load more 735
Load more 736
Load more 737
Load more 738
Load more 739
Load more 740
Load more 741
Load more 742
Load more 743
Load more 744
Load more 745
Load more 746
Load more 747
Load more 748
Load more 749
Load more 750
Load more 751
Load more 752
Load more 753
Load more 754
Load more 755
Load more 756
Load more 757
Load more 758
Load more 759
Load more 760
Load more 761
Load more 762
Load more 763
Load more 764
Load more 765
Load more 766
Load more 767
Load more 768
Load more 769
Load more 770
Load more 771
Load more 772
Load more 773
Load more 774
Load more 775
Load more 776
Load more 777
Load more 778
Load more 779
Load more 780
Load more 781
Load more 782
Load more 783
Load more 784
Load more 785
Load more 786
Load more 787
Load more 788
Load more 789
Load more 790
Load more 791
Load more 792
Load more 793
Load more 794
Load more 795
Load more 796
Load more 797
Load more 798
Load more 799
Load more 800
Load more 801
Load more 802
Load more 803
Load more 804
Load more 805
Load more 806
Load more 807
Load more 808
Load more 809
Load more 810
Load more 811
Load more 812
Load more 813
Load more 814
Load more 815
Load more 816
Load more 817
Load more 818
Load more 819
Load more 820
Load more 821
Load more 822
Load more 823
Load more 824
Load more 825
Load more 826
Load more 827
Load more 828
Load more 829
Load more 830
Load more 831
Load more 832
Load more 833
Load more 834
Load more 835
Load more 836
Load more 837
Load more 838
Load more 839
Load more 840
Load more 841
Load more 842
Load more 843
Load more 844
Load more 845
Load more 846
Load more 847
Load more 848
Load more 849
Load more 850
Load more 851
Load more 852
Load more 853
Load more 854
Load more 855
Load more 856
Load more 857
Load more 858
Load more 859
Load more 860
Load more 861
Load more 862
Load more 863
Load more 864
Load more 865
Load more 866
Load more 867
Load more 868
Load more 869
Load more 870
Load more 871
Load more 872
Load more 873
Load more 874
Load more 875
Load more 876
Load more 877
Load more 878
Load more 879
Load more 880
Load more 881
Load more 882
Load more 883
Load more 884
Load more 885
Load more 886
Load more 887
Load more 888
Load more 889
Load more 890
Load more 891
Load more 892
Load more 893
Load more 894
Load more 895
Load more 896
Load more 897
Load more 898
Load more 899
Load more 900
Load more 901
Load more 902
Load more 903
Load more 904
Load more 905
Load more 906
Load more 907
Load more 908
Load more 909
Load more 910
Load more 911
Load more 912
Load more 913
Load more 914
Load more 915
Load more 916
Load more 917
Load more 918
Load more 919
Load more 920
Load more 921
Load more 922
Load more 923
Load more 924
Load more 925
Load more 926
Load more 927
Load more 928
Load more 929
Load more 930
Load more 931
Load more 932
Load more 933
Load more 934
Load more 935
Load more 936
Load more 937
Load more 938
Load more 939
Load more 940
Load more 941
Load more 942
Load more 943
Load more 944
Load more 945
Load more 946
Load more 947
Load more 948
Load more 949
Load more 950
Load more 951
Load more 952
Load more 953
Load more 954
Load more 955
Load more 956
Load more 957
Load more 958
Load more 959
Load more 960
Load more 961
Load more 962
Load more 963
Load more 964
Load more 965
Load more 966
Load more 967
Load more 968
Load more 969
Load more 970
Load more 971
Load more 972
Load more 973
Load more 974
Load more 975
Load more 976
Load more 977
Load more 978
Load more 979
Load more 980
Load more 981
Load more 982
Load more 983
Load more 984
Load more 985
Load more 986
Load more 987
Load more 988
Load more 989
Load more 990
Load more 991
Load more 992
Load more 993
Load more 994
Load more 995
Load more 996
Load more 997
Load more 998
Load more 999
Load more 1000

BUILD ROBUST FORMS IN DRUPAL 8

Building Robust Forms with Drupal 8

Over the last few Drupal releases, the Webform module has been the standard for creating robust forms and surveys. While this venerable module has served the community’s needs quite well, major releases of Drupal often afford the opportunity to take a fresh look at how common problems are solved, leveraging new technologies and concepts introduced in the release.

Baked into Core

Since Drupal 4.6, Drupal Core has shipped with a basic contact form module that had limited functionality. Finally, the contact module got some much-needed attention in Drupal 8. Contact forms are now fieldable entities, allowing us to build forms with the same fields we build content types, taxonomies, and other entities with.

Building Out the Form

Forms are created and managed by navigating to Structure->Contact Forms in the Admin menu. From here, choose “Add contact form.”

Drupal 8 Contact Form Admin

This takes us to a form for setting the name of the form, email addresses for submissions to be sent to, and optionally an auto-reply message to the submitter. Once saved, we are taken back to the Contact Forms admin page.

Add Contact Form

This gives us a basic form with Sender Name and Email, a Subject field, and a basic text area for a Message. To add fields to our new form, we need to select the “Manage Fields” option in the Operations dropdown. From here, we can add any of the field types available on the site.

Add fields

Form Display

To customize how the form is displayed, we want to select the “Manage Form Display” option in the Operations dropdown. This will allow us to change the order of the fields for the form, change configurations for each field, and allow us to disable any fields that are provided by default that we don’t want to use.

Form Display Admin

Manage Display

Similar to Form Display, if we want to change the order and display of fields in the submission emails, using the “Manage Display” option will allow us reorder or hide fields from showing in the submission email.

Display Admin
Submission Storage and Export

Everything we’ve covered so far is great if we want to build out a form and start getting submissions by email. However, if we want to save and view submissions in the site or want to export the submissions in bulk, we need to look to some contributed modules to fill in the gaps.

Contact Storage Module

As its name implies, the Contact Storage module addresses the need for a central location from which content editors can review and manage form submissions on the site. The module also provides Views integration as well as some additional customization options for our forms. The default configuration provides these features for us, so we can install the module and start benefitting from it immediately.

Submission Exports

We now have robust forms and a place to centrally store their submissions, with Views giving us the ability to build out lists of submissions. What we’re still missing at this point is a way to download the submissions in bulk, and it’s fairly common to want such an export in a format like CSV that can be loaded into a spreadsheet application. To achieve that, we can put our Views integration to use, along with Drupal 8’s REST Module, and the CSV Serialization module.

 

 

Load more 1
Load more 2
Load more 3
Load more 4
Load more 5
Load more 6
Load more 7
Load more 8
Load more 9
Load more 10
Load more 11
Load more 12
Load more 13
Load more 14
Load more 15
Load more 16
Load more 17
Load more 18
Load more 19
Load more 20
Load more 21
Load more 22
Load more 23
Load more 24
Load more 25
Load more 26
Load more 27
Load more 28
Load more 29
Load more 30
Load more 31
Load more 32
Load more 33
Load more 34
Load more 35
Load more 36
Load more 37
Load more 38
Load more 39
Load more 40
Load more 41
Load more 42
Load more 43
Load more 44
Load more 45
Load more 46
Load more 47
Load more 48
Load more 49
Load more 50
Load more 51
Load more 52
Load more 53
Load more 54
Load more 55
Load more 56
Load more 57
Load more 58
Load more 59
Load more 60
Load more 61
Load more 62
Load more 63
Load more 64
Load more 65
Load more 66
Load more 67
Load more 68
Load more 69
Load more 70
Load more 71
Load more 72
Load more 73
Load more 74
Load more 75
Load more 76
Load more 77
Load more 78
Load more 79
Load more 80
Load more 81
Load more 82
Load more 83
Load more 84
Load more 85
Load more 86
Load more 87
Load more 88
Load more 89
Load more 90
Load more 91
Load more 92
Load more 93
Load more 94
Load more 95
Load more 96
Load more 97
Load more 98
Load more 99
Load more 100
Load more 101
Load more 102
Load more 103
Load more 104
Load more 105
Load more 106
Load more 107
Load more 108
Load more 109
Load more 110
Load more 111
Load more 112
Load more 113
Load more 114
Load more 115
Load more 116
Load more 117
Load more 118
Load more 119
Load more 120
Load more 121
Load more 122
Load more 123
Load more 124
Load more 125
Load more 126
Load more 127
Load more 128
Load more 129
Load more 130
Load more 131
Load more 132
Load more 133
Load more 134
Load more 135
Load more 136
Load more 137
Load more 138
Load more 139
Load more 140
Load more 141
Load more 142
Load more 143
Load more 144
Load more 145
Load more 146
Load more 147
Load more 148
Load more 149
Load more 150
Load more 151
Load more 152
Load more 153
Load more 154
Load more 155
Load more 156
Load more 157
Load more 158
Load more 159
Load more 160
Load more 161
Load more 162
Load more 163
Load more 164
Load more 165
Load more 166
Load more 167
Load more 168
Load more 169
Load more 170
Load more 171
Load more 172
Load more 173
Load more 174
Load more 175
Load more 176
Load more 177
Load more 178
Load more 179
Load more 180
Load more 181
Load more 182
Load more 183
Load more 184
Load more 185
Load more 186
Load more 187
Load more 188
Load more 189
Load more 190
Load more 191
Load more 192
Load more 193
Load more 194
Load more 195
Load more 196
Load more 197
Load more 198
Load more 199
Load more 200
Load more 201
Load more 202
Load more 203
Load more 204
Load more 205
Load more 206
Load more 207
Load more 208
Load more 209
Load more 210
Load more 211
Load more 212
Load more 213
Load more 214
Load more 215
Load more 216
Load more 217
Load more 218
Load more 219
Load more 220
Load more 221
Load more 222
Load more 223
Load more 224
Load more 225
Load more 226
Load more 227
Load more 228
Load more 229
Load more 230
Load more 231
Load more 232
Load more 233
Load more 234
Load more 235
Load more 236
Load more 237
Load more 238
Load more 239
Load more 240
Load more 241
Load more 242
Load more 243
Load more 244
Load more 245
Load more 246
Load more 247
Load more 248
Load more 249
Load more 250
Load more 251
Load more 252
Load more 253
Load more 254
Load more 255
Load more 256
Load more 257
Load more 258
Load more 259
Load more 260
Load more 261
Load more 262
Load more 263
Load more 264
Load more 265
Load more 266
Load more 267
Load more 268
Load more 269
Load more 270
Load more 271
Load more 272
Load more 273
Load more 274
Load more 275
Load more 276
Load more 277
Load more 278
Load more 279
Load more 280
Load more 281
Load more 282
Load more 283
Load more 284
Load more 285
Load more 286
Load more 287
Load more 288
Load more 289
Load more 290
Load more 291
Load more 292
Load more 293
Load more 294
Load more 295
Load more 296
Load more 297
Load more 298
Load more 299
Load more 300
Load more 301
Load more 302
Load more 303
Load more 304
Load more 305
Load more 306
Load more 307
Load more 308
Load more 309
Load more 310
Load more 311
Load more 312
Load more 313
Load more 314
Load more 315
Load more 316
Load more 317
Load more 318
Load more 319
Load more 320
Load more 321
Load more 322
Load more 323
Load more 324
Load more 325
Load more 326
Load more 327
Load more 328
Load more 329
Load more 330
Load more 331
Load more 332
Load more 333
Load more 334
Load more 335
Load more 336
Load more 337
Load more 338
Load more 339
Load more 340
Load more 341
Load more 342
Load more 343
Load more 344
Load more 345
Load more 346
Load more 347
Load more 348
Load more 349
Load more 350
Load more 351
Load more 352
Load more 353
Load more 354
Load more 355
Load more 356
Load more 357
Load more 358
Load more 359
Load more 360
Load more 361
Load more 362
Load more 363
Load more 364
Load more 365
Load more 366
Load more 367
Load more 368
Load more 369
Load more 370
Load more 371
Load more 372
Load more 373
Load more 374
Load more 375
Load more 376
Load more 377
Load more 378
Load more 379
Load more 380
Load more 381
Load more 382
Load more 383
Load more 384
Load more 385
Load more 386
Load more 387
Load more 388
Load more 389
Load more 390
Load more 391
Load more 392
Load more 393
Load more 394
Load more 395
Load more 396
Load more 397
Load more 398
Load more 399
Load more 400
Load more 401
Load more 402
Load more 403
Load more 404
Load more 405
Load more 406
Load more 407
Load more 408
Load more 409
Load more 410
Load more 411
Load more 412
Load more 413
Load more 414
Load more 415
Load more 416
Load more 417
Load more 418
Load more 419
Load more 420
Load more 421
Load more 422
Load more 423
Load more 424
Load more 425
Load more 426
Load more 427
Load more 428
Load more 429
Load more 430
Load more 431
Load more 432
Load more 433
Load more 434
Load more 435
Load more 436
Load more 437
Load more 438
Load more 439
Load more 440
Load more 441
Load more 442
Load more 443
Load more 444
Load more 445
Load more 446
Load more 447
Load more 448
Load more 449
Load more 450
Load more 451
Load more 452
Load more 453
Load more 454
Load more 455
Load more 456
Load more 457
Load more 458
Load more 459
Load more 460
Load more 461
Load more 462
Load more 463
Load more 464
Load more 465
Load more 466
Load more 467
Load more 468
Load more 469
Load more 470
Load more 471
Load more 472
Load more 473
Load more 474
Load more 475
Load more 476
Load more 477
Load more 478
Load more 479
Load more 480
Load more 481
Load more 482
Load more 483
Load more 484
Load more 485
Load more 486
Load more 487
Load more 488
Load more 489
Load more 490
Load more 491
Load more 492
Load more 493
Load more 494
Load more 495
Load more 496
Load more 497
Load more 498
Load more 499
Load more 500

Drupal 8 Module (Distro!) of the Week: Lightning

What does the Lightning distribution do?

“The Lightning Distro gives developers a starter kit for building great authoring experiences in Drupal 8,” explains product owner, John Kennedy. “By combining Layout, Media, Workflow and Preview capabilities into a single distribution, we’re able to offer a simplified, consistent authoring experience. By making choices about how these features are implemented, commitments to maintaining the distro, upgradability, and a suite of automated tests, we also offer an easier build and a reduced maintenance burden for developers.”

As of Lightning’s 1.0 GA release in June, 2016, there are nearly 400 sites running Lightning including, appropriately, the Acquia Lightning homepage! Visit lightning.acquia.com for instructions on installing Lightning with Composer, upgrade documentation, roadmap information, and more.

Acquia Lightning's homepage: lightning.acquia.com

Why is the Lightning distribution important to developers?

“Lightning gives developers a fast onramp to Drupal 8. Choosing modules can be time-consuming; it can be hard to decide which technical approaches to take, especially while also learning a new system like Drupal 8. Lightning gives you a minimal, pre-selected set of authoring functionalities, powered by a carefully chosen, pre-configured and documented set of modules to include in your build.”

Beyond this, Lightning provides a lightweight framework for further extension that is tightly coupled with Drupal 8’s design patterns and functionality. John continues, “We don’t try to provide absolutely everything out-of-the-box. This is a faster way to a great authoring and publishing experience built with Drupal.” Lightning comes ready to be used in continuous integration workflows. It includes more than 60 automated tests covering its major functionality. This gives developers a much more solid base to work with than an entirely custom, one-off selection of contributed modules with limited or unknown test coverage. It makes Lightning a ‘safer’ environment for further extension and development.

According to John, Lightning is somewhere in between the framework- and the product-distros of the world. Panopoly, for example, is more of a foundation for site building that specifically addresses layouts. While Thunder, built and maintained by Hubert Burda Media, is an example of an “out-of-the-box” product distro for publishers.

“We focus on developers first,” John is adamant, “This is our advantage … and yours as a developer or content author. Authoring experiences in Lighting, even complicated or sophisticated ones, will be easier to configure. And developers can focus on what their authors and businesses need.”

“We try not to put anything in Lightning that needs to be undone by a developer.” That’s a frequent concern of developers when they approach distributions. Some distributions have (or have had) certain modules or burdensome configurations that developers have to undo before they can use them. “We try to stick to Drupal and the modules contained in our distribution. This is Drupal, great Drupal, faster … That’s our hope.” Furthermore, John clarifies that Lightning won’t interact “destructively” with other modules. For example, the Display Suite Module isn’t in Lightning even though the team expects many users of the distro to use it.

What value does the Lightning distro provide to site owners and businesses?

When you work with a site built on top of Lightning, you get the extensive functionality and flexibility of Drupal 8 core, with the added benefit of great working experiences in the following areas … and Lightning even lets you activate and use only a selection of its functionality. If you don’t need it all to start with, it’ll still be there for you if and when you do.

 

 

 

Bitcoin Blogs 4501
Bitcoin Blogs 4502
Bitcoin Blogs 4503
Bitcoin Blogs 4504
Bitcoin Blogs 4505
Bitcoin Blogs 4506
Bitcoin Blogs 4507
Bitcoin Blogs 4508
Bitcoin Blogs 4509
Bitcoin Blogs 4510
Bitcoin Blogs 4511
Bitcoin Blogs 4512
Bitcoin Blogs 4513
Bitcoin Blogs 4514
Bitcoin Blogs 4515
Bitcoin Blogs 4516
Bitcoin Blogs 4517
Bitcoin Blogs 4518
Bitcoin Blogs 4519
Bitcoin Blogs 4520
Bitcoin Blogs 4521
Bitcoin Blogs 4522
Bitcoin Blogs 4523
Bitcoin Blogs 4524
Bitcoin Blogs 4525
Bitcoin Blogs 4526
Bitcoin Blogs 4527
Bitcoin Blogs 4528
Bitcoin Blogs 4529
Bitcoin Blogs 4530
Bitcoin Blogs 4531
Bitcoin Blogs 4532
Bitcoin Blogs 4533
Bitcoin Blogs 4534
Bitcoin Blogs 4535
Bitcoin Blogs 4536
Bitcoin Blogs 4537
Bitcoin Blogs 4538
Bitcoin Blogs 4539
Bitcoin Blogs 4540
Bitcoin Blogs 4541
Bitcoin Blogs 4542
Bitcoin Blogs 4543
Bitcoin Blogs 4544
Bitcoin Blogs 4545
Bitcoin Blogs 4546
Bitcoin Blogs 4547
Bitcoin Blogs 4548
Bitcoin Blogs 4549
Bitcoin Blogs 4550
Bitcoin Blogs 4551
Bitcoin Blogs 4552
Bitcoin Blogs 4553
Bitcoin Blogs 4554
Bitcoin Blogs 4555
Bitcoin Blogs 4556
Bitcoin Blogs 4557
Bitcoin Blogs 4558
Bitcoin Blogs 4559
Bitcoin Blogs 4560
Bitcoin Blogs 4561
Bitcoin Blogs 4562
Bitcoin Blogs 4563
Bitcoin Blogs 4564
Bitcoin Blogs 4565
Bitcoin Blogs 4566
Bitcoin Blogs 4567
Bitcoin Blogs 4568
Bitcoin Blogs 4569
Bitcoin Blogs 4570
Bitcoin Blogs 4571
Bitcoin Blogs 4572
Bitcoin Blogs 4573
Bitcoin Blogs 4574
Bitcoin Blogs 4575
Bitcoin Blogs 4576
Bitcoin Blogs 4577
Bitcoin Blogs 4578
Bitcoin Blogs 4579
Bitcoin Blogs 4580
Bitcoin Blogs 4581
Bitcoin Blogs 4582
Bitcoin Blogs 4583
Bitcoin Blogs 4584
Bitcoin Blogs 4585
Bitcoin Blogs 4586
Bitcoin Blogs 4587
Bitcoin Blogs 4588
Bitcoin Blogs 4589
Bitcoin Blogs 4590
Bitcoin Blogs 4591
Bitcoin Blogs 4592
Bitcoin Blogs 4593
Bitcoin Blogs 4594
Bitcoin Blogs 4595
Bitcoin Blogs 4596
Bitcoin Blogs 4597
Bitcoin Blogs 4598
Bitcoin Blogs 4599
Bitcoin Blogs 4600
Bitcoin Blogs 4601
Bitcoin Blogs 4602
Bitcoin Blogs 4603
Bitcoin Blogs 4604
Bitcoin Blogs 4605
Bitcoin Blogs 4606
Bitcoin Blogs 4607
Bitcoin Blogs 4608
Bitcoin Blogs 4609
Bitcoin Blogs 4610
Bitcoin Blogs 4611
Bitcoin Blogs 4612
Bitcoin Blogs 4613
Bitcoin Blogs 4614
Bitcoin Blogs 4615
Bitcoin Blogs 4616
Bitcoin Blogs 4617
Bitcoin Blogs 4618
Bitcoin Blogs 4619
Bitcoin Blogs 4620
Bitcoin Blogs 4621
Bitcoin Blogs 4622
Bitcoin Blogs 4623
Bitcoin Blogs 4624
Bitcoin Blogs 4625
Bitcoin Blogs 4626
Bitcoin Blogs 4627
Bitcoin Blogs 4628
Bitcoin Blogs 4629
Bitcoin Blogs 4630
Bitcoin Blogs 4631
Bitcoin Blogs 4632
Bitcoin Blogs 4633
Bitcoin Blogs 4634
Bitcoin Blogs 4635
Bitcoin Blogs 4636
Bitcoin Blogs 4637
Bitcoin Blogs 4638
Bitcoin Blogs 4639
Bitcoin Blogs 4640
Bitcoin Blogs 4641
Bitcoin Blogs 4642
Bitcoin Blogs 4643
Bitcoin Blogs 4644
Bitcoin Blogs 4645
Bitcoin Blogs 4646
Bitcoin Blogs 4647
Bitcoin Blogs 4648
Bitcoin Blogs 4649
Bitcoin Blogs 4650
Bitcoin Blogs 4651
Bitcoin Blogs 4652
Bitcoin Blogs 4653
Bitcoin Blogs 4654
Bitcoin Blogs 4655
Bitcoin Blogs 4656
Bitcoin Blogs 4657
Bitcoin Blogs 4658
Bitcoin Blogs 4659
Bitcoin Blogs 4660
Bitcoin Blogs 4661
Bitcoin Blogs 4662
Bitcoin Blogs 4663
Bitcoin Blogs 4664
Bitcoin Blogs 4665
Bitcoin Blogs 4666
Bitcoin Blogs 4667
Bitcoin Blogs 4668
Bitcoin Blogs 4669
Bitcoin Blogs 4670
Bitcoin Blogs 4671
Bitcoin Blogs 4672
Bitcoin Blogs 4673
Bitcoin Blogs 4674
Bitcoin Blogs 4675
Bitcoin Blogs 4676
Bitcoin Blogs 4677
Bitcoin Blogs 4678
Bitcoin Blogs 4679
Bitcoin Blogs 4680
Bitcoin Blogs 4681
Bitcoin Blogs 4682
Bitcoin Blogs 4683
Bitcoin Blogs 4684
Bitcoin Blogs 4685
Bitcoin Blogs 4686
Bitcoin Blogs 4687
Bitcoin Blogs 4688
Bitcoin Blogs 4689
Bitcoin Blogs 4690
Bitcoin Blogs 4691
Bitcoin Blogs 4692
Bitcoin Blogs 4693
Bitcoin Blogs 4694
Bitcoin Blogs 4695
Bitcoin Blogs 4696
Bitcoin Blogs 4697
Bitcoin Blogs 4698
Bitcoin Blogs 4699
Bitcoin Blogs 4700
Bitcoin Blogs 4701
Bitcoin Blogs 4702
Bitcoin Blogs 4703
Bitcoin Blogs 4704
Bitcoin Blogs 4705
Bitcoin Blogs 4706
Bitcoin Blogs 4707
Bitcoin Blogs 4708
Bitcoin Blogs 4709
Bitcoin Blogs 4710
Bitcoin Blogs 4711
Bitcoin Blogs 4712
Bitcoin Blogs 4713
Bitcoin Blogs 4714
Bitcoin Blogs 4715
Bitcoin Blogs 4716
Bitcoin Blogs 4717
Bitcoin Blogs 4718
Bitcoin Blogs 4719
Bitcoin Blogs 4720
Bitcoin Blogs 4721
Bitcoin Blogs 4722
Bitcoin Blogs 4723
Bitcoin Blogs 4724
Bitcoin Blogs 4725
Bitcoin Blogs 4726
Bitcoin Blogs 4727
Bitcoin Blogs 4728
Bitcoin Blogs 4729
Bitcoin Blogs 4730
Bitcoin Blogs 4731
Bitcoin Blogs 4732
Bitcoin Blogs 4733
Bitcoin Blogs 4734
Bitcoin Blogs 4735
Bitcoin Blogs 4736
Bitcoin Blogs 4737
Bitcoin Blogs 4738
Bitcoin Blogs 4739
Bitcoin Blogs 4740
Bitcoin Blogs 4741
Bitcoin Blogs 4742
Bitcoin Blogs 4743
Bitcoin Blogs 4744
Bitcoin Blogs 4745
Bitcoin Blogs 4746
Bitcoin Blogs 4747
Bitcoin Blogs 4748
Bitcoin Blogs 4749
Bitcoin Blogs 4750
Bitcoin Blogs 4751
Bitcoin Blogs 4752
Bitcoin Blogs 4753
Bitcoin Blogs 4754
Bitcoin Blogs 4755
Bitcoin Blogs 4756
Bitcoin Blogs 4757
Bitcoin Blogs 4758
Bitcoin Blogs 4759
Bitcoin Blogs 4760
Bitcoin Blogs 4761
Bitcoin Blogs 4762
Bitcoin Blogs 4763
Bitcoin Blogs 4764
Bitcoin Blogs 4765
Bitcoin Blogs 4766
Bitcoin Blogs 4767
Bitcoin Blogs 4768
Bitcoin Blogs 4769
Bitcoin Blogs 4770
Bitcoin Blogs 4771
Bitcoin Blogs 4772
Bitcoin Blogs 4773
Bitcoin Blogs 4774
Bitcoin Blogs 4775
Bitcoin Blogs 4776
Bitcoin Blogs 4777
Bitcoin Blogs 4778
Bitcoin Blogs 4779
Bitcoin Blogs 4780
Bitcoin Blogs 4781
Bitcoin Blogs 4782
Bitcoin Blogs 4783
Bitcoin Blogs 4784
Bitcoin Blogs 4785
Bitcoin Blogs 4786
Bitcoin Blogs 4787
Bitcoin Blogs 4788
Bitcoin Blogs 4789
Bitcoin Blogs 4790
Bitcoin Blogs 4791
Bitcoin Blogs 4792
Bitcoin Blogs 4793
Bitcoin Blogs 4794
Bitcoin Blogs 4795
Bitcoin Blogs 4796
Bitcoin Blogs 4797
Bitcoin Blogs 4798
Bitcoin Blogs 4799
Bitcoin Blogs 4800
Bitcoin Blogs 4801
Bitcoin Blogs 4802
Bitcoin Blogs 4803
Bitcoin Blogs 4804
Bitcoin Blogs 4805
Bitcoin Blogs 4806
Bitcoin Blogs 4807
Bitcoin Blogs 4808
Bitcoin Blogs 4809
Bitcoin Blogs 4810
Bitcoin Blogs 4811
Bitcoin Blogs 4812
Bitcoin Blogs 4813
Bitcoin Blogs 4814
Bitcoin Blogs 4815
Bitcoin Blogs 4816
Bitcoin Blogs 4817
Bitcoin Blogs 4818
Bitcoin Blogs 4819
Bitcoin Blogs 4820
Bitcoin Blogs 4821
Bitcoin Blogs 4822
Bitcoin Blogs 4823
Bitcoin Blogs 4824
Bitcoin Blogs 4825
Bitcoin Blogs 4826
Bitcoin Blogs 4827
Bitcoin Blogs 4828
Bitcoin Blogs 4829
Bitcoin Blogs 4830
Bitcoin Blogs 4831
Bitcoin Blogs 4832
Bitcoin Blogs 4833
Bitcoin Blogs 4834
Bitcoin Blogs 4835
Bitcoin Blogs 4836
Bitcoin Blogs 4837
Bitcoin Blogs 4838
Bitcoin Blogs 4839
Bitcoin Blogs 4840
Bitcoin Blogs 4841
Bitcoin Blogs 4842
Bitcoin Blogs 4843
Bitcoin Blogs 4844
Bitcoin Blogs 4845
Bitcoin Blogs 4846
Bitcoin Blogs 4847
Bitcoin Blogs 4848
Bitcoin Blogs 4849
Bitcoin Blogs 4850
Bitcoin Blogs 4851
Bitcoin Blogs 4852
Bitcoin Blogs 4853
Bitcoin Blogs 4854
Bitcoin Blogs 4855
Bitcoin Blogs 4856
Bitcoin Blogs 4857
Bitcoin Blogs 4858
Bitcoin Blogs 4859
Bitcoin Blogs 4860
Bitcoin Blogs 4861
Bitcoin Blogs 4862
Bitcoin Blogs 4863
Bitcoin Blogs 4864
Bitcoin Blogs 4865
Bitcoin Blogs 4866
Bitcoin Blogs 4867
Bitcoin Blogs 4868
Bitcoin Blogs 4869
Bitcoin Blogs 4870

How to write a PHPUnit functional test for Drupal 8

Step 1: Create a Fixture

To quote the PHPUnit manual:

One of the most time-consuming parts of writing tests is writing the code to set the world up in a known state and then return it to its original state when the test is complete. This known state is called the fixture of the test.

In the case of testing a Drupal migration, the fixture is a database agnostic[1] representation of the data source to be migrated. According to the convention set out in core, the file should be created in the following location: modules/[module_name]/tests/fixtures and the file name should reference the version of Drupal core to which it applies, e.g. drupal7.php. It mainly consists of createTable() and insert() commands that form the dataset.

The db-tools.php command line application can be used to automate the creation of a fixture file. This was used in core to create the fixture files for the migrate_drupal module. To find out more, I recommend reading the drupal.org article entitled Generating database fixtures for D8 Migrate tests.

Alternatively you can write the fixture file manually – if doing so, core/modules/migrate_drupal/tests/fixtures/drupal7.php is a good point of reference.

Here is an (admittedly convoluted) example of a fixture file:


/**
 * @file
 * A database agnostic dump for testing purposes.
 */
    
use Drupal\Core\Database\Database;
    
$connection = Database::getConnection();
    
$connection->schema()->createTable('example', array(
  'fields' => array(
  'id' => array(
    'type' => 'serial',
    'not null' => TRUE,
   ),
   'name' => array(
     'type' => 'varchar',
     'not null' => TRUE,
     'length' => '255',
     'default' => '',
    ),
    'weight' => array(
       'type' => 'int',
        'not null' => TRUE,
        'default' => '0',
      ),
    ),
    'primary key' => array(
       'id',
     ),
    'mysql_character_set' => 'utf8',
));
    
$connection->insert('example')
->fields(array(
  'id',
  'name',
  'weight',
))
->values(array(
   'id' => '1',
   'name' => 'General discussion',
   'weight' => '2',
))
->values(array(
   'id' => '2',
   'name' => 'Term1',
   'weight' => '0',
))
->execute();

The snippet above creates one table (example) containing 3 fields (id, name, weight) and then inserts two records into it. Depending on the complexity of the test, a fixture file could include any number of tables each containing enough rows to cater for each facet that needs to be tested.

Step 2: Create the test file

This is the file that will contain the method to set up and run the test(s).

The file structure of test files is important, our example would be created in modules/[module_name]/tests/src/Kernel/Migrate/d7. It is located in the Kernel directory because it is a functional test – this is explained in more details in the drupal.org Automated tests article. It is then organised into the Migrate directory (obviously because it is a migration test). For more details on the location of test files read the drupal.org article on PHPUnit file structure, namespace, and required metadata.

The file name (and contained class) should end in “Test” and for migration tests should begin with “Migrate” (according to Drupal core convention). In our example the file will be called MigrateExampleTest.php and will initially contain the following:


namespace Drupal\Tests\example\Kernel\Migrate\d7;
    
use Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase;
    
/**
 * Tests 'example' migration.
 *
 * @group example
 */
class MigrateExampleTest extends MigrateDrupalTestBase {
    
  static $modules = ['example'];
    
  /**
   * {@inheritdoc}
   */
   protected function setUp() {
      parent::setUp();
   }
    
  /**
   * Test 'example' migration from Drupal 7 to 8.
   */
   public function testExample() {
        
   }
}

The class name should match the file name, in this case MigrateExampleTest. A straightforward test class should extend MigrateDrupalTestBase, but a more complicated test class could extend MigrateDrupal7TestBase which provides access to the migrate_drupal fixture including a well-populated database.

 

 

Bitcoin Blogs 4001
Bitcoin Blogs 4002
Bitcoin Blogs 4003
Bitcoin Blogs 4004
Bitcoin Blogs 4005
Bitcoin Blogs 4006
Bitcoin Blogs 4007
Bitcoin Blogs 4008
Bitcoin Blogs 4009
Bitcoin Blogs 4010
Bitcoin Blogs 4011
Bitcoin Blogs 4012
Bitcoin Blogs 4013
Bitcoin Blogs 4014
Bitcoin Blogs 4015
Bitcoin Blogs 4016
Bitcoin Blogs 4017
Bitcoin Blogs 4018
Bitcoin Blogs 4019
Bitcoin Blogs 4020
Bitcoin Blogs 4021
Bitcoin Blogs 4022
Bitcoin Blogs 4023
Bitcoin Blogs 4024
Bitcoin Blogs 4025
Bitcoin Blogs 4026
Bitcoin Blogs 4027
Bitcoin Blogs 4028
Bitcoin Blogs 4029
Bitcoin Blogs 4030
Bitcoin Blogs 4031
Bitcoin Blogs 4032
Bitcoin Blogs 4033
Bitcoin Blogs 4034
Bitcoin Blogs 4035
Bitcoin Blogs 4036
Bitcoin Blogs 4037
Bitcoin Blogs 4038
Bitcoin Blogs 4039
Bitcoin Blogs 4040
Bitcoin Blogs 4041
Bitcoin Blogs 4042
Bitcoin Blogs 4043
Bitcoin Blogs 4044
Bitcoin Blogs 4045
Bitcoin Blogs 4046
Bitcoin Blogs 4047
Bitcoin Blogs 4048
Bitcoin Blogs 4049
Bitcoin Blogs 4050
Bitcoin Blogs 4051
Bitcoin Blogs 4052
Bitcoin Blogs 4053
Bitcoin Blogs 4054
Bitcoin Blogs 4055
Bitcoin Blogs 4056
Bitcoin Blogs 4057
Bitcoin Blogs 4058
Bitcoin Blogs 4059
Bitcoin Blogs 4060
Bitcoin Blogs 4061
Bitcoin Blogs 4062
Bitcoin Blogs 4063
Bitcoin Blogs 4064
Bitcoin Blogs 4065
Bitcoin Blogs 4066
Bitcoin Blogs 4067
Bitcoin Blogs 4068
Bitcoin Blogs 4069
Bitcoin Blogs 4070
Bitcoin Blogs 4071
Bitcoin Blogs 4072
Bitcoin Blogs 4073
Bitcoin Blogs 4074
Bitcoin Blogs 4075
Bitcoin Blogs 4076
Bitcoin Blogs 4077
Bitcoin Blogs 4078
Bitcoin Blogs 4079
Bitcoin Blogs 4080
Bitcoin Blogs 4081
Bitcoin Blogs 4082
Bitcoin Blogs 4083
Bitcoin Blogs 4084
Bitcoin Blogs 4085
Bitcoin Blogs 4086
Bitcoin Blogs 4087
Bitcoin Blogs 4088
Bitcoin Blogs 4089
Bitcoin Blogs 4090
Bitcoin Blogs 4091
Bitcoin Blogs 4092
Bitcoin Blogs 4093
Bitcoin Blogs 4094
Bitcoin Blogs 4095
Bitcoin Blogs 4096
Bitcoin Blogs 4097
Bitcoin Blogs 4098
Bitcoin Blogs 4099
Bitcoin Blogs 4100
Bitcoin Blogs 4101
Bitcoin Blogs 4102
Bitcoin Blogs 4103
Bitcoin Blogs 4104
Bitcoin Blogs 4105
Bitcoin Blogs 4106
Bitcoin Blogs 4107
Bitcoin Blogs 4108
Bitcoin Blogs 4109
Bitcoin Blogs 4110
Bitcoin Blogs 4111
Bitcoin Blogs 4112
Bitcoin Blogs 4113
Bitcoin Blogs 4114
Bitcoin Blogs 4115
Bitcoin Blogs 4116
Bitcoin Blogs 4117
Bitcoin Blogs 4118
Bitcoin Blogs 4119
Bitcoin Blogs 4120
Bitcoin Blogs 4121
Bitcoin Blogs 4122
Bitcoin Blogs 4123
Bitcoin Blogs 4124
Bitcoin Blogs 4125
Bitcoin Blogs 4126
Bitcoin Blogs 4127
Bitcoin Blogs 4128
Bitcoin Blogs 4129
Bitcoin Blogs 4130
Bitcoin Blogs 4131
Bitcoin Blogs 4132
Bitcoin Blogs 4133
Bitcoin Blogs 4134
Bitcoin Blogs 4135
Bitcoin Blogs 4136
Bitcoin Blogs 4137
Bitcoin Blogs 4138
Bitcoin Blogs 4139
Bitcoin Blogs 4140
Bitcoin Blogs 4141
Bitcoin Blogs 4142
Bitcoin Blogs 4143
Bitcoin Blogs 4144
Bitcoin Blogs 4145
Bitcoin Blogs 4146
Bitcoin Blogs 4147
Bitcoin Blogs 4148
Bitcoin Blogs 4149
Bitcoin Blogs 4150
Bitcoin Blogs 4151
Bitcoin Blogs 4152
Bitcoin Blogs 4153
Bitcoin Blogs 4154
Bitcoin Blogs 4155
Bitcoin Blogs 4156
Bitcoin Blogs 4157
Bitcoin Blogs 4158
Bitcoin Blogs 4159
Bitcoin Blogs 4160
Bitcoin Blogs 4161
Bitcoin Blogs 4162
Bitcoin Blogs 4163
Bitcoin Blogs 4164
Bitcoin Blogs 4165
Bitcoin Blogs 4166
Bitcoin Blogs 4167
Bitcoin Blogs 4168
Bitcoin Blogs 4169
Bitcoin Blogs 4170
Bitcoin Blogs 4171
Bitcoin Blogs 4172
Bitcoin Blogs 4173
Bitcoin Blogs 4174
Bitcoin Blogs 4175
Bitcoin Blogs 4176
Bitcoin Blogs 4177
Bitcoin Blogs 4178
Bitcoin Blogs 4179
Bitcoin Blogs 4180
Bitcoin Blogs 4181
Bitcoin Blogs 4182
Bitcoin Blogs 4183
Bitcoin Blogs 4184
Bitcoin Blogs 4185
Bitcoin Blogs 4186
Bitcoin Blogs 4187
Bitcoin Blogs 4188
Bitcoin Blogs 4189
Bitcoin Blogs 4190
Bitcoin Blogs 4191
Bitcoin Blogs 4192
Bitcoin Blogs 4193
Bitcoin Blogs 4194
Bitcoin Blogs 4195
Bitcoin Blogs 4196
Bitcoin Blogs 4197
Bitcoin Blogs 4198
Bitcoin Blogs 4199
Bitcoin Blogs 4200
Bitcoin Blogs 4201
Bitcoin Blogs 4202
Bitcoin Blogs 4203
Bitcoin Blogs 4204
Bitcoin Blogs 4205
Bitcoin Blogs 4206
Bitcoin Blogs 4207
Bitcoin Blogs 4208
Bitcoin Blogs 4209
Bitcoin Blogs 4210
Bitcoin Blogs 4211
Bitcoin Blogs 4212
Bitcoin Blogs 4213
Bitcoin Blogs 4214
Bitcoin Blogs 4215
Bitcoin Blogs 4216
Bitcoin Blogs 4217
Bitcoin Blogs 4218
Bitcoin Blogs 4219
Bitcoin Blogs 4220
Bitcoin Blogs 4221
Bitcoin Blogs 4222
Bitcoin Blogs 4223
Bitcoin Blogs 4224
Bitcoin Blogs 4225
Bitcoin Blogs 4226
Bitcoin Blogs 4227
Bitcoin Blogs 4228
Bitcoin Blogs 4229
Bitcoin Blogs 4230
Bitcoin Blogs 4231
Bitcoin Blogs 4232
Bitcoin Blogs 4233
Bitcoin Blogs 4234
Bitcoin Blogs 4235
Bitcoin Blogs 4236
Bitcoin Blogs 4237
Bitcoin Blogs 4238
Bitcoin Blogs 4239
Bitcoin Blogs 4240
Bitcoin Blogs 4241
Bitcoin Blogs 4242
Bitcoin Blogs 4243
Bitcoin Blogs 4244
Bitcoin Blogs 4245
Bitcoin Blogs 4246
Bitcoin Blogs 4247
Bitcoin Blogs 4248
Bitcoin Blogs 4249
Bitcoin Blogs 4250
Bitcoin Blogs 4251
Bitcoin Blogs 4252
Bitcoin Blogs 4253
Bitcoin Blogs 4254
Bitcoin Blogs 4255
Bitcoin Blogs 4256
Bitcoin Blogs 4257
Bitcoin Blogs 4258
Bitcoin Blogs 4259
Bitcoin Blogs 4260
Bitcoin Blogs 4261
Bitcoin Blogs 4262
Bitcoin Blogs 4263
Bitcoin Blogs 4264
Bitcoin Blogs 4265
Bitcoin Blogs 4266
Bitcoin Blogs 4267
Bitcoin Blogs 4268
Bitcoin Blogs 4269
Bitcoin Blogs 4270
Bitcoin Blogs 4271
Bitcoin Blogs 4272
Bitcoin Blogs 4273
Bitcoin Blogs 4274
Bitcoin Blogs 4275
Bitcoin Blogs 4276
Bitcoin Blogs 4277
Bitcoin Blogs 4278
Bitcoin Blogs 4279
Bitcoin Blogs 4280
Bitcoin Blogs 4281
Bitcoin Blogs 4282
Bitcoin Blogs 4283
Bitcoin Blogs 4284
Bitcoin Blogs 4285
Bitcoin Blogs 4286
Bitcoin Blogs 4287
Bitcoin Blogs 4288
Bitcoin Blogs 4289
Bitcoin Blogs 4290
Bitcoin Blogs 4291
Bitcoin Blogs 4292
Bitcoin Blogs 4293
Bitcoin Blogs 4294
Bitcoin Blogs 4295
Bitcoin Blogs 4296
Bitcoin Blogs 4297
Bitcoin Blogs 4298
Bitcoin Blogs 4299
Bitcoin Blogs 4300
Bitcoin Blogs 4301
Bitcoin Blogs 4302
Bitcoin Blogs 4303
Bitcoin Blogs 4304
Bitcoin Blogs 4305
Bitcoin Blogs 4306
Bitcoin Blogs 4307
Bitcoin Blogs 4308
Bitcoin Blogs 4309
Bitcoin Blogs 4310
Bitcoin Blogs 4311
Bitcoin Blogs 4312
Bitcoin Blogs 4313
Bitcoin Blogs 4314
Bitcoin Blogs 4315
Bitcoin Blogs 4316
Bitcoin Blogs 4317
Bitcoin Blogs 4318
Bitcoin Blogs 4319
Bitcoin Blogs 4320
Bitcoin Blogs 4321
Bitcoin Blogs 4322
Bitcoin Blogs 4323
Bitcoin Blogs 4324
Bitcoin Blogs 4325
Bitcoin Blogs 4326
Bitcoin Blogs 4327
Bitcoin Blogs 4328
Bitcoin Blogs 4329
Bitcoin Blogs 4330
Bitcoin Blogs 4331
Bitcoin Blogs 4332
Bitcoin Blogs 4333
Bitcoin Blogs 4334
Bitcoin Blogs 4335
Bitcoin Blogs 4336
Bitcoin Blogs 4337
Bitcoin Blogs 4338
Bitcoin Blogs 4339
Bitcoin Blogs 4340
Bitcoin Blogs 4341
Bitcoin Blogs 4342
Bitcoin Blogs 4343
Bitcoin Blogs 4344
Bitcoin Blogs 4345
Bitcoin Blogs 4346
Bitcoin Blogs 4347
Bitcoin Blogs 4348
Bitcoin Blogs 4349
Bitcoin Blogs 4350
Bitcoin Blogs 4351
Bitcoin Blogs 4352
Bitcoin Blogs 4353
Bitcoin Blogs 4354
Bitcoin Blogs 4355
Bitcoin Blogs 4356
Bitcoin Blogs 4357
Bitcoin Blogs 4358
Bitcoin Blogs 4359
Bitcoin Blogs 4360
Bitcoin Blogs 4361
Bitcoin Blogs 4362
Bitcoin Blogs 4363
Bitcoin Blogs 4364
Bitcoin Blogs 4365
Bitcoin Blogs 4366
Bitcoin Blogs 4367
Bitcoin Blogs 4368
Bitcoin Blogs 4369
Bitcoin Blogs 4370
Bitcoin Blogs 4371
Bitcoin Blogs 4372
Bitcoin Blogs 4373
Bitcoin Blogs 4374
Bitcoin Blogs 4375
Bitcoin Blogs 4376
Bitcoin Blogs 4377
Bitcoin Blogs 4378
Bitcoin Blogs 4379
Bitcoin Blogs 4380
Bitcoin Blogs 4381
Bitcoin Blogs 4382
Bitcoin Blogs 4383
Bitcoin Blogs 4384
Bitcoin Blogs 4385
Bitcoin Blogs 4386
Bitcoin Blogs 4387
Bitcoin Blogs 4388
Bitcoin Blogs 4389
Bitcoin Blogs 4390
Bitcoin Blogs 4391
Bitcoin Blogs 4392
Bitcoin Blogs 4393
Bitcoin Blogs 4394
Bitcoin Blogs 4395
Bitcoin Blogs 4396
Bitcoin Blogs 4397
Bitcoin Blogs 4398
Bitcoin Blogs 4399
Bitcoin Blogs 4400
Bitcoin Blogs 4401
Bitcoin Blogs 4402
Bitcoin Blogs 4403
Bitcoin Blogs 4404
Bitcoin Blogs 4405
Bitcoin Blogs 4406
Bitcoin Blogs 4407
Bitcoin Blogs 4408
Bitcoin Blogs 4409
Bitcoin Blogs 4410
Bitcoin Blogs 4411
Bitcoin Blogs 4412
Bitcoin Blogs 4413
Bitcoin Blogs 4414
Bitcoin Blogs 4415
Bitcoin Blogs 4416
Bitcoin Blogs 4417
Bitcoin Blogs 4418
Bitcoin Blogs 4419
Bitcoin Blogs 4420
Bitcoin Blogs 4421
Bitcoin Blogs 4422
Bitcoin Blogs 4423
Bitcoin Blogs 4424
Bitcoin Blogs 4425
Bitcoin Blogs 4426
Bitcoin Blogs 4427
Bitcoin Blogs 4428
Bitcoin Blogs 4429
Bitcoin Blogs 4430
Bitcoin Blogs 4431
Bitcoin Blogs 4432
Bitcoin Blogs 4433
Bitcoin Blogs 4434
Bitcoin Blogs 4435
Bitcoin Blogs 4436
Bitcoin Blogs 4437
Bitcoin Blogs 4438
Bitcoin Blogs 4439
Bitcoin Blogs 4440
Bitcoin Blogs 4441
Bitcoin Blogs 4442
Bitcoin Blogs 4443
Bitcoin Blogs 4444
Bitcoin Blogs 4445
Bitcoin Blogs 4446
Bitcoin Blogs 4447
Bitcoin Blogs 4448
Bitcoin Blogs 4449
Bitcoin Blogs 4450
Bitcoin Blogs 4451
Bitcoin Blogs 4452
Bitcoin Blogs 4453
Bitcoin Blogs 4454
Bitcoin Blogs 4455
Bitcoin Blogs 4456
Bitcoin Blogs 4457
Bitcoin Blogs 4458
Bitcoin Blogs 4459
Bitcoin Blogs 4460
Bitcoin Blogs 4461
Bitcoin Blogs 4462
Bitcoin Blogs 4463
Bitcoin Blogs 4464
Bitcoin Blogs 4465
Bitcoin Blogs 4466
Bitcoin Blogs 4467
Bitcoin Blogs 4468
Bitcoin Blogs 4469
Bitcoin Blogs 4470
Bitcoin Blogs 4471
Bitcoin Blogs 4472
Bitcoin Blogs 4473
Bitcoin Blogs 4474
Bitcoin Blogs 4475
Bitcoin Blogs 4476
Bitcoin Blogs 4477
Bitcoin Blogs 4478
Bitcoin Blogs 4479
Bitcoin Blogs 4480
Bitcoin Blogs 4481
Bitcoin Blogs 4482
Bitcoin Blogs 4483
Bitcoin Blogs 4484
Bitcoin Blogs 4485
Bitcoin Blogs 4486
Bitcoin Blogs 4487
Bitcoin Blogs 4488
Bitcoin Blogs 4489
Bitcoin Blogs 4490
Bitcoin Blogs 4491
Bitcoin Blogs 4492
Bitcoin Blogs 4493
Bitcoin Blogs 4494
Bitcoin Blogs 4495
Bitcoin Blogs 4496
Bitcoin Blogs 4497
Bitcoin Blogs 4498
Bitcoin Blogs 4499
Bitcoin Blogs 4500

Debug Site Performance Using Web Profiler in Drupal 8

In the beginning of any Drupal project the site loads very quickly because there aren’t many modules installed. But as you add modules, the performance of the site will become slower and slower.

There’s always a certain point in the project where you realize it’s time to look at the problem and see if it’s a rogue module or some dodgy code, we’ve all seen this.

Trying to debug a performance issue can be tedious work. But often, it comes down to having too many queries loaded on a page.

If you’re on Drupal 7, just enable query logging using the Devel module. This will show all the queries generated at the bottom of the page.

But for Drupal 8 we have something better: Web Profiler.

Fig 1.2

Web Profiler is a Drupal 8 port of the Symfony WebProfiler bundle. The port is possible because Drupal 8 uses Symfony components.

Web Profiler adds a toolbar at the bottom of every page and shows you all sorts of stats such as the amount of database queries loaded on the page, which services are used and much more.

Now there’re a few other ways to profile your Drupal site. A popular one is to use XHProf and Devel integrates with it. You also have the XHProf module.

In this tutorial, you’ll learn how to install and use Web Profiler.

Getting Started

Web Profiler used to be its own project. However, now it’s part of Devel.

Go download the Devel module then install the Web Profiler sub-module.

Fig 1.2

Below are the Drush and Drupal Console commands to download and install:

Drush:

$ drush dl devel
$ drush en webprofiler

Drupal Console:

$ drupal module:download devel --latest
$ drupal module:install webprofiler

Install Libraries

Add highlight.js and D3.js

As far as I can tell these two JavaScript libraries are optional. Web Profiler will still work even if you don’t have these installed.

Highlight.js is used, as you can guess, to add syntax highlighting to code. You can see it used when listing out database queries.

To add highlight.js, just head over to its download page and click on the Download button in the “Custom package” section. Then extract the downloaded zip file into /libraries/highlight so the path to the library is /libraries/highlight/highlight.pack.js.

D3.js is used when viewing the Timeline page.

Fig 1.2

To add D3, just go to its homepage and download the library by clicking on d3.zip. Extract the zip file copy the d3 folder into the /libraries directory so it’s /libraries/d3/d3.min.js.

Using Web Profiler

One thing I like about Web Profiler is that it’s easy to setup. Just install the module and the toolbar will appear on the page. Straightaway you’ll be able to see useful information such as the query count, memory usage and more.

Here are two useful items which’ll appear on the toolbar.

Timeline

Fig 1.2

This shows you the time it took to render the page and memory usage.

If you click on the Timeline item and see an empty page it means you haven’t finished configuring it. You’ll need to add D3 and some code to your settings.php. You can grab the code from the “Displaying Timeline” section.

 

Bitcoin Blogs 3501
Bitcoin Blogs 3502
Bitcoin Blogs 3503
Bitcoin Blogs 3504
Bitcoin Blogs 3505
Bitcoin Blogs 3506
Bitcoin Blogs 3507
Bitcoin Blogs 3508
Bitcoin Blogs 3509
Bitcoin Blogs 3510
Bitcoin Blogs 3511
Bitcoin Blogs 3512
Bitcoin Blogs 3513
Bitcoin Blogs 3514
Bitcoin Blogs 3515
Bitcoin Blogs 3516
Bitcoin Blogs 3517
Bitcoin Blogs 3518
Bitcoin Blogs 3519
Bitcoin Blogs 3520
Bitcoin Blogs 3521
Bitcoin Blogs 3522
Bitcoin Blogs 3523
Bitcoin Blogs 3524
Bitcoin Blogs 3525
Bitcoin Blogs 3526
Bitcoin Blogs 3527
Bitcoin Blogs 3528
Bitcoin Blogs 3529
Bitcoin Blogs 3530
Bitcoin Blogs 3531
Bitcoin Blogs 3532
Bitcoin Blogs 3533
Bitcoin Blogs 3534
Bitcoin Blogs 3535
Bitcoin Blogs 3536
Bitcoin Blogs 3537
Bitcoin Blogs 3538
Bitcoin Blogs 3539
Bitcoin Blogs 3540
Bitcoin Blogs 3541
Bitcoin Blogs 3542
Bitcoin Blogs 3543
Bitcoin Blogs 3544
Bitcoin Blogs 3545
Bitcoin Blogs 3546
Bitcoin Blogs 3547
Bitcoin Blogs 3548
Bitcoin Blogs 3549
Bitcoin Blogs 3550
Bitcoin Blogs 3551
Bitcoin Blogs 3552
Bitcoin Blogs 3553
Bitcoin Blogs 3554
Bitcoin Blogs 3555
Bitcoin Blogs 3556
Bitcoin Blogs 3557
Bitcoin Blogs 3558
Bitcoin Blogs 3559
Bitcoin Blogs 3560
Bitcoin Blogs 3561
Bitcoin Blogs 3562
Bitcoin Blogs 3563
Bitcoin Blogs 3564
Bitcoin Blogs 3565
Bitcoin Blogs 3566
Bitcoin Blogs 3567
Bitcoin Blogs 3568
Bitcoin Blogs 3569
Bitcoin Blogs 3570
Bitcoin Blogs 3571
Bitcoin Blogs 3572
Bitcoin Blogs 3573
Bitcoin Blogs 3574
Bitcoin Blogs 3575
Bitcoin Blogs 3576
Bitcoin Blogs 3577
Bitcoin Blogs 3578
Bitcoin Blogs 3579
Bitcoin Blogs 3580
Bitcoin Blogs 3581
Bitcoin Blogs 3582
Bitcoin Blogs 3583
Bitcoin Blogs 3584
Bitcoin Blogs 3585
Bitcoin Blogs 3586
Bitcoin Blogs 3587
Bitcoin Blogs 3588
Bitcoin Blogs 3589
Bitcoin Blogs 3590
Bitcoin Blogs 3591
Bitcoin Blogs 3592
Bitcoin Blogs 3593
Bitcoin Blogs 3594
Bitcoin Blogs 3595
Bitcoin Blogs 3596
Bitcoin Blogs 3597
Bitcoin Blogs 3598
Bitcoin Blogs 3599
Bitcoin Blogs 3600
Bitcoin Blogs 3601
Bitcoin Blogs 3602
Bitcoin Blogs 3603
Bitcoin Blogs 3604
Bitcoin Blogs 3605
Bitcoin Blogs 3606
Bitcoin Blogs 3607
Bitcoin Blogs 3608
Bitcoin Blogs 3609
Bitcoin Blogs 3610
Bitcoin Blogs 3611
Bitcoin Blogs 3612
Bitcoin Blogs 3613
Bitcoin Blogs 3614
Bitcoin Blogs 3615
Bitcoin Blogs 3616
Bitcoin Blogs 3617
Bitcoin Blogs 3618
Bitcoin Blogs 3619
Bitcoin Blogs 3620
Bitcoin Blogs 3621
Bitcoin Blogs 3622
Bitcoin Blogs 3623
Bitcoin Blogs 3624
Bitcoin Blogs 3625
Bitcoin Blogs 3626
Bitcoin Blogs 3627
Bitcoin Blogs 3628
Bitcoin Blogs 3629
Bitcoin Blogs 3630
Bitcoin Blogs 3631
Bitcoin Blogs 3632
Bitcoin Blogs 3633
Bitcoin Blogs 3634
Bitcoin Blogs 3635
Bitcoin Blogs 3636
Bitcoin Blogs 3637
Bitcoin Blogs 3638
Bitcoin Blogs 3639
Bitcoin Blogs 3640
Bitcoin Blogs 3641
Bitcoin Blogs 3642
Bitcoin Blogs 3643
Bitcoin Blogs 3644
Bitcoin Blogs 3645
Bitcoin Blogs 3646
Bitcoin Blogs 3647
Bitcoin Blogs 3648
Bitcoin Blogs 3649
Bitcoin Blogs 3650
Bitcoin Blogs 3651
Bitcoin Blogs 3652
Bitcoin Blogs 3653
Bitcoin Blogs 3654
Bitcoin Blogs 3655
Bitcoin Blogs 3656
Bitcoin Blogs 3657
Bitcoin Blogs 3658
Bitcoin Blogs 3659
Bitcoin Blogs 3660
Bitcoin Blogs 3661
Bitcoin Blogs 3662
Bitcoin Blogs 3663
Bitcoin Blogs 3664
Bitcoin Blogs 3665
Bitcoin Blogs 3666
Bitcoin Blogs 3667
Bitcoin Blogs 3668
Bitcoin Blogs 3669
Bitcoin Blogs 3670
Bitcoin Blogs 3671
Bitcoin Blogs 3672
Bitcoin Blogs 3673
Bitcoin Blogs 3674
Bitcoin Blogs 3675
Bitcoin Blogs 3676
Bitcoin Blogs 3677
Bitcoin Blogs 3678
Bitcoin Blogs 3679
Bitcoin Blogs 3680
Bitcoin Blogs 3681
Bitcoin Blogs 3682
Bitcoin Blogs 3683
Bitcoin Blogs 3684
Bitcoin Blogs 3685
Bitcoin Blogs 3686
Bitcoin Blogs 3687
Bitcoin Blogs 3688
Bitcoin Blogs 3689
Bitcoin Blogs 3690
Bitcoin Blogs 3691
Bitcoin Blogs 3692
Bitcoin Blogs 3693
Bitcoin Blogs 3694
Bitcoin Blogs 3695
Bitcoin Blogs 3696
Bitcoin Blogs 3697
Bitcoin Blogs 3698
Bitcoin Blogs 3699
Bitcoin Blogs 3700
Bitcoin Blogs 3701
Bitcoin Blogs 3702
Bitcoin Blogs 3703
Bitcoin Blogs 3704
Bitcoin Blogs 3705
Bitcoin Blogs 3706
Bitcoin Blogs 3707
Bitcoin Blogs 3708
Bitcoin Blogs 3709
Bitcoin Blogs 3710
Bitcoin Blogs 3711
Bitcoin Blogs 3712
Bitcoin Blogs 3713
Bitcoin Blogs 3714
Bitcoin Blogs 3715
Bitcoin Blogs 3716
Bitcoin Blogs 3717
Bitcoin Blogs 3718
Bitcoin Blogs 3719
Bitcoin Blogs 3720
Bitcoin Blogs 3721
Bitcoin Blogs 3722
Bitcoin Blogs 3723
Bitcoin Blogs 3724
Bitcoin Blogs 3725
Bitcoin Blogs 3726
Bitcoin Blogs 3727
Bitcoin Blogs 3728
Bitcoin Blogs 3729
Bitcoin Blogs 3730
Bitcoin Blogs 3731
Bitcoin Blogs 3732
Bitcoin Blogs 3733
Bitcoin Blogs 3734
Bitcoin Blogs 3735
Bitcoin Blogs 3736
Bitcoin Blogs 3737
Bitcoin Blogs 3738
Bitcoin Blogs 3739
Bitcoin Blogs 3740
Bitcoin Blogs 3741
Bitcoin Blogs 3742
Bitcoin Blogs 3743
Bitcoin Blogs 3744
Bitcoin Blogs 3745
Bitcoin Blogs 3746
Bitcoin Blogs 3747
Bitcoin Blogs 3748
Bitcoin Blogs 3749
Bitcoin Blogs 3750
Bitcoin Blogs 3751
Bitcoin Blogs 3752
Bitcoin Blogs 3753
Bitcoin Blogs 3754
Bitcoin Blogs 3755
Bitcoin Blogs 3756
Bitcoin Blogs 3757
Bitcoin Blogs 3758
Bitcoin Blogs 3759
Bitcoin Blogs 3760
Bitcoin Blogs 3761
Bitcoin Blogs 3762
Bitcoin Blogs 3763
Bitcoin Blogs 3764
Bitcoin Blogs 3765
Bitcoin Blogs 3766
Bitcoin Blogs 3767
Bitcoin Blogs 3768
Bitcoin Blogs 3769
Bitcoin Blogs 3770
Bitcoin Blogs 3771
Bitcoin Blogs 3772
Bitcoin Blogs 3773
Bitcoin Blogs 3774
Bitcoin Blogs 3775
Bitcoin Blogs 3776
Bitcoin Blogs 3777
Bitcoin Blogs 3778
Bitcoin Blogs 3779
Bitcoin Blogs 3780
Bitcoin Blogs 3781
Bitcoin Blogs 3782
Bitcoin Blogs 3783
Bitcoin Blogs 3784
Bitcoin Blogs 3785
Bitcoin Blogs 3786
Bitcoin Blogs 3787
Bitcoin Blogs 3788
Bitcoin Blogs 3789
Bitcoin Blogs 3790
Bitcoin Blogs 3791
Bitcoin Blogs 3792
Bitcoin Blogs 3793
Bitcoin Blogs 3794
Bitcoin Blogs 3795
Bitcoin Blogs 3796
Bitcoin Blogs 3797
Bitcoin Blogs 3798
Bitcoin Blogs 3799
Bitcoin Blogs 3800
Bitcoin Blogs 3801
Bitcoin Blogs 3802
Bitcoin Blogs 3803
Bitcoin Blogs 3804
Bitcoin Blogs 3805
Bitcoin Blogs 3806
Bitcoin Blogs 3807
Bitcoin Blogs 3808
Bitcoin Blogs 3809
Bitcoin Blogs 3810
Bitcoin Blogs 3811
Bitcoin Blogs 3812
Bitcoin Blogs 3813
Bitcoin Blogs 3814
Bitcoin Blogs 3815
Bitcoin Blogs 3816
Bitcoin Blogs 3817
Bitcoin Blogs 3818
Bitcoin Blogs 3819
Bitcoin Blogs 3820
Bitcoin Blogs 3821
Bitcoin Blogs 3822
Bitcoin Blogs 3823
Bitcoin Blogs 3824
Bitcoin Blogs 3825
Bitcoin Blogs 3826
Bitcoin Blogs 3827
Bitcoin Blogs 3828
Bitcoin Blogs 3829
Bitcoin Blogs 3830
Bitcoin Blogs 3831
Bitcoin Blogs 3832
Bitcoin Blogs 3833
Bitcoin Blogs 3834
Bitcoin Blogs 3835
Bitcoin Blogs 3836
Bitcoin Blogs 3837
Bitcoin Blogs 3838
Bitcoin Blogs 3839
Bitcoin Blogs 3840
Bitcoin Blogs 3841
Bitcoin Blogs 3842
Bitcoin Blogs 3843
Bitcoin Blogs 3844
Bitcoin Blogs 3845
Bitcoin Blogs 3846
Bitcoin Blogs 3847
Bitcoin Blogs 3848
Bitcoin Blogs 3849
Bitcoin Blogs 3850
Bitcoin Blogs 3851
Bitcoin Blogs 3852
Bitcoin Blogs 3853
Bitcoin Blogs 3854
Bitcoin Blogs 3855
Bitcoin Blogs 3856
Bitcoin Blogs 3857
Bitcoin Blogs 3858
Bitcoin Blogs 3859
Bitcoin Blogs 3860
Bitcoin Blogs 3861
Bitcoin Blogs 3862
Bitcoin Blogs 3863
Bitcoin Blogs 3864
Bitcoin Blogs 3865
Bitcoin Blogs 3866
Bitcoin Blogs 3867
Bitcoin Blogs 3868
Bitcoin Blogs 3869
Bitcoin Blogs 3870
Bitcoin Blogs 3871
Bitcoin Blogs 3872
Bitcoin Blogs 3873
Bitcoin Blogs 3874
Bitcoin Blogs 3875
Bitcoin Blogs 3876
Bitcoin Blogs 3877
Bitcoin Blogs 3878
Bitcoin Blogs 3879
Bitcoin Blogs 3880
Bitcoin Blogs 3881
Bitcoin Blogs 3882
Bitcoin Blogs 3883
Bitcoin Blogs 3884
Bitcoin Blogs 3885
Bitcoin Blogs 3886
Bitcoin Blogs 3887
Bitcoin Blogs 3888
Bitcoin Blogs 3889
Bitcoin Blogs 3890
Bitcoin Blogs 3891
Bitcoin Blogs 3892
Bitcoin Blogs 3893
Bitcoin Blogs 3894
Bitcoin Blogs 3895
Bitcoin Blogs 3896
Bitcoin Blogs 3897
Bitcoin Blogs 3898
Bitcoin Blogs 3899
Bitcoin Blogs 3900
Bitcoin Blogs 3901
Bitcoin Blogs 3902
Bitcoin Blogs 3903
Bitcoin Blogs 3904
Bitcoin Blogs 3905
Bitcoin Blogs 3906
Bitcoin Blogs 3907
Bitcoin Blogs 3908
Bitcoin Blogs 3909
Bitcoin Blogs 3910
Bitcoin Blogs 3911
Bitcoin Blogs 3912
Bitcoin Blogs 3913
Bitcoin Blogs 3914
Bitcoin Blogs 3915
Bitcoin Blogs 3916
Bitcoin Blogs 3917
Bitcoin Blogs 3918
Bitcoin Blogs 3919
Bitcoin Blogs 3920
Bitcoin Blogs 3921
Bitcoin Blogs 3922
Bitcoin Blogs 3923
Bitcoin Blogs 3924
Bitcoin Blogs 3925
Bitcoin Blogs 3926
Bitcoin Blogs 3927
Bitcoin Blogs 3928
Bitcoin Blogs 3929
Bitcoin Blogs 3930
Bitcoin Blogs 3931
Bitcoin Blogs 3932
Bitcoin Blogs 3933
Bitcoin Blogs 3934
Bitcoin Blogs 3935
Bitcoin Blogs 3936
Bitcoin Blogs 3937
Bitcoin Blogs 3938
Bitcoin Blogs 3939
Bitcoin Blogs 3940
Bitcoin Blogs 3941
Bitcoin Blogs 3942
Bitcoin Blogs 3943
Bitcoin Blogs 3944
Bitcoin Blogs 3945
Bitcoin Blogs 3946
Bitcoin Blogs 3947
Bitcoin Blogs 3948
Bitcoin Blogs 3949
Bitcoin Blogs 3950
Bitcoin Blogs 3951
Bitcoin Blogs 3952
Bitcoin Blogs 3953
Bitcoin Blogs 3954
Bitcoin Blogs 3955
Bitcoin Blogs 3956
Bitcoin Blogs 3957
Bitcoin Blogs 3958
Bitcoin Blogs 3959
Bitcoin Blogs 3960
Bitcoin Blogs 3961
Bitcoin Blogs 3962
Bitcoin Blogs 3963
Bitcoin Blogs 3964
Bitcoin Blogs 3965
Bitcoin Blogs 3966
Bitcoin Blogs 3967
Bitcoin Blogs 3968
Bitcoin Blogs 3969
Bitcoin Blogs 3970
Bitcoin Blogs 3971
Bitcoin Blogs 3972
Bitcoin Blogs 3973
Bitcoin Blogs 3974
Bitcoin Blogs 3975
Bitcoin Blogs 3976
Bitcoin Blogs 3977
Bitcoin Blogs 3978
Bitcoin Blogs 3979
Bitcoin Blogs 3980
Bitcoin Blogs 3981
Bitcoin Blogs 3982
Bitcoin Blogs 3983
Bitcoin Blogs 3984
Bitcoin Blogs 3985
Bitcoin Blogs 3986
Bitcoin Blogs 3987
Bitcoin Blogs 3988
Bitcoin Blogs 3989
Bitcoin Blogs 3990
Bitcoin Blogs 3991
Bitcoin Blogs 3992
Bitcoin Blogs 3993
Bitcoin Blogs 3994
Bitcoin Blogs 3995
Bitcoin Blogs 3996
Bitcoin Blogs 3997
Bitcoin Blogs 3998
Bitcoin Blogs 3999
Bitcoin Blogs 4000

Let’s debug in Drupal 8 !

It has been nearly 7 months since Drupal 8 first release and as a developer, I am still in the learning process. It can be hard sometimes to know what is going wrong with your code and how to solve it. I will tell you about few things to know on how to develop and debug Drupal 8 projects and continue learning, learning and learning !

Disabling cache

First of all, to avoid having a crazy terminal with thousands of drupal cr hits, you can disable Drupal caching during development. You need to copy and rename sites/example.settings.local.php file to sites/default/settings.local.php. Then uncomment/update some values:

  • uncomment this line to enable the “null cache service”:
$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml';
  • uncomment these lines to disable CSS/JS aggregation:
$config['system.performance']['css']['preprocess'] = FALSE;
$config['system.performance']['js']['preprocess'] = FALSE;
  • uncomment these lines to disable the render cache and the dynamic page cache:
$settings['cache']['bins']['render'] = 'cache.backend.null';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null';
  • you can allow test modules and themes to be installed if needed with:
$settings['extension_discovery_scan_tests'] = TRUE;

To include this file as part of Drupal’s settings file, open sites/default/settings.php file and uncomment these lines:

if (file_exists(__DIR__ . '/settings.local.php')) {
    include __DIR__ . '/settings.local.php';
}

Then, to disable Twig caching, open sites/development.services.yml file and add the following settings:

parameters:
    twig.config:
        debug: true
        auto_reload: true
        cache: false

Finally, rebuild the Drupal cache and it is done !

Displaying errors

As in Drupal 7, you can set different levels of errors display (by visiting this page: /admin/config/development/logging in the administration interface):

  • None
  • Errors and warnings
  • All

In Drupal 8, there is a fourth level called “All messages, with backtrace information”. This is native to Drupal core and it allows to display the error backtrace in the message area.

You can also adjust the level of errors in your local setting file:

$config['system.logging']['error_level'] = 'verbose';

Creating log messages

Developers from Drupal 7 know the Database Logging module that allows to log messages in the database using the famous watchdog() function.

Well, this module still exists in Drupal 8 but the function has a replacement : the Drupal 8 logger class.

It looks like this:

// Logs an error
\Drupal::logger('my_module')->error($message);

Let’s have a look at the different parts of the code:

  • \Drupal::logger(‘my_module') is the helper method that quickly creates a copy of the logger service. As a parameter, it takes the module name from where we log the information;
  • ->error:this is the severity-level method (it can be debuginfonoticewarningerrorcriticalalertemergency);
  • $message is the log message. It can be a simple string or it can contain some placeholders. In this case, you can pass the associative array (placeholders as keys) as a second parameter.

All the messages created with the logger service can be viewed in the reports page of the administration interface in /admin/reports/dblog as it used to be in Drupal 7.

Debugging Twig templates

Drupal core comes with a theming debug mode that is really helpful for local environments. To enable it, copy-and-paste the following code into sites/default/services.yml file (if you haven’t already added these lines in development.services.yml):

parameters:
    twig.config:
        debug: true

Thanks to this mode, it will be easier to find out which portion of HTML code has been written in which templates: in the source code, you will see each part of Twig templates (pages, nodes, blocks, menus etc.) surrounded by HTML comments that contain the matching suggestion templates. The one in current use will be checked.

 

 

Bitcoin Blogs 3001
Bitcoin Blogs 3002
Bitcoin Blogs 3003
Bitcoin Blogs 3004
Bitcoin Blogs 3005
Bitcoin Blogs 3006
Bitcoin Blogs 3007
Bitcoin Blogs 3008
Bitcoin Blogs 3009
Bitcoin Blogs 3010
Bitcoin Blogs 3011
Bitcoin Blogs 3012
Bitcoin Blogs 3013
Bitcoin Blogs 3014
Bitcoin Blogs 3015
Bitcoin Blogs 3016
Bitcoin Blogs 3017
Bitcoin Blogs 3018
Bitcoin Blogs 3019
Bitcoin Blogs 3020
Bitcoin Blogs 3021
Bitcoin Blogs 3022
Bitcoin Blogs 3023
Bitcoin Blogs 3024
Bitcoin Blogs 3025
Bitcoin Blogs 3026
Bitcoin Blogs 3027
Bitcoin Blogs 3028
Bitcoin Blogs 3029
Bitcoin Blogs 3030
Bitcoin Blogs 3031
Bitcoin Blogs 3032
Bitcoin Blogs 3033
Bitcoin Blogs 3034
Bitcoin Blogs 3035
Bitcoin Blogs 3036
Bitcoin Blogs 3037
Bitcoin Blogs 3038
Bitcoin Blogs 3039
Bitcoin Blogs 3040
Bitcoin Blogs 3041
Bitcoin Blogs 3042
Bitcoin Blogs 3043
Bitcoin Blogs 3044
Bitcoin Blogs 3045
Bitcoin Blogs 3046
Bitcoin Blogs 3047
Bitcoin Blogs 3048
Bitcoin Blogs 3049
Bitcoin Blogs 3050
Bitcoin Blogs 3051
Bitcoin Blogs 3052
Bitcoin Blogs 3053
Bitcoin Blogs 3054
Bitcoin Blogs 3055
Bitcoin Blogs 3056
Bitcoin Blogs 3057
Bitcoin Blogs 3058
Bitcoin Blogs 3059
Bitcoin Blogs 3060
Bitcoin Blogs 3061
Bitcoin Blogs 3062
Bitcoin Blogs 3063
Bitcoin Blogs 3064
Bitcoin Blogs 3065
Bitcoin Blogs 3066
Bitcoin Blogs 3067
Bitcoin Blogs 3068
Bitcoin Blogs 3069
Bitcoin Blogs 3070
Bitcoin Blogs 3071
Bitcoin Blogs 3072
Bitcoin Blogs 3073
Bitcoin Blogs 3074
Bitcoin Blogs 3075
Bitcoin Blogs 3076
Bitcoin Blogs 3077
Bitcoin Blogs 3078
Bitcoin Blogs 3079
Bitcoin Blogs 3080
Bitcoin Blogs 3081
Bitcoin Blogs 3082
Bitcoin Blogs 3083
Bitcoin Blogs 3084
Bitcoin Blogs 3085
Bitcoin Blogs 3086
Bitcoin Blogs 3087
Bitcoin Blogs 3088
Bitcoin Blogs 3089
Bitcoin Blogs 3090
Bitcoin Blogs 3091
Bitcoin Blogs 3092
Bitcoin Blogs 3093
Bitcoin Blogs 3094
Bitcoin Blogs 3095
Bitcoin Blogs 3096
Bitcoin Blogs 3097
Bitcoin Blogs 3098
Bitcoin Blogs 3099
Bitcoin Blogs 3100
Bitcoin Blogs 3101
Bitcoin Blogs 3102
Bitcoin Blogs 3103
Bitcoin Blogs 3104
Bitcoin Blogs 3105
Bitcoin Blogs 3106
Bitcoin Blogs 3107
Bitcoin Blogs 3108
Bitcoin Blogs 3109
Bitcoin Blogs 3110
Bitcoin Blogs 3111
Bitcoin Blogs 3112
Bitcoin Blogs 3113
Bitcoin Blogs 3114
Bitcoin Blogs 3115
Bitcoin Blogs 3116
Bitcoin Blogs 3117
Bitcoin Blogs 3118
Bitcoin Blogs 3119
Bitcoin Blogs 3120
Bitcoin Blogs 3121
Bitcoin Blogs 3122
Bitcoin Blogs 3123
Bitcoin Blogs 3124
Bitcoin Blogs 3125
Bitcoin Blogs 3126
Bitcoin Blogs 3127
Bitcoin Blogs 3128
Bitcoin Blogs 3129
Bitcoin Blogs 3130
Bitcoin Blogs 3131
Bitcoin Blogs 3132
Bitcoin Blogs 3133
Bitcoin Blogs 3134
Bitcoin Blogs 3135
Bitcoin Blogs 3136
Bitcoin Blogs 3137
Bitcoin Blogs 3138
Bitcoin Blogs 3139
Bitcoin Blogs 3140
Bitcoin Blogs 3141
Bitcoin Blogs 3142
Bitcoin Blogs 3143
Bitcoin Blogs 3144
Bitcoin Blogs 3145
Bitcoin Blogs 3146
Bitcoin Blogs 3147
Bitcoin Blogs 3148
Bitcoin Blogs 3149
Bitcoin Blogs 3150
Bitcoin Blogs 3151
Bitcoin Blogs 3152
Bitcoin Blogs 3153
Bitcoin Blogs 3154
Bitcoin Blogs 3155
Bitcoin Blogs 3156
Bitcoin Blogs 3157
Bitcoin Blogs 3158
Bitcoin Blogs 3159
Bitcoin Blogs 3160
Bitcoin Blogs 3161
Bitcoin Blogs 3162
Bitcoin Blogs 3163
Bitcoin Blogs 3164
Bitcoin Blogs 3165
Bitcoin Blogs 3166
Bitcoin Blogs 3167
Bitcoin Blogs 3168
Bitcoin Blogs 3169
Bitcoin Blogs 3170
Bitcoin Blogs 3171
Bitcoin Blogs 3172
Bitcoin Blogs 3173
Bitcoin Blogs 3174
Bitcoin Blogs 3175
Bitcoin Blogs 3176
Bitcoin Blogs 3177
Bitcoin Blogs 3178
Bitcoin Blogs 3179
Bitcoin Blogs 3180
Bitcoin Blogs 3181
Bitcoin Blogs 3182
Bitcoin Blogs 3183
Bitcoin Blogs 3184
Bitcoin Blogs 3185
Bitcoin Blogs 3186
Bitcoin Blogs 3187
Bitcoin Blogs 3188
Bitcoin Blogs 3189
Bitcoin Blogs 3190
Bitcoin Blogs 3191
Bitcoin Blogs 3192
Bitcoin Blogs 3193
Bitcoin Blogs 3194
Bitcoin Blogs 3195
Bitcoin Blogs 3196
Bitcoin Blogs 3197
Bitcoin Blogs 3198
Bitcoin Blogs 3199
Bitcoin Blogs 3200
Bitcoin Blogs 3201
Bitcoin Blogs 3202
Bitcoin Blogs 3203
Bitcoin Blogs 3204
Bitcoin Blogs 3205
Bitcoin Blogs 3206
Bitcoin Blogs 3207
Bitcoin Blogs 3208
Bitcoin Blogs 3209
Bitcoin Blogs 3210
Bitcoin Blogs 3211
Bitcoin Blogs 3212
Bitcoin Blogs 3213
Bitcoin Blogs 3214
Bitcoin Blogs 3215
Bitcoin Blogs 3216
Bitcoin Blogs 3217
Bitcoin Blogs 3218
Bitcoin Blogs 3219
Bitcoin Blogs 3220
Bitcoin Blogs 3221
Bitcoin Blogs 3222
Bitcoin Blogs 3223
Bitcoin Blogs 3224
Bitcoin Blogs 3225
Bitcoin Blogs 3226
Bitcoin Blogs 3227
Bitcoin Blogs 3228
Bitcoin Blogs 3229
Bitcoin Blogs 3230
Bitcoin Blogs 3231
Bitcoin Blogs 3232
Bitcoin Blogs 3233
Bitcoin Blogs 3234
Bitcoin Blogs 3235
Bitcoin Blogs 3236
Bitcoin Blogs 3237
Bitcoin Blogs 3238
Bitcoin Blogs 3239
Bitcoin Blogs 3240
Bitcoin Blogs 3241
Bitcoin Blogs 3242
Bitcoin Blogs 3243
Bitcoin Blogs 3244
Bitcoin Blogs 3245
Bitcoin Blogs 3246
Bitcoin Blogs 3247
Bitcoin Blogs 3248
Bitcoin Blogs 3249
Bitcoin Blogs 3250
Bitcoin Blogs 3251
Bitcoin Blogs 3252
Bitcoin Blogs 3253
Bitcoin Blogs 3254
Bitcoin Blogs 3255
Bitcoin Blogs 3256
Bitcoin Blogs 3257
Bitcoin Blogs 3258
Bitcoin Blogs 3259
Bitcoin Blogs 3260
Bitcoin Blogs 3261
Bitcoin Blogs 3262
Bitcoin Blogs 3263
Bitcoin Blogs 3264
Bitcoin Blogs 3265
Bitcoin Blogs 3266
Bitcoin Blogs 3267
Bitcoin Blogs 3268
Bitcoin Blogs 3269
Bitcoin Blogs 3270
Bitcoin Blogs 3271
Bitcoin Blogs 3272
Bitcoin Blogs 3273
Bitcoin Blogs 3274
Bitcoin Blogs 3275
Bitcoin Blogs 3276
Bitcoin Blogs 3277
Bitcoin Blogs 3278
Bitcoin Blogs 3279
Bitcoin Blogs 3280
Bitcoin Blogs 3281
Bitcoin Blogs 3282
Bitcoin Blogs 3283
Bitcoin Blogs 3284
Bitcoin Blogs 3285
Bitcoin Blogs 3286
Bitcoin Blogs 3287
Bitcoin Blogs 3288
Bitcoin Blogs 3289
Bitcoin Blogs 3290
Bitcoin Blogs 3291
Bitcoin Blogs 3292
Bitcoin Blogs 3293
Bitcoin Blogs 3294
Bitcoin Blogs 3295
Bitcoin Blogs 3296
Bitcoin Blogs 3297
Bitcoin Blogs 3298
Bitcoin Blogs 3299
Bitcoin Blogs 3300
Bitcoin Blogs 3301
Bitcoin Blogs 3302
Bitcoin Blogs 3303
Bitcoin Blogs 3304
Bitcoin Blogs 3305
Bitcoin Blogs 3306
Bitcoin Blogs 3307
Bitcoin Blogs 3308
Bitcoin Blogs 3309
Bitcoin Blogs 3310
Bitcoin Blogs 3311
Bitcoin Blogs 3312
Bitcoin Blogs 3313
Bitcoin Blogs 3314
Bitcoin Blogs 3315
Bitcoin Blogs 3316
Bitcoin Blogs 3317
Bitcoin Blogs 3318
Bitcoin Blogs 3319
Bitcoin Blogs 3320
Bitcoin Blogs 3321
Bitcoin Blogs 3322
Bitcoin Blogs 3323
Bitcoin Blogs 3324
Bitcoin Blogs 3325
Bitcoin Blogs 3326
Bitcoin Blogs 3327
Bitcoin Blogs 3328
Bitcoin Blogs 3329
Bitcoin Blogs 3330
Bitcoin Blogs 3331
Bitcoin Blogs 3332
Bitcoin Blogs 3333
Bitcoin Blogs 3334
Bitcoin Blogs 3335
Bitcoin Blogs 3336
Bitcoin Blogs 3337
Bitcoin Blogs 3338
Bitcoin Blogs 3339
Bitcoin Blogs 3340
Bitcoin Blogs 3341
Bitcoin Blogs 3342
Bitcoin Blogs 3343
Bitcoin Blogs 3344
Bitcoin Blogs 3345
Bitcoin Blogs 3346
Bitcoin Blogs 3347
Bitcoin Blogs 3348
Bitcoin Blogs 3349
Bitcoin Blogs 3350
Bitcoin Blogs 3351
Bitcoin Blogs 3352
Bitcoin Blogs 3353
Bitcoin Blogs 3354
Bitcoin Blogs 3355
Bitcoin Blogs 3356
Bitcoin Blogs 3357
Bitcoin Blogs 3358
Bitcoin Blogs 3359
Bitcoin Blogs 3360
Bitcoin Blogs 3361
Bitcoin Blogs 3362
Bitcoin Blogs 3363
Bitcoin Blogs 3364
Bitcoin Blogs 3365
Bitcoin Blogs 3366
Bitcoin Blogs 3367
Bitcoin Blogs 3368
Bitcoin Blogs 3369
Bitcoin Blogs 3370
Bitcoin Blogs 3371
Bitcoin Blogs 3372
Bitcoin Blogs 3373
Bitcoin Blogs 3374
Bitcoin Blogs 3375
Bitcoin Blogs 3376
Bitcoin Blogs 3377
Bitcoin Blogs 3378
Bitcoin Blogs 3379
Bitcoin Blogs 3380
Bitcoin Blogs 3381
Bitcoin Blogs 3382
Bitcoin Blogs 3383
Bitcoin Blogs 3384
Bitcoin Blogs 3385
Bitcoin Blogs 3386
Bitcoin Blogs 3387
Bitcoin Blogs 3388
Bitcoin Blogs 3389
Bitcoin Blogs 3390
Bitcoin Blogs 3391
Bitcoin Blogs 3392
Bitcoin Blogs 3393
Bitcoin Blogs 3394
Bitcoin Blogs 3395
Bitcoin Blogs 3396
Bitcoin Blogs 3397
Bitcoin Blogs 3398
Bitcoin Blogs 3399
Bitcoin Blogs 3400
Bitcoin Blogs 3401
Bitcoin Blogs 3402
Bitcoin Blogs 3403
Bitcoin Blogs 3404
Bitcoin Blogs 3405
Bitcoin Blogs 3406
Bitcoin Blogs 3407
Bitcoin Blogs 3408
Bitcoin Blogs 3409
Bitcoin Blogs 3410
Bitcoin Blogs 3411
Bitcoin Blogs 3412
Bitcoin Blogs 3413
Bitcoin Blogs 3414
Bitcoin Blogs 3415
Bitcoin Blogs 3416
Bitcoin Blogs 3417
Bitcoin Blogs 3418
Bitcoin Blogs 3419
Bitcoin Blogs 3420
Bitcoin Blogs 3421
Bitcoin Blogs 3422
Bitcoin Blogs 3423
Bitcoin Blogs 3424
Bitcoin Blogs 3425
Bitcoin Blogs 3426
Bitcoin Blogs 3427
Bitcoin Blogs 3428
Bitcoin Blogs 3429
Bitcoin Blogs 3430
Bitcoin Blogs 3431
Bitcoin Blogs 3432
Bitcoin Blogs 3433
Bitcoin Blogs 3434
Bitcoin Blogs 3435
Bitcoin Blogs 3436
Bitcoin Blogs 3437
Bitcoin Blogs 3438
Bitcoin Blogs 3439
Bitcoin Blogs 3440
Bitcoin Blogs 3441
Bitcoin Blogs 3442
Bitcoin Blogs 3443
Bitcoin Blogs 3444
Bitcoin Blogs 3445
Bitcoin Blogs 3446
Bitcoin Blogs 3447
Bitcoin Blogs 3448
Bitcoin Blogs 3449
Bitcoin Blogs 3450
Bitcoin Blogs 3451
Bitcoin Blogs 3452
Bitcoin Blogs 3453
Bitcoin Blogs 3454
Bitcoin Blogs 3455
Bitcoin Blogs 3456
Bitcoin Blogs 3457
Bitcoin Blogs 3458
Bitcoin Blogs 3459
Bitcoin Blogs 3460
Bitcoin Blogs 3461
Bitcoin Blogs 3462
Bitcoin Blogs 3463
Bitcoin Blogs 3464
Bitcoin Blogs 3465
Bitcoin Blogs 3466
Bitcoin Blogs 3467
Bitcoin Blogs 3468
Bitcoin Blogs 3469
Bitcoin Blogs 3470
Bitcoin Blogs 3471
Bitcoin Blogs 3472
Bitcoin Blogs 3473
Bitcoin Blogs 3474
Bitcoin Blogs 3475
Bitcoin Blogs 3476
Bitcoin Blogs 3477
Bitcoin Blogs 3478
Bitcoin Blogs 3479
Bitcoin Blogs 3480
Bitcoin Blogs 3481
Bitcoin Blogs 3482
Bitcoin Blogs 3483
Bitcoin Blogs 3484
Bitcoin Blogs 3485
Bitcoin Blogs 3486
Bitcoin Blogs 3487
Bitcoin Blogs 3488
Bitcoin Blogs 3489
Bitcoin Blogs 3490
Bitcoin Blogs 3491
Bitcoin Blogs 3492
Bitcoin Blogs 3493
Bitcoin Blogs 3494
Bitcoin Blogs 3495
Bitcoin Blogs 3496
Bitcoin Blogs 3497
Bitcoin Blogs 3498
Bitcoin Blogs 3499
Bitcoin Blogs 3500

DIGGING INTO DRUPAL 8: CODE SNIPPETS FOR SITE BUILDERS

The more I work with Drupal 8, the more I realize how much has changed for developers in the Drupal community. While the transition to a modern, object-oriented system is what’s best for the longevity of the platform, it certainly doesn’t come without challenges. As someone who doesn’t come from an OOP background, I’ve found the transition difficult at times. In many cases, I know exactly what I want to do, just not how to do it the “Drupal 8 way”. On top of this, tutorials and blog posts on D8 are all over the map in terms of accuracy. Many posts written during D8’s development cycle are no longer applicable because of API changes, etc.

Below is a list of snippets that might be helpful to site builders or developers more familiar with D7 hooks and procedural. It might also be useful to OOP folks who are new to Drupal in general. My goal below is to add to and update these snippets over time.

ROUTES & LINKS

DETERMINE THE CURRENT DRUPAL ROUTE

Need to know what the current Drupal route is or need to run some logic against the current route? You can get the current route like so:

$route = Drupal::routeMatch()->getRouteName();

To some, the Drupal::routeMatch() syntax might look foreign (it did to me). Here’s a rundown of what’s happening here:

First, Drupal. This is calling the global Drupal class, which, in Drupal 8, is a bridge between procedural and OO methods of writing Drupal code. The following comes from the documentation:

This class acts as a unified global accessor to arbitrary services within the system in order to ease the transition from procedural code to injected OO code.

Right. Moving on to ::routeMatch(). Here we’re using the routeMatch() method which “Retrieves the currently active route match object.” Simple enough. But what is “::” all about? This StackOverflow answer helped me to understand what that’s all about.

From there, the getRouteName() method returns the current route name as a string. Here are some example routes: entity.node.canonicalview.frontpage and node.type_add.

IS THIS THE FRONT PAGE ROUTE?

Need to check if the current route is the front page route? There’s a service and method for that:

// Is the current route/path the front page?
if ($is_front = Drupal::service('path.matcher')->isFrontPage()) {}

Here we’re calling the path.matcher service (defined in /core/core.services.yml) and using the isFrontPage() method. For more on services, check out the “Services and Dependency Injection Container” documentation on api.drupal.org which helped me understand how all of these bits work together and the why of their structure.

GET THE REQUESTED PATH

Need to know what the current page’s requested path was, as opposed to the route? You can do this:

$current_uri = Drupal::request()->getRequestUri();

REDIRECT TO A SPECIFIC ROUTE

Need to redirect to a specific page? In Drupal 7, you would likely handle this with drupal_goto() in your page callback function. In Drupal 8, you can use RedirectResponse() for that. Here is the relevant changelog.

Here are some examples, borrowed heavily from said changelog. First, in procedural PHP:

use SymfonyComponentHttpFoundationRedirectResponse;

function my_redirect() {
  return new RedirectResponse(Drupal::url('user.page'));
}

Here is how you would use a Drupal 8 controller to accomplish the same thing:

use DrupalCoreControllerControllerBase;

class MyControllerClass extends ControllerBase {

  public function foo() {
    //...
    return $this->redirect('user.page');
  }
}

 

 

Bitcoin Blogs 2501
Bitcoin Blogs 2502
Bitcoin Blogs 2503
Bitcoin Blogs 2504
Bitcoin Blogs 2505
Bitcoin Blogs 2506
Bitcoin Blogs 2507
Bitcoin Blogs 2508
Bitcoin Blogs 2509
Bitcoin Blogs 2510
Bitcoin Blogs 2511
Bitcoin Blogs 2512
Bitcoin Blogs 2513
Bitcoin Blogs 2514
Bitcoin Blogs 2515
Bitcoin Blogs 2516
Bitcoin Blogs 2517
Bitcoin Blogs 2518
Bitcoin Blogs 2519
Bitcoin Blogs 2520
Bitcoin Blogs 2521
Bitcoin Blogs 2522
Bitcoin Blogs 2523
Bitcoin Blogs 2524
Bitcoin Blogs 2525
Bitcoin Blogs 2526
Bitcoin Blogs 2527
Bitcoin Blogs 2528
Bitcoin Blogs 2529
Bitcoin Blogs 2530
Bitcoin Blogs 2531
Bitcoin Blogs 2532
Bitcoin Blogs 2533
Bitcoin Blogs 2534
Bitcoin Blogs 2535
Bitcoin Blogs 2536
Bitcoin Blogs 2537
Bitcoin Blogs 2538
Bitcoin Blogs 2539
Bitcoin Blogs 2540
Bitcoin Blogs 2541
Bitcoin Blogs 2542
Bitcoin Blogs 2543
Bitcoin Blogs 2544
Bitcoin Blogs 2545
Bitcoin Blogs 2546
Bitcoin Blogs 2547
Bitcoin Blogs 2548
Bitcoin Blogs 2549
Bitcoin Blogs 2550
Bitcoin Blogs 2551
Bitcoin Blogs 2552
Bitcoin Blogs 2553
Bitcoin Blogs 2554
Bitcoin Blogs 2555
Bitcoin Blogs 2556
Bitcoin Blogs 2557
Bitcoin Blogs 2558
Bitcoin Blogs 2559
Bitcoin Blogs 2560
Bitcoin Blogs 2561
Bitcoin Blogs 2562
Bitcoin Blogs 2563
Bitcoin Blogs 2564
Bitcoin Blogs 2565
Bitcoin Blogs 2566
Bitcoin Blogs 2567
Bitcoin Blogs 2568
Bitcoin Blogs 2569
Bitcoin Blogs 2570
Bitcoin Blogs 2571
Bitcoin Blogs 2572
Bitcoin Blogs 2573
Bitcoin Blogs 2574
Bitcoin Blogs 2575
Bitcoin Blogs 2576
Bitcoin Blogs 2577
Bitcoin Blogs 2578
Bitcoin Blogs 2579
Bitcoin Blogs 2580
Bitcoin Blogs 2581
Bitcoin Blogs 2582
Bitcoin Blogs 2583
Bitcoin Blogs 2584
Bitcoin Blogs 2585
Bitcoin Blogs 2586
Bitcoin Blogs 2587
Bitcoin Blogs 2588
Bitcoin Blogs 2589
Bitcoin Blogs 2590
Bitcoin Blogs 2591
Bitcoin Blogs 2592
Bitcoin Blogs 2593
Bitcoin Blogs 2594
Bitcoin Blogs 2595
Bitcoin Blogs 2596
Bitcoin Blogs 2597
Bitcoin Blogs 2598
Bitcoin Blogs 2599
Bitcoin Blogs 2600
Bitcoin Blogs 2601
Bitcoin Blogs 2602
Bitcoin Blogs 2603
Bitcoin Blogs 2604
Bitcoin Blogs 2605
Bitcoin Blogs 2606
Bitcoin Blogs 2607
Bitcoin Blogs 2608
Bitcoin Blogs 2609
Bitcoin Blogs 2610
Bitcoin Blogs 2611
Bitcoin Blogs 2612
Bitcoin Blogs 2613
Bitcoin Blogs 2614
Bitcoin Blogs 2615
Bitcoin Blogs 2616
Bitcoin Blogs 2617
Bitcoin Blogs 2618
Bitcoin Blogs 2619
Bitcoin Blogs 2620
Bitcoin Blogs 2621
Bitcoin Blogs 2622
Bitcoin Blogs 2623
Bitcoin Blogs 2624
Bitcoin Blogs 2625
Bitcoin Blogs 2626
Bitcoin Blogs 2627
Bitcoin Blogs 2628
Bitcoin Blogs 2629
Bitcoin Blogs 2630
Bitcoin Blogs 2631
Bitcoin Blogs 2632
Bitcoin Blogs 2633
Bitcoin Blogs 2634
Bitcoin Blogs 2635
Bitcoin Blogs 2636
Bitcoin Blogs 2637
Bitcoin Blogs 2638
Bitcoin Blogs 2639
Bitcoin Blogs 2640
Bitcoin Blogs 2641
Bitcoin Blogs 2642
Bitcoin Blogs 2643
Bitcoin Blogs 2644
Bitcoin Blogs 2645
Bitcoin Blogs 2646
Bitcoin Blogs 2647
Bitcoin Blogs 2648
Bitcoin Blogs 2649
Bitcoin Blogs 2650
Bitcoin Blogs 2651
Bitcoin Blogs 2652
Bitcoin Blogs 2653
Bitcoin Blogs 2654
Bitcoin Blogs 2655
Bitcoin Blogs 2656
Bitcoin Blogs 2657
Bitcoin Blogs 2658
Bitcoin Blogs 2659
Bitcoin Blogs 2660
Bitcoin Blogs 2661
Bitcoin Blogs 2662
Bitcoin Blogs 2663
Bitcoin Blogs 2664
Bitcoin Blogs 2665
Bitcoin Blogs 2666
Bitcoin Blogs 2667
Bitcoin Blogs 2668
Bitcoin Blogs 2669
Bitcoin Blogs 2670
Bitcoin Blogs 2671
Bitcoin Blogs 2672
Bitcoin Blogs 2673
Bitcoin Blogs 2674
Bitcoin Blogs 2675
Bitcoin Blogs 2676
Bitcoin Blogs 2677
Bitcoin Blogs 2678
Bitcoin Blogs 2679
Bitcoin Blogs 2680
Bitcoin Blogs 2681
Bitcoin Blogs 2682
Bitcoin Blogs 2683
Bitcoin Blogs 2684
Bitcoin Blogs 2685
Bitcoin Blogs 2686
Bitcoin Blogs 2687
Bitcoin Blogs 2688
Bitcoin Blogs 2689
Bitcoin Blogs 2690
Bitcoin Blogs 2691
Bitcoin Blogs 2692
Bitcoin Blogs 2693
Bitcoin Blogs 2694
Bitcoin Blogs 2695
Bitcoin Blogs 2696
Bitcoin Blogs 2697
Bitcoin Blogs 2698
Bitcoin Blogs 2699
Bitcoin Blogs 2700
Bitcoin Blogs 2701
Bitcoin Blogs 2702
Bitcoin Blogs 2703
Bitcoin Blogs 2704
Bitcoin Blogs 2705
Bitcoin Blogs 2706
Bitcoin Blogs 2707
Bitcoin Blogs 2708
Bitcoin Blogs 2709
Bitcoin Blogs 2710
Bitcoin Blogs 2711
Bitcoin Blogs 2712
Bitcoin Blogs 2713
Bitcoin Blogs 2714
Bitcoin Blogs 2715
Bitcoin Blogs 2716
Bitcoin Blogs 2717
Bitcoin Blogs 2718
Bitcoin Blogs 2719
Bitcoin Blogs 2720
Bitcoin Blogs 2721
Bitcoin Blogs 2722
Bitcoin Blogs 2723
Bitcoin Blogs 2724
Bitcoin Blogs 2725
Bitcoin Blogs 2726
Bitcoin Blogs 2727
Bitcoin Blogs 2728
Bitcoin Blogs 2729
Bitcoin Blogs 2730
Bitcoin Blogs 2731
Bitcoin Blogs 2732
Bitcoin Blogs 2733
Bitcoin Blogs 2734
Bitcoin Blogs 2735
Bitcoin Blogs 2736
Bitcoin Blogs 2737
Bitcoin Blogs 2738
Bitcoin Blogs 2739
Bitcoin Blogs 2740
Bitcoin Blogs 2741
Bitcoin Blogs 2742
Bitcoin Blogs 2743
Bitcoin Blogs 2744
Bitcoin Blogs 2745
Bitcoin Blogs 2746
Bitcoin Blogs 2747
Bitcoin Blogs 2748
Bitcoin Blogs 2749
Bitcoin Blogs 2750
Bitcoin Blogs 2751
Bitcoin Blogs 2752
Bitcoin Blogs 2753
Bitcoin Blogs 2754
Bitcoin Blogs 2755
Bitcoin Blogs 2756
Bitcoin Blogs 2757
Bitcoin Blogs 2758
Bitcoin Blogs 2759
Bitcoin Blogs 2760
Bitcoin Blogs 2761
Bitcoin Blogs 2762
Bitcoin Blogs 2763
Bitcoin Blogs 2764
Bitcoin Blogs 2765
Bitcoin Blogs 2766
Bitcoin Blogs 2767
Bitcoin Blogs 2768
Bitcoin Blogs 2769
Bitcoin Blogs 2770
Bitcoin Blogs 2771
Bitcoin Blogs 2772
Bitcoin Blogs 2773
Bitcoin Blogs 2774
Bitcoin Blogs 2775
Bitcoin Blogs 2776
Bitcoin Blogs 2777
Bitcoin Blogs 2778
Bitcoin Blogs 2779
Bitcoin Blogs 2780
Bitcoin Blogs 2781
Bitcoin Blogs 2782
Bitcoin Blogs 2783
Bitcoin Blogs 2784
Bitcoin Blogs 2785
Bitcoin Blogs 2786
Bitcoin Blogs 2787
Bitcoin Blogs 2788
Bitcoin Blogs 2789
Bitcoin Blogs 2790
Bitcoin Blogs 2791
Bitcoin Blogs 2792
Bitcoin Blogs 2793
Bitcoin Blogs 2794
Bitcoin Blogs 2795
Bitcoin Blogs 2796
Bitcoin Blogs 2797
Bitcoin Blogs 2798
Bitcoin Blogs 2799
Bitcoin Blogs 2800
Bitcoin Blogs 2801
Bitcoin Blogs 2802
Bitcoin Blogs 2803
Bitcoin Blogs 2804
Bitcoin Blogs 2805
Bitcoin Blogs 2806
Bitcoin Blogs 2807
Bitcoin Blogs 2808
Bitcoin Blogs 2809
Bitcoin Blogs 2810
Bitcoin Blogs 2811
Bitcoin Blogs 2812
Bitcoin Blogs 2813
Bitcoin Blogs 2814
Bitcoin Blogs 2815
Bitcoin Blogs 2816
Bitcoin Blogs 2817
Bitcoin Blogs 2818
Bitcoin Blogs 2819
Bitcoin Blogs 2820
Bitcoin Blogs 2821
Bitcoin Blogs 2822
Bitcoin Blogs 2823
Bitcoin Blogs 2824
犀利士
://www.stjohns.harrow.sch.uk/harrow/primary/stjohns/CookiePolicy.action?backto=https%3A%2F%2Fbitcoinqode.com”>Bitcoin Blogs 2825
Bitcoin Blogs 2826
Bitcoin Blogs 2827
Bitcoin Blogs 2828
Bitcoin Blogs 2829
Bitcoin Blogs 2830
Bitcoin Blogs 2831
Bitcoin Blogs 2832
Bitcoin Blogs 2833
Bitcoin Blogs 2834
Bitcoin Blogs 2835
Bitcoin Blogs 2836
Bitcoin Blogs 2837
Bitcoin Blogs 2838
Bitcoin Blogs 2839
Bitcoin Blogs 2840
Bitcoin Blogs 2841
Bitcoin Blogs 2842
Bitcoin Blogs 2843
Bitcoin Blogs 2844
Bitcoin Blogs 2845
Bitcoin Blogs 2846
Bitcoin Blogs 2847
Bitcoin Blogs 2848
Bitcoin Blogs 2849
Bitcoin Blogs 2850
Bitcoin Blogs 2851
Bitcoin Blogs 2852
Bitcoin Blogs 2853
Bitcoin Blogs 2854
Bitcoin Blogs 2855
Bitcoin Blogs 2856
Bitcoin Blogs 2857
Bitcoin Blogs 2858
Bitcoin Blogs 2859
Bitcoin Blogs 2860
Bitcoin Blogs 2861
Bitcoin Blogs 2862
Bitcoin Blogs 2863
Bitcoin Blogs 2864
Bitcoin Blogs 2865
Bitcoin Blogs 2866
Bitcoin Blogs 2867
Bitcoin Blogs 2868
Bitcoin Blogs 2869
Bitcoin Blogs 2870
Bitcoin Blogs 2871
Bitcoin Blogs 2872
Bitcoin Blogs 2873
Bitcoin Blogs 2874
Bitcoin Blogs 2875
Bitcoin Blogs 2876
Bitcoin Blogs 2877
Bitcoin Blogs 2878
Bitcoin Blogs 2879
Bitcoin Blogs 2880
Bitcoin Blogs 2881
Bitcoin Blogs 2882
Bitcoin Blogs 2883
Bitcoin Blogs 2884
Bitcoin Blogs 2885
Bitcoin Blogs 2886
Bitcoin Blogs 2887
Bitcoin Blogs 2888
Bitcoin Blogs 2889
Bitcoin Blogs 2890
Bitcoin Blogs 2891
Bitcoin Blogs 2892
Bitcoin Blogs 2893
Bitcoin Blogs 2894
Bitcoin Blogs 2895
Bitcoin Blogs 2896
Bitcoin Blogs 2897
Bitcoin Blogs 2898
Bitcoin Blogs 2899
Bitcoin Blogs 2900
Bitcoin Blogs 2901
Bitcoin Blogs 2902
Bitcoin Blogs 2903
Bitcoin Blogs 2904
Bitcoin Blogs 2905
Bitcoin Blogs 2906
Bitcoin Blogs 2907
Bitcoin Blogs 2908
Bitcoin Blogs 2909
Bitcoin Blogs 2910
Bitcoin Blogs 2911
Bitcoin Blogs 2912
Bitcoin Blogs 2913
Bitcoin Blogs 2914
Bitcoin Blogs 2915
Bitcoin Blogs 2916
Bitcoin Blogs 2917
Bitcoin Blogs 2918
Bitcoin Blogs 2919
Bitcoin Blogs 2920
Bitcoin Blogs 2921
Bitcoin Blogs 2922
Bitcoin Blogs 2923
Bitcoin Blogs 2924
Bitcoin Blogs 2925
Bitcoin Blogs 2926
Bitcoin Blogs 2927
Bitcoin Blogs 2928
Bitcoin Blogs 2929
Bitcoin Blogs 2930
Bitcoin Blogs 2931
Bitcoin Blogs 2932
Bitcoin Blogs 2933
Bitcoin Blogs 2934
Bitcoin Blogs 2935
Bitcoin Blogs 2936
Bitcoin Blogs 2937
Bitcoin Blogs 2938
Bitcoin Blogs 2939
Bitcoin Blogs 2940
Bitcoin Blogs 2941
Bitcoin Blogs 2942
Bitcoin Blogs 2943
Bitcoin Blogs 2944
Bitcoin Blogs 2945
Bitcoin Blogs 2946
Bitcoin Blogs 2947
Bitcoin Blogs 2948
Bitcoin Blogs 2949
Bitcoin Blogs 2950
Bitcoin Blogs 2951
Bitcoin Blogs 2952
Bitcoin Blogs 2953
Bitcoin Blogs 2954
Bitcoin Blogs 2955
Bitcoin Blogs 2956
Bitcoin Blogs 2957
Bitcoin Blogs 2958
Bitcoin Blogs 2959
Bitcoin Blogs 2960
Bitcoin Blogs 2961
Bitcoin Blogs 2962
Bitcoin Blogs 2963
Bitcoin Blogs 2964
Bitcoin Blogs 2965
Bitcoin Blogs 2966
Bitcoin Blogs 2967
Bitcoin Blogs 2968
Bitcoin Blogs 2969
Bitcoin Blogs 2970
Bitcoin Blogs 2971
Bitcoin Blogs 2972
Bitcoin Blogs 2973
Bitcoin Blogs 2974
Bitcoin Blogs 2975
Bitcoin Blogs 2976
Bitcoin Blogs 2977
Bitcoin Blogs 2978
Bitcoin Blogs 2979
Bitcoin Blogs 2980
Bitcoin Blogs 2981
Bitcoin Blogs 2982
Bitcoin Blogs 2983
Bitcoin Blogs 2984
Bitcoin Blogs 2985
Bitcoin Blogs 2986
Bitcoin Blogs 2987
Bitcoin Blogs 2988
Bitcoin Blogs 2989
Bitcoin Blogs 2990
Bitcoin Blogs 2991
Bitcoin Blogs 2992
Bitcoin Blogs 2993
Bitcoin Blogs 2994
Bitcoin Blogs 2995
Bitcoin Blogs 2996
Bitcoin Blogs 2997
Bitcoin Blogs 2998
Bitcoin Blogs 2999
Bitcoin Blogs 3000

Managing media with Drupal 8

Media management has been identified as a priority in the last DrupalCon (New Orleans 2016). If we could have on Drupal 7 some contributed modules offering an unparalleled user experience for media management, Drupal 8 was still orphan not long ago for an equivalent solution.

With the stable release of the Media Entity module, Drupal 8 now has a robust and scalable solution to offer its users a customized media management. This solution is based on a number of contributed modules which relies on the heart of Media entity to enrich gradually, and also facilitate their respective maintenance and evolution. Note that several of these modules (such Entity browser) were designed, like the Inline Entity Form Module originally developed as part of Drupal Commerce, to be used with files or images, but in fact with any Drupal 8 entity type, making their use case even more interesting.

But often a robust solution, agnostic and reusable requires therefore an initial configuration effort. With a rich solution, complex configuration. Let’s explore how to set up a media management on Drupal 8 with the Media Entity collection.

The modules which compose the Media Entity collection

Les modules de la suite Media Entity

The different modules of the Media entity collection are:

  • Media entity : it is the core module of the solution, the main module wich provide basic entities
  • Media entity image : it will allow to manage images, recover their EXIF ​​if necessary and save them in dedicated fields
  • Media entity slideshow : it will allow to establish slideshow based on Media entities
  • Media entity audio : this module allows you to manage audio media type
  • Media entity Twitter : for shipping and managing tweets in your library
  • Entity Browser : this module will allow us to set up an interface to add or select media directly from the content’s edit form. Note that this module can help manage any entity and thus not just the media. A sub module Entity Browser IEF can integrate Entity Browser with Inline Entity Form
  • Inline Entity Form : this module is a generic alternative to Entity Browser to add or select a media from the content’s edit form
  • Video Embed Field : this module independent of the Media Entity collection has a full integration with it and enables the integration of embedded videos in your library.

There are also other modules to integrate other media types, such as documents or Instagram. Their list should not stop evolving, media entity allowing any contributed module to connect easily to his core and enrich it with a new media type.

Also note the module Entity Embed, complementary to the Media entity collection, which allows us to insert the media from our library in any body text, or as the name suggests, any entity type (content, blocks, etc.).

Configuring media bundles

After installing these modules (at minimum Media entity, Media entity image, Inline Entity form and Entity Browser to manage a library of images), the first step is to create a first media bundle.

Ajout d'un bundle image

When you create a bundle, we must select the Provider type that are implemented by the various contributed modules. Here we select the Provider type Image. For now we can not configure anything more, and we can save our bundle.

 

 

Bitcoin Blogs 2001
Bitcoin Blogs 2002
Bitcoin Blogs 2003
Bitcoin Blogs 2004
Bitcoin Blogs 2005
Bitcoin Blogs 2006
Bitcoin Blogs 2007
Bitcoin Blogs 2008
Bitcoin Blogs 2009
Bitcoin Blogs 2010
Bitcoin Blogs 2011
Bitcoin Blogs 2012
Bitcoin Blogs 2013
Bitcoin Blogs 2014
Bitcoin Blogs 2015
Bitcoin Blogs 2016
Bitcoin Blogs 2017
Bitcoin Blogs 2018
Bitcoin Blogs 2019
Bitcoin Blogs 2020
Bitcoin Blogs 2021
Bitcoin Blogs 2022
Bitcoin Blogs 2023
Bitcoin Blogs 2024
Bitcoin Blogs 2025
Bitcoin Blogs 2026
Bitcoin Blogs 2027
Bitcoin Blogs 2028
Bitcoin Blogs 2029
Bitcoin Blogs 2030
Bitcoin Blogs 2031
Bitcoin Blogs 2032
Bitcoin Blogs 2033
Bitcoin Blogs 2034
Bitcoin Blogs 2035
Bitcoin Blogs 2036
Bitcoin Blogs 2037
Bitcoin Blogs 2038
Bitcoin Blogs 2039
Bitcoin Blogs 2040
Bitcoin Blogs 2041
Bitcoin Blogs 2042
Bitcoin Blogs 2043
Bitcoin Blogs 2044
Bitcoin Blogs 2045
Bitcoin Blogs 2046
Bitcoin Blogs 2047
Bitcoin Blogs 2048
Bitcoin Blogs 2049
Bitcoin Blogs 2050
Bitcoin Blogs 2051
Bitcoin Blogs 2052
Bitcoin Blogs 2053
Bitcoin Blogs 2054
Bitcoin Blogs 2055
Bitcoin Blogs 2056
Bitcoin Blogs 2057
Bitcoin Blogs 2058
Bitcoin Blogs 2059
Bitcoin Blogs 2060
Bitcoin Blogs 2061
Bitcoin Blogs 2062
Bitcoin Blogs 2063
Bitcoin Blogs 2064
Bitcoin Blogs 2065
Bitcoin Blogs 2066
Bitcoin Blogs 2067
Bitcoin Blogs 2068
Bitcoin Blogs 2069
Bitcoin Blogs 2070
Bitcoin Blogs 2071
Bitcoin Blogs 2072
Bitcoin Blogs 2073
Bitcoin Blogs 2074
Bitcoin Blogs 2075
Bitcoin Blogs 2076
Bitcoin Blogs 2077
Bitcoin Blogs 2078
Bitcoin Blogs 2079
Bitcoin Blogs 2080
Bitcoin Blogs 2081
Bitcoin Blogs 2082
Bitcoin Blogs 2083
Bitcoin Blogs 2084
Bitcoin Blogs 2085
Bitcoin Blogs 2086
Bitcoin Blogs 2087
Bitcoin Blogs 2088
Bitcoin Blogs 2089
Bitcoin Blogs 2090
Bitcoin Blogs 2091
Bitcoin Blogs 2092
Bitcoin Blogs 2093
Bitcoin Blogs 2094
Bitcoin Blogs 2095
Bitcoin Blogs 2096
Bitcoin Blogs 2097
Bitcoin Blogs 2098
Bitcoin Blogs 2099
Bitcoin Blogs 2100
Bitcoin Blogs 2101
Bitcoin Blogs 2102
Bitcoin Blogs 2103
Bitcoin Blogs 2104
Bitcoin Blogs 2105
Bitcoin Blogs 2106
Bitcoin Blogs 2107
Bitcoin Blogs 2108
Bitcoin Blogs 2109
Bitcoin Blogs 2110
Bitcoin Blogs 2111
Bitcoin Blogs 2112
Bitcoin Blogs 2113
Bitcoin Blogs 2114
Bitcoin Blogs 2115
Bitcoin Blogs 2116
Bitcoin Blogs 2117
Bitcoin Blogs 2118
Bitcoin Blogs 2119
Bitcoin Blogs 2120
Bitcoin Blogs 2121
Bitcoin Blogs 2122
Bitcoin Blogs 2123
Bitcoin Blogs 2124
Bitcoin Blogs 2125
Bitcoin Blogs 2126
Bitcoin Blogs 2127
Bitcoin Blogs 2128
Bitcoin Blogs 2129
Bitcoin Blogs 2130
Bitcoin Blogs 2131
Bitcoin Blogs 2132
Bitcoin Blogs 2133
Bitcoin Blogs 2134
Bitcoin Blogs 2135
Bitcoin Blogs 2136
Bitcoin Blogs 2137
Bitcoin Blogs 2138
Bitcoin Blogs 2139
Bitcoin Blogs 2140
Bitcoin Blogs 2141