Inchoo http://inchoo.net Magento Design and Magento Development Professionals - Inchoo Wed, 22 Nov 2017 14:26:57 +0000 en-US hourly 1 https://wordpress.org/?v=4.8.1 How Meet Magento opened my eyes to performing – a tale of 1000 words http://inchoo.net/life-at-inchoo/meet-magento-opened-eyes-performing-tale-1000-words/ http://inchoo.net/life-at-inchoo/meet-magento-opened-eyes-performing-tale-1000-words/#comments Tue, 14 Nov 2017 08:52:30 +0000 http://inchoo.net/?p=31080 Several times a year Inchooers have the opportunity to go to Meet Magento events. The most represented topics at Meet Magentos are development-related, and I always thought those events were reserved only for developers. Since I’m not one, I was reluctant to apply – until Meet Magento Spain 2017. What has changed? Well, after two...

The post How Meet Magento opened my eyes to performing – a tale of 1000 words appeared first on Inchoo.

]]>
Several times a year Inchooers have the opportunity to go to Meet Magento events. The most represented topics at Meet Magentos are development-related, and I always thought those events were reserved only for developers. Since I’m not one, I was reluctant to apply – until Meet Magento Spain 2017.

What has changed?

Well, after two years of gaining experience in office management, processes regarding human resources, and working on strengthening the bond with the local community, I, side by side with Zrinka, decided to share a story “It takes a village” with the rest of Magento community.

It wasn’t an easy decision; we had no experience in presenting, especially in front of an international audience, and in a foreign language – but we dared. We were the first female speaker duo ever to represent the company at an international conference.

How was the whole experience?

We arrived to Madrid a few days prior to the conference so we would have time to experience the city. We were accommodated in Petit Palace Posada del Peine, the oldest hotel in Spain, located in the old town of the capital, and next to Plaza Mayor. Since we were in the city centre, everything was close and we didn’t have to use taxis (I even got sore muscles from all the walking uphill).

Even though we started preparing the presentation a month earlier, each day in our hotel room we would rehearse it and put some finishing touches to it.

We were very excited when the day finally came. The conference was held at Teatro Goya, a nice cinema multiplex, where our hosts and good friends from Interactiv4 XOXOed us warmly. There were 3 separate tracks: Dev, Biz & Community, and the one combined but in Spanish. Our presentation was first on the agenda on Biz & Community track and we couldn’t wait for it to begin. In the beginning we were in a pickle due to some technical issues, but that didn’t stop us from delivering a story to our audience (approximately 40 people).

Although we were well rated and the overall feedback was good, when I think about all the details, there’s quite a number of things I would now do differently. Now that our adventure passed, I would like to share some tips that may be of use to those of you who are preparing to undertake a similar action. I am not an expert and yet have a lot to learn but I’m starting to uncover the secrets…

Public speaking is a stress trigger

I know public speaking presents quite a challenge for all of us, and anxiety that it causes can be a real issue. Your mind and body just won’t listen and you feel like you don’t have any control. Well, to be aware of the fear is the first step to overriding it. Fear will always be present, but you need to learn how to put it aside.

There is no magic formula that tells you how to do it because everyone is different. You need to find it; create your own formula that lets you be you during public speeches.

How to grease the wheels?

What helps me is the structure. Clear and easy-guiding structure that doesn’t need to be visible to the audience. In my mind, I built the whole presentation in blocks – content units each made of exact number of parts (3).

The presentation, the slides themselves, should primarily be easy to follow, without large amount of text but planned in a way to guide you and to help you remember the key points (and, preferably, be interesting to the audience:) ) You should start creating it early enough so you would have time to make some changes along the way – I know I do that all the time.

Besides the content, preparation was a very important thing for me. We all think our voice sounds ridiculous and we don’t know what to do with our hands or bodies during speeches. I wanted to overcome these insecurities, and this is why I tried to “expose” myself as many times possible. I read out loud my lines and marked all the words I need to emphasize with arrows, all the parts when I need to slow down or pause with vertical lines, etc. It helped me because I feel my mind is usually faster than the tongue and I easily end up speaking too fast and just sound baffling.

Several times I also came to the office early in the mornings when no one was there so I could stand in front of the large mirror and practice my stance and expressions. It is very different when you sit at the table or lie in bed and practice your speech quietly and when you’re looking at yourself in the mirror while doing it out loud. If you have the opportunity, gather your own audience (family or colleagues) and rehearse in front of them too. They might give you some additional advice. So, try to simulate the situation – it would truly help reduce the stress.

After you rehearsed the story, you should not only be focused on it but also on the audience. In the end, they’re the reason you’re there. Try yo get to know them, involve them if possible, commit to them. They want you to succeed.

In the end, the most important thing is to perceive the presentation as storytelling, as performance.

As professor William Kuskin (Department of English, University of Colorado Boulder) said:

Successful presentations are public stories, they’re rehearsed, they’re thought through, they’re revised. They involve not just our words, but our bodies. They involve our awareness of our audience and our context and our purpose. So when we think of a successful presentation, we need to think of it as more than just reciting a script. We need to think of it as an entire experience.

I think about his words very often…

The post How Meet Magento opened my eyes to performing – a tale of 1000 words appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/meet-magento-opened-eyes-performing-tale-1000-words/feed/ 1
Magento Solution Partners readiness and expertise with Magento 2 http://inchoo.net/magento-2/magento-solution-partner-readiness-and-expertise-with-magento-2/ http://inchoo.net/magento-2/magento-solution-partner-readiness-and-expertise-with-magento-2/#comments Thu, 09 Nov 2017 12:33:20 +0000 http://inchoo.net/?p=31031 With more and more projects being migrated to Magento 2, and showcased by partners and Magento themselves, what’s the status of Magento 2 adoption within the partner ecosystem? Is there any way merchants can tell “heaven from hell” when deciding what partner to go with when planning and delivering a Magento 2 project? Did you...

The post Magento Solution Partners readiness and expertise with Magento 2 appeared first on Inchoo.

]]>
With more and more projects being migrated to Magento 2, and showcased by partners and Magento themselves, what’s the status of Magento 2 adoption within the partner ecosystem?

Is there any way merchants can tell “heaven from hell” when deciding what partner to go with when planning and delivering a Magento 2 project?

Did you know that (only) 72% of Magento solution partners are Magento 2 trained?

So, Magento 2 has been out for quite some time (have you noticed)? It didn’t come quietly, and nothing about it has been quite around Magento ecosystem. Now, with many websites (still) running on various Magento 1 versions, many merchants are planning their move to Magento 2 for 2018.

Not to forget, someone who is completely new to eCommerce or is looking at switching platforms may also be considering Magento. For them, the number 2 doesn’t really mean that much and they won’t get too excited. They only want a working software and a quality team to help them build and grow their business.

I took some time to go over the Magento partner directory and crunch some numbers. Now, there is still no formal developer certification in place for Magento 2 (Solution Specialist one has rolled out, though). So, I wanted to see is there any way to compare partners or get some insight into how focused and experienced they are with the newest Magento software?

How many Magento 2 trained partners are out there?

Solution Partners were invited by Magento (originally back in late 2015 with a follow-up in late 2016) to have their employees trained on the new platform. This was done by completing official Magento 2 trainings (frontend and backend). When people from partner teams completed these trainings, this showed on partner profiles in a form of a Magento 2 Trained Partner badge.

These trainings were intended to boost Magento 2 acceptance and readiness of solution partners. The main purpose was to be better equipped when planning and delivering projects for existing and new Magento clients. So, fast forward a year or two, and where are we now?

Here is an overview of all Magento Solution Partners by partner level and their Magento 2 Trained status. Numbers shown are based on the analysis of the partner directory on November 9, 2017.

Some quick takeaways:

  • There is a total of 228 active Magento Solution Partners out there
  • 72% of all partners are Magento 2 Trained
  • The higher the partner level, the larger percentage of M2 trained partners
  • There are 9 Enterprise Solution Partners who are not M2 trained

To check/verify these figures, and get some more insights, check Magento partner website. Over there you can get into partner search and then narrow down with a couple of filtering options. This way everyone can see which partners are Magento 2 Trained. Additionally, when inside specific partner profiles, you’ll find more details about each partner.

So, what is there to take form all of this? Here is a quick Q&A to wrap our head around it:

Is Magento 2 training any proof of quality of services rendered by partners?

Not really. Partners receive a Magento 2 Trained Partner badge when their employees pass some of the official Magento training programs. These don’t reflect real-life experience with Magento 2 and these are not official certifications.

Then is it important and why?

It is important because it shows, like official certifications, commitment and effort, rather than actual quality of delivery. Quality can vary even for several merchants working with the same solution partner. This is something I’m sure many Magento clients are aware of. Let’s face it – you can only truly know someone after you engage in a cooperation. So, this information (next to all others merchants will gather when deciding who they will work with) is one piece of a larger puzzle.

Why are there so many Professional and Enterprise partners who don’t have any of their staff trained for Magento 2?

This is a good question (I’m also interested in finding the answer to this), and there can be a number of reasons. Perhaps some partners had people complete the training but have since left the company. Maybe they simply didn’t invest time into formal trainings and focused on delivering Magento 2 projects instead. This way perhaps they are a better choice than some other partners who may have training but no hands-on experience. And there may be some that don’t have either because Magento has not paid special attention to this after the initial rollout.

Ok, so how do we know if someone is good at Magento 2?

First of all, let me ask you what version are we talking about? 🙂 You should first look for and/or ask for solution partners’ track record. Another good hint at the quality of overall Magento work can be the number of official certificates. These can be found listed on partner profiles. While these will verify mostly M1 expertise and not M2 in particular, it is one of the more solid “proofs” out there right now.

What about Magento 2 certification?

Magento 2 Solution Specialist certification has rolled out and there are already 124 M2 Certified Solution Specialists out there.

Developer certifications, however, will roll out most likely some time during 2018. In the meantime you should take into account all of those things mentioned previously when making a decision on working with a Magento Solution Partner for your eCommerce project.

If you would like to see how we at Inchoo can help you out, we’ll be happy to hear from you!

The post Magento Solution Partners readiness and expertise with Magento 2 appeared first on Inchoo.

]]>
http://inchoo.net/magento-2/magento-solution-partner-readiness-and-expertise-with-magento-2/feed/ 2
Why you should go to MageTestFest if you are a Magento developer http://inchoo.net/life-at-inchoo/go-magetestfest-magento-developer/ http://inchoo.net/life-at-inchoo/go-magetestfest-magento-developer/#respond Fri, 03 Nov 2017 13:50:31 +0000 http://inchoo.net/?p=31014 When a conference is advertised as “Magento. Software Testing. Party.” and Yireo stands behinds its organization, there is really not much left to say in order to convince you to attend MageTestFest that’s happening November 15th – 18th 2017! There are no doubts – you must clear your schedule and head off to this international...

The post Why you should go to MageTestFest if you are a Magento developer appeared first on Inchoo.

]]>
When a conference is advertised as “Magento. Software Testing. Party.” and Yireo stands behinds its organization, there is really not much left to say in order to convince you to attend MageTestFest that’s happening November 15th – 18th 2017!

There are no doubts – you must clear your schedule and head off to this international developer oriented event that has one single focus: TESTING! Vital for clean coding, testing is a topic that can always break the unbearable silence among developers that are just meeting each other.

But let’s be serious for a moment here. Testing should be a fundamental part of your work if you are a developer. Guys behind MageTestFest saw the need for full-depth conference about testing, where everybody is talking about the same topic, which results in extreme focus, learning and fun. And also for future cleaner code, fewer screw-ups and happier customers.

Who are the speakers?

Only proven experts on the subject! Sebastian Bergmann, Mathias Verraes, Vinai Koop, Fabian Schmengler, James Cowie, Tom Erskine, Igor Minailo and Jisse Reitsma will blow you away with knowledge they are willing to share in order for you to become an even better developer!

 

Four exciting days are ahead of us all – 1 conference day, 2 workshops (PHPUNIT, DDD) and 1 contribution day/hackathon.

Meet the Inchooers, they’ll have the goodies!

Inchoo troops will also be there! Look for our green banner where Stjepan Udovicic and Luka Rajcevic will meet you with open hands (that will be filled with Inchoo swag)! T-shirts, notebooks, stickers, be sure to grab yours while you can! 😉


Go to MageTestFest, invest in a future with fewer screw-ups!

The post Why you should go to MageTestFest if you are a Magento developer appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/go-magetestfest-magento-developer/feed/ 0
“It takes a village” to raise an active local IT community – 2 Inchooers take the stage at #MM17ES http://inchoo.net/life-at-inchoo/takes-village-raise-active-local-community-2-inchooers-stage-mm17es/ http://inchoo.net/life-at-inchoo/takes-village-raise-active-local-community-2-inchooers-stage-mm17es/#respond Thu, 02 Nov 2017 11:41:00 +0000 http://inchoo.net/?p=30998 Inchooers at Magento conference? That’s nothing new. But 2 women Inchooers on the stage of Meet Magento Spain? Well, that’s something! IT has always been a predominantly male industry. However, women are playing a huge part too! It is no longer such a huge surprise to see a woman in tech. Although they are still...

The post “It takes a village” to raise an active local IT community – 2 Inchooers take the stage at #MM17ES appeared first on Inchoo.

]]>
Inchooers at Magento conference? That’s nothing new. But 2 women Inchooers on the stage of Meet Magento Spain? Well, that’s something!

IT has always been a predominantly male industry. However, women are playing a huge part too! It is no longer such a huge surprise to see a woman in tech. Although they are still generally unrepresented in hardcore technology jobs, women are mostly finding their place in business development, HR, consultations, marketing and design fields of IT companies.

Let’s face it – men are from Mars and women are from Venus. We are alike, but again, we’re different in values that we bring to the company and ways that we are handling business, especially on soft skills level. Research show that women are better at using soft skills that are crucial for effective leadership and superior business performance.

A productive and healthy work environment depends on soft skills. After all, the workplace is an interpersonal space, where relationships must be built and fostered, perspectives must be exchanged, and occasionally conflicts must be resolved.

Women at Inchoo and their involvement in the local tech community

Inchoo values the importance of women, that are now taking up to 20% of our company’s employees batch. Besides the value of the above-mentioned skills that they bring into Inchoo’s business, their roles have deep roots in our local IT community – attracting talents, organizing learning events, communicating with universities, educational institutions and much much more!

But they don’t do it alone. It takes a village made of IT enthusiasts and companies to form a healthy community that is raising talented, hard working individuals seeking for their place under the Tech Sun.

Our Event Coordinator Zrinka Antolovic and Lead Office Manager Dunja Vorkapic will show you on stage of #MM17ES how and why “It takes a village” when we were forming our local IT community through Osijek Software City association and how we keep it alive and kicking now more than ever!

They’ll be talking how our local IT firms cooperate and react to the biggest challenge we’re facing – lack of qualified workforce and how we include other stakeholders (high schools, universities, local government…) in solving challenges we face in Osijek’s IT industry.

Here is an interview with them to find out more.

Hi Zrinka and Dunja! Wow, 2 girls at Meet Magento conference! Well, that’s a first for Inchoo. Are you excited about it? How did you decide to apply as a speakers?

Dunja: A lot of “firsts” in one place.

This is the first conference I’ll be attending in 2 years of working at Inchoo (I do not count Developers Paradise 2016 and Meet Magento Croatia 2017 because I was a member of organizational committee) 🙂

Every time there is an open call for speakers and their entourage for a Meet Magento at Inchoo, many people apply. Since I’m not a developer and haven’t been that long in the firm, I‘ve never applied for one because I taught developers have the advantage. As the time went by, I encouraged myself to step up and share a story with the rest of the community.

Besides that, I wouldn’t want to miss the chance to visit my favourite country – Spain. I love everything about it; people, culture, language, weather… What better way of experiencing all that than to attend Meet Magento Spain 2017! I can’t wait for the plane to hitch… 🙂

Zrinka: Yes, a lot of “first” in one place. I’m looking forward to sharing the story of the Osijek Software City association. On the other side, I like traveling and Spain was on top of my “wish list”. I believe this conference is a perfect opportunity to do both. I also met some people from Interactiv4 (conference organizer) and I’m excited to see them again. I’m happy because Dunja and I will share that experience together.

Zrinka, your role at Inchoo is really interesting – Event Coordinator. Tell us more about what you do and why it turned out to be so important for us!

My job is about managing all events related to Inchoo, organize and help with activities in the local community, take care of student relationships and serve as Inchoo’s rep in board of directors of Osijek Software City association. This is the main topic of our presentation – to explain problems in our local IT community and and show what we are doing to fix them. As an Event Coordinator, I’m usually behind the curtains on such events. This will be the first time for me to be in front of them and I’m really excited.

What is Osijek Software City and why is it so important for local IT community?

Dunja: Osijek Software City is an association born in 2012 with a purpose of acting towards the local community by increasing people’s engagement in IT and increasing their competitiveness for the labour market (whether local, or international).

The association was founded by IT companies that came to the same conclusion about what challenges them the most – finding and recruiting talented individuals. All activities the companies have done so far, yielded nothing but positive results.

As a regional IT center that counts more than 100 IT companies, Osijek has a lot to offer. What would be your top picks to lure someone that is thinking of moving here?

Zrinka: Osijek is a beautiful place for living. It is a small town that can provide you with everything you need. It has excellent traffic infrastructure, especially for bikes, so you don’t waste nearly any time commuting. When it comes to IT, companies from Osijek compete with large world companies and offer a lot of opportunities for employment. I was not born and raised in Osijek, but I am happy to have gotten the opportunity to live and work here. One of the strongest attractors to move to Osijek as an IT worker would definitely be our closely-knit community.

Dunja, for those who will, unfortunately, have to miss MM17ES and your presentation, give a sneak peek of key takeaways for those who are interested in what you’ll bring with “It takes a village” presentation.

It’s a story about how IT companies from our region (eastern Croatia) react to the biggest challenge they’re facing with – lack of quality workforce. They teamed up and, in 2012, established the association “Osijek Software City”.

After comprehending that commitment to the local community is one company characteristic they all share, they all stood up together to promote IT among young people and decided to invest in them in terms of knowledge without knowing when and whether the “return on investment” (hiring these people) is going to happen.

It takes a village to raise a child would, in our context, mean that it takes a community to help a developer grow. 🙂

For those of you who are attending #MM17ES, feel free to welcome our Inchooers Zrinka and Dunja to their first international MM event. They will teach you about our local IT community, and you show them what #Real Magento stands for and what Magento community is all about!

See you there!

The post “It takes a village” to raise an active local IT community – 2 Inchooers take the stage at #MM17ES appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/takes-village-raise-active-local-community-2-inchooers-stage-mm17es/feed/ 0
Keeping an eye on small things in eCommerce projects http://inchoo.net/ecommerce/keeping-eye-small-things-ecommerce-projects/ http://inchoo.net/ecommerce/keeping-eye-small-things-ecommerce-projects/#comments Tue, 31 Oct 2017 12:23:02 +0000 http://inchoo.net/?p=30978 When managing projects, one usually focuses on big things: biggest costs, biggest features, biggest risks, etc. The same is with building an eCommerce site – the biggest, most important things are, well, most important. But large topics are not the be-all and end-all of the project. In this post, we will illustrate how tiny issues...

The post Keeping an eye on small things in eCommerce projects appeared first on Inchoo.

]]>
When managing projects, one usually focuses on big things: biggest costs, biggest features, biggest risks, etc. The same is with building an eCommerce site – the biggest, most important things are, well, most important.

But large topics are not the be-all and end-all of the project.

In this post, we will illustrate how tiny issues can have an outsized influence on the project. Through analysis of several examples from our experience, we will try to understand how small perturbations shape the course of the project.

So let’s start with something totally relevant, let’s start with – Napoleon.

We all know the story. He conquered Europe, and then turned his sights on Russia. His conquest started with an army of 680 000 men, and in a short time marched into Moscow. Russians evacuate Moscow and burn down three quarters of it! Napoleon, short on supplies retreats from the empty city. During the retreat, he loses most of his army. Out of 600 000 men, only 30 000 survive, and only 1 000 are fit for service.

A great story of brilliant defensive strategy.

Or is it?

In 2001, workers digging trenches for telephone cables in Vilnius, Lithuania found over 2 000 skeletons, stacked three on top of each other, arranged in v-shape. Analysis revealed that those were soldiers from Napoleon’s time, and with their remains, the complete story of Napoleon’s defeat was revealed:

Napoleon starts his attack on Russia in June 1812 from Germany. Things turn downhill in Poland. The summer is unusually hot and 20 thousand horses die of thirst. This stretches and strains the supply lines and the resources are scarce. The hygiene is bad and lice are becoming a huge problem – they are visibly crawling on men and the whole army is infested. Lice carry typhus, and in a month 80 000 soldiers die or are incapacitated because of the disease.

In August Napoleon conquers Smolensk, but another 105 00 men are lost to typhus. In the next two weeks, typhus claims another 60 000 men. In September, a week after the battle of Borodino, Napoleon enters Moscow with 90 000 men. The city is deserted and burned. Napoleon requests enforcements, but out of 15 000 men sent to him, 10 000 die from typhus. The winter is coming, and supplies have run out. Napoleon decides to retreat.

In December they come to Vilnius, with only 20 000 men fit for service. Fearing the coup, Napoleon urgently leaves for Paris, and general Murat organizes the retreat.

And now it is clear: a military genius of Kutuzov, and the coldest Russian winter and all the Russian cannons heard pounding in overture to Tchaikovsky’s 1812 weren’t enough to defeat the great general. It took the smallest creature of them all, unassuming, ordinary lice to bring destruction to Grande Armée.

With that in mind, what are the small, seemingly insignificant things that have an outsized influence on our projects?

Let’s walk through few examples of the small challenges or hiccups that proved to be big in the end (whether we acted proactively to resolve them and prevent the excrement hitting the fan, or we learned the hard way from addressing them too late in the game).

We will start with technical topics, and move slowly into organizational and pure project management issues.

Comment? What comment?
– When comments in code are bad

You know how developers often comment out pieces of code while working, in order to speed up a process or go around specific bugs in Magento (what bugs in Magento, you ask?!?!)

Well, it happened probably too many times that a piece of code that was commented out during development made it through to production that way, causing havoc on live site. Why is this commented out? What does it do? What did it use to do?

Lesson learned: Establish proper git branching model – And stick to it for dear life!

Leave commented out code out of committed code. Instead, keep it in git-diff – this may be subject to interpretation and depends on the project at hand, but this is a good rule of thumb. For controlling different versions of our code, we should use – version control software.

Attack of the Robots
– Ignore crawlers at your own peril!

Magento site works the same with or without the robots.txt file. The file itself does not affect the functioning of the store. The interesting thing about it is that it is one of few items that must be different between staging and live site (on staging we want to exclude everything from crawling, and on live site we are targeting specific files and folders – though usually it is a large number of them).

What happens is that after deployment, because of gitignore developer inadvertently deletes robots.txt file without noticing. Actually, nobody notices – the site works ok and everybody is celebrating new feature release.

Nobody notices, until we got a call from the client that the site is down. Next call is with the hosting provider – they will yell how they are bombarded with requests and how Google crashes our site. All because of one simple small txt file that does not affect our code or the user.

Lesson learned: Establish post-deploy check procedure – And execute it every time!

There are a lot of small tasks that need to be done and are easily forgotten during deploy. Having a checklist that we can rely on releases our mental energy to focus on executing the task at hand.

I-Track, U-Track, DDoS-Track
– Newsletters gone wild!

Newsletters are a great way to inform customers about new promotions and discounts. One large client had a big subscriber database and was sending a newsletter to them without problem for years. The URL in the newsletter was a hefty complex query, but as Magento has full-page caching, it was not a problem for the server.

At one point marketing came to a very reasonable idea to track which subscribers open the newsletter, so they could analyze and segment the campaigns. The tracking was implemented by adding a unique ID parameter to each newsletter URL, so when the user opens the newsletter, the hit is registered.

What that meant is that each user was served a unique page, Magento’s full-page cache was no longer used, and the query was executed for each hit. With a huge amount of subscribers opening their newsletter at the same time and thus executing the enormous query, the site went down. The client DDoS-ed themselves.

Lesson learned: Establish a Change Request Procedure – Make it simple, clear and stick to it!

Change is a fact for any project, that is why we have to be prepared for change. By establishing a Change Request Procedure we will make sure that relevant persons vet the change. For example, should the request be checked by Development, SEO specialist, Marketing? In our example, the solution was to setup caching to ignore the parameter – something a developer would notice in a second.

Extending the non-extendable
– Assumptions are just that!

We have a relatively large client (around 80 000 products) that wanted to track stock for a subset of products, and if a customer tries to order out of stock product, offer them a subscription to notification when the product is in stock again.

The notification is easy to do if the stock management is global, if Magento manages the stock for all products. If the stock is tracked only on a subset of products, as was the case with that client, then Magento will trigger the subscription message for all non-managed products (since their stock is 0)

We planned to go with Magento 1, so the solution was simple – extend the core to additionally check does the product have managed stock and if not, suppress the message. 30 minutes work.

Then Magento 2 became a thing. And the plan was changed, we’ll go with Magento 2. Because why not. Now, Magento 2 does not allow extending core. In general, you don’t extend a component, you write your own. In this case, we were deep in the core, we had to rework the whole Product page, which landed us with 30h of work. Add few similar customizations, and you have a project deep in red.

Lesson learned: Check your assumptions – Then double check them!

Every project is built on a series of assumptions. If one of them changes or proves wrong (we’re using Magento 2 instead of Magento 1), then the project is in danger (in this case, our estimates are way off). But if we know the assumptions we’re building our project on (dare I say: if we have them written down), then we can always check them and react when they’re changing.
Most important lesson: build a relationship of trust with the client, so you can work together when problems like these arise.

An admin, an admin! My kingdom for an admin!
– Who handles system administration?

We had a client where we took care of everything on Magento side, and everyone thought (ok, we thought) that their hosting company takes care of permissions and overall server-side setup.

However, when we came close to deploying to the live site (there was a specific environment in place where we were allowed to push changes to live in a very specific way), we brought the site down only to realize that our latest deployments failed to go to production due to server-side setup mixup. We were not in a position to fix this ourselves, hosting company wasn’t aware we expected them to handle this, the client didn’t know whose job this would have to be in the first place. A small omission in communication caused a huge issue when the push came to shove.

Lesson learned: Know your scope – In more details than you think you need

Ask questions, a lot of them. Prepare a checklist for the Sales team and on-boarding process. PMs should make sure to have all of this information in place before the team starts working.

Roses are red, violets are blue
– Clash of personalities

When a new project kicks off, you have to establish a good rapport with a client. Sometimes, when the deadlines are tight and you are already stretched, you don’t have enough time to think about personality match with the client. Things can go south quickly if there is a personality or communication style mismatch that you put under the rug hoping it will sort itself out.

We’ve had a scenario in which our lead developer, who acted as the main point of contact, and the client had almost an outing over a specific task where they poorly communicated the feature request. The confusion, combined with poor judgment on how one can/should communicate directly with a client created enough bad blood to force us to remove the lead developer from all communication with the client and get another team member assume this role.

Fortunately, the timing was not off, and we made it to a point where we managed to salvage the relationship and the project.

Lesson learned: Know your client – Adapt your communication to the client

Keep a close eye on the communication, invest time to learn who you are talking to on the other side, who is the client’s representative, what communication style they prefer, how technical are they… so that you can decide what communication tone and frequency would be the best from your end. In PM-speak, do a stakeholder analysis and use it as input for creating communication matrix for the project.

Six is not enough?

If the six examples did not convince you, we could spend hours talking about:

  • Client thinking something is irrelevant or easy and forgetting to tell us until it’s too late. E.g. automatic order processing is “just one button”, or the client doesn’t mention they have multiple stores,
  • The time we did not contract 3rd party support (for integrated systems),
  • That project where we did not include all stakeholders from the client side (e.g. not all departments) which led to last minute changes and budget overruns,
  • When we did not explain our process to the client, so they were late with their deliveries (e.g. logos, transactional emails),
  • The client that was too detailed and wanted to have spit-polished plans – the whole budget was spent only on planning,
  • Or many projects where we did not check if extensions really work with the latest Magento version (e.g. M1 -> M2 upgrade)
  • Or …

Instead of conclusion

“By failing to prepare, you are preparing to fail.”
– Benjamin Franklin

The six examples we covered are ranging from technical to social, but they have one thing in common. The solution was not technical, it was better processes, communication, organization – in short, better Project Management. They are the best illustration that the biggest risk and the biggest opportunity in projects come from good or bad project management. Please share your experiences in comments – what were the small things that made or broke your projects, and how did you deal with them?

Oh, I almost forgot…

Those skeletons in Vilnius? That wasn’t a mass grave, they were not burying the bodies. The ground was too frozen to dig, so they could not dig trenches. They used frozen corpses of their friends to build a breastwork, a shield, barricades to protect them from advancing Russian army.

Don’t let that happen to you because you ignored small things.

The post Keeping an eye on small things in eCommerce projects appeared first on Inchoo.

]]>
http://inchoo.net/ecommerce/keeping-eye-small-things-ecommerce-projects/feed/ 1
Customising product info tabs in Magento 2 (part 2) http://inchoo.net/magento-2/customising-product-info-tabs-magento-2-part-2/ http://inchoo.net/magento-2/customising-product-info-tabs-magento-2-part-2/#comments Mon, 30 Oct 2017 13:37:55 +0000 http://inchoo.net/?p=30945 In this follow up on our first blog post about customising product info tabs in Magento 2 we’ll be talking about reordering tabs. Again it’s a fairly easy task. We already know that we’ll be looking at product page layout and template files in Magento Catalog module. Standard Magento way for reordering and rearranging elements...

The post Customising product info tabs in Magento 2 (part 2) appeared first on Inchoo.

]]>
In this follow up on our first blog post about customising product info tabs in Magento 2 we’ll be talking about reordering tabs. Again it’s a fairly easy task. We already know that we’ll be looking at product page layout and template files in Magento Catalog module.

Standard Magento way for reordering and rearranging elements around the webpage is by modifying layout (xml) files. For that purpose we use move instruction together with a couple of attributes, required ones being:

element – for selecting element to be moved
destination – for denoting destination element

Optional ones, before and after, are used for placing the target element before or after the certain element under the same parent.

Although useful and easy to use, this layout handler is of no help when we face the problem of reordering product tabs so we need to find another way.

HTML markup for our product tabs is stored in details.phtml file found in module-catalog/view/frontend/templates/product/view folder. Inspecting the code we will find out that our tabbed navigation is ordered based on elements position in a $detailedInfoGroup array. We found exactly what we were looking for and now we can copy file to our theme scope and simply redeclare array before foreach loop.

// Reposition elements in array
   $detailedInfoGroup = ["reviews.tab", "product.info.description", "product.attributes"]

And that’s it!

In the example above, we moved reviews.tab to the first position in array and looking at the product page in our browser we can see that tabbed navigation is in the same order defined in $detailedInfoGroup array in template file.

This simple and easy array manipulation is the way to go in almost every situation we need to change tabs ordering. However, there are one or two cases when server-side scripting cannot be our weapon of choice and we need to rely on javascript or jQuery.

Javascript to the rescue

As a client-side language, javascript is suitable in cases we want to reorder our tabs based on some user agent setting or feature such as screen resolution.

To code our .js script let’s first take a look at HTML structure of tabbed navigation. We can see that tab titles and tab contents are all div elements and all siblings, meaning they share the same parent.

In the first part of our script we will get all divs that are children of container div i.e. div class="product data items" in one array in a such a way that tab title and tab content pairs are stored in one array element:

// Get tab title and tab content pairs in one array
   var container = document.getElementsByClassName('product data items');
   var elements = container[0].children;
   var tabs = []; // declare array to hold our elements
 
   for (var i = 0; i < elements.length; i += 2) {
     var tabTitle   = (elements[i]).outerHTML;
     var tabContent = (elements[i + 1]).outerHTML;
 
     tabs.push(tabTitle + tabContent);
   }

The second part of our script is a function that sorts tabs array based on our inputs:

// Function to reorder tabs based on newOrder array
   var result = [];        
   function reorder(tabs, newOrder) {
     for(var i = 0; i < tabs.length; i++) {
       result[i] = tabs[newOrder[i] - 1];
     }
     return result;
   }

Finally, our third code block is where we declare new array with arbitrary elements’ position and call our function:

// Output reordered elements     
   var newOrder = [3, 1, 2]; // new elements' position
   container[0].innerHTML = null;
   container[0].innerHTML = reorder(tabs, newOrder).join("");

As you know Magento 2 has its special way for using custom javascript so I’ll refer you to this excellent post to correctly add javascript files to your project.

***

Obviously, (re)declaring php array in template file is the easier and more convenient of the two methods. But, when dealing with different settings end/or features on end users’ devices, we have no choice but to use javascript.

The post Customising product info tabs in Magento 2 (part 2) appeared first on Inchoo.

]]>
http://inchoo.net/magento-2/customising-product-info-tabs-magento-2-part-2/feed/ 1
How was it at Meet Magento Romania 2017? Review by Inchoo http://inchoo.net/life-at-inchoo/meet-magento-romania-2017/ http://inchoo.net/life-at-inchoo/meet-magento-romania-2017/#respond Wed, 25 Oct 2017 11:14:39 +0000 http://inchoo.net/?p=30905 This fall, for the first time, Andreja, Goran, Ivan and myself had the opportunity to be a part of Meet Magento Conference. After Poland and Greece, it was time for Romania, and this is our experience. The Trip Romania. The first association is probably historical province of Transylvania and its legends about Count Dracula and...

The post How was it at Meet Magento Romania 2017? Review by Inchoo appeared first on Inchoo.

]]>
This fall, for the first time, Andreja, Goran, Ivan and myself had the opportunity to be a part of Meet Magento Conference. After Poland and Greece, it was time for Romania, and this is our experience.

The Trip

Romania. The first association is probably historical province of Transylvania and its legends about Count Dracula and his castle in the heart of this province. But, Romania is certainly not just that. This year, in Cluj – Napoca, the city that is considered the unofficial capital of the historical province of Transylvania, a two – day Meet Magento conference was held in a beautiful Grand Hotel Italia. (Thanks Nandino for arranging our accommodation :)).

The 12 hours trip (with breaks) definitely paid off after we came to a hotel room on 4th floor and saw the beautiful view of the city of Cluj-Napoca.

We’ve unpacked our things and went for a long-awaited sleep. Since this was the first conference for all of us, we tried to attend all the interesting lectures and get to know as many interesting people, so we needed a rest.

The conference

The conference began with an introductory lecture by Vlad Stănescu from MindMagent followed by Ben Marks, Marius Străjeru, Riccardo Tempesta, Sherrie Rohde and many others, and of course, our Project Manager Goran Bokun. The hall was full of people interested in novelties in eCommerce world, and we have to say that we’ve learned a lot from them.

Our Goran held a fantastic lecture on the topic: “Start small to win or lose big – why you should keep an eye on details when managing eCommerce projects”, and he was awesome. We were very proud of him and we learned that keeping an eye on the small things in big projects is the key to success.

After interesting lectures and coffee breaks, we went to a deserved after party in Collin’s where we treated ourselves with our favourite drink – beer, and met a lot of great people.

The 2nd day of the conference was filled with interesting lectures from Bartek Igielski, Maciej Kalkowski and many others. The conference has been concluded with Ask us Anything part with Max Yekaterynenko, Marius Străjeru, Ben Marks and Sherrie Rohde where we had the opportunity to ask any questions about Magento community, Magento development or the future of Magento.

Meet Magento Romania

Meet Magento Romania AMA

After this beautiful experience, we hope to see Romania again, and until then, enjoy our next experiences from Meet Magento Conferences!

The post How was it at Meet Magento Romania 2017? Review by Inchoo appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/meet-magento-romania-2017/feed/ 0
Add custom image field for custom options http://inchoo.net/magento/add-custom-image-field-custom-options/ http://inchoo.net/magento/add-custom-image-field-custom-options/#comments Tue, 24 Oct 2017 10:39:05 +0000 http://inchoo.net/?p=30858 We had a request from a client who wanted to display images for custom options. In this article, I’ll explain how to add the image field to the custom option in admin. Create new module Inchoo_ProductCustomOptionsFile app/etc/modules/Inchoo_ProductCustomOptionsFile.xml <?xml version="1.0"?> <config> <modules> <Inchoo_ProductCustomOptionsFile> <active>true</active> <codePool>local</codePool> </Inchoo_ProductCustomOptionsFile> </modules> </config> Configuration file To add your custom field it...

The post Add custom image field for custom options appeared first on Inchoo.

]]>
We had a request from a client who wanted to display images for custom options. In this article, I’ll explain how to add the image field to the custom option in admin.

Create new module Inchoo_ProductCustomOptionsFile

app/etc/modules/Inchoo_ProductCustomOptionsFile.xml

  1. <?xml version="1.0"?>
    <config>
        <modules>
            <Inchoo_ProductCustomOptionsFile>
                <active>true</active>
                <codePool>local</codePool>
            </Inchoo_ProductCustomOptionsFile>
        </modules>
    </config>

Configuration file

To add your custom field it is necessary to rewrite class         Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Type_Select and set your template. To fill custom option image filed with new image’s names it is necessary to rewrite the class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option.

/app/code/local/Inchoo/ProductCustomOptionsFile/etc/config.xml

<?xml version="1.0"?>
<config>
	<modules>
		<Inchoo_ProductCustomOptionsFile>
			<version>1.0.0</version>
		</Inchoo_ProductCustomOptionsFile>
	</modules>
	<global>
		<blocks>
			<adminhtml>
				<rewrite>
					<catalog_product_edit_tab_options_type_select>Inchoo_ProductCustomOptionsFile_Block_Adminhtml_Rewrite_Catalog_Product_Edit_Type_Select</catalog_product_edit_tab_options_type_select>
					<catalog_product_edit_tab_options_option>Inchoo_ProductCustomOptionsFile_Block_Adminhtml_Rewrite_Catalog_Product_Edit_Tab_Options_Option</catalog_product_edit_tab_options_option>
				</rewrite>
			</adminhtml>
			<inchoo_file>
				<class>Inchoo_ProductCustomOptionsFile_Block</class>
			</inchoo_file>
		</blocks>
		<resources>
			<inchoo_productcustomoptionsfile_setup>
				<setup>
					<module>Inchoo_ProductCustomOptionsFile</module>
				</setup>
			</inchoo_productcustomoptionsfile_setup>
		</resources>
	</global>
	<admin>
		<routers>
			<adminhtml>
				<args>
					<modules>
						<inchoo_product before="Mage_Adminhtml">Inchoo_ProductCustomOptionsFile_Adminhtml</inchoo_product>
					</modules>
				</args>
			</adminhtml>
		</routers>
	</admin>
</config>

 Blocks

/app/code/local/Inchoo/ProductCustomOptionsFile/Block/Adminhtml/Rewrite/Catalog/Product/Edit/Type/Select.php

We want to use our template instead default one for custom option.

<?php
class Inchoo_ProductCustomOptionsFile_Block_Adminhtml_Rewrite_Catalog_Product_Edit_Type_Select extends Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Type_Select
{
	public function __construct()
	{
		parent::__construct();
		$this->setTemplate('catalog/product/edit/options/type/select-with-file.phtml');
		$this->setCanEditPrice(true);
		$this->setCanReadPrice(true);
	}
 
}

Create a template file and copy content of /app/design/adminhtml/default/default/template/catalog/product/edit/options/type/select.phtml into our new template file /app/design/adminhtml/default/default/template/catalog/product/edit/options/type/select-with-file.phtml

Add code between Inchoo into select-with-file.phtml template

<!---...-->
 
OptionTemplateSelect =
<!---...-->
        '<th class="type-sku"><?php echo Mage::helper('core')->jsQuoteEscape(Mage::helper('catalog')->__('SKU')) ?></th>'+
            // Inchoo
        '<th class="type-title"><?php echo Mage::helper('core')->jsQuoteEscape(Mage::helper('catalog')->__('Image Name')) ?></th>'+
        '<th class="type-title"><?php echo Mage::helper('core')->jsQuoteEscape(Mage::helper('catalog')->__('Upload New Image')) ?></th>'+
            // Inchoo
        '<th class="type-title"><?php echo Mage::helper('core')->jsQuoteEscape(Mage::helper('catalog')->__('Sort Order')) ?></th>'+
<!---...-->
 
OptionTemplateSelectRow =
<!---...-->
        '<td><input type="text" class="input-text" name="product[options][{{id}}][values][{{select_id}}][sku]" value="{{sku}}"></td>'+
            // Inchoo
        '<td><input type="text" class="select-type-image" id="product_option_{{id}}_select_{{select_id}}_image" name="product[options][{{id}}][values][{{select_id}}][image]" value="{{image}}">{{checkboxScopeTitle}}</td>'+
        '<td><input type="file" class="input-text select-type-image" id="image" name="{{id}}-{{select_id}}"></td>'+
            // Inchoo
        '<td><input type="text" class="validate-zero-or-greater input-text" name="product[options][{{id}}][values][{{select_id}}][sort_order]" value="{{sort_order}}"></td>'+
<!---...-->

To pass our new custom option value to template we need to rewrite Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option class. Create block /app/code/local/Inchoo/ProductCustomOptionsFile/Block/Adminhtml/Rewrite/Catalog/Product/Edit/Tab/Options/Option.php Add code between Inchoo comment. Function getOptionValues() returns all product custom options to javascript object which fills custom options fields.

class Inchoo_ProductCustomOptionsFile_Block_Adminhtml_Rewrite_Catalog_Product_Edit_Tab_Options_Option extends Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option
{
	public function getOptionValues()
	{
 
// ...
	$i = 0;
	$itemCount = 0;
	foreach ($option->getValues() as $_value) {
	/* @var $_value Mage_Catalog_Model_Product_Option_Value */
		$value['optionValues'][$i] = array(
		'item_count' => max($itemCount, $_value->getOptionTypeId()),
		'option_id' => $_value->getOptionId(),
		'option_type_id' => $_value->getOptionTypeId(),
		'title' => $this->escapeHtml($_value->getTitle()),
		'price' => ($showPrice)
		? $this->getPriceValue($_value->getPrice(), $_value->getPriceType()) : '',
		'price_type' => ($showPrice) ? $_value->getPriceType() : 0,
		'sku' => $this->escapeHtml($_value->getSku()),
		'sort_order' => $_value->getSortOrder(),
		// Inchoo
		'image' => $_value->getImage(),
		// Inchoo
		);
// ...

Now we have our custom fields Image Name and Upload New Images :

Saving images

To save images into database, we need to create setup script and rewrite Mage_Adminhtml_Catalog_ProductController. Then create setup script /app/code/local/Inchoo/ProductCustomOptionsFile/sql/inchoo_productcustomoptionsfile_setup/install-1.0.0.php

<?php
/* @var $installer Mage_Core_Model_Resource_Setup */
 
$installer = $this;
 
$installer->getConnection()
->addColumn($installer->getTable('catalog/product_option_type_value'), 'image', 'VARCHAR(255) NULL');
$installer->endSetup();

Rewrite class Mage_Adminhtml_Catalog_ProductController and add code between Inchoo to save images name into table catalog_product_option_type_value and upload images.

 

<?php
require_once(Mage::getModuleDir('controllers','Mage_Adminhtml').DS.'Catalog'.DS.'ProductController.php');
 
class Inchoo_ProductCustomOptionsFile_Adminhtml_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController
{
	/**
	 * Initialize product before saving
	 */
	protected function _initProductSave()
	{
 
// ..
 
		$product->setCanSaveConfigurableAttributes(
			(bool) $this->getRequest()->getPost('affect_configurable_product_attributes')
			&& !$product->getConfigurableReadonly()
		);
// Inchoo
		$skuImageName=trim($product->getSku());
		$imagesFiles=$_FILES;
		$path = Mage::getBaseDir('media') . DS . 'catalog' . DS . 'customoption' .DS. 'images';
 
		foreach ($imagesFiles as $key=>$value)
		{
			$optionsValue = explode('-',$key);
			foreach ($value as $key2=>$value2)
			{
				if($key2=='name' && $value2!="") {
					try {
						$uploader = new Varien_File_Uploader($key);
						$uploader->setAllowedExtensions(array('jpg','jpeg','gif','png','svg'));
						$uploader->setAllowRenameFiles(false);
						$uploader->setFilesDispersion(false);
						$optionTitle = trim($productData['options'][$optionsValue[0]]['title']);
						$optionValueTitle = trim($productData['options'][$optionsValue[0]]['values'][$optionsValue[1]]['title']);
						$imageExtension = pathinfo($value2,PATHINFO_EXTENSION);
						$newImageName =$skuImageName.'_'.$optionTitle.'_'.$optionValueTitle.'.'.$imageExtension;
						$uploader->save($path, $newImageName);
						$productData['options'][$optionsValue[0]]['values'][$optionsValue[1]]['image']=$uploader->getUploadedFileName();
					} catch(Exception $e) {
						Mage::log('Unable to save custom option image. ' . $e->getMessage(), null, null, true);
					}
 
				}
			}
		}
// Inchoo

And that’s it. If you have any questions, feel free to post them in comments.

The post Add custom image field for custom options appeared first on Inchoo.

]]>
http://inchoo.net/magento/add-custom-image-field-custom-options/feed/ 1
Meet Magento Greece and Athens at its finest http://inchoo.net/life-at-inchoo/meet-magento-greece-2017-review/ http://inchoo.net/life-at-inchoo/meet-magento-greece-2017-review/#respond Mon, 23 Oct 2017 13:36:18 +0000 http://inchoo.net/?p=30881 The whole of September has been rather hectic, so we barely realized that the date of Meet Magento Greece conference has approached. So my colleague Adrian and my self needed to plan and prepare everything, and start packing fast. Our office manager Nandino set us up with the accommodation in Athens and flight tickets and we were...

The post Meet Magento Greece and Athens at its finest appeared first on Inchoo.

]]>
The whole of September has been rather hectic, so we barely realized that the date of Meet Magento Greece conference has approached. So my colleague Adrian and my self needed to plan and prepare everything, and start packing fast. Our office manager Nandino set us up with the accommodation in Athens and flight tickets and we were good to go.

A 2-hour ride to Belgrade was the first part of our trip and was actually rather pleasant. No hassles at the border and we were safely delivered to Nikola Tesla airport by our office master Nandino. After going through all the checks, we boarded the plane and in an hour and a half we were in Greece. Metro took us from the airport to the center of Athens.

When we got off the Metro, the first thing that struck us was the climate. Even though the actual temperature is not a lot higher than in Croatia, the proximity of the see is giving it that mild Mediterranean feel. I am guessing it can also be attributed to the position which is closer to the equator than Croatia. Anyway, it really felt good to catch a breeze of summer, once again, since it is long gone in Croatia.

The first day, or should I say evening, we spent walking around and planning our sightseeing for after the conference. Even though we were a bit tired, it didn’t stop us from checking some cool places and getting some proper food (other than airline food). We treated ourselves with some Greek platters, just to make sure we cover all of the best the Greek cuisine has to offer.

The conference

Thursday was the conference day. As usual with this series of conferences, Meet Magento Greece brought some of the well-known names from Magento world. So we met the Magento “evangelist”  Ben Marks, as well as Guido Jansen and some other people from Magento community.

The whole of Thursday was filled with interesting presentations. Ben talked about the future of Magento, while Guido’s presentation covered a very interesting topic of online persuasion. There were many great speakers but I would mention just a few that really caught my attention. Maciej Kalkowski offered some thoughts and tips around Magento performance optimisation while Olga Mavi from Socital talked about data-driven personalization. It would be crazy not to mention Savvas Zortikis who had a great presentation about Viral marketing as a growth catalyst for an eCommerce Store.


I spoke about the internal project that we had last year, which included a bit of outbound campaigns, a fair portion of Magento and a lot of research.

The conference ended with the cocktail party where we had a chance to talk with other guests and meet some interesting people. The organizer of the conference was Converge who we would like to thank for the organization and hospitality.

That was pretty much the end of that day for us. We needed to get some rest as the plans for tomorrow were serious to say the least.

Athens – The eye of Greece

We got up early in order to be among the first ones to reach the Acropolis. And we did it! The Acropolis with all its parts and details was simply amazing. Philopappos Monument, Zeus Temple, Panathenaic stadium, Hadrians Arch, Agora, were also among the places we visited. Impossible to miss was also Byron’s statue located in the National Garden. Needless to say that we walked quite a bit that day – 26 kilometers to be precise. So the overall impression was just wow! To put it shortly – If you haven’t been to Athens you should go!

One thing that I need to mention once again is the food. And what a food it was! Greek cuisine is somewhat similar to those of other Balkan countries. So it was really interesting to try both original Greek dishes as well as those we are sort of familiar with. Whatever we tried was really tasty: from gyros and skewers to moussaka and lamb pot.

Tomorrow morning we packed our stuff and decided to do a quick tour of Nymphs’ Hill in Thissio. We didn’t have a lot of time but it was worth it. And that was pretty much it. We said farewell to Athens and flew back home. It was a great trip altogether and I would do it again any given day.

The post Meet Magento Greece and Athens at its finest appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/meet-magento-greece-2017-review/feed/ 0
Solr and Magento – search by department http://inchoo.net/magento/solr-search-by-department/ http://inchoo.net/magento/solr-search-by-department/#comments Wed, 18 Oct 2017 09:29:47 +0000 http://inchoo.net/?p=30692 There are eCommerce stores which sell a wide variety of products like food, personal care, electronics, and so on. On those stores, visitors want to be able to search by a specific category. This can be achieved by adding a new feature: search by department or category. In this quick tutorial I will explain the...

The post Solr and Magento – search by department appeared first on Inchoo.

]]>
There are eCommerce stores which sell a wide variety of products like food, personal care, electronics, and so on. On those stores, visitors want to be able to search by a specific category. This can be achieved by adding a new feature: search by department or category. In this quick tutorial I will explain the base concept of how to do it using Solr search engine as an example.

Assuming you already use Solr search server on your eCommerce site, first step should be checking if there is a category_ids field in Solr index. Category_ids should exist in Solr index in order to be able to filter by category_id.

To check if the field exists, call this url: http://localhost:8983/solr/collection1/select?q=*%3A*&wt=json&indent=true.

You can see category_ids in the response below:

Field category_ids should be declared in Solr schema.xml as in the following example:

        <field name="category_ids"  type="int"  indexed="true" multiValued="true"/>

Category_ids field is multivalued and indexed, can contain more values, and product can be assigned to more categories.

If the previous conditions are fulfilled, only the Magento side should be modified to send a proper category filter with search phrase. If you use Solarium client, it is pretty easy.

$client = new Solarium\Client($config);
 
// get a select query instance
$query = $client->createSelect();
$query->setQuery('Teflon');
$query->setFields(array('id','name','price'));
 
// create a filterquery by category id 3887
$fq = $query->createFilterQuery('category_ids')->setQuery('category_ids:3887');

If you are interested in finding out more about the Solarium concepts, click here.

Finally, query to Solr should look like this:
http://localhost:8983/solr/collection1/magento_en?q=Teflon&fq=category_ids:3887

q parameter is search terms “Teflon”
fq parameter is filter by category id 3887 (more about Solr common parameters)

The results

This is how a “search by category” on Magento frontend can look like:

With this feature you can improve site search performance and decrease the need for search refinement which, ultimately, has direct impact on your eCommerce conversion rate.

The post Solr and Magento – search by department appeared first on Inchoo.

]]>
http://inchoo.net/magento/solr-search-by-department/feed/ 1
How to keep design library in sync across the team? Welcome Sketch Libraries! http://inchoo.net/magento/design/how-to-keep-design-library-in-sync-across-the-team-welcome-sketch-libraries/ http://inchoo.net/magento/design/how-to-keep-design-library-in-sync-across-the-team-welcome-sketch-libraries/#respond Tue, 17 Oct 2017 10:43:10 +0000 http://inchoo.net/?p=30680 The buzz these days is all about design systems, but design system by itself is not enough to ensure consistency through all designs. When working with design systems, the main challenges are ongoing maintenance and informing everyone about the changes. For a long time, there wasn’t a thorough solution for designers who design in Sketch...

The post How to keep design library in sync across the team? Welcome Sketch Libraries! appeared first on Inchoo.

]]>
The buzz these days is all about design systems, but design system by itself is not enough to ensure consistency through all designs. When working with design systems, the main challenges are ongoing maintenance and informing everyone about the changes.

For a long time, there wasn’t a thorough solution for designers who design in Sketch which would provide easy access to the latest styles and propagate changed assets to team members. Yeah, we had the ability to share symbols via plugins for a while (Craft’s Library), but there were too many problems, and sharing library is too important to rely on a third-party plugin.

Welcome Sketch Libraries

Sketch just made public the Sketch 47, and we finally have a document with symbols which can be used across other documents, so let’s see how to use libraries in Sketch.

1. Create a Sketch document with at least one symbol and save your document in Dropbox, Box, Sync or any other place where your colleagues have access.

2. Press CMD + comma to open Sketch’s Preferences and navigate to the Libraries tab.

3. You’ll notice there is iOS UI Design library included, but we’ll create a new library. Click on the “Add Library…” button and choose your document. Congrats, you’ve just created a single source of truth for everyone in your team.

Team members can now easily add the Library by following the same steps mentioned above and access the symbols in that file from any Sketch file.

Inserting, editing and accepting changes

Using shared library is simple and straightforward. Inserting symbols works just like inserting regular symbols, the only difference is they are not placed in your document. To insert a symbol just find your shared library at the bottom of the list on the Insert menu.

You’ll notice external symbols have slightly different icons from the local symbols to avoid confusion.

Once inserted, there are two options for editing an external symbol. You can unlink it from Library or open it in the Original document.


If you choose “Unlink from Library”, it will detach from the external library and become a local symbol in your current Sketch file.

Making changes in the original document will affect all instances of the symbol across any document which is using this library, but only if those changes are accepted. After making changes, everyone who is using this library will see “Library Update Available” badge on the top-right corner of Sketch.

Maybe Sketch crew should make that badge more prominent because it’s easy to miss. Anyhow, clicking on it will display a dialog box with outdated symbols and an option to selectively update them.

To sum up…

This feature is definitely a game changer for all Sketch users and it will change real-time collaboration permanently. What we would like to see in some of the future updates is an option to include text styles and layer styles in a library.

The post How to keep design library in sync across the team? Welcome Sketch Libraries! appeared first on Inchoo.

]]>
http://inchoo.net/magento/design/how-to-keep-design-library-in-sync-across-the-team-welcome-sketch-libraries/feed/ 0
Build your custom form validation rule http://inchoo.net/magento-2/build-your-custom-form-validation-rule/ http://inchoo.net/magento-2/build-your-custom-form-validation-rule/#comments Mon, 16 Oct 2017 08:40:56 +0000 http://inchoo.net/?p=30792 This article is sort of a follow up on my previous article on custom form validation, which explains step-by-step what it takes to validate any form. The Magento 2 way, of course. But what if you have to implement another field that has to be in a particular format or that kind of rule does...

The post Build your custom form validation rule appeared first on Inchoo.

]]>
This article is sort of a follow up on my previous article on custom form validation, which explains step-by-step what it takes to validate any form. The Magento 2 way, of course.

But what if you have to implement another field that has to be in a particular format or that kind of rule does not even exist? Well… Keep reading, my dear visitor, keep reading.

Really, Gandalf, wanna make a bet? 🙂

We will be working on a contact form that is located in a custom theme (in this case, Inchoo/FormValidation):

app/design/frontend/Inchoo/FormValidation/Magento_Contact/templates/form.phtml

  1. Add custom validation method
    In the data-mage-init attribute, add a custom method name (in this case, theInchooValidationMethod), which will be used to trigger our custom validation rule:
    <form class="form contact"
          action="<?php /* @escapeNotVerified */ echo $block->getFormAction(); ?>"
          id="contact-form"
          method="post"
          data-hasrequired="<?php /* @escapeNotVerified */ echo __('* Required Fields') ?>"
          data-mage-init='{
    	"validation":{},
    	 "theInchooValidationMethod":{}
    }'>
  2. In the same form, add your custom field:
    <form>
    <!-- form content -->
     
    <div class="field name required">
                <label class="label" for="field5"><span>Field 5 (inchoo)</span></label>
                <div class="control">
                    <input name="field5" id="field5" title="Field 5" value="" class="input-text required inchoo" type="text"/>
                </div>
            </div>
     
    <!-- form content -->
     
    </form>

    As you can see, a custom class named inchoo has been added to the input field, which will be used as a custom rule name to validate this field.

  3. Bind your custom validation method name to a Javascript file using RequireJs (app/design/frontend/Inchoo/FormValidation/requirejs-config.js):
    var config = {
        map: {
            "*": {
                theInchooValidationMethod: "js/theInchooValidationRule"
            }
        }
    };
  4. Create the Javascript file with the code that will validate the field (app/design/frontend/Inchoo/FormValidation/web/js/theInchooValidationRule.js):
    define([
        'jquery',
        'jquery/ui',
        'jquery/validate',
        'mage/translate'
    ], function($){
        'use strict';
     
        return function() {
            $.validator.addMethod(
                "inchoo",
                function(value, element) {
                    return this.optional(element) || /^Inchoo/.test(value);
                },
                $.mage.__("Type 'Inchoo' in this field")
            );
        }
    });

Let’s open up the browser and submit the form!

OK, we can see that validation is working (by default, required rule kicks in first. Let’s type in something and submit the form…

Hooray! Our custom validation rule has been invoked! And now if we type in the word “Inchoo” and submit the form…

The error message is gone, our custom validation is working as expected!

Nice try, Gandalf, nice try…

 

If you have any questions, feel free to post them in the comment section below!

The post Build your custom form validation rule appeared first on Inchoo.

]]>
http://inchoo.net/magento-2/build-your-custom-form-validation-rule/feed/ 1
eCommerce (Ro)mania http://inchoo.net/life-at-inchoo/ecommerce-romania/ http://inchoo.net/life-at-inchoo/ecommerce-romania/#respond Thu, 12 Oct 2017 12:33:07 +0000 http://inchoo.net/?p=30816 We are happy to anounce 4 Inchooers will be attending this year’s Meet Magento Romania – a two-day conference that will be held in beautiful Cluj, the unofficial capital of Transylvania, on 16th and 17th October. Our delegates Ivana, Andreja, Ivan and Goran (who we’re proud to present as a speaker) are excited because this...

The post eCommerce (Ro)mania appeared first on Inchoo.

]]>
We are happy to anounce 4 Inchooers will be attending this year’s Meet Magento Romania – a two-day conference that will be held in beautiful Cluj, the unofficial capital of Transylvania, on 16th and 17th October. Our delegates Ivana, Andreja, Ivan and Goran (who we’re proud to present as a speaker) are excited because this is their first Magento event.

Regardless of the expertise, each attendee will be able to choose among various lectures. Agenda consists of the Main/Development and Business track, and covers interesting topics from technical guidelines, security, community and future of Magento to business aspects of eCommerce such as legal challenges and digital marketing.

Our project manager Goran told us how he feels about this upcoming experience.

Goran, you are a world traveler. Have you ever been to Romania and what are you looking forward to the most?

Goran: This is my first time in Romania. I plan to go hiking in Transylvania in the next year or two, so I will spend my free time checking out hills, forests and castles to better plan my hiking trip.

What are your expectations of #MM17RO event?

Goran: This is my first MM event, but I heard a lot of good things about Magento conferences – both about the content of the lectures and the spirit of the attendees. All of my colleagues improved their skill significantly on MM conferences, so I plan to do the same – I expect to learn and have fun at the same time. I look forward to experiencing the enthusiasm of the Magento community and getting to know it better.

You have a large experience in Project management. What will you be sharing with your “Start small to win or lose big – why you should keep an eye on details when managing eCommerce projects” presentation?

Goran: Project managers usually focus on big things: biggest costs, biggest features, biggest risks, etc. The same is with building an eCommerce site – the biggest, most important things are, well, most important.

But large topics are not the be-all and end-all of the project.

In my lecture I will illustrate how tiny issues can have outsized influence on the project. Through analysis of several examples from our experience I will try to understand how small perturbations shape the course of the project. At the end, I will present a challenge to the audience: what is the smallest thing that significantly influenced their project?

This is a go to conference for everyone who wants to connect and find out a useful tip or to from merchants, decision-makers/ leaders and developers in the eCommerce. Book you tickets here!

The post eCommerce (Ro)mania appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/ecommerce-romania/feed/ 0
You shouldn’t miss Meet Magento Greece! http://inchoo.net/life-at-inchoo/meet-magento-greece-2017/ http://inchoo.net/life-at-inchoo/meet-magento-greece-2017/#respond Tue, 10 Oct 2017 09:49:38 +0000 http://inchoo.net/?p=30738 In 2015, the year Meet Magento Greece was born, Inchooers Hrvoje and Dino witnessed a community rise and we don’t want to miss to see how it all panned out in the last three years. There were many Inchooers interested in attending this year’s #MM17GR but only Adrian and Želimir are fortunate enough to witness...

The post You shouldn’t miss Meet Magento Greece! appeared first on Inchoo.

]]>
In 2015, the year Meet Magento Greece was born, Inchooers Hrvoje and Dino witnessed a community rise and we don’t want to miss to see how it all panned out in the last three years. There were many Inchooers interested in attending this year’s #MM17GR but only Adrian and Želimir are fortunate enough to witness it firsthand.

Meet Magento Greece 2017 is the first Meet Magento event happening in two cities in parallel, where you can meet and learn from Magento developers and e-commerce leaders. Since Želimir will be one of the speakers, we asked him what are his expectations from the event.

So Želimir, you are heading off to Greece. Have you ever been there?

Želimir: Well, I have never been there. As a matter of fact, it has been quite some time that Greece has been on the list of countries I want to visit. So yeah, mixing pleasure with work is what we’ll have there. I really like Greek culture so this is going to be a great opportunity to see and learn a bit about it. Yeh, we learn a lot about it in school and all, but real deal is a completely different thing.

You are holding a presentation “Introducing Magento to Croatian market”. What is it about?

Želimir: The presentation I’ll have is a retrospective of the internal project we had at Inchoo. It took place in late 2016/early 2017 and it was about introducing Magento 2 to Croatian market. I am going to talk about the process, researches we did, tools we used, what we planned and what we learned. It was a u bumpy road but the one we needed to take. I am sure that conference guests will be interested to hear this kind of presentation as it includes a lot of different aspects.

Courtesy of http://gr.meet-magento.com

What are you planning to visit while you’re there?

Želimir: Really thrilled to go to Athens, since there are so many things I want to see there. My colleague Adrian already prepared a short itinerary which is, quite frankly, easy to agree on. Acropolis, Parthenon, National Archaeological Museum are among the notable cultural places we aim to visit. Personally, I like to visit local markets whenever I visit new places, as nothing can give you a feel of a culture and it’s people as markets can. Therefore, Varvakios Agora is certainly on my list, if we find time for visit. Athens is also well known for its great restaurants and bars so we plan to visit those as well. Those might not be as culturally significant as Parthenon, but must not be missed either! 😉

If you’re interested in joining Želimir, Adrian and the rest of Meet Magento Greece crew, and you still haven’t booked your ticket, you can do so here!

The post You shouldn’t miss Meet Magento Greece! appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/meet-magento-greece-2017/feed/ 0
Case Study: Migration from Magento 1 to Magento 2 for Sloan Express http://inchoo.net/magento-2/case-study-migration-magento-1-magento-2-sloan-express/ http://inchoo.net/magento-2/case-study-migration-magento-1-magento-2-sloan-express/#respond Mon, 02 Oct 2017 11:54:40 +0000 http://inchoo.net/?p=30654 Sloan Express is a family-owned business with deep roots in the agricultural industry that have been serving the needs of farmers worldwide for over 80 years. Located in Central Illinois, Sloan Express is the area leader offering new agricultural parts that are equal to or better than the original equipment part. They sell directly to...

The post Case Study: Migration from Magento 1 to Magento 2 for Sloan Express appeared first on Inchoo.

]]>

Sloan Express is a family-owned business with deep roots in the agricultural industry that have been serving the needs of farmers worldwide for over 80 years. Located in Central Illinois, Sloan Express is the area leader offering new agricultural parts that are equal to or better than the original equipment part. They sell directly to farmers, implement dealers and repair shops.

Sloan Express has been able to address some of the problems that today’s farmers face: parts not stocked locally; shortage of local sources for parts; and most important – TIME. The Sloan Express Customer prompt and direct delivery with no time wasted trying to find a part and then waiting for it to come in.

What were the challenges for us?

Sloanex_new2017
Sloanex_old2016

Recognizing the need to take the business to the next level, Jeff Sloan and the team from Sloan Express approached us looking for Magento professionals that can migrate their existing store from 1.7. Open Source edition to Magento 2.

Magento 2 introduces new methodologies and technologies for delivering enhanced shopping and store experience to the merchants and users. But to be honest, migrating from Magento 1 to Magento 2 is not an easy and trouble-free process. Since it’s not automated, there is plenty of manual work that needs to be done by professionals who understand migration process and your business in order to get a stable and fully functional store.

Sloan Express knew what they wanted for their future. They required a solution that can easily scale up if required and has a modular architecture to ensure faster page load time, faster add-to-cart server response time and faster end-to-end checkout time.

Inchoo at Sloan Express

Inchoo at Sloan Express

Magento 2 Open source (previously known as Community Edition) comes with support for only MySQL search engine, but some projects require better or more adjustable search engine in order to increase sales or conversion rate. For Sloan Express, we’ve implemented SOLR search engine in order to achieve blazing-fast search results that are also highly reliable and fault tolerant. With a near real-time indexing, advanced full-text search capabilities and optimisation for high volume traffic, SOLR has brought a new dimension for the customers using the site.

The client wanted to keep all of their existing features and extensions from Magento 1. As one can imagine, Magento 1 extensions are not compatible with Magento 2, so we implemented new ones and set fundamentals for all future technical implementations and integrations as PIM, ERP and other complex technical systems.

Since Sloan Express had a large number of categories, we had to do a major restructuring of the store’s hierarchy, which, among other, resulted with structured navigation and flow that seems more natural to the end user.

The end result

Sloan Express now has modern and clean responsive design with a completely new look and flow that provides optimal viewing and interaction experience across a wide range of devices. We designed it by having in mind business needs for this special niche and eCommerce trends supported with the gathered information and behavior of visitors on the previous store.

Results Sloanex Inchoo

Implementing several analytic tools, we now have a better understanding of the customer’s journey and how they engage with the brand. That gives us the opportunity to continuously test and improve technical functionalities and user experience in order to increase revenue and reflect the quality that stands behind the name of Sloan Express in agriculture world.

The post Case Study: Migration from Magento 1 to Magento 2 for Sloan Express appeared first on Inchoo.

]]>
http://inchoo.net/magento-2/case-study-migration-magento-1-magento-2-sloan-express/feed/ 0
Belarus meets Inchoo: IAESTE summer internship http://inchoo.net/life-at-inchoo/belarus-meets-inchoo-iaeste-summer-internship/ http://inchoo.net/life-at-inchoo/belarus-meets-inchoo-iaeste-summer-internship/#respond Fri, 29 Sep 2017 12:54:37 +0000 http://inchoo.net/?p=30638 7 years ago, Kamilla from Russia did a summer internship at Inchoo. This year, we had the opportunity to host Ulyana Kiklevich from Belarus on an internship that was organised through IAESTE. We’ve prepared an interview to get to know Ulyana, see how her days as frontend developer intern at Inchoo went, what she learned,...

The post Belarus meets Inchoo: IAESTE summer internship appeared first on Inchoo.

]]>
7 years ago, Kamilla from Russia did a summer internship at Inchoo. This year, we had the opportunity to host Ulyana Kiklevich from Belarus on an internship that was organised through IAESTE. We’ve prepared an interview to get to know Ulyana, see how her days as frontend developer intern at Inchoo went, what she learned, and why she decided to travel back to the Croatian coast with her parents.

Hi Ulyana, can you tell us something about yourself?

My name is Ulyana Kiklevich, I am 20 years old. I’m from Belarus, Minsk. I am a full-time student of the Belarusian State University of Informatics and Radioelectronics, with the specialization in “Computing machines, systems and networks”. I’m a technically-minded person, so it’s interesting for me to develop something new and solve some interesting tasks. I always try to improve my skills, learn something new, and look for new possibilities. I manage to work and study at the same time in Minsk, so I don’t have a lot of free time, but when I have some I read books, go to the cinema or play chess. I really believe that I’m the luckiest person in the world because I’ve got this amazing opportunity to be at Inchoo for the internship.

How did you decide to get an internship at Inchoo?

I’ve read a lot about your company, and what you do, so when a position appeared – it was easy to make a decision to apply for the internship. I prepared a lot because I really wanted my country and my university to be proud of me. Also, I didn’t want Inchoo to regret accepting me. I tried to do my best, and I hope I did it.

Your internship is almost over. Did those 6 weeks fly by quicker than you expected or you couldn’t wait for the internship to be over?

I’ve been here for 6 weeks and it’s the most significant experience in my life. First of all, Croatia is unbelievably beautiful country. This nature, these mountains – it’s amazing! I’ve made so many photos and I regret all the time that my camera couldn’t capture how beautiful everything around me is. Then I’ve met Croatian people. You are so kind! So friendly, so open-hearted, so warm and hospitable. I really admire your nationality, your culture, and people. And of course, I adore my job – and your company. I really enjoyed coming in the office and saying “Jutro!” every morning. Your office is so progressive, and Inchooers are so smart and interesting. You have Big Pizzas days and it’s incredible! I’m really happy for every day that I’ve spent at Inchoo for the last 6 weeks.

What were your exact tasks while interning at Inchoo? Can you tell us what you learned during these 6 weeks?

My main tasks were creating some HTML pages for an online shop (we all know that life is too short to buy offline). I had some basic knowledge, but I never worked with web shops. So, my mentor showed me how professionals do it, and how to work effectively with maximum improvement. I found out some features that would be useful for me in future. Also, the task included many spheres, so I could really use all of my knowledge.

What part of the internship would you say was the most interesting and what part was challenging?

The most interesting for me was getting advice from my mentor. I’ve never worked with such a professional and clever person. No one in the world could make the studying process so interesting and interactive.

There were no problems, the company helped me to solve them all: I got a bicycle, a T-shirt, a notebook, a mouse, headphones, cookies and once my team paid for my coffee. What can be better? 🙂

Who was your mentor? How were you accepted by other team members?

My mentor was Nenad Andrakovic and he was the best! I was happy to meet him, I found out so much and got a huge amount of knowledge thanks to him. The team was great – they are all so sweet and funny (I didn’t understand all of their jokes, but they laughed a lot and that made me smile 🙂 ). They never forgot to invite me to coffee break or share chocolate with me. Everybody tried to help me and I really think it’s impossible to be kinder than Croatian people are.

Can you describe your typical day at Inchoo?

Well, I usually come early, I ring the bell downstairs and poor Dunja has to run and open it for me. Then everybody says “Jutro!”, and I start my workday. About 20 minutes later my “cool team” starts to come. They discuss something in Croatian and sometimes I understand them (but they don’t know about it), so I can listen to them and even take part in their conversation. Then I ask my mentor some questions about the task or Nenad asks me if I’m fine. Then we either discuss my questions, or just start working. At 10:00 guys always (I emphasize – always!) invite me to drink coffee with them. After that, I have lunch and start working even harder (I hope Nenad is reading it and appreciates it). At 4 PM I’m leaving, and everybody says “Have a good evening!”. And that is why I love my job here.

How would you explain and describe Inchoo and Inchooers in a few sentences?

Inchoo is the most progressive, dynamic, interesting, effectively organized and quality oriented company I’ve ever seen. I’m really proud that I had a chance to work here. You are really the best. I admire all people working here and admire the ambiance here. I will never forget your company. I will never forget the experience you gave me. You can’t even imagine how much you gave to a student from Belarus.

Ulyana with Nassau team

Ulyana with Nassau team

What do you think of Osijek? How did you spend your free time here (afternoons and weekends)?

Osijek is a very beautiful, calm and slow city. I enjoyed walking to work in the morning; I could buy breakfast on my way, meet some people, take sunbaths and listen to music. The city is so peaceful and cozy, I really love it. Usually, in the evening I had time to go to the café with my friends, also I went to the swimming pool (thank you Antonija for the ticket) or to the river. I rode a bicycle (thank you Tomislav for the bicycle), traveled a lot (thank you Andreja for your power bank). I was at Jankovac, at Plitvice, at the seaside, and in Novi Sad, Serbia. The only thing I regret – I had too little time to see all of the places I wanted. A good reason to come back.

Can you compare life in Belarus and Croatia?

It’s hard for me to compare our lives. I live in a big, noisy city, but here I see calm and peaceful life. Sometimes I notice that people in Minsk are always in a hurry, and that’s the main difference between us. But I should say, that people in Belarus are kind and hospitable as well. We honor our traditions and our history. We are always happy to meet new people and have guests. Our tables are always full of food for our guests and we are cheerful. And these are our common features. I hope I left a good impression about Belarusian people.

Are you looking forward to going back to Belarus? What are your plans after returning home?

Of course, I miss my country and my family. It was the first time I left home for so long. But if I had the chance to stay longer here – I would love to. After returning I’ll start my new college year and will tell everybody how lucky I am and how great this time was. I want to continue working in the field I used to work here: now I know more and I hope that I can be really useful in a team.

Do you plan on coming back to Osijek/Croatia?

I’d love to come back. Adriatic Sea is the most beautiful sea ever. I decided I would come back here with my parents. I want to show them your nature, your lakes, and waterfalls, your parks and mountains. Everybody should know how amazing your country is!

In addition, I’d like to send to my team my sincere greetings and thanks. Nassau-guys, thank you for every day here, for every smile and warm word.

Thank you Zrinka for your help, attention and every “How are you? Are you ok?”. At Inchoo, I’m always ok! 🙂

Thank you Vanja and Goran for your temporary company and help.

Thank you, Tomislav Bilic, for the chance and opportunity you gave me to take a small part in this beautiful, interesting Inchoo world.

Thank you all!

And thank you Ulyana for choosing our office for your summer internship, it was a pleasure meeting you! 🙂

The post Belarus meets Inchoo: IAESTE summer internship appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/belarus-meets-inchoo-iaeste-summer-internship/feed/ 0
Customising product info tabs in Magento 2 http://inchoo.net/magento-2/customising-product-info-tabs-magento-2/ http://inchoo.net/magento-2/customising-product-info-tabs-magento-2/#comments Tue, 26 Sep 2017 11:53:13 +0000 http://inchoo.net/?p=30572 Whether horizontal (which are more common) or vertical, tabs are a great way to avoid information overload by organizing large content into easily digestible chunks of data. When done right they provide all the information (related to one specific subject) without overwhelming users, allowing them to quickly navigate through the content by showing data from...

The post Customising product info tabs in Magento 2 appeared first on Inchoo.

]]>
Whether horizontal (which are more common) or vertical, tabs are a great way to avoid information overload by organizing large content into easily digestible chunks of data. When done right they provide all the information (related to one specific subject) without overwhelming users, allowing them to quickly navigate through the content by showing data from just one tab at a time. From the UX standpoint tabs’ main purpose is to simply facilitate access to information and it’s also useful to know that they don’t have any negative effect on your SEO and site ranking in any way.

In Magento, like in most other eCommerce platforms, tabbed navigation is utilized on product pages for displaying various product information and data. By default, and this is the same for Luma and Blank theme, there are three tabs on the product page:
details about the product i.e. description
more information which stores product attributes and values
reviews provided by products buyers and consumers

These tabs can easily be customised, and we’ll show you how. But, just before we start let’s take some time to explore and find out which templates and layout files we are actually going to customise. One way to do this is to enable Template Path Hints and add Block Names to Hints through Magento admin:

Stores => Configuration => Advanced => Developer => Debug

Although, it’s doubtful how useful these debug settings are at least now we know which Magento module (hint: module-catalog) is responsible for product info tabs so we can begin with our customisation. Let’s start off easy.

Renaming product tabs

In order to set another title for our tab we have to override base layout file catalog_product_view.xml found inside vendor/module_catalog folder. Standard (Magento) way to do this is to create new layout file inside our theme scope and name it exactly like the base file.

Our file path should look like this:
app/design/frontend/<Vendor>/<Theme>/Magento_Catalog/layout/catalog_product_view.xml

And the code inside our file like this:

<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";; xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
  <body>
    <referenceBlock name="product.info.details">                
      <referenceBlock name="product.info.description">
        <arguments>
          <argument name="title" translate="true" xsi:type="string">Description</argument>
        </arguments>
      </referenceBlock>
    </referenceBlock>
  </body>
</page>

If we analyse the code above we’ll see that the first layout handler
<referenceBlock name="product.info.details"> reference our product tabbed navigation as a whole while the child handler <referenceBlock name="product.info.description"> reference single tab, in our case details tab. With <argument name="title" translate="true" xsi:type="string"> we simply set new title for our tab. <arguments> handler is just a (required) container for <argument> and it does’t have it’s own attributes.

Removing product tabs

This one is even more simple. We just have to reference our target block and set remove attribute to true. So our catalog_product_view.xml looks like this:

<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";; xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
  <body>
    <referenceBlock name="product.info.review" remove="true" />
  </body>
</page>

Adding custom tab

Now, let’s say we want to create an additional tab in our product info tabs and populate it with content e.g. value of some particular attribute. For demonstration purpose, let’s say that our new tab will hold information about contents of product packaging.

First, from Magento admin, we will create new attribute, let’s name it Packaging and add it to default attribute set.
Next, we will:
– create new template file, we can name it packaging-content.phtml
– save it in: app/design/frontend/<Vendor>/<Theme>/Magento_Catalog/templates/product/view/
– paste the following code:

<?php
$_helper = $this->helper('Magento\Catalog\Helper\Output');
$_product = $block->getProduct();
$_code = $block->getAtCode();
$_className = $block->getCssClass();
$_attributeLabel = $block->getAtLabel();
$_attributeType = $block->getAtType();
$_attributeAddAttribute = $block->getAddAttribute();
if ($_attributeLabel && $_attributeLabel == 'default') {
    $_attributeLabel = $_product->getResource()->getAttribute($_code)->getFrontendLabel();
}
  $_attributeValue = $_product->getResource()->getAttribute($_code)->getFrontend()->getValue($_product);
?>
 
<?php if ($_attributeValue): ?>
    <div class="packaging-content" <?php  echo $_attributeAddAttribute;?>>
        <?php echo $_attributeValue; ?>
    </div>
<?php endif; ?>

N.B. attribute set (from the first step) must match string value in our if statement (line: 9)

Third and final step is to place following code in our layout file catalog_product_view.xml:

<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";; xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
  <body>
    <referenceBlock name="product.info.details">                
      <block class="Magento\Catalog\Block\Product\View\Description" name="packaging-content" template="Magento_Catalog::product/view/packaging-content.phtml" group="detailed_info">
        <arguments>
          <argument name="at_call" xsi:type="string">getPackaging</argument>
          <argument name="at_code" xsi:type="string">packaging</argument>
          <argument name="css_class" xsi:type="string">packaging</argument>
          <argument name="at_label" xsi:type="string”>packaging</argument>
          <argument name="add_attribute" xsi:type="string">itemprop="packaging"</argument>
          <argument name="title" translate="true" xsi:type="string">Packaging content</argument>
        </arguments>
      </block>
    </referenceBlock>
  </body>
</page>

Adding related products in tabbed navigation

For adding related products we also need two files, template and layout:
Our template file, we shall name it related-products.phtml and save it in app/design/frontend/<Vendor>/<Theme>/Magento_Catalog/templates/product/ will have just one line of code:

<?php echo $this->getBlockHtml('catalog.product.related'); ?>

And our layout file catalog_product_view.xml should look like this:

<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";; xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
  <body>
    <!— 1st Code Block: Get Related Products as new tab -->
    <referenceBlock name="product.info.details">
      <block class="Magento\Catalog\Block\Product\View" name="deliveryinfo.tab" as="deliveryinfo" template="Magento_Catalog::product/related-products.phtml" group="detailed_info" >
        <arguments>
          <argument translate="true" name="title" xsi:type="string">Related Products</argument>
        </arguments>
      </block>
    </referenceBlock>
 
    <!— 2nd Code Block: Move original block to product info tabs -->
    <move element="catalog.product.related" destination="product.info.details" />
  </body>
</page>

First code block is to set up a new tab with related products, and the second one is for removing the original block from layout flow.

In similar fashion this can be done for displaying upsell products as well. All we need to do is change our template (we can name it upsell-products.phtml) file to:

<?php echo $this->getBlockHtml('product.info.upsell'); ?>

And in our layout file change:
– name of template file to upsell-products.phtml (line: 6)
– title of our tab to “You might be interested” or something similar (line: 8)
– element attribute to product.info.upsell (line: 14)

Wrapping up

As you can see from these examples, it’s fairly easy to customise product page tabbed navigation. Add some CSS for styling and you’ll have your new tabs with new customised content in a matter of few hours.

And if you wish to customise some other parts of product page you can refer to this blog post.

The post Customising product info tabs in Magento 2 appeared first on Inchoo.

]]>
http://inchoo.net/magento-2/customising-product-info-tabs-magento-2/feed/ 2
Meet Magento Poland 2017 – review by Inchoo http://inchoo.net/life-at-inchoo/meet-magento-poland-2017-review-by-inchoo/ http://inchoo.net/life-at-inchoo/meet-magento-poland-2017-review-by-inchoo/#comments Tue, 26 Sep 2017 09:36:20 +0000 http://inchoo.net/?p=30546 After Warsaw and Poznan, comes unarguably the most beautiful city in Poland – Krakow, where we went for Meet Magento Poland conference. Placed in an old beer factory, we had a pleasure of experiencing this special two-day conference, filled with food, great people and new things to try. Keynotes On Sunday, Max Yekaterynenko and team were...

The post Meet Magento Poland 2017 – review by Inchoo appeared first on Inchoo.

]]>
After Warsaw and Poznan, comes unarguably the most beautiful city in Poland – Krakow, where we went for Meet Magento Poland conference.

Placed in an old beer factory, we had a pleasure of experiencing this special two-day conference, filled with food, great people and new things to try.

Keynotes

On Sunday, Max Yekaterynenko and team were running a Magento workshop. After them came contributors party in the evening.

On day 1, opening speach was by Kuba Zwoliński ,Vice president of Meet Magento Association. He was soon followed by Ben Marks speaking on future of Magento.

The ones who likely intrigued many, were team Hatimeria with their new solution called Diety.

Rest of the day was followed by great speakers, such as Jisse Reitsma, Anna Völkl, Riccardo Tempesta and many others. Tracks were full of people, eager to learn and carefully listening what lecturers have to say.

Main hall

Leisure room

Later that day, the party was held on Barka Na Wisle. Night party on a boat, that was one thing on my checklist.

Second day was marked by filled room on Anton Krills Magento 2 Workshop after that many other lectures, among which were our CEO Tomislav Bilić with his lecture “The bumpy road of growing a team” and Frontend developer Nenad Andraković with “Using HTML5 APIs to improve performance and UX”.

The city

We came to Krakow with no expectations, and we were left speechless by its beauty. Our apartment was placed in the middle of Jewish square, full of unique restaurants and live music. It was an amazing experience!

And rest of the city was no exception. Wawel Castle, Old town square, and Plac Nowy are only a few things we were able to visit there. Maybe the best of our experience of Krakow came in the evening. People filling local restaurants and pubs, enjoying good beer and company and really taking their time.

Meet Magento Poland 2017 was great, filled with awesome people in a beautiful city sharing experiences and building friendships.

Oprócz miłości do Magento, choć ostatnio szorstkiej i wymagającej 😉 kochamy fotografować.Zapraszamy do subiektywnej…

Posted by ZENTRALA on 25. rujna 2017

 
While enjoying Polish beer, we had to say goodbye to this wonderful experience and await a new one.

Cheers till the next time!

The post Meet Magento Poland 2017 – review by Inchoo appeared first on Inchoo.

]]>
http://inchoo.net/life-at-inchoo/meet-magento-poland-2017-review-by-inchoo/feed/ 1
Programmatically create upsell, cross sell and related products in Magento http://inchoo.net/magento/programmatically-create-upsell-crosssell-related-products-magento/ http://inchoo.net/magento/programmatically-create-upsell-crosssell-related-products-magento/#comments Thu, 21 Sep 2017 08:52:12 +0000 http://inchoo.net/?p=30529 This article will explain how to add upsell, cross sell and related products programmatically to Magento. One of practical examples would be data migration from some other ecommerce system to Magento. You can read a nice article on how to add upsell, cross sell and related products from administration here. It explains what all these...

The post Programmatically create upsell, cross sell and related products in Magento appeared first on Inchoo.

]]>
This article will explain how to add upsell, cross sell and related products programmatically to Magento. One of practical examples would be data migration from some other ecommerce system to Magento. You can read a nice article on how to add upsell, cross sell and related products from administration here. It explains what all these product relations mean and where are they used on the site.

Load existing product data

At the beginning, there is a product that need to be updated with product relations. It needs to be loaded as usual.

$product = Mage::getModel('catalog/product')->load($productId);

This loaded product model will not contain information about already existing upsell, cross sell and related products. If loaded product doesn’t have previous upsell, cross sell or related products set, it can be saved immediately with new data. But, if there is already existing data about these products, it must be loaded first, merged with new data and then saved. There are specific functions for that. Otherwise, it would be overwritten with new data only.

$upSellProducts = $product->getUpSellProducts();
$crossSellProducts = $product->getCrossSellProducts();
$relatedProducts = $product->getRelatedProducts();

These functions load all upsell, cross sell and related product models as an array with numeric keys starting from zero.

 

Prepare existing product data

In order to update product’s upsell, cross sell and related information, they need to be rearranged in array with product ids as keys. This array should also contain information about product position as a subarray. Position parameter determines product’s order position on frontend, usually in sidebar or slider. This parameter can also be set through Magento administration by opening product’s upsell, cross sell or related tab.

foreach ($upSellProducts as $upSellProduct) {
    $upSellProductsArranged[$upSellProduct->getId()] = array('position' => $$upSellProduct->getPosition());
}
 
foreach ($crossSellProducts as $crossSellProduct) {
    $crossSellProductsArranged[$crossSellProduct->getId()] = array('position' => $crossSellProduct->getPosition());
}
 
foreach ($relatedProducts as $relatedProduct) {
    $relatedProductsArranged[$relatedProduct->getId()] = array('position' => $relatedProduct->getPosition());
}

Merge new product data

When migrating products to Magento, products will be created, not updated, so if there is multiple upsell, cross sell or related products, this parameter can be incremented in a loop starting from zero or they can all be set to zero.Merging new upsell, cross sell and related products:

$newUpSellProducts = array($newUpSellProduct1, $newUpSellProduct2);
foreach ($newUpSellProducts as $newUpSellProduct) {
    $upSellProductsArranged[$newUpSellProduct->getId()] = array('position' => '');
}
 
$newCrossSellProducts = array($newCrossSellProduct1, $newCrossSellProduct2);
foreach ($newCrossSellProducts as $newCrossSellProduct) {
    $crossSellProductsArranged[$newCrossSellProduct->getId()] = array('position' => '');
}
 
$newRelatedProducts = array($newRelatedProduct1, $newRelatedProduct2);
foreach ($newRelatedProducts as $newRelatedProduct) {
    $relatedProductsArranged[$newRelatedProduct->getId()] = array('position' => '');
}

When all relations are merged, they should be set as one of product’s _data parameter:

$product->setUpSellLinkData($upSellProductsArranged);
$product->setCrossSellLinkData($crossSellProductsArranged);
$product->setRelatedLinkData($relatedProductsArranged);

Finally the product can be saved:

$product->save();

Database structure

This may seem like a simple thing. All that is needed is to set upsell, cross sell and related product ids in array with their positions and save the product. Backend process is actually complicated. Magento function that handles product relations saving process is saveProductRelations($product). It is located in Mage_Catalog_Model_Product_Link class.

Database structure for product relations is eav structure. Main table, in which most of this information is saved, is “catalog_product_link”. It’s structure is very simple. It consists of 4 columns. “link_id” is increment ID, “product_id” is edited product, “linked_product_id” is ID of the product that is related to edited product, “link_type_id” is relation type ID. 4 is for upsell, 5 for cross sell and 1 for related product. Second table worth mentioning is “catalog_product_link_attribute_int” which saves product’s position parameter mentioned earlier.

 

select * from catalog_product_link;

+---------+------------+-------------------+--------------+
| link_id | product_id | linked_product_id | link_type_id |
+---------+------------+-------------------+--------------+
|     1   |     247    |               640 |            1 |
|     2   |     247    |               642 |            1 |
|     3   |     247    |               647 |            1 |
|     4   |     247    |               641 |            1 |
|     5   |     247    |               652 |            4 |
|     6   |     247    |               651 |            4 |
|     7   |     247    |               651 |            5 |
|     8   |     247    |               652 |            5 |
|     9   |     247    |               652 |            1 |
|    10   |     247    |               651 |            1 |
+---------+------------+-------------------+--------------+

The post Programmatically create upsell, cross sell and related products in Magento appeared first on Inchoo.

]]>
http://inchoo.net/magento/programmatically-create-upsell-crosssell-related-products-magento/feed/ 1
Inchoo is now a Google Premier Partner! http://inchoo.net/ecommerce/inchoo-google-premier-partner/ http://inchoo.net/ecommerce/inchoo-google-premier-partner/#respond Tue, 19 Sep 2017 11:22:11 +0000 http://inchoo.net/?p=30507 We’re very excited to announce that Inchoo has just leveled up to a Google Premier Partner status, which placed us among the top trustworthy PPC experts in the world in the eyes of the almighty Google. How did we deserve it? Well, with Google, You can never be certain, but there are a few key...

The post Inchoo is now a Google Premier Partner! appeared first on Inchoo.

]]>
We’re very excited to announce that Inchoo has just leveled up to a Google Premier Partner status, which placed us among the top trustworthy PPC experts in the world in the eyes of the almighty Google. How did we deserve it? Well, with Google, You can never be certain, but there are a few key factors that could be the reason for this exciting upgrade. Here’s our short story on becoming a Google Premier Partner.

1. We’re Adwords certified

Our team demonstrated a great knowledge on Adwords by passing the Certification exams. We have not one, not two, but 29 individual certificates!

Inchoo Adwords Certifications

Passing the certifications didn’t immediately make us PPC experts, but it certainly pushed us in the right direction. We kept improving by implementing the knowledge we learned through the certifications along with testing the new features and principles to provide our clients with top quality service and great results.

2. We’re focused on the results

To achieve a Google Premier Partner status, it isn’t enough to pass the certification exams. It’s also necessary to have a higher Adwords spend along with excellent performance, which means that you can become Google Premier Partner only if you continuously manage successful campaigns with a focus on results.

With years of experience in building successful online stores in various industries across the world and excellent knowledge of eCommerce and PPC, We know how to improve each store’s performance. The best proof of our expertise certainly are the results we have achieved:

inchoo results - google premier partner

From the moment this client’s PPC got into Inchoers hands, his revenue has grown by 582.09%, while we managed to decrease the average CPC by 83.13% (compared to the same period last year). That’s what we call a successful campaign.

3. The Force is strong with us

Becoming Google Premier Partner wasn’t quick nor easy, but when hard work and the Force (if the Force is a combination of experience, knowledge, and commitment) unite, everything is possible.

We want to thank all of our clients who trusted us on managing their PPC campaigns because achieving this status wouldn’t be possible without them. Thank you all!

If you believe your AdWords campaigns could use some professional help, make sure you check out our AdWords services and feel free to leave a note down below.

The post Inchoo is now a Google Premier Partner! appeared first on Inchoo.

]]>
http://inchoo.net/ecommerce/inchoo-google-premier-partner/feed/ 0