everybody this is talk about Drupal 8
migrate and how amazing it is originally
I was going to do this in kind of a Wild
West theme but doing that across like 40
slides or so it just seemed kind of dumb
so I'm leaving with it the Wild West
part out of it so it was me I've been a
software developer really since I was a
little kid I've been in the Drupal
community for about five years I just
kind of weaseled my way into a project I
had no business being on order to get
off of it another project and then kind
of fell in love with the community and
my form and all of you guys this is what
is what's kept me passionate about this
community for the past five years I'm
primarily back-end as you can see from
the design of this slide I do not have
an eye for design I mean I'll try to CSS
if I have to but if I could do
everything from the command line that is
ideal contributed to some important
modules I guess as many as I'd like but
you know some Grand Master and I just
love to eat my little fake Oh avatar
everywhere all right so what we're going
to talk about is how migrate works some
of the kind of must-have modules you
need to really be productive in it and
then how to write each of the different
types of plugins to handle the different
operations that migrate is going to do
we're going to talk a little bit about
destinations because there there is a
little bit special and then we're gonna
have live demos with maybe real coding
you get to watch me tight as we go
so before I start who here has done any
sort of migration in Drupal 8 at all
okay it looks like about half who has
tried and failed to do a migration okay
hopefully the the beginning of this see
how everything works we'll we'll bring
you up to speed and then the the real
hardcore people maybe at least hopefully
there's something you'll get out of this
but we said the real the real hardcore
Cody meat is all at the end what we're
not going to talk about is migrate
upgrade or migrating any legacy sites
with with migrate there's a whole lot of
good talks on that stuff already this is
outside the scope of what I'll be
talking about we're not really going to
be cataloging differences between all
migrated and new migrate although you
know I might just sort of rant about how
bad stuff used to be and we're not to be
talking about multi-language stuff
there's I don't know if I've seen the
talk for it but there are definitely
good posts about how to import
translations and things like that
we're not going to be dealing with that
so what is migrate how does it work
basically there's three parts to a
migration there's a source process and a
destination source this is where the
data comes from this is any data source
pretty much any data source you can
imagine there's already plug-ins for
Jason and CSV other Drupal all kinds of
web server anything you can imagine
there's probably already a source for it
process is what Maps that source data
into data that the destination is going
to import and the destination is where
that data is going to go most of the
time that's a Drupal entity not all the
time I'm going to cover something a
little bit later where we have a
destination that's not Drupal and
sometimes you want to export data from
your Drupal site out to something else
but for the most part most of what I see
most of people's you know issues that
I'm trying to correct or how quick it's
all transforming external data into
Drupal entities so let's start with a
source plugin this thing love to read
this is where your data comes from this
is how we're defining it every source
plug-in has a different set of
properties we're using my grade source
directory for this one that this is this
is one of my favorite ones it's it's
very illustrative of how the source
plug-in worse
and I'll be diving into this a little
bit later so you can see just how easy
it is to make a custom source plug-in we
can see that we're gonna be looking at
this particular folder so a lot of
questions that that I've seen evolve
like how do I check data you know my
source data into the repository how do I
point my module at it regularly you know
that's how so you just start at the your
web root and you can specify the path
all the way into your modules data file
we're only looking at PDFs and we have
an unlimited recursion level migrate
directory migrate source directory
actually allows you to limit how many
steps down you're gonna go we don't
we're only dealing with one directory
but you can limit that now we're gonna
look at the process this is what takes
that source data here we have a file
name and the URL
and we're going to map this into
destination data and then this is where
we plug in any of our tools that can
manipulate that data this is a simple
migration that scans a particular
directory that one for PDFs and then
using the parsed PDF process plug-in
that I wrote just based on a generic
kind of PHP PHP DF parser brings in that
data into our body field and then the
destination determines where this is
going to go and in this case it's going
to go into a node of the type document
we can see that we have no dependencies
in here but the enforced module
dependencies this is this is a pretty
key thing this is a good thing that that
migrated plus gives you that regular
migrate doesn't migrate plus will
enforce that enforced module dependency
so when you've disabled your module it
knows to remove all that config regular
role and migrate doesn't do that so when
you you know when you have a module with
your config done under migrating center
migrate plus when you uninstall you have
to delete all the config for each of
your migrations this handles it all for
you I know that is all really exciting
so how do you start well you already
have it it's in core but your real
must-haves to be super productive with
it you need migrate plus you need
migrate tools with the migrate that
comes in core there's really no facility
to just use it out-of-the-box it's code
only there's no command-line tools
there's no UI if you're gonna write a
migrate and then use it using only core
files you know only the core module
you're gonna have to write the code to
do the import
and then there's some add-on tools here
migrate devel is pretty wonderful that
it does a some some great things it
integrates nicely with drush and will
actually display you a snapshot of what
your source data looks like and then you
can make it put what the what the
destinations gonna look like - and then
config update config update really lets
you it's just so you can make quick
changes to your migrate camel and then
just paste them in and run it and it
will update the config for you otherwise
you're going to be doing a lot of you
know a lot of uninstalling and
reinstalling your module to update the
config migrate develop if you use that
migrate debug tag that it comes with the
command line option it will update your
import config but only after it runs
which is not super helpful because you
have to run it limit it roll it back run
it again and then you'll get your real
results but it's still faster than
uninstalling and reinstalling your
module so how do we do it really we just
create a module we think it's a
directory and an info yeah no file or
just Drupal GM if you were using the
Drupal console
we're gonna start with some config nasaw
goes into config install we need a
config for our migration group the
groups are really optional but you
should really use them and then a
migration a config file for the
migration itself and then when we enable
the module when we do address migrate
status
we'll just see it in the list that looks
something like this there we go so we
can see here's the different groups that
I have here I've got a group a list of
cars that comes from a CSV
here's that PDF one I was looking at and
then the special treat is pulling Mars
rover data straight from NASA because
we're trying to prove that migrations
are rocket science but well we'll make
it that way
and then rush em IM to run it now if
you're like me and you've been doing
this for a really long time you'll keep
typing and rush mi and it will yell at
you every time because the new dress 9
is all mi m so for dress 8 1 1 5 which i
think is what i'm on it'll just put a
warning up so remember him I am migrate
the import once you've got all that down
you're gonna want to test your migration
so I've written a little helper module
that does it optionally does a process
row but mostly is here to display what
your source data and your destination
data will look like you don't need to
worry about trying to copy any of this
down that is a shortcut to the github
repo of where all of this is so let's
run one
here's our our site with our favorite
theme and then can we read this I have
this my great helpers processor oh it
takes the ID of a migration how many
rows were going to process and then
whether we're going to process it
or not so with false that means all
we're going to see is source data but I
changed this to true will also see how
it maps during the process base let's
execute this so this is a CSV file
oops
oh boy
[Music]
so it looks like that
if we come down it's got this crazy
doubleheader here so the first header
line is what we'd expect it's column
headers and then they have the types on
the next line so we want to do something
special to handle this we don't want to
import string double in double double as
a car
[Music]
so we can see that we have a skip plug
in here during in our process space it
uses a static map so that if it
encounters the string string it will
turn it into a zero which skip on empty
registers as empty and it will skip this
row so that's why I have two in here for
how many rows were processing because
the first one won't actually process a
row you'll see when I when I run this
that it doesn't have any destination
because it skips in and then this is
what the file looks like so car would
give a string mpg cylinders displacement
horsepower etc etc then if we come down
to the next row which is the first one
with actual data in it we can see that
it's giving us a Chevelle mpg of 18 yeah
right because I have a modern v8 muscley
car and I don't get 18
that's 1970 their standards are probably
different bobbly
the ringing is not me it was coming to
go on last obsession - all right well
that's good all right maybe it'll do
that when we're waiting what I'm talking
know what's going again you have to be
plugging in on the adapter for the video
I don't see a USB that doesn't only have
it doesn't have a USB adapter as well
don't see it on this one son all right
well sorry for this body I'll just try
to you know if it flashes four leaves
with more than a second or two just
giving a sign not only
I'm used to working ahead of a WebEx
anyway so this isn't all that different
from what I normally do so all we're
seeing now is source data this is just a
representation of the source file that
we pulled in and the fields that are in
it if we look at what the mapping looks
like
this is excellent there we go we're
setting our destination fields to the
source fields and this is a pretty
simple just one-to-one migration so
we're gonna put cylinders and cylinders
horsepower and horsepower and so on go
and change this to true now and see what
it is that we're doing those were the
column headings in the CSB
yes
these
that composure
good good
there it is
all right
no that's going this is excellent
all right so we have this set to true so
it will run the process row on this and
we'll be able to see how it maps we can
see that this we don't even have our
first one in here because that was the
one that we told it to skip with that
skip on empty so we get our second one
it's giving us our source data and then
we can look at our destination we can
see now this goes to title our skip has
a value in it so it doesn't it's
assigning it just to admin for the
creator and then here all of the the
field values that it's doing so with
just this little bitty animal we have
all of this in here and working so let's
go to content as we can see is empty
and then we'll run the import you can
see that we start out we have 101 rows
in this spreadsheet we have imported
none of them I remember this time than I
am now CSV import should go pretty fast
it just spins through a file that it's
already got creates all of these notes
when we refresh here there they are
I know it's very impressive personal
collection
no this isn't really my era we're gonna
dodge Coronets and things in the 70s
this isn't really my my thing it was
just the easiest free car data source
that I could find we can do address em
are then to roll them back
and then once that's done we refreshed
content and they're all gone so it
handles the mapping of the source ID and
the destination ID for you so it knows
what to roll back and then if you have
any updates and you're running with an
update flag it will automatically update
the appropriate destination node based
on changes in your source node
all right so let's talk about sources
this is where your data it comes from
now for the most part there are sources
that can interpret everything that
you're going to want whether it comes
from you know some sort of relational
database a web service and some data
file files in a directory structure or
other systems whatever I haven't really
found a place where there's anything
lacking yet so yeah I really just I
haven't had to write a lot of sources I
don't think I've had to write any to
actually use inner projects there's
something that covers what we have but
let's look at my great source directory
this is a really good pattern to to
follow as as far as a source goes
but I said not scrolling over yeah this
is great
there it is I apologize for that can we
read this good
we make a little larger
apparently no
it's suddenly decided to go into
presentation mode I hit my shortcut
before all right the source plugin
really only needs a couple of things it
needs an initialized iterator and it
needs IDs and IDs this is what is going
to identify your source data as a unique
record iterator is how it actually gets
the data from the source this is a good
pattern to follow as opposed to some of
the core documentation the core doc is
not entirely correct
for instance source plugin tells you
that for initialized iterator that you
can give it an array it is not an array
this must be an iterator if you're
trying to return an array and this
initialize iterator like it says you can
it won't even register it as a source
and it will run blank so that's a gotcha
and then all it's doing is building up
its own couple of iterators to take the
source directory and loop down through
them and then since we have a file
extension set it checks the file
extension of everything that it found
that it finds and if it matches it'll
push it to the array that it wraps in
the array iterator again I cannot stress
how key this is because when I do write
a source I have forgotten to do this a
couple of times and it's baffling as to
why it comes up blank so let's go ahead
and look at that I'm going to turn
presentation mode off so you can see
what the directory looks like
it keeps flipping back to my other
phpstorm rather than coming out of where
it's supposed to come out too
[Music]
we're still in target come on open
jeez Louise all right so here's our
module and we have a data directory in
here there's three PDFs in here so
that's what it's going to use that's
what it finds as we process it so I have
one up here for our PDF import we
execute we can see what this source
looks like and all this is is the path
and the files that exist inside here and
here's just these three of them well
there's one okay
so here's our various rows
okay if you're writing a writing a
source I really recommend that you
follow migrate source directory to see
what is looking like
so demo time that's that's what I was
doing is I was skipping ahead of myself
let's talk about processes now this is
where it's really exciting this is where
you take your source data and manipulate
it and then map it out to where it's
going to go in the destination for the
most part most of your custom work is
going to be done here most of what
you're going to write is going to be a
process plugin
so these are just things that do stuff
today though to see what you already
have using the Drupal console you can do
a debug plug-in and look at my great doc
process it'll give you a list of
everything that's in there and where it
lives so yeah my great plus again I
cannot stress how important this is it
has half of the things that you'll need
to do just in it like you know building
arrays or a pop the rate pop is one of
my favorite examples for the process
plug-in because it's so simple although
I'll get to that in a minute all the
process plug-in really needs there's a
transform method that returns out
whatever data it's going to return you
know the day the output data
coming back to the other target what I'm
just going to close that
so for for a simple process plug-in this
is a bad as simple as it gets
we need to identify it so you identify
as a process plug-in give it an ID if
you're nice you'll explain how to use it
and then we extend our process plug-in
base which gives us this transform
method and as we can see all we're doing
is running a ray pop and returning that
value this is a fully functional really
viable process plug-in it doesn't have
to be more complicated than this but I
wrote one that's more complicated than
this just to show you guys
so I wrote this parse PDF just based on
a quick and easy PHP PDF PDF parser
library that I found so let's let's take
this apart let's see what we're doing
here it extracts text from a PDF source
here's our plugin identifier so when we
use this in a migration file we're going
to set our process plug-in as parse
underscore PDF this is how we're going
to use it here's our destination target
plug-in that we're using and then the
source which really just expects a file
a fully-qualified file name for where it
can find the file in our important
transform function we just do a little
bit of validation make sure that we have
a value make sure that it's not an array
then finally we make sure that the file
exists and if it does we open up the
parser get the text and return it so
let's hop back over here and turn this
to true so that we'll see what our
process row output looks like when we
execute this
we can see not only do we have our
source up here but in our destination
we've mapped body value to the text of
that PDF and here it is
it's a long one here we go
[Music]
so we cover area notation and our
transform method oh and value I should
go over that to value is what you're
actually giving the ammo has the source
it comes into your plug in under value
right there so we got value is we set it
to URL which is that fully qualified
file name and now let's actually run
this guy
so we concede we should we should be
empty here of PDFs imported is zero will
run our PDF migrate
and then we'll go back to content and
look there are our notes so if we had it
one we can see that we've pulled the
text out of the PDF
[Music]
let's swishing back and forth is great
isn't it there we go
you can also change these together well
an array of processes
apparently I didn't have this in
presentation mode when I was pre running
it because I had all of the tabs nicely
in a row ah streamline that don't worry
so we have our body value goes to this
plugin so if we were to write another
little plugin let's just copy this and
make this a two
and then here let's just make sure that
it's not empty that it's not an array we
don't care about this and let's make our
text
so yeah writing a new process plug-in
really is just this simple all we're
doing is doing a string to upper on the
value that comes in and returning it
we're going to slip that into our
migration here
we don't actually need a source line by
default it will use the return from
whatever is above it in the chain now
let's go ahead and roll that back
what was that oh you're right
okay now we're going to do this migrate
debug you can see that it's going to
give us what we had and then the next
time we run it the new config will have
loaded and then she need to do a my M
so this to LA I'm and specify your
actual migration this is why you all
come to a talk that says live code good
good good
I need to clear the cache because I
added a plug-in
is it in my hand but I'm Vanessa
I do not know it's a fine question
though
well I am mr. import I don't know what
else mi is supposed to be
and sometimes your migrations will get
hung up in a loop or if you work them
where they're you know if they if they
break so here are a handful of important
commands Josh migrate stop
and then drush migrate reset status this
will set it back to idle so that you can
do your upgrade again or import again
and there it is so this is what my great
debug gives you it gives you the course
this is a long PDF there we go
so right here from your dress output
it'll give you that same sort of thing
that my little helper it gave you in M
they execute window and then we can see
that our body value is all capitals now
so we just added a new process plug-in
and I gotta go in with just that the
whole thing was what 20 lines of code
and all the three of them were copy it
paste really
destinations this shows where this
determines where your data is going to
go however your your import process is
going to save data out
that's your destination plug in again
it's just my experience most of the time
you're not going to be writing these
just something like 90% of all of the
migrations that I've seen or to get
things into Drupal but to get things out
of Drupal migrate plus comes with a SQL
table output that you know handles
imports and deletes and and then rolls
them back on an individual record level
for you that's that's great
so I wrote a custom one that is going to
export data as a CSV
more just everybody's favorite the
migration itself looks like this mostly
standard stuff we're using that
[Music]
now we can see that our destination
plug-in is CSV and we're giving it a
path of just our doc route export that's
ESB
we're using a destination base that has
an import import is what it is that
actually writes that data so we're going
to get the path off of our configuration
and then if it doesn't exist we're going
to create the file and then for every
row that we have defined in our process
it's going to add it up blow it up into
a CSV and write it out and then it has
custom roll back functionality it
doesn't go in like row by row remove
records from the file although it could
be sophisticated enough to do that this
version of it just deletes the file when
it rolls it back so let's look at what
that looks like we can see that we have
no export that's CSV
now we're going to take all of that data
from one CSV and put it into another CSV
there it is
so here's all the hundred rows that we
did and note that it skipped the row we
told it to skip
if we roll it back
I'll still they're good
well ideally when you roll it back it
should delete the file too
Benetton
and this not actually storing anything
it's just converting it from one source
to the destination exactly this that
this migrate is just a conduit Drupal is
just an orchestrating everything it
doesn't say anything is an entity Drupal
the only changes in anything Drupal and
related now are the the map tables that
the migrate keeps track on and and
that's it so we have some more practice
with NASA data and this was pretty fun
to do we're going to import data about
Mars rovers and then get the pictures
that they take these cute little guys so
we have these in a group there's one
Jesus there's one that gets the actual
rover data one that gets the cameras
associated with each Rover and then one
that grabs the photos that it's taken on
that particular day it's going to import
terms and notes they're very exciting
but you're select
yes so this is just to prove that
there's no trickery going on here these
are in fact empty no cameras no Rovers
this is riveting
excellent so you could just do the full
migration on this group and it gives you
some cool stuff in fact we're gonna say
our group is NASA and now when you do it
by group it does no dependency why is
what needs to come before what and it
will run things in the appropriate order
the rover photos for instance need the
camera which needs the rover so won't do
the matter of order we can see that on
the on the date that I have this
configured with it it only had four
photos and let's just have a look at
those
now sometimes you need to clear the
cache here because it doesn't get good a
good good so on June 3rd 2015 this is
what curiosity took with the front
hazard camera and these are all nicely
tagged so we can look everything
curiosity took and here's all of our
notes so but is we're going to do
something even cooler than that remember
I mentioned all the way at the beginning
that regular migrate relies on code to
actually do the import it doesn't have
any command-line tools or UI or anything
like that well I happen to have some
code here that would do it so we have
our three Rovers
we'll leave poor spirit alone because he
stopped working a while ago
give me a give me a date something that
I don't have to click back too far
perfect now we submit this is loading up
our migration changing the source URL
property and then running the the
migrate and doing the import so we can
see that it automatically redirected us
to my little view here that shows
opportunity any camera and on the date
that we just specified and these ones do
need the cash to be clear down there
images images get a little finicky with
time we all know how this works
so well that's good they're way faster
than I expected it to you know that's
gonna need to be cleared go ahead write
it into your process function ordinarily
I would but I was hoping to be faster so
looking at our submit we're grabbing our
rover ID grabbing the the date that
we're doing this on and then for each of
the migrations that were doing for
running this get migration so you got a
plug-in manager to migration create an
instance based on your migration ID and
here you can get your executable which
gives you an object with all of your
source configuration now in my main
configuration for this you can see that
I've got
let's Rovers photos this is actually
coded in here for the third June 2015
what we're actually doing is we're
replacing this and this
with our values that we pass in our over
name in our date and then we're
returning that and then we run the
import
so we can actually control this from a
code level and run this same import on
any of these parameters that we want now
when we load we should have pictures
great
let's just drill into one of these while
it's going
so that's a good picture opportunity but
let's see everything that opportunity
got so here's some more data we got from
NASA when it landed on Mars when it
launched its current status which is
active again poor spirit doesn't say
active the Mars Sol which because Mars
doesn't exactly have a 24-hour day so
it's been there for 5018 local Mars days
the newest picture that it has is from
Wednesday and has taken almost 200,000
pictures and here they are so we can see
that some of these are you know not
super helpful but look that is real
rocks and treads on Mars
see if we have our view back yes here we
go
now that I've got all of this data in a
Drupal 8 site let's use this d8 source
plugin migrate Drupal is what does your
version diversion kind of imports and I
think for core version 8.5 this migrate
Drupal d8 is part of the core Drupal
migrated update but I'm not sure I did a
patch for a Drupal migrated d8 and then
was told that it was all rolling up so I
don't know if my documentation patch
actually went in there but if you're
looking for documentation on how it
works the Drupal or migrate Drupal da
now has a nice readme on how to set all
of this up on your own that had zero
documentation before so let's migrate
these cars again
and then while that's going we're going
to head over to our other site so here
we have the rat site it's just really
the destination for all of this it's
still my favorite theme but it's rats we
can tell it apart you can see that it
has no content empty
this one is done now let's open our
other shell this is rat to match the red
so we know as I'm switching back and
forth because I tried to switch back and
forth quickly in the video doesn't
always keep up which site we're on
mmm we can see it worked a minute ago
probably mistyped it I did I had one -
that does not do now we can see that our
Drupal 8 source site has these hundred
cars it's got the PDFs that we imported
it's got all of our over data so let's
go ahead and bring these cars over I
have the same content type
you know same field definitions and
everything on one site versus the other
they don't have to go one-to-one
I just set them up so that they were and
now we refresh on our target site BAM
all these come from the other Drupal
site right in here and they're all
complete
you can see they're anonymous I didn't
have users but that you can do one more
will do that documents too
yeah it always pauses at the fast parts
and here's our our documents that we
imported
without a body but I might not have
included the body
let's go ahead and roll back the
documents here
you can see it was three now if we
switch over here
[Music]
you can see in our source we're back
down to zero so it is getting these
things live from one site to the next
and forth so imagine there are some sort
of questions yeah
no it adds on to it I'll show you how
that looks
it makes the you have imported more than
it has as its source but its source is
hard-coded by default so here we can see
that we have imported 19 so we have
minus 15 left unprocessed it will just
keep going and if I do a rollback here
we're all although Mac will you
contribute that GUI migration along with
the
the helper that you have a link to your
slides yeah I can also I do have the
public repo and you can get it right
there
sure
so I've done a couple of these usually I
get it done and I kind of forget about
it
now I've had a couple sites where
there's content that keeps getting
created like oh I'm taking one site to
another site and there's like a few
weeks between right and stuff gets
graded I always worried about rewriting
the migration because like it first of
migrates the configurations we want to
read through that because I've changed a
lot configurations I'm going to do it
back is it safe to pick up new content
off the old site do another run of the
migration well let me let me clarify on
what you mean by the configurations
they're like so I've done about my grade
from Drupal Drupal okay it pulls the
month the configuration from the old
site it doesn't it doesn't have to okay
but what I wanted it to it was good
first time and then I've you know
changed some stuff will it go is it
possible to just to run like particular
content right yeah well if you're the so
the question was in a say a Drupal to
Drupal migrated rerunning the migrated
to grab new content you can target it to
run a particular a particular migration
so if you've got one migration for blog
posts one migration for articles you can
say only run the articles at that point
it will run differences so it will only
do the sources that it doesn't already
have unless you run it with a - - update
in which case it will pull all of the
data and and let you it'll overwrite all
of the new stuff but let's say the
antenna nodes in your original article
import and then two weeks later you've
got two more you're running at em I am
articles it will only pull in the to
change the two new ones if they've
changed on the source site unless you do
a - - update they won't come over the
old the ones through a reason I got it
right
okay thanks it's a drupal 7 if we were
pulling in content from a third party
API that's regularly updating on it's
like doing feeds so yeah feeds migrate
is migrated best solution which
programmatically calling the migrate on
are on schedule that is my preferred
solution but I'm kind of I'm anti feeds
that that's mostly the way that I do it
like with that we have a knowledge
management system that pulls in
citations and literature references and
things from Zotero and the previous
incarnation of the site did it in feeds
and it was kind of hard to manage you
couldn't really rollback or track the
changes super well so I wrote a migrate
for it and it runs on a schedule on a
crop just like that and and pulls in all
of the deltas now another thing that I
have it doing is actually checking the
source data against our version of the
target data and then flagging the
differences for updates so that when it
pulls it it knows which ones it wants to
update as well as which ones it wants to
do new
each of them less taxing so it really is
I mean we're talking yeah I mean it's
not that many records it's eight twelve
thousand something like that but over
HTTP to get that it's slow so getting it
once
checking it and then importing it was by
far the fastest way to go google
migration or any migration no sources it
doesn't if it knows if there is
additional source data because it checks
the the migrated mapping and if that
source ID doesn't exist in your map it
knows that that's a new record if
something has changed it doesn't know
that automatically you have to tell it
and so like for that's a taro example I
have a job that goes through that
migrate map table and there's a needs
update field in there and if you change
that to true it will know to pull that
in and the next the next migration
he used in a tuple seven migrate having
a high water field yeah yes I had such
bad luck with that in Drupal seven it
didn't always work correctly with
complex data that going against my own
advice using built-in tools and I for
the most part just check make the check
myself
and he he's the d8 source bug even in
court
Ortiz probably have more time for the
drupal DA again in Drupal 8.5 I think it
is part of the core migrate Drupal now
if it's not though its migrate Drupal da
vennett depends on how you need to
process it if it's like if there's a
process that's a whole you know like
really something complex it really
doesn't lend itself to just a line item
by line item I might have something that
imports the data transform you know it
does whatever he needs to do on it and
then import it but for the most part
yeah I'll just do whatever did
operations I need to do kind of field by
field run by row in my process section
yeah that more specific example looks
like you're still thinking of something
yeah
there are well the dates of a UNIX
timestamp I don't know that there is one
that simply does it off the shelf now
but there's a callback one you can just
you know call a like a time ghouls three
more times
yeah and as for a concatenated there is
a concatenate plus if I come with
regular migraines I don't remember and
it will kids put those things yet are
your slides they can be okay I'll had it
alright anything else well thank you all
very much